diff options
| -rw-r--r-- | drivers/pci/pci.c | 2 | ||||
| -rw-r--r-- | drivers/pci/pci.h | 1 | ||||
| -rw-r--r-- | drivers/pci/pcie/portdrv_pci.c | 5 |
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 | */ |
| 2233 | static bool pci_bridge_d3_possible(struct pci_dev *bridge) | 2233 | bool 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); | |||
| 85 | void pci_ea_init(struct pci_dev *dev); | 85 | void pci_ea_init(struct pci_dev *dev); |
| 86 | void pci_allocate_cap_save_buffers(struct pci_dev *dev); | 86 | void pci_allocate_cap_save_buffers(struct pci_dev *dev); |
| 87 | void pci_free_cap_save_buffers(struct pci_dev *dev); | 87 | void pci_free_cap_save_buffers(struct pci_dev *dev); |
| 88 | bool pci_bridge_d3_possible(struct pci_dev *dev); | ||
| 88 | void pci_bridge_d3_update(struct pci_dev *dev); | 89 | void pci_bridge_d3_update(struct pci_dev *dev); |
| 89 | 90 | ||
| 90 | static inline void pci_wakeup_event(struct pci_dev *dev) | 91 | static 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 | ||
| 176 | static void pcie_portdrv_remove(struct pci_dev *dev) | 177 | static 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); |
