[PATCH RESEND v2 03/11] usb: xhci: add quirks flag to support MediaTek xHCI 0.96

Bin Meng bmeng.cn at gmail.com
Fri Sep 4 08:54:03 CEST 2020


On Wed, Aug 26, 2020 at 5:31 PM Chunfeng Yun <chunfeng.yun at mediatek.com> wrote:
>
> There some vendor quirks for MTK xHCI 0.96 host controller:
> 1. It defines some extra SW scheduling parameters for HW
>    to minimize the scheduling effort for synchronous and
>    interrupt endpoints. The parameters are put into reseved

typo: reserved?

>    DWs of slot context and endpoint context.
> 2. Its TDS in  Normal TRB defines a number of packets that
>    remains to be transferred for a TD after processing all
>    Max packets in all previous TRBs.
>
> Signed-off-by: Chunfeng Yun <chunfeng.yun at mediatek.com>
> Tested-by: Frank Wunderlich <frank-w at public-files.de>
> ---
> v2: add Tested-by Frank
> ---
>  drivers/usb/host/xhci-mtk.c  | 1 +
>  drivers/usb/host/xhci-ring.c | 9 +++++++--
>  drivers/usb/host/xhci.c      | 2 +-
>  include/usb/xhci.h           | 2 ++
>  4 files changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/usb/host/xhci-mtk.c b/drivers/usb/host/xhci-mtk.c
> index 8ff7185..f3f181d 100644
> --- a/drivers/usb/host/xhci-mtk.c
> +++ b/drivers/usb/host/xhci-mtk.c
> @@ -258,6 +258,7 @@ static int xhci_mtk_probe(struct udevice *dev)
>         if (ret)
>                 goto ssusb_init_err;
>
> +       mtk->ctrl.quirks = XHCI_MTK_HOST;
>         hcor = (struct xhci_hcor *)((uintptr_t)mtk->hcd +
>                         HC_LENGTH(xhci_readl(&mtk->hcd->cr_capbase)));
>
> diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
> index 0f86b01..cf8b9d2 100644
> --- a/drivers/usb/host/xhci-ring.c
> +++ b/drivers/usb/host/xhci-ring.c
> @@ -332,7 +332,8 @@ static u32 xhci_td_remainder(struct xhci_ctrl *ctrl, int transferred,
>  {
>         u32 total_packet_count;
>
> -       if (ctrl->hci_version < 0x100)
> +       /* MTK xHCI 0.96 contains some features from 1.0 */
> +       if (ctrl->hci_version < 0x100 && !(ctrl->quirks & XHCI_MTK_HOST))
>                 return ((td_total_len - transferred) >> 10);
>
>         /* One TRB with a zero-length data packet. */
> @@ -340,6 +341,10 @@ static u32 xhci_td_remainder(struct xhci_ctrl *ctrl, int transferred,
>             trb_buff_len == td_total_len)
>                 return 0;
>
> +       /* for MTK xHCI 0.96, TD size include this TRB, but not in 1.x */
> +       if ((ctrl->quirks & XHCI_MTK_HOST) && (ctrl->hci_version < 0x100))
> +               trb_buff_len = 0;
> +
>         total_packet_count = DIV_ROUND_UP(td_total_len, maxp);
>
>         /* Queueing functions don't count the current TRB into transferred */
> @@ -823,7 +828,7 @@ int xhci_ctrl_tx(struct usb_device *udev, unsigned long pipe,
>                 field |= 0x1;
>
>         /* xHCI 1.0 6.4.1.2.1: Transfer Type field */
> -       if (ctrl->hci_version >= 0x100) {
> +       if (ctrl->hci_version >= 0x100 || ctrl->quirks & XHCI_MTK_HOST) {
>                 if (length > 0) {
>                         if (req->requesttype & USB_DIR_IN)
>                                 field |= (TRB_DATA_IN << TRB_TX_TYPE_SHIFT);
> diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
> index 4be1411..51edeb2 100644
> --- a/drivers/usb/host/xhci.c
> +++ b/drivers/usb/host/xhci.c
> @@ -650,7 +650,7 @@ static int xhci_set_configuration(struct usb_device *udev)
>                  * are put into reserved DWs in Slot and Endpoint Contexts
>                  * for synchronous endpoints.
>                  */
> -               if (IS_ENABLED(CONFIG_USB_XHCI_MTK)) {
> +               if (ctrl->quirks & XHCI_MTK_HOST) {
>                         ep_ctx[ep_index]->reserved[0] =
>                                 cpu_to_le32(EP_BPKTS(1) | EP_BBM(1));
>                 }
> diff --git a/include/usb/xhci.h b/include/usb/xhci.h
> index 15926eb..3de46cd 100644
> --- a/include/usb/xhci.h
> +++ b/include/usb/xhci.h
> @@ -1230,6 +1230,8 @@ struct xhci_ctrl {
>         struct xhci_virt_device *devs[MAX_HC_SLOTS];
>         int rootdev;
>         u16 hci_version;
> +       u32 quirks;
> +#define XHCI_MTK_HOST          BIT(0)
>  };
>
>  unsigned long trb_addr(struct xhci_segment *seg, union xhci_trb *trb);
> --

Reviewed-by: Bin Meng <bmeng.cn at gmail.com>


More information about the U-Boot mailing list