mirror of
https://github.com/torvalds/linux.git
synced 2024-11-25 05:32:00 +00:00
scsi: ufs: core: WLUN suspend SSU/enter hibern8 fail recovery
When SSU/enter hibern8 fail in WLUN suspend flow, trigger the error handler
and return busy to break the suspend. Otherwise the consumer will get
stuck in runtime suspend status.
Fixes: b294ff3e34
("scsi: ufs: core: Enable power management for wlun")
Signed-off-by: Peter Wang <peter.wang@mediatek.com>
Link: https://lore.kernel.org/r/20221208072520.26210-1-peter.wang@mediatek.com
Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Adrian Hunter <adrian.hunter@intel.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
c411a42fb9
commit
1a5665fc8d
@ -6056,6 +6056,14 @@ void ufshcd_schedule_eh_work(struct ufs_hba *hba)
|
||||
}
|
||||
}
|
||||
|
||||
static void ufshcd_force_error_recovery(struct ufs_hba *hba)
|
||||
{
|
||||
spin_lock_irq(hba->host->host_lock);
|
||||
hba->force_reset = true;
|
||||
ufshcd_schedule_eh_work(hba);
|
||||
spin_unlock_irq(hba->host->host_lock);
|
||||
}
|
||||
|
||||
static void ufshcd_clk_scaling_allow(struct ufs_hba *hba, bool allow)
|
||||
{
|
||||
down_write(&hba->clk_scaling_lock);
|
||||
@ -9083,6 +9091,15 @@ static int __ufshcd_wl_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
|
||||
|
||||
if (!hba->dev_info.b_rpm_dev_flush_capable) {
|
||||
ret = ufshcd_set_dev_pwr_mode(hba, req_dev_pwr_mode);
|
||||
if (ret && pm_op != UFS_SHUTDOWN_PM) {
|
||||
/*
|
||||
* If return err in suspend flow, IO will hang.
|
||||
* Trigger error handler and break suspend for
|
||||
* error recovery.
|
||||
*/
|
||||
ufshcd_force_error_recovery(hba);
|
||||
ret = -EBUSY;
|
||||
}
|
||||
if (ret)
|
||||
goto enable_scaling;
|
||||
}
|
||||
@ -9094,6 +9111,15 @@ static int __ufshcd_wl_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
|
||||
*/
|
||||
check_for_bkops = !ufshcd_is_ufs_dev_deepsleep(hba);
|
||||
ret = ufshcd_link_state_transition(hba, req_link_state, check_for_bkops);
|
||||
if (ret && pm_op != UFS_SHUTDOWN_PM) {
|
||||
/*
|
||||
* If return err in suspend flow, IO will hang.
|
||||
* Trigger error handler and break suspend for
|
||||
* error recovery.
|
||||
*/
|
||||
ufshcd_force_error_recovery(hba);
|
||||
ret = -EBUSY;
|
||||
}
|
||||
if (ret)
|
||||
goto set_dev_active;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user