[SCSI] check runtime PM status in system PM
[deliverable/linux.git] / drivers / scsi / scsi_pm.c
index d329f8b12e2b11503bd52b391bc198798aa1f297..a633076e562269e0fb163bcdacbbfbf1a9891d4b 100644 (file)
@@ -49,8 +49,22 @@ static int scsi_bus_suspend_common(struct device *dev, pm_message_t msg)
 {
        int err = 0;
 
-       if (scsi_is_sdev_device(dev))
+       if (scsi_is_sdev_device(dev)) {
+               /*
+                * sd is the only high-level SCSI driver to implement runtime
+                * PM, and sd treats runtime suspend, system suspend, and
+                * system hibernate identically (but not system freeze).
+                */
+               if (pm_runtime_suspended(dev)) {
+                       if (msg.event == PM_EVENT_SUSPEND ||
+                           msg.event == PM_EVENT_HIBERNATE)
+                               return 0;       /* already suspended */
+
+                       /* wake up device so that FREEZE will succeed */
+                       pm_runtime_resume(dev);
+               }
                err = scsi_dev_type_suspend(dev, msg);
+       }
        return err;
 }
 
This page took 0.030151 seconds and 5 git commands to generate.