linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2 0/4] Re-use device management code fragments
@ 2024-03-05 21:00 Avri Altman
  2024-03-05 21:00 ` [PATCH v2 1/4] scsi: ufs: Re-use device management locking code Avri Altman
                   ` (3 more replies)
  0 siblings, 4 replies; 15+ messages in thread
From: Avri Altman @ 2024-03-05 21:00 UTC (permalink / raw)
  To: James E . J . Bottomley, Martin K . Petersen
  Cc: Bart Van Assche, Bean Huo, linux-scsi, linux-kernel, Avri Altman

v1->v2:
 - Attend Bart's comments


Device management commands are constructed for query commands that are
being issued by the driver, but also for raw device management commands
originated by the bsg module, and recently, by the advanced rpmb
handler. Thus, the same code fragments, e.g. locking, composing the
command, composing the upiu etc., appear over and over. Remove those
duplications.  Theoretically, there should be no functional change.

Avri Altman (4):
  scsi: ufs: Re-use device management locking code
  scsi: ufs: Re-use exec_dev_cmd
  scsi: ufs: Re-use compose_dev_cmd
  scsi: ufs: Re-use compose_devman_upiu

 drivers/ufs/core/ufshcd.c | 204 ++++++++++++++++----------------------
 1 file changed, 86 insertions(+), 118 deletions(-)

-- 
2.42.0


^ permalink raw reply	[flat|nested] 15+ messages in thread

* [PATCH v2 1/4] scsi: ufs: Re-use device management locking code
  2024-03-05 21:00 [PATCH v2 0/4] Re-use device management code fragments Avri Altman
