Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

xhci: Don't prevent USB2 bus suspend in state check intended for USB3 only

The code to prevent a bus suspend if a USB3 port was still in link training
also reacted to USB2 port polling state.
This caused bus suspend to busyloop in some cases.
USB2 polling state is different from USB3, and should not prevent bus
suspend.

Limit the USB3 link training state check to USB3 root hub ports only.
The origial commit went to stable so this need to be applied there as well

Fixes: 2f31a67f01a8 ("usb: xhci: Prevent bus suspend if a port connect change or polling state is detected")
Cc: stable@vger.kernel.org
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Mathias Nyman and committed by
Greg Kroah-Hartman
45f750c1 40e020c1

+2 -1
+2 -1
drivers/usb/host/xhci-hub.c
··· 1507 1507 portsc_buf[port_index] = 0; 1508 1508 1509 1509 /* Bail out if a USB3 port has a new device in link training */ 1510 - if ((t1 & PORT_PLS_MASK) == XDEV_POLLING) { 1510 + if ((hcd->speed >= HCD_USB3) && 1511 + (t1 & PORT_PLS_MASK) == XDEV_POLLING) { 1511 1512 bus_state->bus_suspended = 0; 1512 1513 spin_unlock_irqrestore(&xhci->lock, flags); 1513 1514 xhci_dbg(xhci, "Bus suspend bailout, port in polling\n");