PCI hotplug: clean up acpi_get_hp_params_from_firmware() interface
[safe/jmp/linux-2.6] / drivers / pci / pci.c
index 84a6d6d..6edecff 100644 (file)
@@ -854,6 +854,7 @@ pci_restore_state(struct pci_dev *dev)
 
        if (!dev->state_saved)
                return 0;
+
        /* PCI Express register must be restored first */
        pci_restore_pcie_state(dev);
 
@@ -875,6 +876,8 @@ pci_restore_state(struct pci_dev *dev)
        pci_restore_msi_state(dev);
        pci_restore_iov_state(dev);
 
+       dev->state_saved = false;
+
        return 0;
 }
 
@@ -1225,6 +1228,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 +1248,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 +1375,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 */