[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