@ 2024-03-05 21:00 ` Avri Altman
  2024-03-06 21:21   ` Bean Huo
  2024-03-05 21:00 ` [PATCH v2 2/4] scsi: ufs: Re-use exec_dev_cmd Avri Altman
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 15+ messages in thread
From: Avri Altman @ 2024-03-05 21:00 UTC (permalink / raw)
  To: James E . J . Bottomley, Martin K . Petersen
  Cc: Bart Van Assche, Bean Huo, linux-scsi, linux-kernel, Avri Altman

Group those 3 calls that repeat for every device management command into
a lock and unlock handlers.

Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Avri Altman <avri.altman@wdc.com>
---
 drivers/ufs/core/ufshcd.c | 69 ++++++++++++++++++---------------------
 1 file changed, 32 insertions(+), 37 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 21429eec1b82..983b7b8e3c7c 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -3272,6 +3272,20 @@ static int ufshcd_wait_for_dev_cmd(struct ufs_hba *hba,
 	return err;
 }
 
+static void ufshcd_dev_man_lock(struct ufs_hba *hba)
+{
+	ufshcd_hold(hba);
+	mutex_lock(&hba->dev_cmd.lock);
+	down_read(&hba->clk_scaling_lock);
+}
+
+static void ufshcd_dev_man_unlock(struct ufs_hba *hba)
+{
+	up_read(&hba->clk_scaling_lock);
+	mutex_unlock(&hba->dev_cmd.lock);
+	ufshcd_release(hba);
+}
+
 /**
  * ufshcd_exec_dev_cmd - API for sending device management requests
  * @hba: UFS hba
@@ -3294,8 +3308,6 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
 	/* Protects use of hba->reserved_slot. */
 	lockdep_assert_held(&hba->dev_cmd.lock);
 
-	down_read(&hba->clk_scaling_lock);
-
 	lrbp = &hba->lrb[tag];
 	lrbp->cmd = NULL;
 	err = ufshcd_compose_dev_cmd(hba, lrbp, cmd_type, tag);
@@ -3312,7 +3324,6 @@ static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
 				    (struct utp_upiu_req *)lrbp->ucd_rsp_ptr);
 
 out:
-	up_read(&hba->clk_scaling_lock);
 	return err;
 }
 
@@ -3383,8 +3394,8 @@ int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
 
 	BUG_ON(!hba);
 
-	ufshcd_hold(hba);
-	mutex_lock(&hba->dev_cmd.lock);
+	ufshcd_dev_man_lock(hba);
+
 	ufshcd_init_query(hba, &request, &response, opcode, idn, index,
 			selector);
 
@@ -3426,8 +3437,7 @@ int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
 				MASK_QUERY_UPIU_FLAG_LOC) & 0x1;
 
 out_unlock:
-	mutex_unlock(&hba->dev_cmd.lock);
-	ufshcd_release(hba);
+	ufshcd_dev_man_unlock(hba);
 	return err;
 }
 
@@ -3457,9 +3467,8 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
 		return -EINVAL;
 	}
 
-	ufshcd_hold(hba);
+	ufshcd_dev_man_lock(hba);
 
-	mutex_lock(&hba->dev_cmd.lock);
 	ufshcd_init_query(hba, &request, &response, opcode, idn, index,
 			selector);
 
@@ -3489,8 +3498,7 @@ int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
 	*attr_val = be32_to_cpu(response->upiu_res.value);
 
 out_unlock:
-	mutex_unlock(&hba->dev_cmd.lock);
-	ufshcd_release(hba);
+	ufshcd_dev_man_unlock(hba);
 	return err;
 }
 
@@ -3553,9 +3561,8 @@ static int __ufshcd_query_descriptor(struct ufs_hba *hba,
 		return -EINVAL;
 	}
 
-	ufshcd_hold(hba);
+	ufshcd_dev_man_lock(hba);
 
-	mutex_lock(&hba->dev_cmd.lock);
 	ufshcd_init_query(hba, &request, &response, opcode, idn, index,
 			selector);
 	hba->dev_cmd.query.descriptor = desc_buf;
@@ -3588,8 +3595,7 @@ static int __ufshcd_query_descriptor(struct ufs_hba *hba,
 
 out_unlock:
 	hba->dev_cmd.query.descriptor = NULL;
-	mutex_unlock(&hba->dev_cmd.lock);
-	ufshcd_release(hba);
+	ufshcd_dev_man_unlock(hba);
 	return err;
 }
 
@@ -5070,8 +5076,8 @@ static int ufshcd_verify_dev_init(struct ufs_hba *hba)
 	int err = 0;
 	int retries;
 
-	ufshcd_hold(hba);
-	mutex_lock(&hba->dev_cmd.lock);
+	ufshcd_dev_man_lock(hba);
+
 	for (retries = NOP_OUT_RETRIES; retries > 0; retries--) {
 		err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_NOP,
 					  hba->nop_out_timeout);
@@ -5081,8 +5087,8 @@ static int ufshcd_verify_dev_init(struct ufs_hba *hba)
 
 		dev_dbg(hba->dev, "%s: error %d retrying\n", __func__, err);
 	}
-	mutex_unlock(&hba->dev_cmd.lock);
-	ufshcd_release(hba);
+
+	ufshcd_dev_man_unlock(hba);
 
 	if (err)
 		dev_err(hba->dev, "%s: NOP OUT failed %d\n", __func__, err);
@@ -7209,8 +7215,6 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
 	/* Protects use of hba->reserved_slot. */
 	lockdep_assert_held(&hba->dev_cmd.lock);
 
-	down_read(&hba->clk_scaling_lock);
-
 	lrbp = &hba->lrb[tag];
 	lrbp->cmd = NULL;
 	lrbp->task_tag = tag;
@@ -7275,7 +7279,6 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
 	ufshcd_add_query_upiu_trace(hba, err ? UFS_QUERY_ERR : UFS_QUERY_COMP,
 				    (struct utp_upiu_req *)lrbp->ucd_rsp_ptr);
 
-	up_read(&hba->clk_scaling_lock);
 	return err;
 }
 
@@ -7314,13 +7317,11 @@ int ufshcd_exec_raw_upiu_cmd(struct ufs_hba *hba,
 		cmd_type = DEV_CMD_TYPE_NOP;
 		fallthrough;
 	case UPIU_TRANSACTION_QUERY_REQ:
-		ufshcd_hold(hba);
-		mutex_lock(&hba->dev_cmd.lock);
+		ufshcd_dev_man_lock(hba);
 		err = ufshcd_issue_devman_upiu_cmd(hba, req_upiu, rsp_upiu,
 						   desc_buff, buff_len,
 						   cmd_type, desc_op);
-		mutex_unlock(&hba->dev_cmd.lock);
-		ufshcd_release(hba);
+		ufshcd_dev_man_unlock(hba);
 
 		break;
 	case UPIU_TRANSACTION_TASK_REQ:
@@ -7380,9 +7381,7 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 	u16 ehs_len;
 
 	/* Protects use of hba->reserved_slot. */
-	ufshcd_hold(hba);
-	mutex_lock(&hba->dev_cmd.lock);
-	down_read(&hba->clk_scaling_lock);
+	ufshcd_dev_man_lock(hba);
 
 	lrbp = &hba->lrb[tag];
 	lrbp->cmd = NULL;
@@ -7448,9 +7447,8 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 		}
 	}
 
-	up_read(&hba->clk_scaling_lock);
-	mutex_unlock(&hba->dev_cmd.lock);
-	ufshcd_release(hba);
+	ufshcd_dev_man_unlock(hba);
+
 	return err ? : result;
 }
 
@@ -8713,9 +8711,7 @@ static void ufshcd_set_timestamp_attr(struct ufs_hba *hba)
 	if (dev_info->wspecversion < 0x400)
 		return;
 
-	ufshcd_hold(hba);
-
-	mutex_lock(&hba->dev_cmd.lock);
+	ufshcd_dev_man_lock(hba);
 
 	ufshcd_init_query(hba, &request, &response,
 			  UPIU_QUERY_OPCODE_WRITE_ATTR,
@@ -8733,8 +8729,7 @@ static void ufshcd_set_timestamp_attr(struct ufs_hba *hba)
 		dev_err(hba->dev, "%s: failed to set timestamp %d\n",
 			__func__, err);
 
-	mutex_unlock(&hba->dev_cmd.lock);
-	ufshcd_release(hba);
+	ufshcd_dev_man_unlock(hba);
 }
 
 /**
-- 
2.42.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 2/4] scsi: ufs: Re-use exec_dev_cmd
  2024-03-05 21:00 [PATCH v2 0/4] Re-use device management code fragments Avri Altman
  2024-03-05 21:00 ` [PATCH v2 1/4] scsi: ufs: Re-use device management locking code Avri Altman
@ 2024-03-05 21:00 ` Avri Altman
  2024-03-06 22:05   ` Bean Huo
  2024-03-05 21:00 ` [PATCH v2 3/4] scsi: ufs: Re-use compose_dev_cmd Avri Altman
  2024-03-05 21:00 ` [PATCH v2 4/4] scsi: ufs: Re-use compose_devman_upiu Avri Altman
  3 siblings, 1 reply; 15+ messages in thread
