xhci: quirks: add link TRB quirk for VL805
authorJonathan Bell <jonathan@raspberrypi.com>
Mon, 26 Oct 2020 14:03:35 +0000 (14:03 +0000)
committerDom Cobley <popcornmix@gmail.com>
Mon, 19 Feb 2024 11:33:37 +0000 (11:33 +0000)
The VL805 controller can't cope with the TR Dequeue Pointer for an endpoint
being set to a Link TRB. The hardware-maintained endpoint context ends up
stuck at the address of the Link TRB, leading to erroneous ring expansion
events whenever the enqueue pointer wraps to the dequeue position.

If the search for the end of the current TD and ring cycle state lands on
a Link TRB, move to the next segment.

Link: https://github.com/raspberrypi/linux/issues/3919
[6.5.y Fixup - move downstream quirk bits further along]

Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
drivers/usb/host/xhci-pci.c
drivers/usb/host/xhci-ring.c
drivers/usb/host/xhci.h

index b61e6d7..d2d86b8 100644 (file)
@@ -482,6 +482,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci)
        if (pdev->vendor == PCI_VENDOR_ID_VIA && pdev->device == 0x3483) {
                xhci->quirks |= XHCI_LPM_SUPPORT;
                xhci->quirks |= XHCI_EP_CTX_BROKEN_DCS;
+               xhci->quirks |= XHCI_AVOID_DQ_ON_LINK;
        }
 
        if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA &&
index f81767b..a383051 100644 (file)
@@ -721,6 +721,15 @@ static int xhci_move_dequeue_past_td(struct xhci_hcd *xhci,
        } while (!cycle_found || !td_last_trb_found);
 
 deq_found:
+       /*
+        * Quirk: the xHC does not correctly parse link TRBs if the HW Dequeue
+        * pointer is set to one. Advance to the next TRB (and next segment).
+        */
+       if (xhci->quirks & XHCI_AVOID_DQ_ON_LINK && trb_is_link(new_deq)) {
+               if (link_trb_toggles_cycle(new_deq))
+                       new_cycle ^= 0x1;
+               next_trb(xhci, ep_ring, &new_seg, &new_deq);
+       }
 
        /* Don't update the ring cycle state for the producer (us). */
        addr = xhci_trb_virt_to_dma(new_seg, new_deq);
index c23b01d..1449fb6 100644 (file)
@@ -1909,6 +1909,9 @@ struct xhci_hcd {
 #define XHCI_ZHAOXIN_TRB_FETCH BIT_ULL(45)
 #define XHCI_ZHAOXIN_HOST      BIT_ULL(46)
 
+/* Downstream VLI fixes */
+#define XHCI_AVOID_DQ_ON_LINK  BIT_ULL(56)
+
        unsigned int            num_active_eps;
        unsigned int            limit_active_eps;
        struct xhci_port        *hw_ports;