Skip to content

Commit

Permalink
PCI PM: Restore config spaces of all devices during early resume
Browse files Browse the repository at this point in the history
At present the configuration spaces of PCI devices that have no
drivers or no PM support in the drivers (either legacy or through a
pm object) are not saved during suspend and, consequently, they are
not restored during resume.  This generally may lead to the state of
the system being slightly inconsistent after the resume, so it's
better to save and restore the configuration spaces of these devices
as well.

Signed-off-by: Rafael J. Wysocki <rjw@sisk.pl>
Acked-by: Ingo Molnar <mingo@elte.hu>
Acked-by: Jesse Barnes <jbarnes@virtuousgeek.org>
  • Loading branch information
rjwysocki committed Mar 30, 2009
1 parent 4a86590 commit 931ff68
Showing 1 changed file with 9 additions and 7 deletions.
16 changes: 9 additions & 7 deletions drivers/pci/pci-driver.c
Expand Up @@ -516,13 +516,13 @@ static int pci_pm_suspend(struct device *dev)
if (pci_has_legacy_pm_support(pci_dev))
return pci_legacy_suspend(dev, PMSG_SUSPEND);

pci_dev->state_saved = false;

if (!pm) {
pci_pm_default_suspend(pci_dev);
goto Fixup;
}

pci_dev->state_saved = false;

if (pm->suspend) {
pci_power_t prev = pci_dev->current_state;
int error;
Expand Down Expand Up @@ -554,8 +554,10 @@ static int pci_pm_suspend_noirq(struct device *dev)
if (pci_has_legacy_pm_support(pci_dev))
return pci_legacy_suspend_late(dev, PMSG_SUSPEND);

if (!pm)
if (!pm) {
pci_save_state(pci_dev);
return 0;
}

if (pm->suspend_noirq) {
pci_power_t prev = pci_dev->current_state;
Expand Down Expand Up @@ -650,13 +652,13 @@ static int pci_pm_freeze(struct device *dev)
if (pci_has_legacy_pm_support(pci_dev))
return pci_legacy_suspend(dev, PMSG_FREEZE);

pci_dev->state_saved = false;

if (!pm) {
pci_pm_default_suspend(pci_dev);
return 0;
}

pci_dev->state_saved = false;

if (pm->freeze) {
int error;

Expand Down Expand Up @@ -738,13 +740,13 @@ static int pci_pm_poweroff(struct device *dev)
if (pci_has_legacy_pm_support(pci_dev))
return pci_legacy_suspend(dev, PMSG_HIBERNATE);

pci_dev->state_saved = false;

if (!pm) {
pci_pm_default_suspend(pci_dev);
goto Fixup;
}

pci_dev->state_saved = false;

if (pm->poweroff) {
int error;

Expand Down

0 comments on commit 931ff68

Please sign in to comment.