linux/drivers/usb/host
Sarah Sharp 8b3d45705e usb: Fix xHCI host issues on remote wakeup.
When a device signals remote wakeup on a roothub, and the suspend change
bit is set, the host controller driver must not give control back to the
USB core until the port goes back into the active state.

EHCI accomplishes this by waiting in the get port status function until
the PORT_RESUME bit is cleared:

                        /* stop resume signaling */
                        temp &= ~(PORT_RWC_BITS | PORT_SUSPEND | PORT_RESUME);
                        ehci_writel(ehci, temp, status_reg);
                        clear_bit(wIndex, &ehci->resuming_ports);
                        retval = ehci_handshake(ehci, status_reg,
                                        PORT_RESUME, 0, 2000 /* 2msec */);

Similarly, the xHCI host should wait until the port goes into U0, before
passing control up to the USB core.  When the port transitions from the
RExit state to U0, the xHCI driver will get a port status change event.
We need to wait for that event before passing control up to the USB
core.

After the port transitions to the active state, the USB core should time
a recovery interval before it talks to the device.  The length of that
recovery interval is TRSMRCY, 10 ms, mentioned in the USB 2.0 spec,
section 7.1.7.7.  The previous xHCI code (which did not wait for the
port to go into U0) would cause the USB core to violate that recovery
interval.

This bug caused numerous USB device disconnects on remote wakeup under
ChromeOS and a Lynx Point LP xHCI host that takes up to 20 ms to move
from RExit to U0.  ChromeOS is very aggressive about power savings, and
sets the autosuspend_delay to 100 ms, and disables USB persist.

