@@ -541,6 +541,7 @@ struct ufs_dev_info {
/* UFS WB related flags */
bool wb_enabled;
bool wb_buf_flush_enabled;
+ bool wb_buf_flush_in_hibern8;
u8 wb_dedicated_lu;
u8 wb_buffer_type;
@@ -282,10 +282,16 @@ static inline void ufshcd_wb_config(struct ufs_hba *hba)
dev_err(hba->dev, "%s: Enable WB failed: %d\n", __func__, ret);
else
dev_info(hba->dev, "%s: Write Booster Configured\n", __func__);
+
ret = ufshcd_wb_toggle_flush_during_h8(hba, true);
- if (ret)
+ if (ret) {
dev_err(hba->dev, "%s: En WB flush during H8: failed: %d\n",
__func__, ret);
+ hba->dev_info.wb_buf_flush_in_hibern8 = false;
+ } else {
+ hba->dev_info.wb_buf_flush_in_hibern8 = true;
+ }
+
ufshcd_wb_toggle_flush(hba, true);
}
@@ -589,6 +595,7 @@ static void ufshcd_device_reset(struct ufs_hba *hba)
if (ufshcd_is_wb_allowed(hba)) {
hba->dev_info.wb_enabled = false;
hba->dev_info.wb_buf_flush_enabled = false;
+ hba->dev_info.wb_buf_flush_in_hibern8 = false;
}
}
if (err != -EOPNOTSUPP)
@@ -5468,6 +5475,7 @@ static bool ufshcd_wb_need_flush(struct ufs_hba *hba)
if (!ufshcd_is_wb_allowed(hba))
return false;
+
/*
* The ufs device needs the vcc to be ON to flush.
* With user-space reduction enabled, it's enough to enable flush
@@ -8567,6 +8575,7 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
enum ufs_pm_level pm_lvl;
enum ufs_dev_pwr_mode req_dev_pwr_mode;
enum uic_link_state req_link_state;
+ bool hibern8;
hba->pm_op_in_progress = 1;
if (!ufshcd_is_shutdown_pm(pm_op)) {
@@ -8626,11 +8635,13 @@ static int ufshcd_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op)
* Hibern8, keep device power mode as "active power mode"
* and VCC supply.
*/
+ hibern8 = req_link_state == UIC_LINK_HIBERN8_STATE ||
+ (req_link_state == UIC_LINK_ACTIVE_STATE &&
+ ufshcd_is_auto_hibern8_enabled(hba));
+
hba->dev_info.b_rpm_dev_flush_capable =
- hba->auto_bkops_enabled ||
- (((req_link_state == UIC_LINK_HIBERN8_STATE) ||
- ((req_link_state == UIC_LINK_ACTIVE_STATE) &&
- ufshcd_is_auto_hibern8_enabled(hba))) &&
+ hba->auto_bkops_enabled || (hibern8 &&
+ hba->dev_info.wb_buf_flush_in_hibern8 &&
ufshcd_wb_need_flush(hba));
}