From: Greg Kroah-Hartman Date: Mon, 27 Jun 2022 08:23:37 +0000 (+0200) Subject: 5.4-stable patches X-Git-Tag: v5.4.202~39 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cd585a2b88ac5ea0a4e3c62c9afd2da80f7a9957;p=thirdparty%2Fkernel%2Fstable-queue.git 5.4-stable patches added patches: xhci-turn-off-port-power-in-shutdown.patch --- diff --git a/queue-5.4/series b/queue-5.4/series index 6f491efdbd6..2b4f21c11d2 100644 --- a/queue-5.4/series +++ b/queue-5.4/series @@ -33,3 +33,4 @@ revert-net-tls-fix-tls_sk_proto_close-executed-repea.patch gpio-winbond-fix-error-code-in-winbond_gpio_get.patch s390-cpumf-handle-events-cycles-and-instructions-ide.patch iio-adc-vf610-fix-conversion-mode-sysfs-node-name.patch +xhci-turn-off-port-power-in-shutdown.patch diff --git a/queue-5.4/xhci-turn-off-port-power-in-shutdown.patch b/queue-5.4/xhci-turn-off-port-power-in-shutdown.patch new file mode 100644 index 00000000000..92cf6cf5acd --- /dev/null +++ b/queue-5.4/xhci-turn-off-port-power-in-shutdown.patch @@ -0,0 +1,86 @@ +From 83810f84ecf11dfc5a9414a8b762c3501b328185 Mon Sep 17 00:00:00 2001 +From: Mathias Nyman +Date: Thu, 23 Jun 2022 14:19:43 +0300 +Subject: xhci: turn off port power in shutdown + +From: Mathias Nyman + +commit 83810f84ecf11dfc5a9414a8b762c3501b328185 upstream. + +If ports are not turned off in shutdown then runtime suspended +self-powered USB devices may survive in U3 link state over S5. + +During subsequent boot, if firmware sends an IPC command to program +the port in DISCONNECT state, it will time out, causing significant +delay in the boot time. + +Turning off roothub port power is also recommended in xhci +specification 4.19.4 "Port Power" in the additional note. + +Cc: stable@vger.kernel.org +Signed-off-by: Mathias Nyman +Link: https://lore.kernel.org/r/20220623111945.1557702-3-mathias.nyman@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/usb/host/xhci-hub.c | 2 +- + drivers/usb/host/xhci.c | 15 +++++++++++++-- + drivers/usb/host/xhci.h | 2 ++ + 3 files changed, 16 insertions(+), 3 deletions(-) + +--- a/drivers/usb/host/xhci-hub.c ++++ b/drivers/usb/host/xhci-hub.c +@@ -566,7 +566,7 @@ struct xhci_hub *xhci_get_rhub(struct us + * It will release and re-aquire the lock while calling ACPI + * method. + */ +-static void xhci_set_port_power(struct xhci_hcd *xhci, struct usb_hcd *hcd, ++void xhci_set_port_power(struct xhci_hcd *xhci, struct usb_hcd *hcd, + u16 index, bool on, unsigned long *flags) + { + struct xhci_hub *rhub; +--- a/drivers/usb/host/xhci.c ++++ b/drivers/usb/host/xhci.c +@@ -775,6 +775,8 @@ static void xhci_stop(struct usb_hcd *hc + void xhci_shutdown(struct usb_hcd *hcd) + { + struct xhci_hcd *xhci = hcd_to_xhci(hcd); ++ unsigned long flags; ++ int i; + + if (xhci->quirks & XHCI_SPURIOUS_REBOOT) + usb_disable_xhci_ports(to_pci_dev(hcd->self.sysdev)); +@@ -790,12 +792,21 @@ void xhci_shutdown(struct usb_hcd *hcd) + del_timer_sync(&xhci->shared_hcd->rh_timer); + } + +- spin_lock_irq(&xhci->lock); ++ spin_lock_irqsave(&xhci->lock, flags); + xhci_halt(xhci); ++ ++ /* Power off USB2 ports*/ ++ for (i = 0; i < xhci->usb2_rhub.num_ports; i++) ++ xhci_set_port_power(xhci, xhci->main_hcd, i, false, &flags); ++ ++ /* Power off USB3 ports*/ ++ for (i = 0; i < xhci->usb3_rhub.num_ports; i++) ++ xhci_set_port_power(xhci, xhci->shared_hcd, i, false, &flags); ++ + /* Workaround for spurious wakeups at shutdown with HSW */ + if (xhci->quirks & XHCI_SPURIOUS_WAKEUP) + xhci_reset(xhci, XHCI_RESET_SHORT_USEC); +- spin_unlock_irq(&xhci->lock); ++ spin_unlock_irqrestore(&xhci->lock, flags); + + xhci_cleanup_msix(xhci); + +--- a/drivers/usb/host/xhci.h ++++ b/drivers/usb/host/xhci.h +@@ -2155,6 +2155,8 @@ int xhci_hub_control(struct usb_hcd *hcd + int xhci_hub_status_data(struct usb_hcd *hcd, char *buf); + int xhci_find_raw_port_number(struct usb_hcd *hcd, int port1); + struct xhci_hub *xhci_get_rhub(struct usb_hcd *hcd); ++void xhci_set_port_power(struct xhci_hcd *xhci, struct usb_hcd *hcd, u16 index, ++ bool on, unsigned long *flags); + + void xhci_hc_died(struct xhci_hcd *xhci); +