diff options
author | Lukas Wunner <lukas@wunner.de> | 2016-09-06 06:20:46 +0200 |
---|---|---|
committer | Bjorn Helgaas <bhelgaas@google.com> | 2016-09-13 23:00:18 +0200 |
commit | 035ee288ae7ade4152f1c3cf23a587b04fdc526c (patch) | |
tree | 2d628d87296e9c18a1e38b9c5575777e2f6c0da6 /drivers/pci/remove.c | |
parent | PCI: Mark Haswell Power Control Unit as having non-compliant BARs (diff) | |
download | linux-035ee288ae7ade4152f1c3cf23a587b04fdc526c.tar.xz linux-035ee288ae7ade4152f1c3cf23a587b04fdc526c.zip |
PCI: Fix bridge_d3 update on device removal
Starting with v4.8, we allow a PCIe port to runtime suspend to D3hot if the
port itself and its children satisfy a number of conditions. Once a child
is removed, we recheck those conditions in case the removed device was
blocking the port from suspending.
The rechecking needs to happen *after* the device has been removed from the
bus it resides on. Otherwise when walking the port's subordinate bus in
pci_bridge_d3_update(), the device being removed would erroneously still be
taken into account.
However the device is removed from the bus_list in pci_destroy_dev() and we
currently recheck *before* that. Fix it.
Fixes: 9d26d3a8f1b0 ("PCI: Put PCIe ports into D3 during suspend")
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
Acked-by: Rafael J. Wysocki <mika.westerberg@linux.intel.com>
Diffstat (limited to 'drivers/pci/remove.c')
-rw-r--r-- | drivers/pci/remove.c | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/drivers/pci/remove.c b/drivers/pci/remove.c index d1ef7acf6930..f9357e09e9b3 100644 --- a/drivers/pci/remove.c +++ b/drivers/pci/remove.c @@ -40,6 +40,7 @@ static void pci_destroy_dev(struct pci_dev *dev) list_del(&dev->bus_list); up_write(&pci_bus_sem); + pci_bridge_d3_device_removed(dev); pci_free_resources(dev); put_device(&dev->dev); } @@ -96,8 +97,6 @@ static void pci_remove_bus_device(struct pci_dev *dev) dev->subordinate = NULL; } - pci_bridge_d3_device_removed(dev); - pci_destroy_dev(dev); } |