lkml.org 
[lkml]   [2016]   [Jan]   [22]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.13.y-ckt 054/108] USB: add quirk for devices with broken LPM
    Date
    3.13.11-ckt33 -stable review patch.  If anyone has any objections, please let me know.

    ---8<------------------------------------------------------------

    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>
    Signed-off-by: Kamal Mostafa <kamal@canonical.com>
    ---
    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(-)

    diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
    index f568236..ab6b128 100644
    --- a/drivers/usb/core/hub.c
    +++ b/drivers/usb/core/hub.c
    @@ -137,6 +137,10 @@ struct usb_hub *usb_hub_to_struct_hub(struct usb_device *hdev)

    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.
    */
    @@ -4298,6 +4302,8 @@ hub_port_init (struct usb_hub *hub, struct usb_device *udev, int port1,
    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) {
    @@ -4540,7 +4546,6 @@ static void hub_port_connect_change(struct usb_hub *hub, int port1,
    if (status < 0)
    goto loop;

    - usb_detect_quirks(udev);
    if (udev->quirks & USB_QUIRK_DELAY_INIT)
    msleep(1000);

    diff --git a/drivers/usb/core/quirks.c b/drivers/usb/core/quirks.c
    index 7409a4d..f308a88 100644
    --- a/drivers/usb/core/quirks.c
    +++ b/drivers/usb/core/quirks.c
    @@ -175,6 +175,12 @@ static const struct usb_device_id usb_quirk_list[] = {
    { 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 */
    };

    diff --git a/include/linux/usb/quirks.h b/include/linux/usb/quirks.h
    index 49587dc..41ea53c 100644
    --- 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 */
    --
    1.9.1
    \
     
     \ /
      Last update: 2016-01-23 01:41    [W:4.353 / U:1.188 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site