[PM] Gracefully handle errors from device_suspend()

From: Pavel Machek (pavel@ucw.cz)
Date: Thu Aug 07 2003 - 18:28:21 EST


Hi!

This makes drivers_suspend() correctly fail when some driver vetoes
the suspend. Device disable is moved after pm_send_all; that looks
more correct to me as pm_send_all may expect some mainboard devices to
still work. Few small whitespace/codingstyle fixes.

[Sorry, filename is wrong, but it should be easy to fix.]

Please apply,
                                                                Pavel

--- /usr/src/tmp/linux/kernel/suspend.c 2003-08-08 01:19:01.000000000 +0200
+++ /usr/src/linux/kernel/suspend.c 2003-08-08 01:14:26.000000000 +0200
@@ -636,19 +637,23 @@
 /* Called from process context */
 static int drivers_suspend(void)
 {
- device_suspend(4, SUSPEND_NOTIFY);
- device_suspend(4, SUSPEND_SAVE_STATE);
- device_suspend(4, SUSPEND_DISABLE);
- if(!pm_suspend_state) {
+ if (device_suspend(4, SUSPEND_NOTIFY))
+ return -EIO;
+ if (device_suspend(4, SUSPEND_SAVE_STATE)) {
+ device_resume(RESUME_RESTORE_STATE);
+ return -EIO;
+ }
+ if (!pm_suspend_state) {
                 if(pm_send_all(PM_SUSPEND,(void *)3)) {
                         printk(KERN_WARNING "Problem while sending suspend event\n");
- return(1);
+ return -EIO;
                 }
                 pm_suspend_state=1;
         } else
                 printk(KERN_WARNING "PM suspend state already raised\n");
+ device_suspend(4, SUSPEND_DISABLE);
           
- return(0);
+ return 0;
 }
 
 #define RESUME_PHASE1 1 /* Called from interrupts disabled */
@@ -661,7 +666,7 @@
                 device_resume(RESUME_ENABLE);
         }
           if (flags & RESUME_PHASE2) {
- if(pm_suspend_state) {
+ if (pm_suspend_state) {
                         if(pm_send_all(PM_RESUME,(void *)0))
                                 printk(KERN_WARNING "Problem while sending resume event\n");
                         pm_suspend_state=0;
@@ -868,7 +873,7 @@
                 blk_run_queues();
 
                 /* Save state of all device drivers, and stop them. */
- if(drivers_suspend()==0)
+ if (drivers_suspend()==0)
                         /* If stopping device drivers worked, we proceed basically into
                          * suspend_save_image.
                          *

-- 
When do you have a heart between your knees?
[Johanka's followup: and *two* hearts?]
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/



This archive was generated by hypermail 2b29 : Thu Aug 07 2003 - 22:00:41 EST