[PATCH v1 5/6] scsi: ufs: Let host_sem cover the entire system suspend/resume

From: Can Guo
Date: Thu May 13 2021 - 01:56:26 EST


UFS error handling now is doing more than just re-probing, but also sending
scsi cmds, e.g., for clearing UACs, and recovering runtime PM error, which
may change runtime status of scsi devices. To protect system suspend/resume
from being disturbed by error handling, move the host_sem from wl pm ops
to ufshcd_suspend_prepare() and ufshcd_resume_complete().

Signed-off-by: Can Guo <cang@xxxxxxxxxxxxxx>
---
drivers/scsi/ufs/ufshcd.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index 631c5f8..a6313cf40 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -8991,16 +8991,13 @@ static int ufshcd_wl_suspend(struct device *dev)
ktime_t start = ktime_get();

hba = shost_priv(sdev->host);
- down(&hba->host_sem);

if (pm_runtime_suspended(dev))
goto out;

ret = __ufshcd_wl_suspend(hba, UFS_SYSTEM_PM);
- if (ret) {
+ if (ret)
dev_err(&sdev->sdev_gendev, "%s failed: %d\n", __func__, ret);
- up(&hba->host_sem);
- }

out:
if (!ret)
@@ -9033,7 +9030,6 @@ static int ufshcd_wl_resume(struct device *dev)
hba->curr_dev_pwr_mode, hba->uic_link_state);
if (!ret)
hba->is_wl_sys_suspended = false;
- up(&hba->host_sem);
return ret;
}
#endif
@@ -9600,6 +9596,7 @@ void ufshcd_resume_complete(struct device *dev)
ufshcd_rpmb_rpm_put(hba);
hba->rpmb_complete_put = false;
}
+ up(&hba->host_sem);
}
EXPORT_SYMBOL_GPL(ufshcd_resume_complete);

@@ -9626,6 +9623,7 @@ int ufshcd_suspend_prepare(struct device *dev)
ufshcd_rpmb_rpm_get_sync(hba);
hba->rpmb_complete_put = true;
}
+ down(&hba->host_sem);
return 0;
}
EXPORT_SYMBOL_GPL(ufshcd_suspend_prepare);
--
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum, a Linux Foundation Collaborative Project.