Skip to content

Commit

Permalink
xhci: quirks: add link TRB quirk for VL805
Browse files Browse the repository at this point in the history
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: #3919

[6.5.y Fixup - move downstream quirk bits further along]

Signed-off-by: Jonathan Bell <[email protected]>
  • Loading branch information
P33M authored and popcornmix committed Nov 18, 2024
1 parent 45dfe08 commit 9e2edf3
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 0 deletions.
1 change: 1 addition & 0 deletions drivers/usb/host/xhci-pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -435,6 +435,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 &&
Expand Down
10 changes: 10 additions & 0 deletions drivers/usb/host/xhci-ring.c
Original file line number Diff line number Diff line change
Expand Up @@ -709,6 +709,16 @@ static int xhci_move_dequeue_past_td(struct xhci_hcd *xhci,

} while (!cycle_found || !td_last_trb_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);
if (addr == 0) {
Expand Down
3 changes: 3 additions & 0 deletions drivers/usb/host/xhci.h
Original file line number Diff line number Diff line change
Expand Up @@ -1630,6 +1630,9 @@ struct xhci_hcd {
#define XHCI_WRITE_64_HI_LO BIT_ULL(47)
#define XHCI_CDNS_SCTX_QUIRK BIT_ULL(48)

/* 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;
Expand Down

0 comments on commit 9e2edf3

Please sign in to comment.