2
0
mirror of https://github.com/edk2-porting/linux-next.git synced 2024-12-27 06:34:11 +08:00
linux-next/drivers/usb
Mathias Nyman 229bc19fd7 xhci: Fix perceived dead host due to runtime suspend race with event handler
Don't rely on event interrupt (EINT) bit alone to detect pending port
change in resume. If no change event is detected the host may be suspended
again, oterwise roothubs are resumed.

There is a lag in xHC setting EINT. If we don't notice the pending change
in resume, and the controller is runtime suspeded again, it causes the
event handler to assume host is dead as it will fail to read xHC registers
once PCI puts the controller to D3 state.

[  268.520969] xhci_hcd: xhci_resume: starting port polling.
[  268.520985] xhci_hcd: xhci_hub_status_data: stopping port polling.
[  268.521030] xhci_hcd: xhci_suspend: stopping port polling.
[  268.521040] xhci_hcd: // Setting command ring address to 0x349bd001
[  268.521139] xhci_hcd: Port Status Change Event for port 3
[  268.521149] xhci_hcd: resume root hub
[  268.521163] xhci_hcd: port resume event for port 3
[  268.521168] xhci_hcd: xHC is not running.
[  268.521174] xhci_hcd: handle_port_status: starting port polling.
[  268.596322] xhci_hcd: xhci_hc_died: xHCI host controller not responding, assume dead

The EINT lag is described in a additional note in xhci specs 4.19.2:

"Due to internal xHC scheduling and system delays, there will be a lag
between a change bit being set and the Port Status Change Event that it
generated being written to the Event Ring. If SW reads the PORTSC and
sees a change bit set, there is no guarantee that the corresponding Port
Status Change Event has already been written into the Event Ring."

Cc: <stable@vger.kernel.org>
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
2018-06-25 21:16:27 +08:00
..
atm USB: atm: fix up some remaining DEVICE_ATTR() usage 2018-01-24 08:49:52 +01:00
c67x00 USB: add SPDX identifiers to all remaining Makefiles 2017-11-07 15:53:48 +01:00
chipidea USB: chipidea: no need to check return value of debugfs_create functions 2018-05-31 12:54:22 +02:00
class usb: usbtmc: Remove rigol_quirk 2018-05-18 15:56:40 +02:00
common usb: common: Small class for USB role switches 2018-03-22 13:40:10 +01:00
core treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
dwc2 dwc2: gadget: Fix ISOC IN DDMA PID bitfield value calculation 2018-06-19 12:48:14 +03:00
dwc3 usb: dwc3: qcom: mark PM functions as __maybe_unused 2018-06-19 12:48:12 +03:00
early usb: early: Correct the endpoint type value for bulk in endpoint 2017-12-07 16:03:15 +01:00
gadget usb: gadget: composite: fix delayed_status race condition when set_interface 2018-06-19 12:48:13 +03:00
host xhci: Fix perceived dead host due to runtime suspend race with event handler 2018-06-25 21:16:27 +08:00
image USB/PHY patches for 4.15-rc1 2017-11-13 21:14:07 -08:00
isp1760 usb: isp1760: Replace mdelay with msleep in isp1760_stop 2018-04-22 15:49:42 +02:00
misc treewide: Use array_size() in vmalloc() 2018-06-12 16:19:22 -07:00
mon treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
mtu3 USB: mtu3: no need to check return value of debugfs_create_dir() 2018-05-31 12:54:21 +02:00
musb USB: musb: clean up debugfs file and directory creation 2018-05-31 12:54:21 +02:00
phy phy: tegra: select USB_COMMON 2018-05-31 12:50:40 +02:00
renesas_usbhs treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
roles usb: roles: intel_xhci: Enable runtime PM 2018-05-24 18:17:00 +02:00
serial treewide: kmalloc() -> kmalloc_array() 2018-06-12 16:19:22 -07:00
storage treewide: kmalloc() -> kmalloc_array() 2018-06-12 16:19:22 -07:00
typec USB: typec: fsusb302: no need to check return value of debugfs_create_dir() 2018-05-31 16:03:59 +02:00
usbip usbip: vhci_sysfs: fix potential Spectre v1 2018-05-24 18:14:28 +02:00
wusbcore treewide: kzalloc() -> kcalloc() 2018-06-12 16:19:22 -07:00
Kconfig usb: select USB_COMMON for usb role switch config 2018-04-22 15:23:37 +02:00
Makefile usb: roles: Add Intel xHCI USB role switch driver 2018-03-22 13:49:27 +01:00
README
usb-skeleton.c usb: usb-skeleton: make MODULE_LICENSE and SPDX tag match 2018-03-06 09:42:07 -08:00

To understand all the Linux-USB framework, you'll use these resources:

    * This source code.  This is necessarily an evolving work, and
      includes kerneldoc that should help you get a current overview.
      ("make pdfdocs", and then look at "usb.pdf" for host side and
      "gadget.pdf" for peripheral side.)  Also, Documentation/usb has
      more information.

    * The USB 2.0 specification (from www.usb.org), with supplements
      such as those for USB OTG and the various device classes.
      The USB specification has a good overview chapter, and USB
      peripherals conform to the widely known "Chapter 9".

    * Chip specifications for USB controllers.  Examples include
      host controllers (on PCs, servers, and more); peripheral
      controllers (in devices with Linux firmware, like printers or
      cell phones); and hard-wired peripherals like Ethernet adapters.

    * Specifications for other protocols implemented by USB peripheral
      functions.  Some are vendor-specific; others are vendor-neutral
      but just standardized outside of the www.usb.org team.

Here is a list of what each subdirectory here is, and what is contained in
them.

core/		- This is for the core USB host code, including the
		  usbfs files and the hub class driver ("hub_wq").

host/		- This is for USB host controller drivers.  This
		  includes UHCI, OHCI, EHCI, and others that might
		  be used with more specialized "embedded" systems.

gadget/		- This is for USB peripheral controller drivers and
		  the various gadget drivers which talk to them.


Individual USB driver directories.  A new driver should be added to the
first subdirectory in the list below that it fits into.

image/		- This is for still image drivers, like scanners or
		  digital cameras.
../input/	- This is for any driver that uses the input subsystem,
		  like keyboard, mice, touchscreens, tablets, etc.
../media/	- This is for multimedia drivers, like video cameras,
		  radios, and any other drivers that talk to the v4l
		  subsystem.
../net/		- This is for network drivers.
serial/		- This is for USB to serial drivers.
storage/	- This is for USB mass-storage drivers.
class/		- This is for all USB device drivers that do not fit
		  into any of the above categories, and work for a range
		  of USB Class specified devices. 
misc/		- This is for all USB device drivers that do not fit
		  into any of the above categories.