linux/drivers/usb/host
Mathias Nyman 72f68bf5c7 xhci: Fix lost USB 2 remote wake
There's a small window where a USB 2 remote wake may be left unhandled
due to a race between hub thread and xhci port event interrupt handler.

When the resume event is detected in the xhci interrupt handler it kicks
the hub timer, which should move the port from resume to U0 once resume
has been signalled for long enough.

To keep the hub "thread" running we set a bus_state->resuming_ports flag.
This flag makes sure hub timer function kicks itself.

checking this flag was not properly protected by the spinlock. Flag was
copied to a local variable before lock was taken. The local variable was
then checked later with spinlock held.

If interrupt is handled right after copying the flag to the local variable
we end up stopping the hub thread before it can handle the USB 2 resume.

CPU0					CPU1
(hub thread)				(xhci event handler)

xhci_hub_status_data()
status = bus_state->resuming_ports;
					<Interrupt>
					handle_port_status()
					spin_lock()
					bus_state->resuming_ports = 1
					set_flag(HCD_FLAG_POLL_RH)
					spin_unlock()
spin_lock()
if (!status)
  clear_flag(HCD_FLAG_POLL_RH)
spin_unlock()

Fix this by taking the lock a bit earlier so that it covers
the resuming_ports flag copy in the hub thread

