linux/drivers/usb/core
Sarah Sharp 10d674a82e USB: When hot reset for USB3 fails, try warm reset.
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=41752

Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Tested-by: Harald Brennich <harald.brennich@gmx.de>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
2011-09-20 12:33:50 -07:00
..
buffer.c USB: Core: Fix minor coding style issues 2011-01-22 19:35:39 -08:00
config.c USB: use usb_endpoint_maxp() instead of le16_to_cpu() 2011-08-23 09:47:40 -07:00
devices.c USB: use usb_endpoint_maxp() instead of le16_to_cpu() 2011-08-23 09:47:40 -07:00
devio.c USB: Do not pass negative length to snoop_urb() 2011-03-23 13:14:16 -07:00
driver.c USB: for usb_autopm_get_interface_async -EINPROGRESS is not an error 2011-09-09 15:58:01 -07:00
endpoint.c USB: use usb_endpoint_maxp() instead of le16_to_cpu() 2011-08-23 09:47:40 -07:00
file.c USB: remove dead code from usb_deregister_dev() 2011-04-13 16:24:05 -07:00
generic.c USB: accept RNDIS configs if there's no alternative 2010-08-10 14:35:43 -07:00
hcd-pci.c USB: irq: Remove IRQF_DISABLED 2011-09-18 01:39:36 -07:00
hcd.c USB: Avoid NULL pointer deref in usb_hcd_alloc_bandwidth. 2011-08-15 09:22:40 -07:00
hub.c USB: When hot reset for USB3 fails, try warm reset. 2011-09-20 12:33:50 -07:00
inode.c usb: remove bad dput after dentry_unhash 2011-06-06 16:26:59 -07:00
Kconfig kconfig: rename CONFIG_EMBEDDED to CONFIG_EXPERT 2011-01-20 17:02:05 -08:00
Makefile usb: makefile cleanup 2010-10-22 10:22:07 -07:00
message.c USB: additional regression fix for device removal 2011-07-07 13:29:33 -07:00
notify.c USB : correct comments in usb/core/notify.c 2008-02-01 14:34:44 -08:00
otg_whitelist.h USB: fix codingstyle issues in drivers/usb/core/*.h 2008-02-01 14:35:07 -08:00
quirks.c USB: add RESET_RESUME for webcams shown to be quirky 2011-09-18 01:48:37 -07:00
sysfs.c usb: core: Change usb_create_sysfs_intf_files()' return type to void 2011-04-29 17:24:38 -07:00
urb.c USB: use usb_endpoint_maxp() instead of le16_to_cpu() 2011-08-23 09:47:40 -07:00
usb.c usb: core: Change usb_create_sysfs_intf_files()' return type to void 2011-04-29 17:24:38 -07:00
usb.h usb: core: Change usb_create_sysfs_intf_files()' return type to void 2011-04-29 17:24:38 -07:00