USB: Allow USB 3.0 ports to be disabled.

If hot and warm reset fails, or a port remains in the Compliance
Mode,
the USB core needs to be able to disable a USB 3.0 port.  Unlike
USB 2.0
ports, once the port is placed into the Disabled link state, it
will not
report any new device connects.  To get device connect
notifications, we
need to put the link into the Disabled state, and then
the RxDetect
state.

The xHCI driver needs to atomically clear all
change bits on USB 3.0
port disable, so that we get Port Status Change
Events for future port
changes.  We could technically do this in the USB
core instead of in the
xHCI roothub code, since the port state machine
can't advance out of the
disabled state until we set the link state to
RxDetect.  However,
external USB 3.0 hubs don't need this code.  They
are level-triggered,
not edge-triggered like xHCI, so they will continue
to send interrupt
events when any change bit is set.  Therefore it
doesn't make sense to
put this code in the USB core.

This patch is part
of a series to fix several reports of infinite loops
on device
enumeration failure.  This includes John, when he boots with
a USB 3.0
device (Roseweil eusb3 enclosure) attached to his NEC 0.96
host
controller.  The fix requires warm reset support, so it does not
make
sense to backport this patch to stable kernels without warm
reset
support.

This patch should be backported to kernels as old as
3.2, contain the
commit ID 75d7cf7 "usbcore: refine warm
reset
logic"

Signed-off-by: Sarah Sharp
<sarah.a.sharp@linux.intel.com>
Acked-by: Alan Stern
<stern@rowland.harvard.edu>
Reported-by: John Covici
<covici@ccs.covici.com>
Signed-off-by: Greg Kroah-Hartman
<gregkh@linuxfoundation.org>

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