USB: Ignore port state until reset completes.

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: Sarah Sharp
<sarah.a.sharp@linux.intel.com>
Acked-by: Alan Stern
<stern@rowland.harvard.edu>
Signed-off-by: Greg Kroah-Hartman
<gregkh@linuxfoundation.org>

idea is taken here -
https://github.com/varunchitre15/thunderzap_xl/commit/f821c18abc6d6cb9b77f311207ce0a470baf9073