• Sarah Sharp's avatar
    USB: Handle warm reset failure on empty port. · 65bdac5e
    Sarah Sharp authored
    An empty port can transition to either Inactive or Compliance Mode if a
    newly connected USB 3.0 device fails to link train.  In that case, we
    issue a warm reset.  Some devices, such as John's Roseweil eusb3
    enclosure, slip back into Compliance Mode after the warm reset.
    
    The current warm reset code does not check for device connect status on
    warm reset completion, and it incorrectly reports the warm reset
    succeeded.  This causes the USB core to attempt to send a Set Address
    control transfer to a port in Compliance Mode, which will always fail.
    
    Make hub_port_wait_reset check the current connect status and link state
    after the warm reset completes.  Return a failure status if the device
    is disconnected or the link state is Compliance Mode or SS.Inactive.
    
    Make hub_events disable the port if warm reset fails.  This will disable
    the port, and then bring it back into the RxDetect state.  Make the USB
    core ignore the connect change until the device reconnects.
    
    Note that this patch does NOT handle connected devices slipping into the
    Inactive state very well.  This is a concern, because devices can go
    into the Inactive state on U1/U2 exit failure.  However, the fix for
    that case is too large for stable, so it will be submitted in a separate
    patch.
    
    This patch should be backported to kernels as old as 3.2, contain the
    commit ID 75d7cf72 "usbcore: refine warm
    reset logic"
    Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
    Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Reported-by: default avatarJohn Covici <covici@ccs.covici.com>
    Cc: stable@vger.kernel.org
    65bdac5e
hub.c 149 KB