From: Avri Altman @ 2024-03-05 21:00 UTC (permalink / raw)
  To: James E . J . Bottomley, Martin K . Petersen
  Cc: Bart Van Assche, Bean Huo, linux-scsi, linux-kernel, Avri Altman

Move out the actual command issue from exec_dev_cmd so it can be used
elsewhere.  While at it, remove a redundant "lrbp->cmd = NULL"
assignment.  Also, as a free bonus, call the upiu trace if it doesn't.

Signed-off-by: Avri Altman <avri.altman@wdc.com>
---
 drivers/ufs/core/ufshcd.c | 53 ++++++++++++++++++---------------------
 1 file changed, 24 insertions(+), 29 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 983b7b8e3c7c..3f62ad7b4062 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -3286,6 +3286,25 @@ static void ufshcd_dev_man_unlock(struct ufs_hba *hba)
 	ufshcd_release(hba);
 }
 
+static int ufshcd_issue_dev_cmd(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
+			  const u32 tag, int timeout)
+{
+	DECLARE_COMPLETION_ONSTACK(wait);
+	int err;
+
+	hba->dev_cmd.complete = &wait;
+
+	ufshcd_add_query_upiu_trace(hba, UFS_QUERY_SEND, lrbp->ucd_req_ptr);
+
+	ufshcd_send_command(hba, tag, hba->dev_cmd_queue);
+	err = ufshcd_wait_for_dev_cmd(hba, lrbp, timeout);
+
+	ufshcd_add_query_upiu_trace(hba, err ? UFS_QUERY_ERR : UFS_QUERY_COMP,
+				    (struct utp_upiu_req *)lrbp->ucd_rsp_ptr);
+
+	return err;
+}
+
 /**
  * ufshcd_exec_dev_cmd - API for sending device management requests
  * @hba: UFS hba
@@ -3300,31 +3319,18 @@ static void ufshcd_dev_man_unlock(struct ufs_hba *hba)
 static int ufshcd_exec_dev_cmd(struct ufs_hba *hba,
 		enum dev_cmd_type cmd_type, int timeout)
 {
-	DECLARE_COMPLETION_ONSTACK(wait);
 	const u32 tag = hba->reserved_slot;
-	struct ufshcd_lrb *lrbp;
+	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
 	int err;
 
 	/* Protects use of hba->reserved_slot. */
 	lockdep_assert_held(&hba->dev_cmd.lock);
 
-	lrbp = &hba->lrb[tag];
-	lrbp->cmd = NULL;
 	err = ufshcd_compose_dev_cmd(hba, lrbp, cmd_type, tag);
 	if (unlikely(err))
-		goto out;
-
-	hba->dev_cmd.complete = &wait;
-
-	ufshcd_add_query_upiu_trace(hba, UFS_QUERY_SEND, lrbp->ucd_req_ptr);
-
-	ufshcd_send_command(hba, tag, hba->dev_cmd_queue);
-	err = ufshcd_wait_for_dev_cmd(hba, lrbp, timeout);
-	ufshcd_add_query_upiu_trace(hba, err ? UFS_QUERY_ERR : UFS_QUERY_COMP,
-				    (struct utp_upiu_req *)lrbp->ucd_rsp_ptr);
+		return err;
 
-out:
-	return err;
+	return ufshcd_issue_dev_cmd(hba, lrbp, tag, timeout);
 }
 
 /**
@@ -7206,7 +7212,6 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
 					enum dev_cmd_type cmd_type,
 					enum query_opcode desc_op)
 {
-	DECLARE_COMPLETION_ONSTACK(wait);
 	const u32 tag = hba->reserved_slot;
 	struct ufshcd_lrb *lrbp;
 	int err = 0;
@@ -7246,17 +7251,12 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
 
 	memset(lrbp->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp));
 
-	hba->dev_cmd.complete = &wait;
-
-	ufshcd_add_query_upiu_trace(hba, UFS_QUERY_SEND, lrbp->ucd_req_ptr);
-
-	ufshcd_send_command(hba, tag, hba->dev_cmd_queue);
 	/*
 	 * ignore the returning value here - ufshcd_check_query_response is
 	 * bound to fail since dev_cmd.query and dev_cmd.type were left empty.
 	 * read the response directly ignoring all errors.
 	 */
-	ufshcd_wait_for_dev_cmd(hba, lrbp, QUERY_REQ_TIMEOUT);
+	ufshcd_issue_dev_cmd(hba, lrbp, tag, QUERY_REQ_TIMEOUT);
 
 	/* just copy the upiu response as it is */
 	memcpy(rsp_upiu, lrbp->ucd_rsp_ptr, sizeof(*rsp_upiu));
