PCI/ACPI/PM: Avoid resuming devices that don't signal PME
authorRafael J. Wysocki <rjw@sisk.pl>
Sun, 6 Nov 2011 21:21:46 +0000 (22:21 +0100)
committerJesse Barnes <jbarnes@virtuousgeek.org>
Fri, 6 Jan 2012 20:10:29 +0000 (12:10 -0800)
Modify pci_acpi_wake_dev() to avoid resuming PME-capable devices
whose PME Status bits are not set, which may happen currently if
several devices are associated with the same wakeup GPE and all
of them are notified whenever at least one of them signals PME.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
drivers/pci/pci-acpi.c

index c8e75851a3148538d1b5a18347ec7ac83d1d0f68..060fd22a1103856988d6866b64c4d8e8e3e95a89 100644 (file)
@@ -45,16 +45,20 @@ static void pci_acpi_wake_dev(acpi_handle handle, u32 event, void *context)
 {
        struct pci_dev *pci_dev = context;
 
-       if (event == ACPI_NOTIFY_DEVICE_WAKE && pci_dev) {
+       if (event != ACPI_NOTIFY_DEVICE_WAKE || !pci_dev)
+               return;
+
+       if (!pci_dev->pm_cap || !pci_dev->pme_support
+            || pci_check_pme_status(pci_dev)) {
                if (pci_dev->pme_poll)
                        pci_dev->pme_poll = false;
 
                pci_wakeup_event(pci_dev);
-               pci_check_pme_status(pci_dev);
                pm_runtime_resume(&pci_dev->dev);
-               if (pci_dev->subordinate)
-                       pci_pme_wakeup_bus(pci_dev->subordinate);
        }
+
+       if (pci_dev->subordinate)
+               pci_pme_wakeup_bus(pci_dev->subordinate);
 }
 
 /**