]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 4.19
authorSasha Levin <sashal@kernel.org>
Fri, 25 Jun 2021 11:56:16 +0000 (07:56 -0400)
committerSasha Levin <sashal@kernel.org>
Fri, 25 Jun 2021 11:56:16 +0000 (07:56 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
queue-4.19/revert-pci-pm-do-not-read-power-state-in-pci_enable_.patch [new file with mode: 0644]
queue-4.19/series

diff --git a/queue-4.19/revert-pci-pm-do-not-read-power-state-in-pci_enable_.patch b/queue-4.19/revert-pci-pm-do-not-read-power-state-in-pci_enable_.patch
new file mode 100644 (file)
index 0000000..f71a6f1
--- /dev/null
@@ -0,0 +1,57 @@
+From f7e0975f86aed4fa7c0cefa25d49b0c19c5671ac Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 22 Jun 2021 17:35:18 +0200
+Subject: Revert "PCI: PM: Do not read power state in
+ pci_enable_device_flags()"
+
+From: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+
+[ Upstream commit 4d6035f9bf4ea12776322746a216e856dfe46698 ]
+
+Revert commit 4514d991d992 ("PCI: PM: Do not read power state in
+pci_enable_device_flags()") that is reported to cause PCI device
+initialization issues on some systems.
+
+BugLink: https://bugzilla.kernel.org/show_bug.cgi?id=213481
+Link: https://lore.kernel.org/linux-acpi/YNDoGICcg0V8HhpQ@eldamar.lan
+Reported-by: Michael <phyre@rogers.com>
+Reported-by: Salvatore Bonaccorso <carnil@debian.org>
+Fixes: 4514d991d992 ("PCI: PM: Do not read power state in pci_enable_device_flags()")
+Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/pci.c | 16 +++++++++++++---
+ 1 file changed, 13 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
+index 3d59bbe4a5d5..9ebf32de8575 100644
+--- a/drivers/pci/pci.c
++++ b/drivers/pci/pci.c
+@@ -1585,11 +1585,21 @@ static int pci_enable_device_flags(struct pci_dev *dev, unsigned long flags)
+       int err;
+       int i, bars = 0;
+-      if (atomic_inc_return(&dev->enable_cnt) > 1) {
+-              pci_update_current_state(dev, dev->current_state);
+-              return 0;               /* already enabled */
++      /*
++       * Power state could be unknown at this point, either due to a fresh
++       * boot or a device removal call.  So get the current power state
++       * so that things like MSI message writing will behave as expected
++       * (e.g. if the device really is in D0 at enable time).
++       */
++      if (dev->pm_cap) {
++              u16 pmcsr;
++              pci_read_config_word(dev, dev->pm_cap + PCI_PM_CTRL, &pmcsr);
++              dev->current_state = (pmcsr & PCI_PM_CTRL_STATE_MASK);
+       }
++      if (atomic_inc_return(&dev->enable_cnt) > 1)
++              return 0;               /* already enabled */
++
+       bridge = pci_upstream_bridge(dev);
+       if (bridge)
+               pci_enable_bridge(bridge);
+-- 
+2.30.2
+
index 21352e27c0ebdfc5a86cafcbbd5cc5292cb44a94..9ceceac3c12cacfdd9c45066a11d05efd46e726c 100644 (file)
@@ -86,3 +86,4 @@ drm-radeon-wait-for-moving-fence-after-pinning.patch
 arm-9081-1-fix-gcc-10-thumb2-kernel-regression.patch
 makefile-move-wno-unused-but-set-variable-out-of-gcc-only-block.patch
 mips-generic-update-node-names-to-avoid-unit-addresses.patch
+revert-pci-pm-do-not-read-power-state-in-pci_enable_.patch