|
@@ -724,9 +724,6 @@ static void __pci_disable_link_state(struct pci_dev *pdev, int state, bool sem,
|
|
|
struct pci_dev *parent = pdev->bus->self;
|
|
|
struct pcie_link_state *link;
|
|
|
|
|
|
- if (aspm_disabled && !force)
|
|
|
- return;
|
|
|
-
|
|
|
if (!pci_is_pcie(pdev))
|
|
|
return;
|
|
|
|
|
@@ -736,6 +733,19 @@ static void __pci_disable_link_state(struct pci_dev *pdev, int state, bool sem,
|
|
|
if (!parent || !parent->link_state)
|
|
|
return;
|
|
|
|
|
|
+ /*
|
|
|
+ * A driver requested that ASPM be disabled on this device, but
|
|
|
+ * if we don't have permission to manage ASPM (e.g., on ACPI
|
|
|
+ * systems we have to observe the FADT ACPI_FADT_NO_ASPM bit and
|
|
|
+ * the _OSC method), we can't honor that request. Windows has
|
|
|
+ * a similar mechanism using "PciASPMOptOut", which is also
|
|
|
+ * ignored in this situation.
|
|
|
+ */
|
|
|
+ if (aspm_disabled && !force) {
|
|
|
+ dev_warn(&pdev->dev, "can't disable ASPM; OS doesn't have ASPM control\n");
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
if (sem)
|
|
|
down_read(&pci_bus_sem);
|
|
|
mutex_lock(&aspm_lock);
|