• Sarah Sharp's avatar
    USB: When hot reset for USB3 fails, try warm reset. · 10d674a8
    Sarah Sharp authored
    When a hot reset (standard USB port reset) fails on a USB 3.0 port, the
    host controller transitions to the "Error" state.  It reports the port
    link state as "Inactive", sets the link state change flag, and (if the
    device disconnects) also reports the disconnect and connect change status.
    It's also supposed to transition the link state to "RxDetect", but the NEC
    µPD720200 xHCI host does not.
    
    Unfortunately, Harald found that the combination of the NEC µPD720200 and
    a LogiLink USB 3.0 to SATA adapter triggered this issue.  The USB core
    would reset the device, the port would go into this error state, and the
    device would never be enumerated.  This combination works under Windows,
    but not under Linux.
    
    When a hot reset fails on a USB 3.0 port, and the link state is reported
    as Inactive, fall back to a warm port reset instead.  Harald confirms that
    with a warm port reset (along with all the change bits being correctly
    cleared), the USB 3.0 device will successfully enumerate.
    
    Harald also had to add two other patches ("xhci: Set change bit when warm
    reset change is set." and "usbcore: refine warm reset logic") to make this
    setup work.  Since the warm reset refinement patch is not destined for the
    stable kernels (it's too big), this patch should not be backported either.
    
    This fixes https://bugzilla.kernel.org/show_bug.cgi?id=41752Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
    Tested-by: default avatarHarald Brennich <harald.brennich@gmx.de>
    Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@suse.de>
    10d674a8
hub.c 115 KB