@@ -7371,7 +7371,6 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 			 struct ufs_ehs *rsp_ehs, int sg_cnt, struct scatterlist *sg_list,
 			 enum dma_data_direction dir)
 {
-	DECLARE_COMPLETION_ONSTACK(wait);
 	const u32 tag = hba->reserved_slot;
 	struct ufshcd_lrb *lrbp;
 	int err = 0;
@@ -7418,11 +7417,7 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 
 	memset(lrbp->ucd_rsp_ptr, 0, sizeof(struct utp_upiu_rsp));
 
-	hba->dev_cmd.complete = &wait;
-
-	ufshcd_send_command(hba, tag, hba->dev_cmd_queue);
-
-	err = ufshcd_wait_for_dev_cmd(hba, lrbp, ADVANCED_RPMB_REQ_TIMEOUT);
+	err = ufshcd_issue_dev_cmd(hba, lrbp, tag, ADVANCED_RPMB_REQ_TIMEOUT);
 
 	if (!err) {
 		/* Just copy the upiu response as it is */
-- 
2.42.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 3/4] scsi: ufs: Re-use compose_dev_cmd
  2024-03-05 21:00 [PATCH v2 0/4] Re-use device management code fragments Avri Altman
  2024-03-05 21:00 ` [PATCH v2 1/4] scsi: ufs: Re-use device management locking code Avri Altman
  2024-03-05 21:00 ` [PATCH v2 2/4] scsi: ufs: Re-use exec_dev_cmd Avri Altman
@ 2024-03-05 21:00 ` Avri Altman
  2024-03-07 12:50   ` Bean Huo
  2024-03-07 18:12   ` Bart Van Assche
  2024-03-05 21:00 ` [PATCH v2 4/4] scsi: ufs: Re-use compose_devman_upiu Avri Altman
  3 siblings, 2 replies; 15+ messages in thread
From: Avri Altman @ 2024-03-05 21:00 UTC (permalink / raw)
  To: James E . J . Bottomley, Martin K . Petersen
  Cc: Bart Van Assche, Bean Huo, linux-scsi, linux-kernel, Avri Altman

Move out some of the dev_cmd initializations so it can be used
elsewhere.

Signed-off-by: Avri Altman <avri.altman@wdc.com>
---
 drivers/ufs/core/ufshcd.c | 33 +++++++++++++--------------------
 1 file changed, 13 insertions(+), 20 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 3f62ad7b4062..c9c2b7f99758 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -3061,15 +3061,21 @@ static int ufshcd_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
 	return err;
 }
 
-static int ufshcd_compose_dev_cmd(struct ufs_hba *hba,
-		struct ufshcd_lrb *lrbp, enum dev_cmd_type cmd_type, int tag)
+static void ufshcd_setup_dev_cmd(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
+			     enum dev_cmd_type cmd_type, u8 lun, int tag)
 {
 	lrbp->cmd = NULL;
 	lrbp->task_tag = tag;
-	lrbp->lun = 0; /* device management cmd is not specific to any LUN */
+	lrbp->lun = lun;
 	lrbp->intr_cmd = true; /* No interrupt aggregation */
 	ufshcd_prepare_lrbp_crypto(NULL, lrbp);
 	hba->dev_cmd.type = cmd_type;
+}
+
+static int ufshcd_compose_dev_cmd(struct ufs_hba *hba,
+		struct ufshcd_lrb *lrbp, enum dev_cmd_type cmd_type, int tag)
+{
+	ufshcd_setup_dev_cmd(hba, lrbp, cmd_type, 0, tag);
 
 	return ufshcd_compose_devman_upiu(hba, lrbp);
 }