I attempted to replicate this bug with Ubuntu 12.04, but could not.  I
used Ubuntu 12.04 on the same platform, with the same BIOS that the bug
was triggered on ChromeOS with.  I also changed the USB sysfs settings
as described above, but still could not reproduce the bug under Ubuntu.
It may be that ChromeOS userspace triggers this bug through additional
settings.

Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
2013-09-23 15:43:31 -07:00
..
whci wusbhc: disable suspend and resume on the root hub. 2013-06-06 12:14:38 -07:00
bcma-hcd.c
ehci-atmel.c ehci-atmel.c: prepare clk before calling enable 2013-06-24 16:21:52 -07:00
ehci-dbg.c ehci: remove duplicate debug_async_open() prototype in ehci-dbg.c 2013-08-30 12:02:08 -07:00
ehci-fsl.c Revert "USB: EHCI: support running URB giveback in tasklet context" 2013-09-17 09:36:10 -07:00
ehci-fsl.h
ehci-grlib.c Revert "USB: EHCI: support running URB giveback in tasklet context" 2013-09-17 09:36:10 -07:00
ehci-hcd.c Revert "USB: EHCI: support running URB giveback in tasklet context" 2013-09-17 09:36:10 -07:00
ehci-hub.c ehci: remove ehci_vdbg() verbose debugging statements 2013-08-30 12:02:07 -07:00
ehci-mem.c USB: EHCI: improve interrupt qh unlink 2013-08-12 11:43:48 -07:00
ehci-msm.c USB: EHCI: make ehci-msm a separate driver 2013-04-08 09:40:20 -07:00
ehci-mv.c Revert "USB: EHCI: support running URB giveback in tasklet context" 2013-09-17 09:36:10 -07:00
ehci-mxc.c usb: ehci-mxc: check for pdata before dereferencing 2013-08-23 10:46:03 -07:00
ehci-octeon.c Revert "USB: EHCI: support running URB giveback in tasklet context" 2013-09-17 09:36:10 -07:00
ehci-omap.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
ehci-orion.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
ehci-pci.c Intel xhci: refactor EHCI/xHCI port switching 2013-07-23 14:50:29 -07:00
ehci-platform.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
ehci-pmcmsp.c Revert "USB: EHCI: support running URB giveback in tasklet context" 2013-09-17 09:36:10 -07:00
ehci-ppc-of.c Revert "USB: EHCI: support running URB giveback in tasklet context" 2013-09-17 09:36:10 -07:00
ehci-ps3.c Revert "USB: EHCI: support running URB giveback in tasklet context" 2013-09-17 09:36:10 -07:00
ehci-q.c Revert "USB: EHCI: support running URB giveback in tasklet context" 2013-09-17 09:36:10 -07:00
ehci-s5p.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
ehci-sched.c ehci: enable debugging code when CONFIG_DYNAMIC_DEBUG is set 2013-08-30 12:02:07 -07:00
ehci-sead3.c Revert "USB: EHCI: support running URB giveback in tasklet context" 2013-09-17 09:36:10 -07:00
ehci-sh.c Revert "USB: EHCI: support running URB giveback in tasklet context" 2013-09-17 09:36:10 -07:00
ehci-spear.c usb: host: ehci-spear: Remove redundant checks 2013-05-30 21:32:53 +09:00
ehci-sysfs.c
ehci-tegra.c usb: host: tegra: Tegra30 support 2013-08-12 13:29:54 -05:00
ehci-tilegx.c Revert "USB: EHCI: support running URB giveback in tasklet context" 2013-09-17 09:36:10 -07:00
ehci-timer.c USB: EHCI: improve interrupt qh unlink 2013-08-12 11:43:48 -07:00
ehci-w90x900.c Revert "USB: EHCI: support running URB giveback in tasklet context" 2013-09-17 09:36:10 -07:00
ehci-xilinx-of.c Revert "USB: EHCI: support running URB giveback in tasklet context" 2013-09-17 09:36:10 -07:00
ehci.h ehci: enable debugging code when CONFIG_DYNAMIC_DEBUG is set 2013-08-30 12:02:07 -07:00
fhci-dbg.c
fhci-hcd.c
fhci-hub.c
fhci-mem.c
fhci-q.c
fhci-sched.c USB: FHCI: upgrade the isochronous API 2013-05-30 21:34:31 +09:00
fhci-tds.c
fhci.h USB: FHCI: upgrade the isochronous API 2013-05-30 21:34:31 +09:00
fotg210-hcd.c usb: host: Faraday fotg210-hcd driver 2013-07-29 11:15:39 -07:00
fotg210.h usb: host: Faraday fotg210-hcd driver 2013-07-29 11:15:39 -07:00
fsl-mph-dr-of.c usb: host: fsl-mph-dr-of: Staticize local symbols 2013-09-17 11:06:57 -05:00
fusbh200-hcd.c usb: host: fusbh200-hcd: rename two functions 2013-06-03 10:52:40 -07:00
fusbh200.h usb host: Faraday USB2.0 FUSBH200-HCD driver 2013-05-17 10:12:52 -07:00
hwa-hc.c HWA: avoid constant suspend and resume on the root hub 2013-08-12 15:41:09 -07:00
imx21-dbg.c
imx21-hcd.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
imx21-hcd.h
isp116x-hcd.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
isp116x.h USB: isp116x: remove dependency on CONFIG_USB_DEBUG 2013-07-23 16:35:17 -07:00
isp1362-hcd.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
isp1362.h USB: isp1362: move debug files from proc to debugfs 2013-07-24 14:43:05 -07:00
isp1760-hcd.c USB: remove remaining instances of USB_SUSPEND 2013-05-15 13:44:44 -04:00
isp1760-hcd.h
isp1760-if.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
Kconfig Remove GENERIC_HARDIRQ config option 2013-09-13 15:09:52 +02:00
Makefile xhci: add traces for debug messages in xhci_address_device() 2013-08-13 16:05:38 -07:00
octeon2-common.c
ohci-at91.c usb: ohci-at91: remove unnecessary dev_set_drvdata() 2013-08-27 21:36:46 -07:00
ohci-da8xx.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
ohci-dbg.c
ohci-ep93xx.c usb: ohci-ep93xx: tidy up driver (*probe) and (*remove) 2013-07-26 13:54:29 -07:00
ohci-exynos.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
ohci-hcd.c USB: ohci_usb warn "irq nobody cared" on shutdown 2013-07-26 13:55:21 -07:00
ohci-hub.c USB: OHCI: prepare to make ohci-hcd a library module 2013-05-30 21:36:03 +09:00
ohci-jz4740.c USB: ohci-jz4740: remove unnecessary platform_set_drvdata() 2013-05-16 17:47:17 -07:00
ohci-mem.c
ohci-nxp.c drivers/usb/host: remove leftover release_mem_region 2013-05-30 21:32:52 +09:00
ohci-octeon.c usb: host: ohci-octeon: Remove redundant platform_set_drvdata() 2013-05-17 10:14:52 -07:00
ohci-omap3.c USB: host: Use usb_hcd_platform_shutdown() wherever possible 2013-07-25 12:01:12 -07:00
ohci-omap.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
ohci-pci.c USB patches for 3.12-rc1 2013-09-03 11:35:32 -07:00
ohci-platform.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
ohci-ppc-of.c USB: host: Use usb_hcd_platform_shutdown() wherever possible 2013-07-25 12:01:12 -07:00
ohci-ps3.c
ohci-pxa27x.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
ohci-q.c USB: OHCI: Generic changes to make ohci-pci a separate driver 2013-05-30 21:36:03 +09:00
ohci-s3c2410.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
ohci-sa1111.c
ohci-sm501.c USB: ohci-sm501: remove unnecessary platform_set_drvdata() 2013-05-16 17:47:18 -07:00
ohci-spear.c Merge 3.10-rc3 into usb-next 2013-05-27 11:00:52 +09:00
ohci-tilegx.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
ohci-tmio.c usb: host: ohci-tmio: Remove redundant platform_set_drvdata() 2013-05-17 10:14:53 -07:00
ohci.h USB: OHCI: add a name for the platform-private field 2013-06-03 11:03:18 -07:00
oxu210hp-hcd.c Merge 3.10-rc3 into usb-next 2013-05-27 11:00:52 +09:00
oxu210hp.h
pci-quirks.c Intel xhci: refactor EHCI/xHCI port switching 2013-07-23 14:50:29 -07:00
pci-quirks.h Merge 3.11-rc3 into usb-next 2013-07-29 07:43:16 -07:00
r8a66597-hcd.c usb: r8a66597-hcd: use platform_{get,set}_drvdata() 2013-08-30 11:11:35 -07:00
r8a66597.h
sl811_cs.c drivers/usb: use module_pcmcia_driver() in pcmcia drivers 2013-03-15 12:26:38 -07:00
sl811-hcd.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
sl811.h USB: sl811: move debug files from proc to debugfs 2013-07-24 14:43:05 -07:00
ssb-hcd.c
u132-hcd.c USB: host: use dev_get_platdata() 2013-07-31 17:53:50 -07:00
uhci-debug.c
uhci-grlib.c USB: host: use platform_{get,set}_drvdata() 2013-05-30 21:32:54 +09:00
uhci-hcd.c
uhci-hcd.h
uhci-hub.c USB: UHCI: fix for suspend of virtual HP controller 2013-05-15 13:41:40 -04:00
uhci-pci.c
uhci-platform.c USB: host: use platform_{get,set}_drvdata() 2013-05-30 21:32:54 +09:00
uhci-q.c USB: fix latency in uhci-hcd and ohci-hcd 2013-05-15 13:42:45 -04:00
xhci-dbg.c xhci: add traces for debug messages in xhci_address_device() 2013-08-13 16:05:38 -07:00
xhci-ext-caps.h xhci: fix port BESL LPM capability checking 2013-08-27 08:54:42 -07:00
xhci-hub.c usb: Fix xHCI host issues on remote wakeup. 2013-09-23 15:43:31 -07:00
xhci-mem.c usb: Fix xHCI host issues on remote wakeup. 2013-09-23 15:43:31 -07:00
xhci-pci.c xhci: add trace for debug messages related to quirks 2013-08-13 16:05:41 -07:00
xhci-plat.c xhci: Step 1 to fix usb-linus and usb-next. 2013-08-15 18:00:46 -07:00
xhci-ring.c usb: Fix xHCI host issues on remote wakeup. 2013-09-23 15:43:31 -07:00
xhci-trace.c xhci: add traces for debug messages in xhci_address_device() 2013-08-13 16:05:38 -07:00
xhci-trace.h xhci: trace debug statements related to ring expansion 2013-08-13 21:14:44 -07:00
xhci.c xhci: Ensure a command structure points to the correct trb on the command ring 2013-09-23 15:43:30 -07:00
xhci.h usb: Fix xHCI host issues on remote wakeup. 2013-09-23 15:43:31 -07:00