linux-uconsole/drivers/usb/host
Wang, Yu 96c734b9c1 xhci: Fix runtime suspended xhci from blocking system suspend.
commit d6236f6d1d upstream.

The system suspend flow as following:
1, Freeze all user processes and kenrel threads.

2, Try to suspend all devices.

2.1, If pci device is in RPM suspended state, then pci driver will try
to resume it to RPM active state in the prepare stage.

2.2, xhci_resume function calls usb_hcd_resume_root_hub to queue two
workqueue items to resume usb2&usb3 roothub devices.

2.3, Call suspend callbacks of devices.

2.3.1, All suspend callbacks of all hcd's children, including
roothub devices are called.

2.3.2, Finally, hcd_pci_suspend callback is called.

Due to workqueue threads were already frozen in step 1, the workqueue
items can't be scheduled, and the roothub devices can't be resumed in
this flow. The HCD_FLAG_WAKEUP_PENDING flag which is set in
usb_hcd_resume_root_hub won't be cleared. Finally,
hcd_pci_suspend will return -EBUSY, and system suspend fails.

The reason why this issue doesn't show up very often is due to that
choose_wakeup will be called in step 2.3.1. In step 2.3.1, if
udev->do_remote_wakeup is not equal to device_may_wakeup(&udev->dev), then
udev will resume to RPM active for changing the wakeup settings. This
has been a lucky hit which hides this issue.

For some special xHCI controllers which have no USB2 port, then roothub
will not match hub driver due to probe failed. Then its
do_remote_wakeup will be set to zero, and we won't be as lucky.

xhci driver doesn't need to resume roothub devices everytime like in
the above case. It's only needed when there are pending event TRBs.

This patch should be back-ported to kernels as old as 3.2, that
contains the commit f69e3120df
"USB: XHCI: resume root hubs when the controller resumes"