@@ -7213,20 +7219,14 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
 					enum query_opcode desc_op)
 {
 	const u32 tag = hba->reserved_slot;
-	struct ufshcd_lrb *lrbp;
+	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
 	int err = 0;
 	u8 upiu_flags;
 
 	/* Protects use of hba->reserved_slot. */
 	lockdep_assert_held(&hba->dev_cmd.lock);
 
-	lrbp = &hba->lrb[tag];
-	lrbp->cmd = NULL;
-	lrbp->task_tag = tag;
-	lrbp->lun = 0;
-	lrbp->intr_cmd = true;
-	ufshcd_prepare_lrbp_crypto(NULL, lrbp);
-	hba->dev_cmd.type = cmd_type;
+	ufshcd_setup_dev_cmd(hba, lrbp, cmd_type, 0, tag);
 
 	if (hba->ufs_version <= ufshci_version(1, 1))
 		lrbp->command_type = UTP_CMD_TYPE_DEV_MANAGE;
@@ -7372,7 +7372,7 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 			 enum dma_data_direction dir)
 {
 	const u32 tag = hba->reserved_slot;
-	struct ufshcd_lrb *lrbp;
+	struct ufshcd_lrb *lrbp = &hba->lrb[tag];
 	int err = 0;
 	int result;
 	u8 upiu_flags;
@@ -7382,14 +7382,7 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 	/* Protects use of hba->reserved_slot. */
 	ufshcd_dev_man_lock(hba);
 
-	lrbp = &hba->lrb[tag];
-	lrbp->cmd = NULL;
-	lrbp->task_tag = tag;
-	lrbp->lun = UFS_UPIU_RPMB_WLUN;
-
-	lrbp->intr_cmd = true;
-	ufshcd_prepare_lrbp_crypto(NULL, lrbp);
-	hba->dev_cmd.type = DEV_CMD_TYPE_RPMB;
+	ufshcd_setup_dev_cmd(hba, lrbp, DEV_CMD_TYPE_RPMB, UFS_UPIU_RPMB_WLUN, tag);
 
 	/* Advanced RPMB starts from UFS 4.0, so its command type is UTP_CMD_TYPE_UFS_STORAGE */
 	lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
-- 
2.42.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* [PATCH v2 4/4] scsi: ufs: Re-use compose_devman_upiu
  2024-03-05 21:00 [PATCH v2 0/4] Re-use device management code fragments Avri Altman
                   ` (2 preceding siblings ...)
  2024-03-05 21:00 ` [PATCH v2 3/4] scsi: ufs: Re-use compose_dev_cmd Avri Altman
@ 2024-03-05 21:00 ` Avri Altman
  2024-03-07 13:06   ` Bean Huo
  3 siblings, 1 reply; 15+ messages in thread
From: Avri Altman @ 2024-03-05 21:00 UTC (permalink / raw)
  To: James E . J . Bottomley, Martin K . Petersen
  Cc: Bart Van Assche, Bean Huo, linux-scsi, linux-kernel, Avri Altman

Move some code fragments into ufshcd_prepare_req_desc_hdr so it can
be used throughout.

Signed-off-by: Avri Altman <avri.altman@wdc.com>
---
 drivers/ufs/core/ufshcd.c | 49 ++++++++++++++-------------------------
 1 file changed, 17 insertions(+), 32 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index c9c2b7f99758..a39a2b34ee2b 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2710,18 +2710,27 @@ static void ufshcd_disable_intr(struct ufs_hba *hba, u32 intrs)
 /**
  * ufshcd_prepare_req_desc_hdr - Fill UTP Transfer request descriptor header according to request
  * descriptor according to request
+ * @hba: per adapter instance
  * @lrbp: pointer to local reference block
  * @upiu_flags: flags required in the header
  * @cmd_dir: requests data direction
  * @ehs_length: Total EHS Length (in 32‐bytes units of all Extra Header Segments)
+ * @scsi: scsi or device management`
  */
-static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp, u8 *upiu_flags,
-					enum dma_data_direction cmd_dir, int ehs_length)
+static void
+ufshcd_prepare_req_desc_hdr(struct ufs_hba *hba, struct ufshcd_lrb *lrbp,
+			    u8 *upiu_flags, enum dma_data_direction cmd_dir,
+			    int ehs_length, bool scsi)
 {
 	struct utp_transfer_req_desc *req_desc = lrbp->utr_descriptor_ptr;
 	struct request_desc_header *h = &req_desc->header;
 	enum utp_data_direction data_direction;
 
+	if (hba->ufs_version <= ufshci_version(1, 1))
+		lrbp->command_type = scsi ? UTP_CMD_TYPE_SCSI : UTP_CMD_TYPE_DEV_MANAGE;
+	else
+		lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
+
 	*h = (typeof(*h)){ };
 
 	if (cmd_dir == DMA_FROM_DEVICE) {
@@ -2854,12 +2863,8 @@ static int ufshcd_compose_devman_upiu(struct ufs_hba *hba,
 	u8 upiu_flags;
 	int ret = 0;
 
-	if (hba->ufs_version <= ufshci_version(1, 1))
-		lrbp->command_type = UTP_CMD_TYPE_DEV_MANAGE;
-	else
-		lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
+	ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags, DMA_NONE, 0, false);
 
-	ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, DMA_NONE, 0);
 	if (hba->dev_cmd.type == DEV_CMD_TYPE_QUERY)
 		ufshcd_prepare_utp_query_req_upiu(hba, lrbp, upiu_flags);
 	else if (hba->dev_cmd.type == DEV_CMD_TYPE_NOP)
@@ -2882,13 +2887,8 @@ static void ufshcd_comp_scsi_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
 	unsigned int ioprio_class = IOPRIO_PRIO_CLASS(req_get_ioprio(rq));
 	u8 upiu_flags;
 
-	if (hba->ufs_version <= ufshci_version(1, 1))
-		lrbp->command_type = UTP_CMD_TYPE_SCSI;
-	else
-		lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
-
-	ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags,
-				    lrbp->cmd->sc_data_direction, 0);
+	ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags,
+				    lrbp->cmd->sc_data_direction, 0, true);
 	if (ioprio_class == IOPRIO_CLASS_RT)
 		upiu_flags |= UPIU_CMD_FLAGS_CP;
 	ufshcd_prepare_utp_scsi_cmd_upiu(lrbp, upiu_flags);
@@ -7228,16 +7228,11 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
 
 	ufshcd_setup_dev_cmd(hba, lrbp, cmd_type, 0, tag);
 
-	if (hba->ufs_version <= ufshci_version(1, 1))
-		lrbp->command_type = UTP_CMD_TYPE_DEV_MANAGE;
-	else
-		lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
+	ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags, DMA_NONE, 0, false);
 
 	/* update the task tag in the request upiu */
 	req_upiu->header.task_tag = tag;
 
-	ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, DMA_NONE, 0);
-
 	/* just copy the upiu request as it is */
 	memcpy(lrbp->ucd_req_ptr, req_upiu, sizeof(*lrbp->ucd_req_ptr));
 	if (desc_buff && desc_op == UPIU_QUERY_OPCODE_WRITE_DESC) {
@@ -7378,24 +7373,14 @@ int ufshcd_advanced_rpmb_req_handler(struct ufs_hba *hba, struct utp_upiu_req *r
 	u8 upiu_flags;
 	u8 *ehs_data;
 	u16 ehs_len;
+	int ehs = (hba->capabilities & MASK_EHSLUTRD_SUPPORTED) ? 2 : 0;
 
 	/* Protects use of hba->reserved_slot. */
 	ufshcd_dev_man_lock(hba);
 
 	ufshcd_setup_dev_cmd(hba, lrbp, DEV_CMD_TYPE_RPMB, UFS_UPIU_RPMB_WLUN, tag);
 
-	/* Advanced RPMB starts from UFS 4.0, so its command type is UTP_CMD_TYPE_UFS_STORAGE */
-	lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
-
-	/*
-	 * According to UFSHCI 4.0 specification page 24, if EHSLUTRDS is 0, host controller takes
-	 * EHS length from CMD UPIU, and SW driver use EHS Length field in CMD UPIU. if it is 1,
-	 * HW controller takes EHS length from UTRD.
-	 */
-	if (hba->capabilities & MASK_EHSLUTRD_SUPPORTED)
-		ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, dir, 2);
-	else
-		ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, dir, 0);
+	ufshcd_prepare_req_desc_hdr(hba, lrbp, &upiu_flags, DMA_NONE, ehs, false);
 
 	/* update the task tag */
 	req_upiu->header.task_tag = tag;
