| From ad87e03213b552a5c33d5e1e7a19a73768397010 Mon Sep 17 00:00:00 2001 |
| From: Alan Stern <stern@rowland.harvard.edu> |
| Date: Thu, 10 Dec 2015 15:27:21 -0500 |
| Subject: USB: add quirk for devices with broken LPM |
| |
| From: Alan Stern <stern@rowland.harvard.edu> |
| |
| commit ad87e03213b552a5c33d5e1e7a19a73768397010 upstream. |
| |
| Some USB device / host controller combinations seem to have problems |
| with Link Power Management. For example, Steinar found that his xHCI |
| controller wouldn't handle bandwidth calculations correctly for two |
| video cards simultaneously when LPM was enabled, even though the bus |
| had plenty of bandwidth available. |
| |
| This patch introduces a new quirk flag for devices that should remain |
| disabled for LPM, and creates quirk entries for Steinar's devices. |
| |
| Signed-off-by: Alan Stern <stern@rowland.harvard.edu> |
| Reported-by: Steinar H. Gunderson <sgunderson@bigfoot.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/usb/core/hub.c | 7 ++++++- |
| drivers/usb/core/quirks.c | 6 ++++++ |
| include/linux/usb/quirks.h | 3 +++ |
| 3 files changed, 15 insertions(+), 1 deletion(-) |
| |
| --- a/drivers/usb/core/hub.c |
| +++ b/drivers/usb/core/hub.c |
| @@ -137,6 +137,10 @@ struct usb_hub *usb_hub_to_struct_hub(st |
| |
| static int usb_device_supports_lpm(struct usb_device *udev) |
| { |
| + /* Some devices have trouble with LPM */ |
| + if (udev->quirks & USB_QUIRK_NO_LPM) |
| + return 0; |
| + |
| /* USB 2.1 (and greater) devices indicate LPM support through |
| * their USB 2.0 Extended Capabilities BOS descriptor. |
| */ |
| @@ -4289,6 +4293,8 @@ hub_port_init (struct usb_hub *hub, stru |
| goto fail; |
| } |
| |
| + usb_detect_quirks(udev); |
| + |
| if (udev->wusb == 0 && le16_to_cpu(udev->descriptor.bcdUSB) >= 0x0201) { |
| retval = usb_get_bos_descriptor(udev); |
| if (!retval) { |
| @@ -4530,7 +4536,6 @@ static void hub_port_connect_change(stru |
| if (status < 0) |
| goto loop; |
| |
| - usb_detect_quirks(udev); |
| if (udev->quirks & USB_QUIRK_DELAY_INIT) |
| msleep(1000); |
| |
| --- a/drivers/usb/core/quirks.c |
| +++ b/drivers/usb/core/quirks.c |
| @@ -182,6 +182,12 @@ static const struct usb_device_id usb_in |
| { USB_DEVICE(0x0b05, 0x17e0), .driver_info = |
| USB_QUIRK_IGNORE_REMOTE_WAKEUP }, |
| |
| + /* Blackmagic Design Intensity Shuttle */ |
| + { USB_DEVICE(0x1edb, 0xbd3b), .driver_info = USB_QUIRK_NO_LPM }, |
| + |
| + /* Blackmagic Design UltraStudio SDI */ |
| + { USB_DEVICE(0x1edb, 0xbd4f), .driver_info = USB_QUIRK_NO_LPM }, |
| + |
| { } /* terminating entry must be last */ |
| }; |
| |
| --- a/include/linux/usb/quirks.h |
| +++ b/include/linux/usb/quirks.h |
| @@ -33,4 +33,7 @@ |
| /* device generates spurious wakeup, ignore remote wakeup capability */ |
| #define USB_QUIRK_IGNORE_REMOTE_WAKEUP 0x00000200 |
| |
| +/* device can't handle Link Power Management */ |
| +#define USB_QUIRK_NO_LPM BIT(10) |
| + |
| #endif /* __LINUX_USB_QUIRKS_H */ |