Using an UAS device (and thus USB-3 streams) on an Intel Cherrytrail
device, results in the following error:

xhci_hcd 0000:00:14.0: ERROR Transfer event for disabled endpoint or incorrect 
stream ring
xhci_hcd 0000:00:14.0: @00000000742f7120 00000000 00000000 06000000 02028000

Note that the completion code is COMP_STALLED and the buffer which was
being processed last is set to NULL. Both are a problem here, the buffer
being NULL is what directly results in this error, because that means
we cannot find out which stream was stalled, so which ring the move
to the next td / which urb to return to the device driver with a -EPIPE
status. Even if we could figure out the active stream when this happened
the COMP_STALLED itself is weird too as the UAS protocol does not define
a stall response by the device.

I've tried to fix this by simply doing a xhci_queue_reset_ep() on
the endpoint, but that only makes things worse, going from waiting
for the scsi layer to timeout (30 seconds) and the uas driver to do an
usb-reset, to things not working at all.

The uas device + USB-3 cable used for testing work fine on other
xhci controllers and show this behavior on multiple cherrytrail devices,
so lets disable streams on cherrytrail until we can find a better
workaround.

Cc: [email protected]
Cc: Oliver Neukum <[email protected]>
Signed-off-by: Hans de Goede <[email protected]>
---
 drivers/usb/host/xhci-pci.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
index c96b0b1..0fbbef8 100644
--- a/drivers/usb/host/xhci-pci.c
+++ b/drivers/usb/host/xhci-pci.c
@@ -180,6 +180,9 @@ static void xhci_pci_quirks(struct device *dev, struct 
xhci_hcd *xhci)
            (pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI ||
             pdev->device == PCI_DEVICE_ID_INTEL_APL_XHCI))
                xhci->quirks |= XHCI_MISSING_CAS;
+       if (pdev->vendor == PCI_VENDOR_ID_INTEL &&
+                pdev->device == PCI_DEVICE_ID_INTEL_CHERRYVIEW_XHCI)
+               xhci->quirks |= XHCI_BROKEN_STREAMS;
 
        if (pdev->vendor == PCI_VENDOR_ID_ETRON &&
                        pdev->device == PCI_DEVICE_ID_EJ168) {
-- 
2.9.3

--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to [email protected]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to