|
Takashi Iwai |
b403ad |
From f2c710f7dca8457e88b4ac9de2060f011254f9dd Mon Sep 17 00:00:00 2001
|
|
Takashi Iwai |
b403ad |
From: Henry Lin <henryl@nvidia.com>
|
|
Takashi Iwai |
b403ad |
Date: Wed, 11 Dec 2019 16:20:04 +0200
|
|
Takashi Iwai |
b403ad |
Subject: [PATCH] usb: xhci: only set D3hot for pci device
|
|
Takashi Iwai |
b403ad |
Git-commit: f2c710f7dca8457e88b4ac9de2060f011254f9dd
|
|
Takashi Iwai |
b403ad |
Patch-mainline: v5.5-rc2
|
|
Takashi Iwai |
b403ad |
References: bsc#1051510
|
|
Takashi Iwai |
b403ad |
|
|
Takashi Iwai |
b403ad |
Xhci driver cannot call pci_set_power_state() on non-pci xhci host
|
|
Takashi Iwai |
b403ad |
controllers. For example, NVIDIA Tegra XHCI host controller which acts
|
|
Takashi Iwai |
b403ad |
as platform device with XHCI_SPURIOUS_WAKEUP quirk set in some platform
|
|
Takashi Iwai |
b403ad |
hits this issue during shutdown.
|
|
Takashi Iwai |
b403ad |
|
|
Takashi Iwai |
b403ad |
Cc: <stable@vger.kernel.org>
|
|
Takashi Iwai |
b403ad |
Fixes: 638298dc66ea ("xhci: Fix spurious wakeups after S5 on Haswell")
|
|
Takashi Iwai |
b403ad |
Signed-off-by: Henry Lin <henryl@nvidia.com>
|
|
Takashi Iwai |
b403ad |
Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com>
|
|
Takashi Iwai |
b403ad |
Link: https://lore.kernel.org/r/20191211142007.8847-4-mathias.nyman@linux.intel.com
|
|
Takashi Iwai |
b403ad |
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
|
|
Takashi Iwai |
b403ad |
Acked-by: Takashi Iwai <tiwai@suse.de>
|
|
Takashi Iwai |
b403ad |
|
|
Takashi Iwai |
b403ad |
---
|
|
Takashi Iwai |
b403ad |
drivers/usb/host/xhci-pci.c | 13 +++++++++++++
|
|
Takashi Iwai |
b403ad |
drivers/usb/host/xhci.c | 7 ++-----
|
|
Takashi Iwai |
b403ad |
drivers/usb/host/xhci.h | 1 +
|
|
Takashi Iwai |
b403ad |
3 files changed, 16 insertions(+), 5 deletions(-)
|
|
Takashi Iwai |
b403ad |
|
|
Takashi Iwai |
b403ad |
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
|
|
Takashi Iwai |
b403ad |
index a0025d23b257..2907fe4d78dd 100644
|
|
Takashi Iwai |
b403ad |
--- a/drivers/usb/host/xhci-pci.c
|
|
Takashi Iwai |
b403ad |
+++ b/drivers/usb/host/xhci-pci.c
|
|
Takashi Iwai |
b403ad |
@@ -521,6 +521,18 @@ static int xhci_pci_resume(struct usb_hcd *hcd, bool hibernated)
|
|
Takashi Iwai |
b403ad |
}
|
|
Takashi Iwai |
b403ad |
#endif /* CONFIG_PM */
|
|
Takashi Iwai |
b403ad |
|
|
Takashi Iwai |
b403ad |
+static void xhci_pci_shutdown(struct usb_hcd *hcd)
|
|
Takashi Iwai |
b403ad |
+{
|
|
Takashi Iwai |
b403ad |
+ struct xhci_hcd *xhci = hcd_to_xhci(hcd);
|
|
Takashi Iwai |
b403ad |
+ struct pci_dev *pdev = to_pci_dev(hcd->self.controller);
|
|
Takashi Iwai |
b403ad |
+
|
|
Takashi Iwai |
b403ad |
+ xhci_shutdown(hcd);
|
|
Takashi Iwai |
b403ad |
+
|
|
Takashi Iwai |
b403ad |
+ /* Yet another workaround for spurious wakeups at shutdown with HSW */
|
|
Takashi Iwai |
b403ad |
+ if (xhci->quirks & XHCI_SPURIOUS_WAKEUP)
|
|
Takashi Iwai |
b403ad |
+ pci_set_power_state(pdev, PCI_D3hot);
|
|
Takashi Iwai |
b403ad |
+}
|
|
Takashi Iwai |
b403ad |
+
|
|
Takashi Iwai |
b403ad |
/*-------------------------------------------------------------------------*/
|
|
Takashi Iwai |
b403ad |
|
|
Takashi Iwai |
b403ad |
/* PCI driver selection metadata; PCI hotplugging uses this */
|
|
Takashi Iwai |
b403ad |
@@ -556,6 +568,7 @@ static int __init xhci_pci_init(void)
|
|
Takashi Iwai |
b403ad |
#ifdef CONFIG_PM
|
|
Takashi Iwai |
b403ad |
xhci_pci_hc_driver.pci_suspend = xhci_pci_suspend;
|
|
Takashi Iwai |
b403ad |
xhci_pci_hc_driver.pci_resume = xhci_pci_resume;
|
|
Takashi Iwai |
b403ad |
+ xhci_pci_hc_driver.shutdown = xhci_pci_shutdown;
|
|
Takashi Iwai |
b403ad |
#endif
|
|
Takashi Iwai |
b403ad |
return pci_register_driver(&xhci_pci_driver);
|
|
Takashi Iwai |
b403ad |
}
|
|
Takashi Iwai |
b403ad |
diff --git a/drivers/usb/host/xhci.c b/drivers/usb/host/xhci.c
|
|
Takashi Iwai |
b403ad |
index 6721d059f58a..c5ee562c4c74 100644
|
|
Takashi Iwai |
b403ad |
--- a/drivers/usb/host/xhci.c
|
|
Takashi Iwai |
b403ad |
+++ b/drivers/usb/host/xhci.c
|
|
Takashi Iwai |
b403ad |
@@ -770,7 +770,7 @@ static void xhci_stop(struct usb_hcd *hcd)
|
|
Takashi Iwai |
b403ad |
*
|
|
Takashi Iwai |
b403ad |
* This will only ever be called with the main usb_hcd (the USB3 roothub).
|
|
Takashi Iwai |
b403ad |
*/
|
|
Takashi Iwai |
b403ad |
-static void xhci_shutdown(struct usb_hcd *hcd)
|
|
Takashi Iwai |
b403ad |
+void xhci_shutdown(struct usb_hcd *hcd)
|
|
Takashi Iwai |
b403ad |
{
|
|
Takashi Iwai |
b403ad |
struct xhci_hcd *xhci = hcd_to_xhci(hcd);
|
|
Takashi Iwai |
b403ad |
|
|
Takashi Iwai |
b403ad |
@@ -789,11 +789,8 @@ static void xhci_shutdown(struct usb_hcd *hcd)
|
|
Takashi Iwai |
b403ad |
xhci_dbg_trace(xhci, trace_xhci_dbg_init,
|
|
Takashi Iwai |
b403ad |
"xhci_shutdown completed - status = %x",
|
|
Takashi Iwai |
b403ad |
readl(&xhci->op_regs->status));
|
|
Takashi Iwai |
b403ad |
-
|
|
Takashi Iwai |
b403ad |
- /* Yet another workaround for spurious wakeups at shutdown with HSW */
|
|
Takashi Iwai |
b403ad |
- if (xhci->quirks & XHCI_SPURIOUS_WAKEUP)
|
|
Takashi Iwai |
b403ad |
- pci_set_power_state(to_pci_dev(hcd->self.sysdev), PCI_D3hot);
|
|
Takashi Iwai |
b403ad |
}
|
|
Takashi Iwai |
b403ad |
+EXPORT_SYMBOL_GPL(xhci_shutdown);
|
|
Takashi Iwai |
b403ad |
|
|
Takashi Iwai |
b403ad |
#ifdef CONFIG_PM
|
|
Takashi Iwai |
b403ad |
static void xhci_save_registers(struct xhci_hcd *xhci)
|
|
Takashi Iwai |
b403ad |
diff --git a/drivers/usb/host/xhci.h b/drivers/usb/host/xhci.h
|
|
Takashi Iwai |
b403ad |
index dc6f62a4b197..13d8838cd552 100644
|
|
Takashi Iwai |
b403ad |
--- a/drivers/usb/host/xhci.h
|
|
Takashi Iwai |
b403ad |
+++ b/drivers/usb/host/xhci.h
|
|
Takashi Iwai |
b403ad |
@@ -2050,6 +2050,7 @@ int xhci_start(struct xhci_hcd *xhci);
|
|
Takashi Iwai |
b403ad |
int xhci_reset(struct xhci_hcd *xhci);
|
|
Takashi Iwai |
b403ad |
int xhci_run(struct usb_hcd *hcd);
|
|
Takashi Iwai |
b403ad |
int xhci_gen_setup(struct usb_hcd *hcd, xhci_get_quirks_t get_quirks);
|
|
Takashi Iwai |
b403ad |
+void xhci_shutdown(struct usb_hcd *hcd);
|
|
Takashi Iwai |
b403ad |
void xhci_init_driver(struct hc_driver *drv,
|
|
Takashi Iwai |
b403ad |
const struct xhci_driver_overrides *over);
|
|
Takashi Iwai |
b403ad |
int xhci_disable_slot(struct xhci_hcd *xhci, u32 slot_id);
|
|
Takashi Iwai |
b403ad |
--
|
|
Takashi Iwai |
b403ad |
2.16.4
|
|
Takashi Iwai |
b403ad |
|