75 lines
2.8 KiB
Diff
75 lines
2.8 KiB
Diff
|
From c736d0427022a2f8eb416d930450fe22663c123c Mon Sep 17 00:00:00 2001
|
||
|
From: Mathias Nyman <mathias.nyman@linux.intel.com>
|
||
|
Date: Fri, 7 Mar 2014 17:06:57 +0200
|
||
|
Subject: [PATCH 1/2] Revert "xhci 1.0: Limit arbitrarily-aligned scatter
|
||
|
gather."
|
||
|
|
||
|
This reverts commit 247bf557273dd775505fb9240d2d152f4f20d304.
|
||
|
|
||
|
This commit, together with commit 3804fad45411b48233b48003e33a78f290d227c8
|
||
|
"USBNET: ax88179_178a: enable tso if usb host supports sg dma" were
|
||
|
origially added to get xHCI 1.0 hosts and usb ethernet ax88179_178a devices
|
||
|
working together with scatter gather. xHCI 1.0 hosts pose some requirement on how transfer
|
||
|
buffers are aligned, setting this requirement for 1.0 hosts caused USB 3.0 mass
|
||
|
storage devices to fail more frequently.
|
||
|
|
||
|
USB 3.0 mass storage devices used to work before 3.14-rc1. Theoretically,
|
||
|
the TD fragment rules could have caused an occasional disk glitch.
|
||
|
Now the devices *will* fail, instead of theoretically failing.
|
||
|
>From a user perspective, this looks like a regression; the USB device obviously
|
||
|
fails on 3.14-rc1, and may sometimes silently fail on prior kernels.
|
||
|
|
||
|
The proper soluition is to implement the TD fragment rules required, but for now
|
||
|
this patch needs to be reverted to get USB 3.0 mass storage devices working at the
|
||
|
level they used to.
|
||
|
|
||
|
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
|
||
|
Cc: stable <stable@vger.kernel.org>
|
||
|
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
||
|
---
|
||
|
drivers/usb/host/xhci.c | 14 +++-----------
|
||
|
1 file changed, 3 insertions(+), 11 deletions(-)
|
||
|
|
||
|
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
|
||
|
index 56d488d..5a646a6 100644
|
||
|
--- a/drivers/usb/host/xhci.c
|
||
|
+++ b/drivers/usb/host/xhci.c
|
||
|
@@ -4719,6 +4719,9 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
|
||
|
/* Accept arbitrarily long scatter-gather lists */
|
||
|
hcd->self.sg_tablesize = ~0;
|
||
|
|
||
|
+ /* support to build packet from discontinuous buffers */
|
||
|
+ hcd->self.no_sg_constraint = 1;
|
||
|
+
|
||
|
/* XHCI controllers don't stop the ep queue on short packets :| */
|
||
|
hcd->self.no_stop_on_short = 1;
|
||
|
|
||
|
@@ -4743,14 +4746,6 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
|
||
|
/* xHCI private pointer was set in xhci_pci_probe for the second
|
||
|
* registered roothub.
|
||
|
*/
|
||
|
- xhci = hcd_to_xhci(hcd);
|
||
|
- /*
|
||
|
- * Support arbitrarily aligned sg-list entries on hosts without
|
||
|
- * TD fragment rules (which are currently unsupported).
|
||
|
- */
|
||
|
- if (xhci->hci_version < 0x100)
|
||
|
- hcd->self.no_sg_constraint = 1;
|
||
|
-
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
@@ -4777,9 +4772,6 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
|
||
|
if (xhci->hci_version > 0x96)
|
||
|
xhci->quirks |= XHCI_SPURIOUS_SUCCESS;
|
||
|
|
||
|
- if (xhci->hci_version < 0x100)
|
||
|
- hcd->self.no_sg_constraint = 1;
|
||
|
-
|
||
|
/* Make sure the HC is halted. */
|
||
|
retval = xhci_halt(xhci);
|
||
|
if (retval)
|
||
|
--
|
||
|
1.9.0
|
||
|
|