lkml.org 
[lkml]   [2014]   [Jul]   [30]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 11/94] usb: Check if port status is equal to RxDetect
    Date
    From: Gavin Guo <gavin.guo@canonical.com>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    commit bb86cf569bbd7ad4dce581a37c7fbd748057e9dc upstream.

    When using USB 3.0 pen drive with the [AMD] FCH USB XHCI Controller
    [1022:7814], the second hotplugging will experience the USB 3.0 pen
    drive is recognized as high-speed device. After bisecting the kernel,
    I found the commit number 41e7e056cdc662f704fa9262e5c6e213b4ab45dd
    (USB: Allow USB 3.0 ports to be disabled.) causes the bug. After doing
    some experiments, the bug can be fixed by avoiding executing the function
    hub_usb3_port_disable(). Because the port status with [AMD] FCH USB
    XHCI Controlleris [1022:7814] is already in RxDetect
    (I tried printing out the port status before setting to Disabled state),
    it's reasonable to check the port status before really executing
    hub_usb3_port_disable().

    Fixes: 41e7e056cdc6 (USB: Allow USB 3.0 ports to be disabled.)
    Signed-off-by: Gavin Guo <gavin.guo@canonical.com>
    Acked-by: Alan Stern <stern@rowland.harvard.edu>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    drivers/usb/core/hub.c | 19 +++++++++++++++++++
    1 file changed, 19 insertions(+)

    diff --git a/drivers/usb/core/hub.c b/drivers/usb/core/hub.c
    index 60a1f13db296..9c63a76cfedd 100644
    --- a/drivers/usb/core/hub.c
    +++ b/drivers/usb/core/hub.c
    @@ -891,6 +891,25 @@ static int hub_usb3_port_disable(struct usb_hub *hub, int port1)
    if (!hub_is_superspeed(hub->hdev))
    return -EINVAL;

    + ret = hub_port_status(hub, port1, &portstatus, &portchange);
    + if (ret < 0)
    + return ret;
    +
    + /*
    + * USB controller Advanced Micro Devices, Inc. [AMD] FCH USB XHCI
    + * Controller [1022:7814] will have spurious result making the following
    + * usb 3.0 device hotplugging route to the 2.0 root hub and recognized
    + * as high-speed device if we set the usb 3.0 port link state to
    + * Disabled. Since it's already in USB_SS_PORT_LS_RX_DETECT state, we
    + * check the state here to avoid the bug.
    + */
    + if ((portstatus & USB_PORT_STAT_LINK_STATE) ==
    + USB_SS_PORT_LS_RX_DETECT) {
    + dev_dbg(&hub->ports[port1 - 1]->dev,
    + "Not disabling port; link state is RxDetect\n");
    + return ret;
    + }
    +
    ret = hub_set_port_link_state(hub, port1, USB_SS_PORT_LS_SS_DISABLED);
    if (ret)
    return ret;
    --
    2.0.1


    \
     
     \ /
      Last update: 2014-07-30 15:21    [W:4.471 / U:0.076 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site