-- 
2.42.0


^ permalink raw reply related	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 1/4] scsi: ufs: Re-use device management locking code
  2024-03-05 21:00 ` [PATCH v2 1/4] scsi: ufs: Re-use device management locking code Avri Altman
@ 2024-03-06 21:21   ` Bean Huo
  0 siblings, 0 replies; 15+ messages in thread
From: Bean Huo @ 2024-03-06 21:21 UTC (permalink / raw)
  To: Avri Altman, James E . J . Bottomley, Martin K . Petersen
  Cc: Bart Van Assche, Bean Huo, linux-scsi, linux-kernel

On Tue, 2024-03-05 at 23:00 +0200, Avri Altman wrote:
> Group those 3 calls that repeat for every device management command
> into
> a lock and unlock handlers.
> 
> Reviewed-by: Bart Van Assche <bvanassche@acm.org>
> Signed-off-by: Avri Altman <avri.altman@wdc.com>

Reviewed-by: Bean Huo <beanhuo@micron.com>


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 2/4] scsi: ufs: Re-use exec_dev_cmd
  2024-03-05 21:00 ` [PATCH v2 2/4] scsi: ufs: Re-use exec_dev_cmd Avri Altman
@ 2024-03-06 22:05   ` Bean Huo
  2024-03-07 19:28     ` Avri Altman
  0 siblings, 1 reply; 15+ messages in thread
From: Bean Huo @ 2024-03-06 22:05 UTC (permalink / raw)
  To: Avri Altman, James E . J . Bottomley, Martin K . Petersen
  Cc: Bart Van Assche, Bean Huo, linux-scsi, linux-kernel

On Tue, 2024-03-05 at 23:00 +0200, Avri Altman wrote:
> Move out the actual command issue from exec_dev_cmd so it can be used
> elsewhere.  While at it, remove a redundant "lrbp->cmd = NULL"
> assignment.  Also, as a free bonus, call the upiu trace if it
> doesn't.


This statement is a bit strange, what it is "if it doesn't"?

from the change, the patch refactors command issue for broader usage
and enhance UPIU tracing, isolate the command issuance logic from
`ufshcd_exec_dev_cmd` to allow reuse across different contexts.


^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/4] scsi: ufs: Re-use compose_dev_cmd
  2024-03-05 21:00 ` [PATCH v2 3/4] scsi: ufs: Re-use compose_dev_cmd Avri Altman
@ 2024-03-07 12:50   ` Bean Huo
  2024-03-07 18:12   ` Bart Van Assche
  1 sibling, 0 replies; 15+ messages in thread
From: Bean Huo @ 2024-03-07 12:50 UTC (permalink / raw)
  To: Avri Altman, James E . J . Bottomley, Martin K . Petersen
  Cc: Bart Van Assche, Bean Huo, linux-scsi, linux-kernel

On Tue, 2024-03-05 at 23:00 +0200, Avri Altman wrote:
> Move out some of the dev_cmd initializations so it can be used
> elsewhere.
> 
> Signed-off-by: Avri Altman <avri.altman@wdc.com>

Reviewed-by: Bean Huo <beanhuo@micron.com>

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 4/4] scsi: ufs: Re-use compose_devman_upiu
  2024-03-05 21:00 ` [PATCH v2 4/4] scsi: ufs: Re-use compose_devman_upiu Avri Altman
@ 2024-03-07 13:06   ` Bean Huo
  2024-03-07 19:26     ` Avri Altman
  0 siblings, 1 reply; 15+ messages in thread
From: Bean Huo @ 2024-03-07 13:06 UTC (permalink / raw)
  To: Avri Altman, James E . J . Bottomley, Martin K . Petersen
  Cc: Bart Van Assche, Bean Huo, linux-scsi, linux-kernel

On Tue, 2024-03-05 at 23:00 +0200, Avri Altman wrote:
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> index c9c2b7f99758..a39a2b34ee2b 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -2710,18 +2710,27 @@ static void ufshcd_disable_intr(struct
> ufs_hba *hba, u32 intrs)
>  /**
>   * ufshcd_prepare_req_desc_hdr - Fill UTP Transfer request
> descriptor header according to request
>   * descriptor according to request
> + * @hba: per adapter instance
>   * @lrbp: pointer to local reference block
>   * @upiu_flags: flags required in the header
>   * @cmd_dir: requests data direction
>   * @ehs_length: Total EHS Length (in 32‐bytes units of all Extra
> Header Segments)
> + * @scsi: scsi or device management`
				      ^  '`'

>   */
> -static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp, u8
> *upiu_flags,
> -                                       enum dma_data_direction
> cmd_dir, int ehs_length)
> +static void
> +ufshcd_prepare_req_desc_hdr(struct ufs_hba *hba, struct ufshcd_lrb
> *lrbp,
> +                           u8 *upiu_flags, enum dma_data_direction
> cmd_dir,
> +                           int ehs_length, bool scsi)

