diff options
-rw-r--r-- | drivers/usb/host/xhci-pci.c | 4 | ||||
-rw-r--r-- | drivers/usb/host/xhci.c | 3 | ||||
-rw-r--r-- | drivers/usb/host/xhci.h | 2 |
3 files changed, 7 insertions, 2 deletions
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c index e20520f42753..464049f638c0 100644 --- a/drivers/usb/host/xhci-pci.c +++ b/drivers/usb/host/xhci-pci.c | |||
@@ -143,6 +143,7 @@ static void xhci_pci_quirks(struct device *dev, struct xhci_hcd *xhci) | |||
143 | pdev->device == PCI_DEVICE_ID_ASROCK_P67) { | 143 | pdev->device == PCI_DEVICE_ID_ASROCK_P67) { |
144 | xhci->quirks |= XHCI_RESET_ON_RESUME; | 144 | xhci->quirks |= XHCI_RESET_ON_RESUME; |
145 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; | 145 | xhci->quirks |= XHCI_TRUST_TX_LENGTH; |
146 | xhci->quirks |= XHCI_BROKEN_STREAMS; | ||
146 | } | 147 | } |
147 | if (pdev->vendor == PCI_VENDOR_ID_RENESAS && | 148 | if (pdev->vendor == PCI_VENDOR_ID_RENESAS && |
148 | pdev->device == 0x0015) | 149 | pdev->device == 0x0015) |
@@ -230,7 +231,8 @@ static int xhci_pci_probe(struct pci_dev *dev, const struct pci_device_id *id) | |||
230 | goto put_usb3_hcd; | 231 | goto put_usb3_hcd; |
231 | /* Roothub already marked as USB 3.0 speed */ | 232 | /* Roothub already marked as USB 3.0 speed */ |
232 | 233 | ||
233 | if (HCC_MAX_PSA(xhci->hcc_params) >= 4) | 234 | if (!(xhci->quirks & XHCI_BROKEN_STREAMS) && |
235 | HCC_MAX_PSA(xhci->hcc_params) >= 4) | ||
234 | xhci->shared_hcd->can_do_streams = 1; | 236 | xhci->shared_hcd->can_do_streams = 1; |
235 | 237 | ||
236 | /* USB-2 and USB-3 roothubs initialized, allow runtime pm suspend */ | 238 | /* USB-2 and USB-3 roothubs initialized, allow runtime pm suspend */ |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c index 0342d9b63977..a0772d362e70 100644 --- a/drivers/usb/host/xhci.c +++ b/drivers/usb/host/xhci.c | |||
@@ -3148,7 +3148,8 @@ int xhci_alloc_streams(struct usb_hcd *hcd, struct usb_device *udev, | |||
3148 | num_streams); | 3148 | num_streams); |
3149 | 3149 | ||
3150 | /* MaxPSASize value 0 (2 streams) means streams are not supported */ | 3150 | /* MaxPSASize value 0 (2 streams) means streams are not supported */ |
3151 | if (HCC_MAX_PSA(xhci->hcc_params) < 4) { | 3151 | if ((xhci->quirks & XHCI_BROKEN_STREAMS) || |
3152 | HCC_MAX_PSA(xhci->hcc_params) < 4) { | ||
3152 | xhci_dbg(xhci, "xHCI controller does not support streams.\n"); | 3153 | xhci_dbg(xhci, "xHCI controller does not support streams.\n"); |
3153 | return -ENOSYS; | 3154 | return -ENOSYS; |
3154 | } | 3155 | } |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h index 9ffecd56600d..dace5152e179 100644 --- a/drivers/usb/host/xhci.h +++ b/drivers/usb/host/xhci.h | |||
@@ -1558,6 +1558,8 @@ struct xhci_hcd { | |||
1558 | #define XHCI_PLAT (1 << 16) | 1558 | #define XHCI_PLAT (1 << 16) |
1559 | #define XHCI_SLOW_SUSPEND (1 << 17) | 1559 | #define XHCI_SLOW_SUSPEND (1 << 17) |
1560 | #define XHCI_SPURIOUS_WAKEUP (1 << 18) | 1560 | #define XHCI_SPURIOUS_WAKEUP (1 << 18) |
1561 | /* For controllers with a broken beyond repair streams implementation */ | ||
1562 | #define XHCI_BROKEN_STREAMS (1 << 19) | ||
1561 | unsigned int num_active_eps; | 1563 | unsigned int num_active_eps; |
1562 | unsigned int limit_active_eps; | 1564 | unsigned int limit_active_eps; |
1563 | /* There are two roothubs to keep track of bus suspend info for */ | 1565 | /* There are two roothubs to keep track of bus suspend info for */ |