• Sarah Sharp's avatar
    USB: Ignore port state until reset completes. · 4f43447e
    Sarah Sharp authored
    The port reset code bails out early if the current connect status is
    cleared (device disconnected).  If we're issuing a hot reset, it may
    also look at the link state before the reset is finished.
    
    Section 10.14.2.6 of the USB 3.0 spec says that when a port enters the
    Error state or Resetting state, the port connection bit retains the
    value from the previous state.  Therefore we can't trust it until the
    reset finishes.  Also, the xHCI spec section 4.19.1.2.5 says software
    shall ignore the link state while the port is resetting, as it can be in
    an unknown state.
    
    The port state during reset is also unknown for USB 2.0 hubs.  The hub
    sends a reset signal by driving the bus into an SE0 state.  This
    overwhelms the "connect" signal from the device, so the port can't tell
    whether anything is connected or not.
    
    Fix the port reset code to ignore the port link state and current
    connect bit until the reset finishes, and USB_PORT_STAT_RESET is
    cleared.
    
    Remove the check for USB_PORT_STAT_C_BH_RESET in the warm reset case,
    because it's redundant.  When the warm reset finishes, the port reset
    bit will be cleared at the same time USB_PORT_STAT_C_BH_RESET is set.
    Remove the now-redundant check for a cleared USB_PORT_STAT_RESET bit
    in the code to deal with the finished reset.
    
    This patch should be backported to all stable kernels.
    Signed-off-by: default avatarSarah Sharp <sarah.a.sharp@linux.intel.com>
    Acked-by: default avatarAlan Stern <stern@rowland.harvard.edu>
    Cc: stable@vger.kernel.org
    4f43447e
hub.c 149 KB