If block layer runtime PM is enabled for one SCSI device, then there is
no need to forcibly change the SCSI device and its request queue's runtime
PM status to active in scsi_dev_type_resume(), since block layer PM shall
resume the SCSI device on the demand of bios.

Cc: Stanley Chu <[email protected]>
Cc: Bart Van Assche <[email protected]>
Signed-off-by: Can Guo <[email protected]>
---
 drivers/scsi/scsi_pm.c | 25 ++++++++++++-------------
 1 file changed, 12 insertions(+), 13 deletions(-)

diff --git a/drivers/scsi/scsi_pm.c b/drivers/scsi/scsi_pm.c
index 3717eea..278c27e 100644
--- a/drivers/scsi/scsi_pm.c
+++ b/drivers/scsi/scsi_pm.c
@@ -79,23 +79,22 @@ static int scsi_dev_type_resume(struct device *dev,
        scsi_device_resume(to_scsi_device(dev));
        dev_dbg(dev, "scsi resume: %d\n", err);
 
-       if (err == 0) {
-               pm_runtime_disable(dev);
-               err = pm_runtime_set_active(dev);
-               pm_runtime_enable(dev);
+       if (scsi_is_sdev_device(dev)) {
+               struct scsi_device *sdev;
 
+               sdev = to_scsi_device(dev);
                /*
-                * Forcibly set runtime PM status of request queue to "active"
-                * to make sure we can again get requests from the queue
-                * (see also blk_pm_peek_request()).
-                *
-                * The resume hook will correct runtime PM status of the disk.
+                * If block layer runtime PM is enabled for the SCSI device,
+                * let block layer PM handle its runtime PM routines.
                 */
-               if (!err && scsi_is_sdev_device(dev)) {
-                       struct scsi_device *sdev = to_scsi_device(dev);
+               if (sdev->request_queue->dev)
+                       return err;
+       }
 
-                       blk_set_runtime_active(sdev->request_queue);
-               }
+       if (err == 0) {
+               pm_runtime_disable(dev);
+               err = pm_runtime_set_active(dev);
+               pm_runtime_enable(dev);
        }
 
        return err;
-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux 
Foundation Collaborative Project.

Reply via email to