aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/pci/pci.c
diff options
context:
space:
mode:
authorRafael J. Wysocki <rafael.j.wysocki@intel.com>2022-05-05 20:14:24 +0200
committerBjorn Helgaas <bhelgaas@google.com>2022-05-05 14:19:49 -0500
commit0ce74a3b9c5255f641842df3c4c14fa8ea049a5a (patch)
treef29f6288d365dbb42feb170b353b252732a7fee5 /drivers/pci/pci.c
parentPCI/PM: Split pci_power_up() (diff)
downloadlinux-dev-0ce74a3b9c5255f641842df3c4c14fa8ea049a5a.tar.xz
linux-dev-0ce74a3b9c5255f641842df3c4c14fa8ea049a5a.zip
PCI/PM: Do not restore BARs if device is not in D0
Do not attempt to restore the device's BARs in pci_set_full_power_state() if the actual current power state of the device is not D0. Link: https://lore.kernel.org/r/1849718.CQOukoFCf9@kreacher Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com> Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
Diffstat (limited to 'drivers/pci/pci.c')
-rw-r--r--drivers/pci/pci.c32
1 files changed, 16 insertions, 16 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 44dcc848ff84..3320453d2691 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -1273,25 +1273,25 @@ static int pci_set_full_power_state(struct pci_dev *dev)
pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);
dev->current_state = pmcsr & PCI_PM_CTRL_STATE_MASK;
- if (dev->current_state != PCI_D0)
+ if (dev->current_state != PCI_D0) {
pci_info_ratelimited(dev, "Refused to change power state from %s to D0\n",
pci_power_name(dev->current_state));
-
- /*
- * According to section 5.4.1 of the "PCI BUS POWER MANAGEMENT
- * INTERFACE SPECIFICATION, REV. 1.2", a device transitioning
- * from D3hot to D0 _may_ perform an internal reset, thereby
- * going to "D0 Uninitialized" rather than "D0 Initialized".
- * For example, at least some versions of the 3c905B and the
- * 3c556B exhibit this behaviour.
- *
- * At least some laptop BIOSen (e.g. the Thinkpad T21) leave
- * devices in a D3hot state at boot. Consequently, we need to
- * restore at least the BARs so that the device will be
- * accessible to its driver.
- */
- if (ret > 0)
+ } else if (ret > 0) {
+ /*
+ * According to section 5.4.1 of the "PCI BUS POWER MANAGEMENT
+ * INTERFACE SPECIFICATION, REV. 1.2", a device transitioning
+ * from D3hot to D0 _may_ perform an internal reset, thereby
+ * going to "D0 Uninitialized" rather than "D0 Initialized".
+ * For example, at least some versions of the 3c905B and the
+ * 3c556B exhibit this behaviour.
+ *
+ * At least some laptop BIOSen (e.g. the Thinkpad T21) leave
+ * devices in a D3hot state at boot. Consequently, we need to
+ * restore at least the BARs so that the device will be
+ * accessible to its driver.
+ */
pci_restore_bars(dev);
+ }
if (dev->bus->self)
pcie_aspm_pm_state_change(dev->bus->self);