On 23/06/21 10:35 am, Can Guo wrote: > Add flags pm_op_in_progress and is_sys_suspended to track the status of hba > runtime and system suspend/resume operations. > > Signed-off-by: Can Guo <cang@xxxxxxxxxxxxxx> > --- > drivers/scsi/ufs/ufshcd.c | 12 +++++++++++- > drivers/scsi/ufs/ufshcd.h | 4 ++++ > 2 files changed, 15 insertions(+), 1 deletion(-) > > diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c > index c40ba1d..abe5f2d 100644 > --- a/drivers/scsi/ufs/ufshcd.c > +++ b/drivers/scsi/ufs/ufshcd.c > @@ -551,6 +551,8 @@ static void ufshcd_print_host_state(struct ufs_hba *hba) > hba->curr_dev_pwr_mode, hba->uic_link_state); > dev_err(hba->dev, "wlu_pm_op_in_progress=%d, is_wlu_sys_suspended=%d\n", > hba->wlu_pm_op_in_progress, hba->is_wlu_sys_suspended); > + dev_err(hba->dev, "pm_op_in_progress=%d, is_sys_suspended=%d\n", > + hba->pm_op_in_progress, hba->is_sys_suspended); > dev_err(hba->dev, "Auto BKOPS=%d, Host self-block=%d\n", > hba->auto_bkops_enabled, hba->host->host_self_blocked); > dev_err(hba->dev, "Clk gate=%d\n", hba->clk_gating.state); > @@ -9141,6 +9143,8 @@ static int ufshcd_suspend(struct ufs_hba *hba) > > if (!hba->is_powered) > return 0; > + > + hba->pm_op_in_progress = true; > /* > * Disable the host irq as host controller as there won't be any > * host controller transaction expected till resume. */ ufshcd_disable_irq(hba); ret = ufshcd_setup_clocks(hba, false); if (ret) { ufshcd_enable_irq(hba); Is "hba->pm_op_in_progress = false" needed here? return ret; } > @@ -9160,6 +9164,7 @@ static int ufshcd_suspend(struct ufs_hba *hba) > ufshcd_vreg_set_lpm(hba); > /* Put the host controller in low power mode if possible */ > ufshcd_hba_vreg_set_lpm(hba); > + hba->pm_op_in_progress = false; > return ret; > } > > @@ -9179,6 +9184,7 @@ static int ufshcd_resume(struct ufs_hba *hba) > if (!hba->is_powered) > return 0; > > + hba->pm_op_in_progress = true; > ufshcd_hba_vreg_set_hpm(hba); > ret = ufshcd_vreg_set_hpm(hba); > if (ret) > @@ -9198,6 +9204,7 @@ static int ufshcd_resume(struct ufs_hba *hba) > out: > if (ret) > ufshcd_update_evt_hist(hba, UFS_EVT_RESUME_ERR, (u32)ret); > + hba->pm_op_in_progress = false; > return ret; > } > > @@ -9222,6 +9229,8 @@ int ufshcd_system_suspend(struct ufs_hba *hba) > trace_ufshcd_system_suspend(dev_name(hba->dev), ret, > ktime_to_us(ktime_sub(ktime_get(), start)), > hba->curr_dev_pwr_mode, hba->uic_link_state); > + if (!ret) > + hba->is_sys_suspended = true; > return ret; > } > EXPORT_SYMBOL(ufshcd_system_suspend); > @@ -9247,7 +9256,8 @@ int ufshcd_system_resume(struct ufs_hba *hba) > trace_ufshcd_system_resume(dev_name(hba->dev), ret, > ktime_to_us(ktime_sub(ktime_get(), start)), > hba->curr_dev_pwr_mode, hba->uic_link_state); > - > + if (!ret) > + hba->is_sys_suspended = false; > return ret; > } > EXPORT_SYMBOL(ufshcd_system_resume); > diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h > index 93aeeb3..1e7fe73 100644 > --- a/drivers/scsi/ufs/ufshcd.h > +++ b/drivers/scsi/ufs/ufshcd.h > @@ -754,6 +754,8 @@ struct ufs_hba { > struct device_attribute spm_lvl_attr; > /* A flag to tell whether __ufshcd_wl_suspend/resume() is in progress */ > bool wlu_pm_op_in_progress; > + /* A flag to tell whether ufshcd_suspend/resume() is in progress */ > + bool pm_op_in_progress; > > /* Auto-Hibernate Idle Timer register value */ > u32 ahit; > @@ -841,6 +843,8 @@ struct ufs_hba { > struct ufs_clk_scaling clk_scaling; > /* A flag to tell whether the UFS device W-LU is system suspended */ > bool is_wlu_sys_suspended; > + /* A flag to tell whether hba is system suspended */ > + bool is_sys_suspended; > > enum bkops_status urgent_bkops_lvl; > bool is_urgent_bkops_lvl_checked; >