* [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* 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 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@vger.kernel.org,
linux-kernel@vger.kernel.org
>
> 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@vger.kernel.org,
linux-kernel@vger.kernel.org
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@vger.kernel.org,
linux-kernel@vger.kernel.org
> 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
* [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* 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 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
* [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 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 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@vger.kernel.org,
linux-kernel@vger.kernel.org
>
> 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 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@vger.kernel.org,
linux-kernel@vger.kernel.org
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