Message ID | 20240329015036.15707-1-peter.wang@mediatek.com (mailing list archive) |
---|---|
State | Accepted |
Headers | show |
Series | [v2] ufs: core: wlun suspend dev/link state error recovery | expand |
On 3/28/24 6:50 PM, peter.wang@mediatek.com wrote: > When wl suspend error occurs, for example, BKOP or SSU timeout, the host > triggers an error handler and returns -EBUSY to break the wl suspend process. > However, it is possible for the runtime PM to enter wl suspend again before > the error handler has finished, and return -EINVAL because the device is > in an error state. To address this, ensure that the rumtime PM waits for the > error handler to finish, or trigger the error handler in such cases, > because returning -EINVAL can cause the I/O to hang. Reviewed-by: Bart Van Assche <bvanassche@acm.org>
On Fri, 29 Mar 2024 09:50:36 +0800, peter.wang@mediatek.com wrote: > When wl suspend error occurs, for example, BKOP or SSU timeout, the host > triggers an error handler and returns -EBUSY to break the wl suspend process. > However, it is possible for the runtime PM to enter wl suspend again before > the error handler has finished, and return -EINVAL because the device is > in an error state. To address this, ensure that the rumtime PM waits for the > error handler to finish, or trigger the error handler in such cases, > because returning -EINVAL can cause the I/O to hang. > > [...] Applied to 6.9/scsi-fixes, thanks! [1/1] ufs: core: wlun suspend dev/link state error recovery https://git.kernel.org/mkp/scsi/c/6bc5e70b1c79
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index e30fd125988d..292b06f361a2 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -9791,7 +9791,10 @@ static int __ufshcd_wl_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op) /* UFS device & link must be active before we enter in this function */ if (!ufshcd_is_ufs_dev_active(hba) || !ufshcd_is_link_active(hba)) { - ret = -EINVAL; + /* Wait err handler finish or trigger err recovery */ + if (!ufshcd_eh_in_progress(hba)) + ufshcd_force_error_recovery(hba); + ret = -EBUSY; goto enable_scaling; }