[PATCH] usb: xhci: Disable streams on Intel Cherrytrail controllers

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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: stable@xxxxxxxxxxxxxxx
Cc: Oliver Neukum <oneukum@xxxxxxxx>
Signed-off-by: Hans de Goede <hdegoede@xxxxxxxxxx>
---
 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 stable" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html



[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]