Signed-off-by: Wang, Yu <yu.y.wang@intel.com>
Acked-by: Alan Stern <stern@rowland.harvard.edu>
[use readl() instead of removed xhci_readl(), reword commit message -Mathias]
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2014-07-09 11:13:59 -07:00
..
whci USB: whci-hcd: fix NULL dereference on allocation failure 2012-08-15 15:17:39 -07:00
bcma-hcd.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
ehci-atmel.c USB: set device dma_mask without reference to global data 2013-05-16 17:30:52 -07:00
ehci-dbg.c USB: EHCI: convert singly-linked lists to list_heads 2013-03-25 13:35:05 -07:00
ehci-fsl.c fsl-usb: do not test for PHY_CLK_VALID bit on controller version 1.6 2014-06-07 13:25:32 -07:00
ehci-fsl.h powerpc/usb: fix bug of CPU hang when missing USB PHY clock 2012-09-05 16:52:08 -07:00
ehci-grlib.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ehci-hcd.c usb: ehci: fix deadlock when threadirqs option is used 2014-03-06 21:30:10 -08:00
ehci-hub.c USB: EHCI: Fix resume signalling on remote wakeup 2013-08-04 16:50:46 +08:00
ehci-mem.c USB: EHCI: use hrtimer for (s)iTD deallocation 2012-07-16 16:54:25 -07:00
ehci-msm.c USB: EHCI: make ehci-msm a separate driver 2013-04-08 09:40:20 -07:00
ehci-mv.c usb: patches for v3.10 merge window 2013-04-05 15:18:00 -07:00
ehci-mxc.c usb: ehci-mxc: check for pdata before dereferencing 2013-09-26 17:18:06 -07:00
ehci-octeon.c USB: EHCI: remove ehci_port_power() routine 2012-10-31 12:48:07 -07:00
ehci-omap.c USB: ehci-omap: Tweak PHY initialization sequence 2013-07-21 18:21:24 -07:00
ehci-orion.c USB: set device dma_mask without reference to global data 2013-05-16 17:30:52 -07:00
ehci-pci.c USB: fix PM config symbol in uhci-hcd, ehci-hcd, and xhci-hcd 2013-10-05 07:13:10 -07:00
ehci-platform.c USB: Fix initconst in ehci driver 2013-04-23 10:10:29 -07:00
ehci-pmcmsp.c USB: EHCI: remove ehci_port_power() routine 2012-10-31 12:48:07 -07:00
ehci-ppc-of.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ehci-ps3.c usb: PS3 EHCI remove unneeded ehci_shutdown 2013-04-01 12:32:43 -07:00
ehci-q.c usb: ehci: mark unlink_empty_async_suspended() as __maybe_unused 2013-03-28 14:49:53 -07:00
ehci-s5p.c usb: ehci-s5p: fix memleak when fallback to pdata 2013-05-16 17:35:13 -07:00
ehci-sched.c USB: EHCI: accept very late isochronous URBs 2013-08-20 08:43:04 -07:00
ehci-sead3.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ehci-sh.c usb: echi-sh: Remove driver variable which is not used 2013-03-28 11:14:47 -07:00
ehci-spear.c USB: set device dma_mask without reference to global data 2013-05-16 17:30:52 -07:00
ehci-sysfs.c
ehci-tegra.c USB: set device dma_mask without reference to global data 2013-05-16 17:30:52 -07:00
ehci-tilegx.c usb: tilegx: fix memleak when create hcd fail 2013-05-09 13:56:40 -04:00
ehci-timer.c USB: EHCI: improve end_unlink_async() 2013-03-25 13:36:32 -07:00
ehci-w90x900.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
ehci-xilinx-of.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ehci.h usb: ehci: add freescale imx28 special write register method 2014-02-06 11:08:13 -08:00
fhci-dbg.c USB: FHCI: Reusing QUICC Engine USB Controller registers from immap_qe.h 2012-06-26 19:42:11 -07:00
fhci-hcd.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
fhci-hub.c USB: FHCI: Reusing QUICC Engine USB Controller registers from immap_qe.h 2012-06-26 19:42:11 -07:00
fhci-mem.c
fhci-q.c
fhci-sched.c USB: FHCI: use list_move_tail instead of list_del/list_add_tail 2012-09-05 16:55:18 -07:00
fhci-tds.c USB: FHCI: Reusing QUICC Engine USB Controller registers from immap_qe.h 2012-06-26 19:42:11 -07:00
fhci.h USB: FHCI: Reusing QUICC Engine USB Controller registers from immap_qe.h 2012-06-26 19:42:11 -07:00
fsl-mph-dr-of.c USB: fsl-mph-dr-of: fix regression on mpc5121e 2013-01-11 16:01:06 -08:00
hwa-hc.c
imx21-dbg.c
imx21-hcd.c usb: imx21-hcd: Include missing linux/module.h 2013-01-11 12:01:09 -08:00
imx21-hcd.h ARM: imx: move platform_data definitions 2012-09-14 11:17:21 +02:00
isp116x-hcd.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
isp116x.h
isp1362-hcd.c procfs: new helper - PDE_DATA(inode) 2013-04-09 14:13:32 -04:00
isp1362.h
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: isp1760-if: fix memleak when platform_get_resource fail 2013-05-16 17:35:13 -07:00
Kconfig USB: fix Kconfig logic for USB_UHCI_HCD 2013-05-15 13:41:39 -04:00
Makefile USB: EHCI: make ehci-msm a separate driver 2013-04-08 09:40:20 -07:00
octeon2-common.c
ohci-at91.c USB: set device dma_mask without reference to global data 2013-05-16 17:30:52 -07:00
ohci-da8xx.c ARM: davinci: move platform_data definitions 2012-09-14 11:16:54 +02:00
ohci-dbg.c
ohci-ep93xx.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
ohci-exynos.c USB: set device dma_mask without reference to global data 2013-05-16 17:30:52 -07:00
ohci-hcd.c USB: OHCI: accept very late isochronous URBs 2013-10-05 07:13:11 -07:00
ohci-hub.c USB: OHCI: fix problem with global suspend on ATI controllers 2014-06-07 13:25:32 -07:00
ohci-jz4740.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
ohci-mem.c
ohci-nxp.c USB fixes for 3.10-rc2 2013-05-23 09:23:32 -07:00
ohci-octeon.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
ohci-omap.c ARM: arm-soc: Header cleanups 2012-12-12 11:45:16 -08:00
ohci-omap3.c USB: set device dma_mask without reference to global data 2013-05-16 17:30:52 -07:00
ohci-pci.c USB: OHCI: fix problem with global suspend on ATI controllers 2014-06-07 13:25:32 -07:00
ohci-platform.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ohci-ppc-of.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
ohci-ps3.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
ohci-pxa27x.c USB: set device dma_mask without reference to global data 2013-05-16 17:30:52 -07:00
ohci-q.c USB: OHCI: accept very late isochronous URBs 2013-10-05 07:13:11 -07:00
ohci-s3c2410.c usb: Convert to devm_ioremap_resource() 2013-01-22 11:41:58 -08:00
ohci-sa1111.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
ohci-sm501.c USB: OHCI: sm501: fix build failure after ohci_finish_controller_resume removal 2012-10-23 10:18:53 -07:00
ohci-spear.c USB: set device dma_mask without reference to global data 2013-05-16 17:30:52 -07:00
ohci-tilegx.c usb: tilegx: fix memleak when create hcd fail 2013-05-09 13:56:40 -04:00
ohci-tmio.c usb: host: ohci-tmio: fix compile warning 2013-01-11 16:22:53 -08:00
ohci.h USB: OHCI: fix problem with global suspend on ATI controllers 2014-06-07 13:25:32 -07:00
oxu210hp-hcd.c USB: remove remaining instances of USB_SUSPEND 2013-05-15 13:44:44 -04:00
oxu210hp.h
pci-quirks.c USB: EHCI: avoid BIOS handover on the HASEE E200 2014-06-30 20:09:41 -07:00
pci-quirks.h usb: host: xhci: fix compilation error for non-PCI based stacks 2012-09-05 12:26:11 -07:00
r8a66597-hcd.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
r8a66597.h usb/host/r8a66597: remove conditional compilation of clk code 2012-07-30 17:25:12 -07:00
sl811-hcd.c USB: remove remaining instances of USB_SUSPEND 2013-05-15 13:44:44 -04:00
sl811.h
sl811_cs.c drivers/usb: use module_pcmcia_driver() in pcmcia drivers 2013-03-15 12:26:38 -07:00
ssb-hcd.c usb: remove use of __devexit 2012-11-21 13:27:17 -08:00
u132-hcd.c USB: remove CONFIG_USB_SUSPEND option 2013-03-28 11:10:22 -07:00
uhci-debug.c USB: uhci: beautify source code 2013-01-24 13:59:26 -08:00
uhci-grlib.c usb: remove use of __devinit 2012-11-21 13:27:16 -08:00
uhci-hcd.c Merge 3.8-rc5 into usb-next 2013-01-25 12:41:02 -08:00
uhci-hcd.h USB: UHCI: remove unused definition 2013-01-24 13:42:09 -08:00
uhci-hub.c USB: UHCI: fix for suspend of virtual HP controller 2013-05-15 13:41:40 -04:00
uhci-pci.c USB: fix PM config symbol in uhci-hcd, ehci-hcd, and xhci-hcd 2013-10-05 07:13:10 -07:00
uhci-platform.c USB: set device dma_mask without reference to global data 2013-05-16 17:30:52 -07:00
uhci-q.c USB: UHCI: accept very late isochronous URBs 2013-10-05 07:13:11 -07:00
xhci-dbg.c xhci: trivial: Remove assigned but unused slot_ctx. 2012-10-25 13:13:48 -07:00
xhci-ext-caps.h
xhci-hub.c xhci: Ensure a command structure points to the correct trb on the command ring 2013-10-05 07:13:10 -07:00
xhci-mem.c xhci: delete endpoints from bandwidth list before freeing whole device 2014-06-11 12:03:24 -07:00
xhci-pci.c xhci: extend quirk for Renesas cards 2014-05-06 07:55:31 -07:00
xhci-plat.c xhci-plat: Don't enable legacy PCI interrupts. 2013-09-26 17:18:04 -07:00
xhci-ring.c xhci: correct burst count field for isoc transfers on 1.0 xhci hosts 2014-07-09 11:13:59 -07:00
xhci.c xhci: Fix runtime suspended xhci from blocking system suspend. 2014-07-09 11:13:59 -07:00
xhci.h xhci: Ensure a command structure points to the correct trb on the command ring 2013-10-05 07:13:10 -07:00