diff options
author | Rafael J. Wysocki <rjw@sisk.pl> | 2009-09-08 23:14:49 +0200 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2009-09-09 14:19:11 -0700 |
commit | e80bb09d2c73d76a2a4cd79e4a83802dd901c642 (patch) | |
tree | fff892db62dd092ab8e3d70d19d813d4979a2503 /drivers | |
parent | df8db91fc3b543d373afa61beef35b072eea1368 (diff) |
PCI PM: Introduce device flag wakeup_prepared
Introduce a new PCI device flag, wakeup_prepared, to prevent PCI
wake-up preparation code from being executed twice in a row for the
same device and for the same purpose.
Reviewed-by: Matthew Garrett <mjg59@srcf.ucam.org>
Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Signed-off-by: Jesse Barnes <jbarnes@virtuousgeek.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/pci/pci.c | 8 |
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c index 84a6d6d30c5..dcdfb2212ca 100644 --- a/drivers/pci/pci.c +++ b/drivers/pci/pci.c @@ -1225,6 +1225,10 @@ int pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable) if (enable && !device_may_wakeup(&dev->dev)) return -EINVAL; + /* Don't do the same thing twice in a row for one device. */ + if (!!enable == !!dev->wakeup_prepared) + return 0; + /* * According to "PCI System Architecture" 4th ed. by Tom Shanley & Don * Anderson we should be doing PME# wake enable followed by ACPI wake @@ -1241,9 +1245,12 @@ int pci_enable_wake(struct pci_dev *dev, pci_power_t state, bool enable) error = platform_pci_sleep_wake(dev, true); if (ret) ret = error; + if (!ret) + dev->wakeup_prepared = true; } else { platform_pci_sleep_wake(dev, false); pci_pme_active(dev, false); + dev->wakeup_prepared = false; } return ret; @@ -1365,6 +1372,7 @@ void pci_pm_init(struct pci_dev *dev) int pm; u16 pmc; + dev->wakeup_prepared = false; dev->pm_cap = 0; /* find PCI PM capability in list */ |