|
@@ -4134,18 +4134,25 @@ out:
|
|
|
}
|
|
|
|
|
|
/**
|
|
|
- * ufshcd_force_reset_auto_bkops - force enable of auto bkops
|
|
|
+ * ufshcd_force_reset_auto_bkops - force reset auto bkops state
|
|
|
* @hba: per adapter instance
|
|
|
*
|
|
|
* After a device reset the device may toggle the BKOPS_EN flag
|
|
|
* to default value. The s/w tracking variables should be updated
|
|
|
- * as well. Do this by forcing enable of auto bkops.
|
|
|
+ * as well. This function would change the auto-bkops state based on
|
|
|
+ * UFSHCD_CAP_KEEP_AUTO_BKOPS_ENABLED_EXCEPT_SUSPEND.
|
|
|
*/
|
|
|
-static void ufshcd_force_reset_auto_bkops(struct ufs_hba *hba)
|
|
|
+static void ufshcd_force_reset_auto_bkops(struct ufs_hba *hba)
|
|
|
{
|
|
|
- hba->auto_bkops_enabled = false;
|
|
|
- hba->ee_ctrl_mask |= MASK_EE_URGENT_BKOPS;
|
|
|
- ufshcd_enable_auto_bkops(hba);
|
|
|
+ if (ufshcd_keep_autobkops_enabled_except_suspend(hba)) {
|
|
|
+ hba->auto_bkops_enabled = false;
|
|
|
+ hba->ee_ctrl_mask |= MASK_EE_URGENT_BKOPS;
|
|
|
+ ufshcd_enable_auto_bkops(hba);
|
|
|
+ } else {
|
|
|
+ hba->auto_bkops_enabled = true;
|
|
|
+ hba->ee_ctrl_mask &= ~MASK_EE_URGENT_BKOPS;
|
|
|
+ ufshcd_disable_auto_bkops(hba);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
static inline int ufshcd_get_bkops_status(struct ufs_hba *hba, u32 *status)
|
|
@@ -6564,11 +6571,15 @@ static int ufshcd_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op)
|
|
|
goto set_old_link_state;
|
|
|
}
|
|
|
|
|
|
- /*
|
|
|
- * If BKOPs operations are urgently needed at this moment then
|
|
|
- * keep auto-bkops enabled or else disable it.
|
|
|
- */
|
|
|
- ufshcd_urgent_bkops(hba);
|
|
|
+ if (ufshcd_keep_autobkops_enabled_except_suspend(hba))
|
|
|
+ ufshcd_enable_auto_bkops(hba);
|
|
|
+ else
|
|
|
+ /*
|
|
|
+ * If BKOPs operations are urgently needed at this moment then
|
|
|
+ * keep auto-bkops enabled or else disable it.
|
|
|
+ */
|
|
|
+ ufshcd_urgent_bkops(hba);
|
|
|
+
|
|
|
hba->clk_gating.is_suspended = false;
|
|
|
|
|
|
if (hba->clk_scaling.is_allowed)
|