scsi: ufs: Track system suspend / resume activity
authorBart Van Assche <bvanassche@acm.org>
Tue, 18 Oct 2022 20:29:56 +0000 (13:29 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Sat, 22 Oct 2022 03:25:59 +0000 (03:25 +0000)
Add a new boolean variable that tracks whether the system is suspending,
suspended or resuming. This information will be used in a later commit to
fix a deadlock between the SCSI error handler and the suspend code.

Reviewed-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Link: https://lore.kernel.org/r/20221018202958.1902564-9-bvanassche@acm.org
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufshcd.c
include/ufs/ufshcd.h

index 84ca17d29898e1aff6957f7eaa9ac677f5ccf9f5..2a32bcc93d2e71a02f396115388cf3a6d35771d2 100644 (file)
@@ -9247,6 +9247,7 @@ static int ufshcd_wl_suspend(struct device *dev)
 
        hba = shost_priv(sdev->host);
        down(&hba->host_sem);
+       hba->system_suspending = true;
 
        if (pm_runtime_suspended(dev))
                goto out;
@@ -9288,6 +9289,7 @@ out:
                hba->curr_dev_pwr_mode, hba->uic_link_state);
        if (!ret)
                hba->is_sys_suspended = false;
+       hba->system_suspending = false;
        up(&hba->host_sem);
        return ret;
 }
index 9f28349ebcff5037218c45e6816d9066d2fd27cf..96538eb3a6c010b9e09cc7d9de217e66f1b369f1 100644 (file)
@@ -802,7 +802,9 @@ struct ufs_hba_monitor {
  * @caps: bitmask with information about UFS controller capabilities
  * @devfreq: frequency scaling information owned by the devfreq core
  * @clk_scaling: frequency scaling information owned by the UFS driver
- * @is_sys_suspended: whether or not the entire system has been suspended
+ * @system_suspending: system suspend has been started and system resume has
+ *     not yet finished.
+ * @is_sys_suspended: UFS device has been suspended because of system suspend
  * @urgent_bkops_lvl: keeps track of urgent bkops level for device
  * @is_urgent_bkops_lvl_checked: keeps track if the urgent bkops level for
  *  device is known or not.
@@ -943,6 +945,7 @@ struct ufs_hba {
 
        struct devfreq *devfreq;
        struct ufs_clk_scaling clk_scaling;
+       bool system_suspending;
        bool is_sys_suspended;
 
        enum bkops_status urgent_bkops_lvl;