]> Pileus Git - ~andy/linux/blobdiff - drivers/usb/host/xhci.c
Merge tag 'sunxi-fixes-for-3.14' of https://github.com/mripard/linux into fixes
[~andy/linux] / drivers / usb / host / xhci.c
index 3712359d18baadca0d1304fc67b8ee2dfb4c133e..6fe577d46fa2d392e586d608efc3805666ac452c 100644 (file)
@@ -4730,11 +4730,8 @@ int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks)
        struct device           *dev = hcd->self.controller;
        int                     retval;
 
-       /* Limit the block layer scatter-gather lists to half a segment. */
-       hcd->self.sg_tablesize = TRBS_PER_SEGMENT / 2;
-
-       /* support to build packet from discontinuous buffers */
-       hcd->self.no_sg_constraint = 1;
+       /* Accept arbitrarily long scatter-gather lists */
+       hcd->self.sg_tablesize = ~0;
 
        /* XHCI controllers don't stop the ep queue on short packets :| */
        hcd->self.no_stop_on_short = 1;
@@ -4760,6 +4757,14 @@ 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;
        }
 
@@ -4788,6 +4793,9 @@ 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)