• G
    USB: xhci: Set change bit when warm reset change is set. · 44f4c3ed
    Greg KH 提交于
    Sometimes, when a USB 3.0 device is disconnected, the Intel Panther
    Point xHCI host controller will report a link state change with the
    state set to "SS.Inactive".  This causes the xHCI host controller to
    issue a warm port reset, which doesn't finish before the USB core times
    out while waiting for it to complete.
    
    When the warm port reset does complete, and the xHC gives back a port
    status change event, the xHCI driver kicks khubd.  However, it fails to
    set the bit indicating there is a change event for that port because the
    logic in xhci-hub.c doesn't check for the warm port reset bit.
    
    After that, the warm port status change bit is never cleared by the USB
    core, and the xHC stops reporting port status change bits.  (The xHCI
    spec says it shouldn't report more port events until all change bits are
    cleared.) This means any port changes when a new device is connected
    will never be reported, and the port will seem "dead" until the xHCI
    driver is unloaded and reloaded, or the computer is rebooted.  Fix this
    by making the xHCI driver set the port change bit when a warm port reset
    change bit is set.
    
    A better solution would be to make the USB core handle warm port reset
    in differently, merging the current code with the standard port reset
    code that does an incremental backoff on the timeout, and tries to
    complete the port reset two more times before giving up.  That more
    complicated fix will be merged next window, and this fix will be
    backported to stable.
    
    This should be backported to kernels as old as 3.0, since that was the
    first kernel with commit a11496eb ("xHCI: warm reset support").
    Signed-off-by: NSarah Sharp <sarah.a.sharp@linux.intel.com>
    Cc: stable@kernel.org
    Signed-off-by: NGreg Kroah-Hartman <gregkh@suse.de>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    44f4c3ed
xhci-hub.c 27.9 KB