2024-03-05 21:04:00

by Avri Altman

[permalink] [raw]
Subject: [PATCH v2 4/4] scsi: ufs: Re-use compose_devman_upiu

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

Signed-off-by: Avri Altman <[email protected]>
---
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



2024-03-07 13:06:52

by Bean Huo

[permalink] [raw]
Subject: Re: [PATCH v2 4/4] scsi: ufs: Re-use compose_devman_upiu

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;



2024-03-07 19:26:59

by Avri Altman

[permalink] [raw]
Subject: RE: [PATCH v2 4/4] scsi: ufs: Re-use compose_devman_upiu

>
> 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;
>

2024-03-08 22:32:35

by Bart Van Assche

[permalink] [raw]
Subject: Re: [PATCH v2 4/4] scsi: ufs: Re-use compose_devman_upiu

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.