Cc: <stable@vger.kernel.org>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Link: https://lore.kernel.org/r/20210715150651.1996099-2-mathias.nyman@linux.intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2021-07-21 09:10:20 +02:00
..
bcma-hcd.c USB: bcma: use module_bcma_driver to simplify the code 2020-09-22 10:37:13 +02:00
ehci-atmel.c
ehci-brcm.c usb: ehci: Add new EHCI driver for Broadcom STB SoC's 2020-05-13 14:28:01 +02:00
ehci-dbg.c usb: host: Use fallthrough pseudo-keyword 2020-07-10 08:55:18 +02:00
ehci-exynos.c usb: host: ehci-exynos: Fix error check in exynos_ehci_probe() 2020-06-18 10:40:57 +02:00
ehci-fsl.c fsl-usb: add need_oc_pp_cycle flag for 85xx also 2021-05-21 14:04:57 +02:00
ehci-fsl.h USB: host: Use the correct style for SPDX License Identifier 2020-04-16 14:32:46 +02:00
ehci-grlib.c
ehci-hcd.c usb: ehci: do not initialise static variables 2021-06-10 19:54:19 +02:00
ehci-hub.c usb: host: move EH SINGLE_STEP_SET_FEATURE implementation to core 2021-05-13 16:01:59 +02:00
ehci-mem.c
ehci-mv.c USB: EHCI: ehci-mv: fix less than zero comparison of an unsigned int 2020-05-19 15:11:43 +02:00
ehci-npcm7xx.c usb/host: ehci-npcm7xx: Use pm_ptr() macro 2020-09-04 16:54:47 +02:00
ehci-omap.c usb: ehci-omap: Fix PM disable depth umbalance in ehci_hcd_omap_probe 2020-12-09 14:33:45 +01:00
ehci-orion.c
ehci-pci.c USB:ehci:fix Kunpeng920 ehci hardware problem 2021-04-10 10:45:38 +02:00
ehci-platform.c usb: host: ehci-platform: add spurious_oc DT support 2021-03-23 12:37:05 +01:00
ehci-pmcmsp.c USB: host: ehci-pmcmsp: Cleanup usb_hcd_msp_remove() 2020-10-28 12:32:26 +01:00
ehci-ppc-of.c
ehci-ps3.c powerpc/ps3: make system bus's remove and shutdown callbacks return void 2020-12-04 01:01:22 +11:00
ehci-q.c usb: host: move EH SINGLE_STEP_SET_FEATURE implementation to core 2021-05-13 16:01:59 +02:00
ehci-sched.c usb: host: ehci-sched: add comment about find_tt() not returning error 2020-10-28 12:21:38 +01:00
ehci-sh.c usb: host: ehci-sh: Remove unused platform data support 2019-12-10 11:34:27 +01:00
ehci-spear.c usb/host: ehci-spear: Use pm_ptr() macro 2020-09-04 16:54:45 +02:00
ehci-st.c
ehci-sysfs.c
ehci-timer.c
ehci-xilinx-of.c
ehci.h usb: ehci: add spurious flag to disable overcurrent checking 2021-03-23 12:36:17 +01:00
fhci-dbg.c
fhci-hcd.c usb: host: fhci-hcd: annotate PIPE_CONTROL switch case with fallthrough 2020-02-19 11:08:52 +01:00
fhci-hub.c
fhci-mem.c
fhci-q.c
fhci-sched.c USB/Thunderbolt patches for 5.9-rc1 2020-08-05 12:13:10 -07:00
fhci-tds.c usb: host: fhci-tds: Remove unused variables 'buf' and 'extra_data' 2020-07-09 17:19:59 +02:00
fhci.h USB: host: Use the correct style for SPDX License Identifier 2020-04-16 14:32:46 +02:00
fotg210-hcd.c USB: fotg210-hcd: remove dentry storage for debugfs file 2021-05-27 09:35:16 +02:00
fotg210.h USB: fotg210-hcd: remove dentry storage for debugfs file 2021-05-27 09:35:16 +02:00
fsl-mph-dr-of.c usb: host: fsl-mph-dr-of: check return of dma_set_mask() 2020-10-28 13:19:31 +01:00
isp116x-hcd.c USB: host: isp116x: remove dentry pointer for debugfs 2021-03-10 09:37:15 +01:00
isp116x.h USB: host: isp116x: remove dentry pointer for debugfs 2021-03-10 09:37:15 +01:00
isp1362-hcd.c USB: host: isp1362: remove dentry pointer for debugfs 2021-03-10 09:37:15 +01:00
isp1362.h USB: host: isp1362: remove dentry pointer for debugfs 2021-03-10 09:37:15 +01:00
Kconfig Revert "usb: host: xhci-plat: Create platform device for onboard hubs in probe()" 2021-06-18 08:37:19 +02:00
Makefile usb: xhci-mtk: support to build xhci-mtk-hcd.ko 2021-03-10 09:37:17 +01:00
max3421-hcd.c sched: Unbreak wakeups 2021-06-18 11:43:06 +02:00
ohci-at91.c usb: hosts: Remove in_interrupt() from comments 2020-10-28 12:32:12 +01:00
ohci-da8xx.c usb: ohci-da8xx: ensure error return on variable error is set 2020-01-08 17:34:18 +01:00
ohci-dbg.c
ohci-exynos.c usb: host: ohci-exynos: Fix error handling in exynos_ohci_probe() 2020-08-27 09:25:58 +02:00
ohci-hcd.c usb: fix a few cases of -Wfallthrough 2020-11-13 15:20:52 +01:00
ohci-hub.c usb: fix a few cases of -Wfallthrough 2020-11-13 15:20:52 +01:00
ohci-mem.c
ohci-nxp.c usb: ohci-nxp: fix use of integer as pointer 2019-11-04 15:50:38 +01:00
ohci-omap.c Merge 5.10-rc7 into usb-next 2020-12-07 10:20:51 +01:00
ohci-pci.c USB: OHCI: remove obsolete FIXME comment 2020-06-19 08:58:44 +02:00
ohci-platform.c usb/ohci-platform: Fix a warning when hibernating 2020-05-18 18:15:39 +02:00
ohci-ppc-of.c
ohci-ps3.c powerpc/ps3: make system bus's remove and shutdown callbacks return void 2020-12-04 01:01:22 +11:00
ohci-pxa27x.c usb: hosts: Remove in_interrupt() from comments 2020-10-28 12:32:12 +01:00
ohci-q.c USB: OHCI: Use fallthrough pseudo-keyword 2020-07-10 08:55:18 +02:00
ohci-s3c2410.c usb: hosts: Remove in_interrupt() from comments 2020-10-28 12:32:12 +01:00
ohci-sa1111.c ARM: 9048/1: sa1111: make sa1111 bus's remove callback return void 2021-02-01 19:42:13 +00:00
ohci-sm501.c USB: ohci-sm501: Add missed iounmap() in remove 2020-06-18 10:42:53 +02:00
ohci-spear.c
ohci-st.c
ohci-tmio.c USB: OHCI: Use fallthrough pseudo-keyword 2020-07-10 08:55:18 +02:00
ohci.h usb: host: ohci: Mark cc_to_error as __maybe_unused 2020-07-03 10:18:40 +02:00
oxu210hp-hcd.c usb: oxu210hp-hcd: Fix memory leak in oxu_create 2020-12-09 15:25:21 +01:00
pci-quirks.c usb: pci-quirks: convert to readl_poll_timeout_atomic() 2020-09-25 16:30:05 +02:00
pci-quirks.h
r8a66597-hcd.c usb: host: r8a66597-hcd: Remove set, then over-written, but never used variable 'tmp' 2020-07-09 17:19:57 +02:00
r8a66597.h USB: host: Use the correct style for SPDX License Identifier 2020-04-16 14:32:46 +02:00
sl811_cs.c usb: host: Mundane spello fix in the file sl811_cs.c 2021-03-18 09:02:27 +01:00
sl811-hcd.c usb: sl811-hcd: improve misleading indentation 2021-03-23 12:38:11 +01:00
sl811.h USB: host: sl811: remove dentry pointer for debugfs 2021-03-10 09:37:15 +01:00
ssb-hcd.c
u132-hcd.c usb: host: u132-hcd: remove redundant continue statements 2021-06-17 15:31:50 +02:00
uhci-debug.c
uhci-grlib.c
uhci-hcd.c USB: host: uhci: remove dentry pointer for debugfs 2021-03-10 09:37:15 +01:00
uhci-hcd.h USB: host: uhci: remove dentry pointer for debugfs 2021-03-10 09:37:15 +01:00
uhci-hub.c
uhci-pci.c usb: hci: add hc_driver as argument for usb_hcd_pci_probe 2020-05-15 15:44:34 +02:00
uhci-platform.c
uhci-q.c
xhci-dbg.c
xhci-dbgcap.c treewide: Use fallthrough pseudo-keyword 2020-08-23 17:36:59 -05:00
xhci-dbgcap.h xhci: dbc: remove tty specific port structure from struct xhci_dbc 2020-07-23 17:05:29 +02:00
xhci-dbgtty.c tty: make tty_operations::chars_in_buffer return uint 2021-05-13 18:29:11 +02:00
xhci-debugfs.c usb: xhci: add debugfs support for ep with stream 2020-09-20 16:18:00 +02:00
xhci-debugfs.h usb: xhci: add debugfs support for ep with stream 2020-09-20 16:18:00 +02:00
xhci-ext-caps.c xhci: ext-caps: Use software node API with the properties 2021-02-05 10:08:19 +01:00
xhci-ext-caps.h usb: xhci: Increase timeout for HC halt 2021-05-13 14:47:36 +02:00
xhci-histb.c xhci: hisilicon: fix refercence leak in xhci_histb_probe 2020-11-13 14:32:43 +01:00
xhci-hub.c xhci: Fix lost USB 2 remote wake 2021-07-21 09:10:20 +02:00
xhci-mem.c xhci: solve a double free problem while doing s4 2021-06-17 17:34:29 +02:00
xhci-mtk-sch.c usb: xhci-mtk: allow multiple Start-Split in a microframe 2021-06-24 14:12:20 +02:00
xhci-mtk.c usb: xhci-mtk: remove unnecessary setting of has_ippc 2021-05-10 16:21:49 +02:00
xhci-mtk.h usb: xhci-mtk: allow multiple Start-Split in a microframe 2021-06-24 14:12:20 +02:00
xhci-mvebu.c usb: host: xhci: mvebu: make USB 3.0 PHY optional for Armada 3720 2021-02-03 11:26:47 +01:00
xhci-mvebu.h usb: host: xhci: mvebu: make USB 3.0 PHY optional for Armada 3720 2021-02-03 11:26:47 +01:00
xhci-pci-renesas.c Revert "usb: renesas-xhci: Fix handling of unknown ROM state" 2021-07-21 08:57:48 +02:00
xhci-pci.c usb: pci-quirks: disable D3cold on xhci suspend for s2idle on AMD Renoir 2021-06-09 10:36:00 +02:00
xhci-pci.h usb: xhci: make symbols static 2020-05-19 14:11:55 +02:00
xhci-plat.c Revert "usb: host: xhci-plat: Create platform device for onboard hubs in probe()" 2021-06-18 08:37:19 +02:00
xhci-plat.h usb: host: xhci: mvebu: make USB 3.0 PHY optional for Armada 3720 2021-02-03 11:26:47 +01:00
xhci-rcar.c usb: xhci-rcar: convert to readl_poll_timeout_atomic() 2020-09-25 16:30:05 +02:00
xhci-rcar.h USB: host: Use the correct style for SPDX License Identifier 2020-04-16 14:32:46 +02:00
xhci-ring.c xhci: Add adaptive interrupt rate for isoch TRBs with XHCI_AVOID_BEI quirk 2021-06-17 17:34:29 +02:00
xhci-tegra.c USB / Thunderbolt patches for 5.14-rc1 2021-07-05 14:16:22 -07:00
xhci-trace.c
xhci-trace.h USB: host: Use the correct style for SPDX License Identifier 2020-04-16 14:32:46 +02:00
xhci.c xhci: remove redundant continue statement 2021-06-21 11:31:35 +02:00
xhci.h Revert "usb: host: xhci-plat: Create platform device for onboard hubs in probe()" 2021-06-18 08:37:19 +02:00