Why not directly pass UTP_CMD_TYPE_SCSI or UTP_CMD_TYPE_DEV_MANAGE
instead of using below ?: logic?


>  {
>         struct utp_transfer_req_desc *req_desc = lrbp-
> >utr_descriptor_ptr;
>         struct request_desc_header *h = &req_desc->header;
>         enum utp_data_direction data_direction;
>  
> +       if (hba->ufs_version <= ufshci_version(1, 1))
> +               lrbp->command_type = scsi ? UTP_CMD_TYPE_SCSI :
> UTP_CMD_TYPE_DEV_MANAGE;



^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 3/4] scsi: ufs: Re-use compose_dev_cmd
  2024-03-05 21:00 ` [PATCH v2 3/4] scsi: ufs: Re-use compose_dev_cmd Avri Altman
  2024-03-07 12:50   ` Bean Huo
@ 2024-03-07 18:12   ` Bart Van Assche
  1 sibling, 0 replies; 15+ messages in thread
From: Bart Van Assche @ 2024-03-07 18:12 UTC (permalink / raw)
  To: Avri Altman, James E . J . Bottomley, Martin K . Petersen
  Cc: Bean Huo, linux-scsi, linux-kernel

On 3/5/24 13:00, Avri Altman wrote:
> Move out some of the dev_cmd initializations so it can be used
> elsewhere.

Reviewed-by: Bart Van Assche <bvanassche@acm.org>


^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [PATCH v2 4/4] scsi: ufs: Re-use compose_devman_upiu
  2024-03-07 13:06   ` Bean Huo
@ 2024-03-07 19:26     ` Avri Altman
  2024-03-08 22:32       ` Bart Van Assche
  0 siblings, 1 reply; 15+ messages in thread
From: Avri Altman @ 2024-03-07 19:26 UTC (permalink / raw)
  To: Bean Huo, James E . J . Bottomley, Martin K . Petersen
  Cc: Bart Van Assche, Bean Huo, linux-scsi, linux-kernel

> 
> On Tue, 2024-03-05 at 23:00 +0200, Avri Altman wrote:
> > diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
> > index c9c2b7f99758..a39a2b34ee2b 100644
> > --- a/drivers/ufs/core/ufshcd.c
> > +++ b/drivers/ufs/core/ufshcd.c
> > @@ -2710,18 +2710,27 @@ static void ufshcd_disable_intr(struct ufs_hba
> > *hba, u32 intrs)
> >  /**
> >   * ufshcd_prepare_req_desc_hdr - Fill UTP Transfer request descriptor
> > header according to request
> >   * descriptor according to request
> > + * @hba: per adapter instance
> >   * @lrbp: pointer to local reference block
> >   * @upiu_flags: flags required in the header
> >   * @cmd_dir: requests data direction
> >   * @ehs_length: Total EHS Length (in 32‐bytes units of all Extra
> > Header Segments)
> > + * @scsi: scsi or device management`
>                                       ^  '`'
> 
> >   */
> > -static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp, u8
> > *upiu_flags,
> > -                                       enum dma_data_direction
> > cmd_dir, int ehs_length)
> > +static void
> > +ufshcd_prepare_req_desc_hdr(struct ufs_hba *hba, struct ufshcd_lrb
> > *lrbp,
> > +                           u8 *upiu_flags, enum dma_data_direction
> > cmd_dir,
> > +                           int ehs_length, bool scsi)
> 
> Why not directly pass UTP_CMD_TYPE_SCSI or UTP_CMD_TYPE_DEV_MANAGE
> instead of using below ?: logic?
Thanks.  Will do that.

Thanks,
Avri

> 
> 
> >  {
> >         struct utp_transfer_req_desc *req_desc = lrbp-
> > >utr_descriptor_ptr;
> >         struct request_desc_header *h = &req_desc->header;
> >         enum utp_data_direction data_direction;
> >
> > +       if (hba->ufs_version <= ufshci_version(1, 1))
> > +               lrbp->command_type = scsi ? UTP_CMD_TYPE_SCSI :
> > UTP_CMD_TYPE_DEV_MANAGE;
> 


^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [PATCH v2 2/4] scsi: ufs: Re-use exec_dev_cmd
  2024-03-06 22:05   ` Bean Huo
@ 2024-03-07 19:28     ` Avri Altman
  2024-03-08 19:29       ` Bean Huo
  0 siblings, 1 reply; 15+ messages in thread
From: Avri Altman @ 2024-03-07 19:28 UTC (permalink / raw)
  To: Bean Huo, James E . J . Bottomley, Martin K . Petersen
  Cc: Bart Van Assche, Bean Huo, linux-scsi, linux-kernel

> 
> On Tue, 2024-03-05 at 23:00 +0200, Avri Altman wrote:
> > Move out the actual command issue from exec_dev_cmd so it can be used
> > elsewhere.  While at it, remove a redundant "lrbp->cmd = NULL"
> > assignment.  Also, as a free bonus, call the upiu trace if it doesn't.
> 
> 
> This statement is a bit strange, what it is "if it doesn't"?
> 
> from the change, the patch refactors command issue for broader usage
> and enhance UPIU tracing, isolate the command issuance logic from
> `ufshcd_exec_dev_cmd` to allow reuse across different contexts.
What I meant is, that I see no downside for including the bsg path in the upiu trace event.
Do you object to that?

Thanks,
Avri

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 2/4] scsi: ufs: Re-use exec_dev_cmd
  2024-03-07 19:28     ` Avri Altman
@ 2024-03-08 19:29       ` Bean Huo
  2024-03-08 19:42         ` Avri Altman
  0 siblings, 1 reply; 15+ messages in thread
From: Bean Huo @ 2024-03-08 19:29 UTC (permalink / raw)
  To: Avri Altman, James E . J . Bottomley, Martin K . Petersen
  Cc: Bart Van Assche, Bean Huo, linux-scsi, linux-kernel

On Thu, 2024-03-07 at 19:28 +0000, Avri Altman wrote:
> > On Tue, 2024-03-05 at 23:00 +0200, Avri Altman wrote:
> > > Move out the actual command issue from exec_dev_cmd so it can be
> > > used
> > > elsewhere.  While at it, remove a redundant "lrbp->cmd = NULL"
> > > assignment.  Also, as a free bonus, call the upiu trace if it
> > > doesn't.
> > 
> > 
> > This statement is a bit strange, what it is "if it doesn't"?
> > 
> > from the change, the patch refactors command issue for broader
> > usage
> > and enhance UPIU tracing, isolate the command issuance logic from
> > `ufshcd_exec_dev_cmd` to allow reuse across different contexts.
> What I meant is, that I see no downside for including the bsg path in
> the upiu trace event.
> Do you object to that?

Avri, 

no, I meant your commit message is not clearer. and then understood
after reading your patch.

Kind regards,
Bean

^ permalink raw reply	[flat|nested] 15+ messages in thread

* RE: [PATCH v2 2/4] scsi: ufs: Re-use exec_dev_cmd
  2024-03-08 19:29       ` Bean Huo
@ 2024-03-08 19:42         ` Avri Altman
  0 siblings, 0 replies; 15+ messages in thread
From: Avri Altman @ 2024-03-08 19:42 UTC (permalink / raw)
  To: Bean Huo, James E . J . Bottomley, Martin K . Petersen
  Cc: Bart Van Assche, Bean Huo, linux-scsi, linux-kernel

> On Thu, 2024-03-07 at 19:28 +0000, Avri Altman wrote:
> > > On Tue, 2024-03-05 at 23:00 +0200, Avri Altman wrote:
> > > > Move out the actual command issue from exec_dev_cmd so it can be
> > > > used elsewhere.  While at it, remove a redundant "lrbp->cmd =
> > > > NULL"
> > > > assignment.  Also, as a free bonus, call the upiu trace if it
> > > > doesn't.
> > >
> > >
> > > This statement is a bit strange, what it is "if it doesn't"?
> > >
> > > from the change, the patch refactors command issue for broader usage
> > > and enhance UPIU tracing, isolate the command issuance logic from
> > > `ufshcd_exec_dev_cmd` to allow reuse across different contexts.
> > What I meant is, that I see no downside for including the bsg path in
> > the upiu trace event.
> > Do you object to that?
> 
> Avri,
> 
> no, I meant your commit message is not clearer. and then understood after
> reading your patch.
Will reword the commit log.

Thanks,
Avri

> 
> Kind regards,
> Bean

^ permalink raw reply	[flat|nested] 15+ messages in thread

* Re: [PATCH v2 4/4] scsi: ufs: Re-use compose_devman_upiu
  2024-03-07 19:26     ` Avri Altman
@ 2024-03-08 22:32       ` Bart Van Assche
  0 siblings, 0 replies; 15+ messages in thread
From: Bart Van Assche @ 2024-03-08 22:32 UTC (permalink / raw)
  To: Avri Altman, Bean Huo, James E . J . Bottomley, Martin K . Petersen
  Cc: Bean Huo, linux-scsi, linux-kernel

On 3/7/24 11:26, Avri Altman wrote:
> On Tue, 2024-03-05 at 23:00 +0200, Avri Altman wrote:
>> Why not directly pass UTP_CMD_TYPE_SCSI or UTP_CMD_TYPE_DEV_MANAGE
>> instead of using below ?: logic?
>
> Thanks.  Will do that.

While making that change, please keep the version check inside
ufshcd_prepare_req_desc_hdr().

Thanks,

Bart.


^ permalink raw reply	[flat|nested] 15+ messages in thread

end of thread, other threads:[~2024-03-08 22:32 UTC | newest]

Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-03-05 21:00 [PATCH v2 0/4] Re-use device management code fragments Avri Altman
2024-03-05 21:00 ` [PATCH v2 1/4] scsi: ufs: Re-use device management locking code Avri Altman
2024-03-06 21:21   ` Bean Huo
2024-03-05 21:00 ` [PATCH v2 2/4] scsi: ufs: Re-use exec_dev_cmd Avri Altman
2024-03-06 22:05   ` Bean Huo
2024-03-07 19:28     ` Avri Altman
2024-03-08 19:29       ` Bean Huo
2024-03-08 19:42         ` Avri Altman
2024-03-05 21:00 ` [PATCH v2 3/4] scsi: ufs: Re-use compose_dev_cmd Avri Altman
2024-03-07 12:50   ` Bean Huo
2024-03-07 18:12   ` Bart Van Assche
2024-03-05 21:00 ` [PATCH v2 4/4] scsi: ufs: Re-use compose_devman_upiu Avri Altman
2024-03-07 13:06   ` Bean Huo
2024-03-07 19:26     ` Avri Altman
2024-03-08 22:32       ` Bart Van Assche

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).