* PATCH: Call acpi_leave_sleep_state before resuming devices
@ 2005-01-25 19:36 Stefan Dösinger
[not found] ` <200501252036.32045.stefandoesinger-RbZlAiThDcE@public.gmane.org>
0 siblings, 1 reply; 5+ messages in thread
From: Stefan Dösinger @ 2005-01-25 19:36 UTC (permalink / raw)
To: Brown, Len; +Cc: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, Andrew Morton
[-- Attachment #1: Type: text/plain, Size: 1131 bytes --]
Hello,
The attached patch introduces 2 new suspend/resume functions, pm_ops->setup
and pm_ops->leave. These are used to correct the order of suspending/resuming
devices and calling acpi functions.
Some notebooks, like my Acer Travelmate 800 and the Samsung P3 notebook have
big resume problems which are solved by calling acpi_leave_sleep_state before
resuming the devices. I fix this by introducing a new function,
acpi_pm_leave, which is called before devices are resumed which calls
acpi_leave_sleep_state and disables the wakeup devices(yes, this was the
resume-finish-split patch). Shaohua also sugested that _PTS should be called
after suspending devices, so I created acpi_pm_setup and moved the content of
acpi_pm_prepare there.
There are now 5 suspend/resume functions:
prepare: It's called before devices are suspended
setup: Called after device suspend but before finally going to sleep
enter: Last suspend function
leave: Called before devices are beeing resumed
finish: Last function, called after device resume
Acked-by: Pavel Machek
Signed-off-by: Stefan Dösinger
Stefan
[-- Attachment #2: suspend.diff --]
[-- Type: text/x-diff, Size: 2994 bytes --]
--- linux-2.6.9/include/linux/pm.h 2005-01-20 14:04:54.248337144 +0100
+++ include/linux/pm.h 2005-01-20 14:03:12.000000000 +0100
@@ -206,9 +206,11 @@
struct pm_ops {
suspend_disk_method_t pm_disk_mode;
- int (*prepare)(suspend_state_t state);
- int (*enter)(suspend_state_t state);
- int (*finish)(suspend_state_t state);
+ int (*prepare)(suspend_state_t state); /*Called before suspending devices*/
+ int (*setup)(suspend_state_t state); /*Called after device suspend*/
+ int (*enter)(suspend_state_t state); /*To Finally enter the sleep state*/
+ int (*leave)(suspend_state_t state); /*Before device wakeup*/
+ int (*finish)(suspend_state_t state); /*After device wakeup*/
};
extern void pm_set_ops(struct pm_ops *);
--- linux-2.6.9/kernel/power/main.c 2005-01-20 14:04:54.463304464 +0100
+++ kernel/power/main.c 2005-01-20 14:10:36.499307088 +0100
@@ -67,6 +67,12 @@
if ((error = device_suspend(state)))
goto Finish;
+
+ if (pm_ops->setup) {
+ if ((error = pm_ops->setup(state)))
+ goto Finish;
+ }
+
return 0;
Finish:
if (pm_ops->finish)
@@ -104,6 +110,8 @@
static void suspend_finish(suspend_state_t state)
{
+ if (pm_ops && pm_ops->leave)
+ pm_ops->leave(state);
device_resume();
if (pm_ops && pm_ops->finish)
pm_ops->finish(state);
--- linux-2.6.9/drivers/acpi/sleep/main.c 2005-01-20 14:04:47.382380928 +0100
+++ drivers/acpi/sleep/main.c 2005-01-20 14:12:29.234168784 +0100
@@ -36,7 +36,7 @@
static int init_8259A_after_S1;
/**
- * acpi_pm_prepare - Do preliminary suspend work.
+ * acpi_pm_setup - Do preliminary suspend work.
* @pm_state: suspend state we're entering.
*
* Make sure we support the state. If we do, and we need it, set the
@@ -44,7 +44,7 @@
* wakeup code to the waking vector.
*/
-static int acpi_pm_prepare(suspend_state_t pm_state)
+static int acpi_pm_setup(suspend_state_t pm_state)
{
u32 acpi_state = acpi_suspend_states[pm_state];
@@ -130,7 +130,23 @@
return ACPI_SUCCESS(status) ? 0 : -EFAULT;
}
+/**
+ * acpi_pm_leave - Make system ready to resume devices.
+ * @pm_state: State we're coming out of.
+ *
+ * This is called after we wake back up and before device
+ * resume methods are called.
+ */
+static int acpi_pm_leave(suspend_state_t pm_state)
+{
+ u32 acpi_state = acpi_suspend_states[pm_state];
+
+ acpi_leave_sleep_state(acpi_state);
+ acpi_disable_wakeup_device(acpi_state);
+
+ return 0;
+}
/**
* acpi_pm_finish - Finish up suspend sequence.
* @pm_state: State we're coming out of.
@@ -143,9 +159,6 @@
{
u32 acpi_state = acpi_suspend_states[pm_state];
- acpi_leave_sleep_state(acpi_state);
- acpi_disable_wakeup_device(acpi_state);
-
/* reset firmware waking vector */
acpi_set_firmware_waking_vector((acpi_physical_address) 0);
@@ -171,8 +184,10 @@
}
static struct pm_ops acpi_pm_ops = {
- .prepare = acpi_pm_prepare,
+ .prepare = NULL,
+ .setup = acpi_pm_setup,
.enter = acpi_pm_enter,
+ .leave = acpi_pm_leave,
.finish = acpi_pm_finish,
};
^ permalink raw reply [flat|nested] 5+ messages in thread* RE: PATCH: Call acpi_leave_sleep_state before resuming devices
@ 2005-01-10 2:19 Li, Shaohua
0 siblings, 0 replies; 5+ messages in thread
From: Li, Shaohua @ 2005-01-10 2:19 UTC (permalink / raw)
To: Stefan D?singer, acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Cc: Pavel Machek, Brown, Len, Carl-Daniel Hailfinger, Johan Vromans
>
>Here's again the resume-finish-split patch, this time CC-ed to Len.
>
>This patch splits up acpi_pm_leave. It introduces acpi_pm_leave which
calls
>acpi_leave_sleep_state and acpi_disable_wakeup_device before resuming
the
>devices. This improves S3 resume on an Acer Travelmate 800 and on the
>Samsung
>P3 notebook.
>
>Some archive references:
>http://sourceforge.net/mailarchive/message.php?msg_id=9091506
>http://sourceforge.net/mailarchive/message.php?msg_id=10315947
>
>The background is that any write access to the pci config registers of
some
>devices(sound card, usb 2.0 controler, and modem) cause a system lockup
if
>they are called before acpi_leave_sleep_state and
>acpi_disable_wakeup_device
>were called. This is on an Acer Travelmate 803 Notebook, and it seems
to be
>the same on other systems.
>
>I sent the patch to the list, but it seems that nobody noticed it and I
>forgot
>to send it again. Here is an updated patch against 2.6.10. I can't
promise
>that it doesn't break other systems. Someone should make sure that
>pm_ops->leave is set to NULL for apm. I haven't found this in the apm
code
>yet.
ACPI spec also said _PTS (in 'acpi_enter_sleep_state_prep') should be
called after all devices are suspend (ACPI sepc 3.0 P401), could you
please also change the order of device suspend and
'acpi_enter_sleep_state_prep'?
Thanks,
Shaohua
-------------------------------------------------------
The SF.Net email is sponsored by: Beat the post-holiday blues
Get a FREE limited edition SourceForge.net t-shirt from ThinkGeek.
It's fun and FREE -- well, almost....http://www.thinkgeek.com/sfshirt
^ permalink raw reply [flat|nested] 5+ messages in thread
* Samsung P35 and S3 suspend
@ 2004-12-15 4:55 Carl-Daniel Hailfinger
2004-12-26 14:43 ` Stefan Dösinger
0 siblings, 1 reply; 5+ messages in thread
From: Carl-Daniel Hailfinger @ 2004-12-15 4:55 UTC (permalink / raw)
To: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Cc: Oliver Dawid, Matthias Hentges, Stefan Dösinger
Hi,
after having read what I believe to be all available information
about getting my Samsung P35 to resume properly from S3, having
tried dozens of patches, recompiled the kernel at least 20 times,
I hope that someone can shed some light on my failure to resume.
Every time I resume from S3 everything is dead. Keyboard, network,
serial port, you name it. Unloading modules doesn't help. Booting
with init=/bin/bash (to avoid loading any modules) doesn't help.
Booting a kernel without framebuffer support doesn't help.
Applying pci-resume-2.6.9.patch doesn't help. Loading a fixed
DSDT doesn't help. Combinations of all of the above don't work
either.
Right now I would be happy if at least the keyboard or network
would work, giving me a chance to shutdown the machine properly.
I'm not demanding a howto or something like that, only a few
hints where to look for improvement. For example, I could not
find the "old style resume" patch Oliver mentioned.
My current base is 2.6.10-rc3-bk8, but I'm willing to test any
2.6.x kernel with any patches and any .config you throw at me.
Thanks for your help!
Carl-Daniel
-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://productguide.itmanagersjournal.com/
^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: Re: Samsung P35 and S3 suspend
@ 2004-12-26 14:43 ` Stefan Dösinger
[not found] ` <20041226194039.GC1739@elf.ucw.cz>
0 siblings, 1 reply; 5+ messages in thread
From: Stefan Dösinger @ 2004-12-26 14:43 UTC (permalink / raw)
To: acpi-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f
Cc: Carl-Daniel Hailfinger, Johan Vromans, Pavel Machek
[-- Attachment #1: Type: text/plain, Size: 1274 bytes --]
> > >>- pci-resume-2.6.10.patch and resume-finish-split-2.6.10.patch
> > >> are applied
> > >
> > > Excuse my ignorance, but where can I get these patches?
> > >
> > >From my local harddisk ;-)
> >
> > Actually, you only need resume-finish-split-2.6.10.patch, the other
> > patch did not have any effect in my testing. Patch attached.
>
> The patch actually looks good, are you going to submit it?
> Pavel
I think this is the patch I sent to this list a few months ago. Here the
archive linksfor reference:
http://sourceforge.net/mailarchive/message.php?msg_id=9091506
The background is that any write access to the pci config registers of some
devices(sound card, usb 2.0 controler, and modem) cause a system lockup if
they are called before acpi_leave_sleep_state and acpi_disable_wakeup_device
were called. This is on an Acer Travelmate 803 Notebook, and it seems to be
the same on other systems.
I sent the patch to the list, but it seems that nobody noticed it and I forgot
to send it again. Here is an updated patch against 2.6.10. I can't promise
that it doesn't break other systems. Someone should make sure that
pm_ops->leave is set to NULL for apm. I haven't found this in the apm code
yet.
Stefan Dösinger
[-- Attachment #2: resume-finish-split.patch --]
[-- Type: text/x-diff, Size: 1855 bytes --]
--- linux-2.6.10/include/linux/pm.h 2004-12-26 15:25:39.639998872 +0100
+++ include/linux/pm.h 2004-12-26 15:27:10.885127504 +0100
@@ -208,6 +208,7 @@
suspend_disk_method_t pm_disk_mode;
int (*prepare)(suspend_state_t state);
int (*enter)(suspend_state_t state);
+ int (*leave)(suspend_state_t state);
int (*finish)(suspend_state_t state);
};
--- linux-2.6.10/kernel/power/main.c 2004-12-26 15:25:54.377758392 +0100
+++ kernel/power/main.c 2004-12-26 15:26:31.472119192 +0100
@@ -104,6 +104,8 @@
static void suspend_finish(suspend_state_t state)
{
+ if (pm_ops && pm_ops->leave)
+ pm_ops->leave(state);
device_resume();
if (pm_ops && pm_ops->finish)
pm_ops->finish(state);
--- linux-2.6.10/drivers/acpi/sleep/main.c 2004-12-26 15:25:20.314936728 +0100
+++ drivers/acpi/sleep/main.c 2004-12-26 15:28:49.253173288 +0100
@@ -130,7 +130,23 @@
return ACPI_SUCCESS(status) ? 0 : -EFAULT;
}
+/**
+ * acpi_pm_leave - Make system ready to resume devices.
+ * @pm_state: State we're coming out of.
+ *
+ * This is called after we wake back up and before device
+ * resume methods are called.
+ */
+
+static int acpi_pm_leave(suspend_state_t pm_state)
+{
+ u32 acpi_state = acpi_suspend_states[pm_state];
+ acpi_leave_sleep_state(acpi_state);
+ acpi_disable_wakeup_device(acpi_state);
+
+ return 0;
+}
/**
* acpi_pm_finish - Finish up suspend sequence.
* @pm_state: State we're coming out of.
@@ -143,9 +159,6 @@
{
u32 acpi_state = acpi_suspend_states[pm_state];
- acpi_leave_sleep_state(acpi_state);
- acpi_disable_wakeup_device(acpi_state);
-
/* reset firmware waking vector */
acpi_set_firmware_waking_vector((acpi_physical_address) 0);
@@ -173,6 +186,7 @@
static struct pm_ops acpi_pm_ops = {
.prepare = acpi_pm_prepare,
.enter = acpi_pm_enter,
+ .leave = acpi_pm_leave,
.finish = acpi_pm_finish,
};
^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2005-01-26 14:11 UTC | newest]
Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2005-01-25 19:36 PATCH: Call acpi_leave_sleep_state before resuming devices Stefan Dösinger
[not found] ` <200501252036.32045.stefandoesinger-RbZlAiThDcE@public.gmane.org>
2005-01-26 5:45 ` Nigel Cunningham
2005-01-26 14:11 ` Stefan Dösinger
-- strict thread matches above, loose matches on Subject: below --
2005-01-10 2:19 Li, Shaohua
2004-12-15 4:55 Samsung P35 and S3 suspend Carl-Daniel Hailfinger
2004-12-26 14:43 ` Stefan Dösinger
[not found] ` <20041226194039.GC1739@elf.ucw.cz>
[not found] ` <20041226194039.GC1739-I/5MKhXcvmPrBKCeMvbIDA@public.gmane.org>
2004-12-30 21:39 ` PATCH: Call acpi_leave_sleep_state before resuming devices Stefan Dösinger
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.