--- drivers/pci/pci-driver.c | 7 ++++++- drivers/pci/pci.c | 8 ++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) Index: linux-2.6/drivers/pci/pci.c =================================================================== --- linux-2.6.orig/drivers/pci/pci.c +++ linux-2.6/drivers/pci/pci.c @@ -1393,11 +1393,15 @@ int pci_restore_standard_config(struct p pci_power_t prev_state; int error; - pci_update_current_state(dev, PCI_D0); + pci_update_current_state(dev, PCI_UNKNOWN); prev_state = dev->current_state; - if (prev_state == PCI_D0) + switch (prev_state) { + case PCI_UNKNOWN: + return 0; + case PCI_D0: goto Restore; + } error = pci_raw_set_power_state(dev, PCI_D0, false); if (error) Index: linux-2.6/drivers/pci/pci-driver.c =================================================================== --- linux-2.6.orig/drivers/pci/pci-driver.c +++ linux-2.6/drivers/pci/pci-driver.c @@ -428,8 +428,13 @@ static int pci_pm_default_resume(struct { pci_fixup_device(pci_fixup_resume, pci_dev); - if (!pci_is_bridge(pci_dev)) + if (!pci_is_bridge(pci_dev)) { + if (pci_dev->current_state == PCI_UNKNOWN) { + pci_set_power_state(pci_dev, PCI_D0); + pci_restore_state(pci_dev); + } pci_enable_wake(pci_dev, PCI_D0, false); + } return pci_pm_reenable_device(pci_dev); }