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.

See: #3919

Signed-off-by: Jonathan Bell <jonathan@raspberrypi.com>
  • Loading branch information
Jonathan Bell authored and popcornmix committed Jan 11, 2021
1 parent 2ad2a8e commit 0704adc
Show file tree
Hide file tree
Showing 3 changed files with 12 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 @@ -272,6 +272,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 @@ -630,6 +630,16 @@ void xhci_find_new_dequeue_state(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))
state->new_cycle_state ^= 0x1;
next_trb(xhci, ep_ring, &new_seg, &new_deq);
}

state->new_deq_seg = new_seg;
state->new_deq_ptr = new_deq;

Expand Down
1 change: 1 addition & 0 deletions drivers/usb/host/xhci.h
Original file line number Diff line number Diff line change
Expand Up @@ -1880,6 +1880,7 @@ struct xhci_hcd {
#define XHCI_DISABLE_SPARSE BIT_ULL(38)
#define XHCI_SG_TRB_CACHE_SIZE_QUIRK BIT_ULL(39)
#define XHCI_EP_CTX_BROKEN_DCS BIT_ULL(40)
#define XHCI_AVOID_DQ_ON_LINK BIT_ULL(41)

unsigned int num_active_eps;
unsigned int limit_active_eps;
Expand Down

0 comments on commit 0704adc

Please sign in to comment.