[PATCH v2 2/3] scsi: ufs: core: Add ufshcd_wb_buf_resize function to enable WB buffer resize

Lu Hongfei
2023-09-08T10:25:54Z

ufshcd_wb_buf_resize is used to enable WB buffer resize. It first blocks
the upper layer from issuing reqs, then waits for the cmd queue to be
empty, and then issues the command to enable WB buffer resize.

It may be called anywhere, such as ufs-sysfs.c, so it needs to be declared
in the header files.

Signed-off-by: Lu Hongfei <luhongfei@vivo.com>
---
drivers/ufs/core/ufshcd-priv.h | 1 +
drivers/ufs/core/ufshcd.c | 21 +++++++++++++++++++++
include/ufs/ufshcd.h | 1 +
3 files changed, 23 insertions(+)

diff --git a/drivers/ufs/core/ufshcd-priv.h b/drivers/ufs/core/ufshcd-priv.h
index f42d99ce5bf1..85caefa421f7 100644
--- a/drivers/ufs/core/ufshcd-priv.h
+++ b/drivers/ufs/core/ufshcd-priv.h
@@ -98,6 +98,7 @@ int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba,
enum query_opcode desc_op);

int ufshcd_wb_toggle(struct ufs_hba *hba, bool enable);
+int ufshcd_wb_buf_resize(struct ufs_hba *hba, u32 resize_op);

/* Wrapper functions for safely calling variant operations */
static inline const char *ufshcd_get_var_name(struct ufs_hba *hba)
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 93417518c04d..7e4461360cbd 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -6045,6 +6045,27 @@ static bool ufshcd_wb_need_flush(struct ufs_hba *hba)
return ufshcd_wb_presrv_usrspc_keep_vcc_on(hba, avail_buf);
}

+int ufshcd_wb_buf_resize(struct ufs_hba *hba, u32 resize_op)
+{
+ int ret;
+ u8 index;
+
+ ufshcd_scsi_block_requests(hba);
+ if (ufshcd_wait_for_doorbell_clr(hba, 1 * USEC_PER_SEC))
+ goto out;
+
+ index = ufshcd_wb_get_query_index(hba);
+ ret = ufshcd_query_attr_retry(hba, UPIU_QUERY_OPCODE_WRITE_ATTR,
+ QUERY_ATTR_IDN_WB_BUF_RESIZE_EN, index, 0, &resize_op);
+ if (ret)
+ dev_err(hba->dev,
+ "%s: Enable WB buf resize operation failed %d\n",
+ __func__, ret);
+out:
+ ufshcd_scsi_unblock_requests(hba);
+ return ret;
+}
+
static void ufshcd_rpm_dev_flush_recheck_work(struct work_struct *work)
{
struct ufs_hba *hba = container_of(to_delayed_work(work),
diff --git a/include/ufs/ufshcd.h b/include/ufs/ufshcd.h
index 7d07b256e906..7dd560dc22c6 100644
--- a/include/ufs/ufshcd.h
+++ b/include/ufs/ufshcd.h
@@ -1381,6 +1381,7 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
struct ufs_ehs *ehs_rsp, int sg_cnt,
struct scatterlist *sg_list, enum dma_data_direction dir);
int ufshcd_wb_toggle(struct ufs_hba *hba, bool enable);
+int ufshcd_wb_buf_resize(struct ufs_hba *hba, u32 resize_op);
int ufshcd_wb_toggle_buf_flush(struct ufs_hba *hba, bool enable);
int ufshcd_suspend_prepare(struct device *dev);
int __ufshcd_suspend_prepare(struct device *dev, bool rpm_ok_for_spm);
--
2.39.0