Commit 52ade9b3 authored by Linus Torvalds's avatar Linus Torvalds

Fix ACPI suspend / device suspend ordering problem

In commit e3c7db62 we fixed the resume
ordering, so that the ACPI low-level resume code was called before the
actual driver resume was called. However, that broke the nesting logic
of suspend and resume, and we continued to suspend the devices _after_
we the ACPI device suspend code was called.

That resulted in us saving PCI state for devices that had already been
changed by ACPI, and in some cases disabled entirely (causing the PCI
save_state to be all-ones).  Which in turn caused the wrong state to be
written back on resume.

This moves the ACPI device suspend to after the device model per-device
suspend() calls. This fixes the bogus state save.

Thanks to Lukáš Hejtmánek for testing.
Acked-by: default avatarLukas Hejtmanek <xhejtman@ics.muni.cz>
Acked-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
Cc: Len Brown <len.brown@intel.com>
Cc: Pavel Machek <pavel@ucw.cz>
Cc: Andrew Morton <akpm@linux-foundation.org>
Cc: Greg KH <greg@kroah.com>
Signed-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
parent 7b104bcb
...@@ -97,25 +97,26 @@ static int suspend_prepare(suspend_state_t state) ...@@ -97,25 +97,26 @@ static int suspend_prepare(suspend_state_t state)
} }
} }
if (pm_ops->prepare) {
if ((error = pm_ops->prepare(state)))
goto Thaw;
}
suspend_console(); suspend_console();
error = device_suspend(PMSG_SUSPEND); error = device_suspend(PMSG_SUSPEND);
if (error) { if (error) {
printk(KERN_ERR "Some devices failed to suspend\n"); printk(KERN_ERR "Some devices failed to suspend\n");
goto Resume_devices; goto Resume_console;
} }
if (pm_ops->prepare) {
if ((error = pm_ops->prepare(state)))
goto Resume_devices;
}
error = disable_nonboot_cpus(); error = disable_nonboot_cpus();
if (!error) if (!error)
return 0; return 0;
enable_nonboot_cpus(); enable_nonboot_cpus();
Resume_devices:
pm_finish(state); pm_finish(state);
Resume_devices:
device_resume(); device_resume();
Resume_console:
resume_console(); resume_console();
Thaw: Thaw:
thaw_processes(); thaw_processes();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment