summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorMathias Nyman <mathias.nyman@linux.intel.com>2024-09-05 17:32:59 +0300
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-10-04 16:29:51 +0200
commite29a1f8b74a9ae9c4c70fc4c001b5fed60f7367c (patch)
tree5c021cafb21164c7e5bb7a59194eb8435dbd3d6e /drivers/usb
parentf7ba350f4e7d5020ae1767d71705e61dae6700bc (diff)
downloadlinux-e29a1f8b74a9ae9c4c70fc4c001b5fed60f7367c.tar.gz
linux-e29a1f8b74a9ae9c4c70fc4c001b5fed60f7367c.tar.bz2
linux-e29a1f8b74a9ae9c4c70fc4c001b5fed60f7367c.zip
xhci: Set quirky xHC PCI hosts to D3 _after_ stopping and freeing them.
commit f81dfa3b57c624c56f2bff171c431bc7f5b558f2 upstream. PCI xHC host should be stopped and xhci driver memory freed before putting host to PCI D3 state during PCI remove callback. Hosts with XHCI_SPURIOUS_WAKEUP quirk did this the wrong way around and set the host to D3 before calling usb_hcd_pci_remove(dev), which will access the host to stop it, and then free xhci. Fixes: f1f6d9a8b540 ("xhci: don't dereference a xhci member after removing xhci") Cc: stable@vger.kernel.org Signed-off-by: Mathias Nyman <mathias.nyman@linux.intel.com> Link: https://lore.kernel.org/r/20240905143300.1959279-12-mathias.nyman@linux.intel.com Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/host/xhci-pci.c8
1 files changed, 5 insertions, 3 deletions
diff --git a/drivers/usb/host/xhci-pci.c b/drivers/usb/host/xhci-pci.c
index 6cee705568c2..5c6fb9958211 100644
--- a/drivers/usb/host/xhci-pci.c
+++ b/drivers/usb/host/xhci-pci.c
@@ -721,8 +721,10 @@ put_runtime_pm:
static void xhci_pci_remove(struct pci_dev *dev)
{
struct xhci_hcd *xhci;
+ bool set_power_d3;
xhci = hcd_to_xhci(pci_get_drvdata(dev));
+ set_power_d3 = xhci->quirks & XHCI_SPURIOUS_WAKEUP;
xhci->xhc_state |= XHCI_STATE_REMOVING;
@@ -735,11 +737,11 @@ static void xhci_pci_remove(struct pci_dev *dev)
xhci->shared_hcd = NULL;
}
+ usb_hcd_pci_remove(dev);
+
/* Workaround for spurious wakeups at shutdown with HSW */
- if (xhci->quirks & XHCI_SPURIOUS_WAKEUP)
+ if (set_power_d3)
pci_set_power_state(dev, PCI_D3hot);
-
- usb_hcd_pci_remove(dev);
}
/*