aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/pci/pci.c2
-rw-r--r--drivers/pci/pci.h1
-rw-r--r--drivers/pci/pcie/portdrv_pci.c5
3 files changed, 5 insertions, 3 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
index 4a7f6f54d669..720f7e27c3a8 100644
--- a/drivers/pci/pci.c
+++ b/drivers/pci/pci.c
@@ -2230,7 +2230,7 @@ void pci_config_pm_runtime_put(struct pci_dev *pdev)
2230 * This function checks if it is possible to move the bridge to D3. 2230 * This function checks if it is possible to move the bridge to D3.
2231 * Currently we only allow D3 for recent enough PCIe ports. 2231 * Currently we only allow D3 for recent enough PCIe ports.
2232 */ 2232 */
2233static bool pci_bridge_d3_possible(struct pci_dev *bridge) 2233bool pci_bridge_d3_possible(struct pci_dev *bridge)
2234{ 2234{
2235 unsigned int year; 2235 unsigned int year;
2236 2236
diff --git a/drivers/pci/pci.h b/drivers/pci/pci.h
index 27048bb88783..ffffef37ab61 100644
--- a/drivers/pci/pci.h
+++ b/drivers/pci/pci.h
@@ -85,6 +85,7 @@ void pci_pm_init(struct pci_dev *dev);
85void pci_ea_init(struct pci_dev *dev); 85void pci_ea_init(struct pci_dev *dev);
86void pci_allocate_cap_save_buffers(struct pci_dev *dev); 86void pci_allocate_cap_save_buffers(struct pci_dev *dev);
87void pci_free_cap_save_buffers(struct pci_dev *dev); 87void pci_free_cap_save_buffers(struct pci_dev *dev);
88bool pci_bridge_d3_possible(struct pci_dev *dev);
88void pci_bridge_d3_update(struct pci_dev *dev); 89void pci_bridge_d3_update(struct pci_dev *dev);
89 90
90static inline void pci_wakeup_event(struct pci_dev *dev) 91static inline void pci_wakeup_event(struct pci_dev *dev)
diff --git a/drivers/pci/pcie/portdrv_pci.c b/drivers/pci/pcie/portdrv_pci.c
index 79327cc14e7d..1ae712cb22ec 100644
--- a/drivers/pci/pcie/portdrv_pci.c
+++ b/drivers/pci/pcie/portdrv_pci.c
@@ -19,6 +19,7 @@
19#include <linux/dmi.h> 19#include <linux/dmi.h>
20#include <linux/pci-aspm.h> 20#include <linux/pci-aspm.h>
21 21
22#include "../pci.h"
22#include "portdrv.h" 23#include "portdrv.h"
23#include "aer/aerdrv.h" 24#include "aer/aerdrv.h"
24 25
@@ -157,7 +158,7 @@ static int pcie_portdrv_probe(struct pci_dev *dev,
157 * subordinate devices). We can't be sure for native PCIe hotplug 158 * subordinate devices). We can't be sure for native PCIe hotplug
158 * either so prevent that as well. 159 * either so prevent that as well.
159 */ 160 */
160 if (!dev->is_hotplug_bridge) { 161 if (pci_bridge_d3_possible(dev) && !dev->is_hotplug_bridge) {
161 /* 162 /*
162 * Keep the port resumed 100ms to make sure things like 163 * Keep the port resumed 100ms to make sure things like
163 * config space accesses from userspace (lspci) will not 164 * config space accesses from userspace (lspci) will not
@@ -175,7 +176,7 @@ static int pcie_portdrv_probe(struct pci_dev *dev,
175 176
176static void pcie_portdrv_remove(struct pci_dev *dev) 177static void pcie_portdrv_remove(struct pci_dev *dev)
177{ 178{
178 if (!dev->is_hotplug_bridge) { 179 if (pci_bridge_d3_possible(dev) && !dev->is_hotplug_bridge) {
179 pm_runtime_forbid(&dev->dev); 180 pm_runtime_forbid(&dev->dev);
180 pm_runtime_get_noresume(&dev->dev); 181 pm_runtime_get_noresume(&dev->dev);
181 pm_runtime_dont_use_autosuspend(&dev->dev); 182 pm_runtime_dont_use_autosuspend(&dev->dev);