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

From: Can Guo
Date: Mon May 24 2021 - 04:48:07 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 5e6e3ac..9a3bc04 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -9057,16 +9057,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)
@@ -9099,7 +9096,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
@@ -9666,6 +9662,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);

@@ -9692,6 +9689,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.