2022-11-20 22:24:39

by Bean Huo

[permalink] [raw]
Subject: [PATCH v2 5/6] ufs: core: Pass EHS length into ufshcd_prepare_req_desc_hdr()

From: Bean Huo <[email protected]>

We need to fill in the total EHS length in UTP Transfer Request Descriptor,
add this functionality to ufshcd_prepare_req_desc_hdr().

Signed-off-by: Bean Huo <[email protected]>
---
drivers/ufs/core/ufshcd.c | 21 ++++++++++-----------
1 file changed, 10 insertions(+), 11 deletions(-)

diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
index 311172578fd8..2936e1e583c3 100644
--- a/drivers/ufs/core/ufshcd.c
+++ b/drivers/ufs/core/ufshcd.c
@@ -2508,14 +2508,15 @@ static void ufshcd_disable_intr(struct ufs_hba *hba, u32 intrs)
}

/**
- * ufshcd_prepare_req_desc_hdr() - Fills the requests header
+ * ufshcd_prepare_req_desc_hdr - Fill UTP Transfer request descriptor header according to request
* descriptor according to request
* @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)
*/
-static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp,
- u8 *upiu_flags, enum dma_data_direction cmd_dir)
+static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp, u8 *upiu_flags,
+ enum dma_data_direction cmd_dir, int ehs_length)
{
struct utp_transfer_req_desc *req_desc = lrbp->utr_descriptor_ptr;
u32 data_direction;
@@ -2534,8 +2535,8 @@ static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp,
*upiu_flags = UPIU_CMD_FLAGS_NONE;
}

- dword_0 = data_direction | (lrbp->command_type
- << UPIU_COMMAND_TYPE_OFFSET);
+ dword_0 = data_direction | (lrbp->command_type << UPIU_COMMAND_TYPE_OFFSET) |
+ ehs_length << 8;
if (lrbp->intr_cmd)
dword_0 |= UTP_REQ_DESC_INT_CMD;

@@ -2590,8 +2591,7 @@ void ufshcd_prepare_utp_scsi_cmd_upiu(struct ufshcd_lrb *lrbp, u8 upiu_flags)
}

/**
- * ufshcd_prepare_utp_query_req_upiu() - fills the utp_transfer_req_desc,
- * for query requsts
+ * ufshcd_prepare_utp_query_req_upiu() - fill the utp_transfer_req_desc for query request
* @hba: UFS hba
* @lrbp: local reference block pointer
* @upiu_flags: flags
@@ -2662,7 +2662,7 @@ static int ufshcd_compose_devman_upiu(struct ufs_hba *hba,
else
lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;

- ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, DMA_NONE);
+ 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)
@@ -2690,8 +2690,7 @@ static int ufshcd_comp_scsi_upiu(struct ufs_hba *hba, struct ufshcd_lrb *lrbp)
lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;

if (likely(lrbp->cmd)) {
- ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags,
- lrbp->cmd->sc_data_direction);
+ ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, lrbp->cmd->sc_data_direction, 0);
ufshcd_prepare_utp_scsi_cmd_upiu(lrbp, upiu_flags);
} else {
ret = -EINVAL;
@@ -6862,7 +6861,7 @@ static int ufshcd_issue_devman_upiu_cmd(struct ufs_hba *hba,
/* update the task tag in the request upiu */
req_upiu->header.dword_0 |= cpu_to_be32(tag);

- ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, DMA_NONE);
+ 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));
--
2.25.1



2022-11-22 11:14:05

by Avri Altman

[permalink] [raw]
Subject: RE: [PATCH v2 5/6] ufs: core: Pass EHS length into ufshcd_prepare_req_desc_hdr()


> From: Bean Huo <[email protected]>
>
> We need to fill in the total EHS length in UTP Transfer Request Descriptor,
> add this functionality to ufshcd_prepare_req_desc_hdr().
>
> Signed-off-by: Bean Huo <[email protected]>
Reviewed-by: Avri Altman <[email protected]>

> ---
> drivers/ufs/core/ufshcd.c | 21 ++++++++++-----------
> 1 file changed, 10 insertions(+), 11 deletions(-)
>
> diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index
> 311172578fd8..2936e1e583c3 100644
> --- a/drivers/ufs/core/ufshcd.c
> +++ b/drivers/ufs/core/ufshcd.c
> @@ -2508,14 +2508,15 @@ static void ufshcd_disable_intr(struct ufs_hba
> *hba, u32 intrs) }
>
> /**
> - * ufshcd_prepare_req_desc_hdr() - Fills the requests header
> + * ufshcd_prepare_req_desc_hdr - Fill UTP Transfer request descriptor
> + header according to request
> * descriptor according to request
> * @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)
> */
> -static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp,
> - u8 *upiu_flags, enum dma_data_direction cmd_dir)
> +static void ufshcd_prepare_req_desc_hdr(struct ufshcd_lrb *lrbp, u8
> *upiu_flags,
> + enum dma_data_direction cmd_dir,
> +int ehs_length)
> {
> struct utp_transfer_req_desc *req_desc = lrbp->utr_descriptor_ptr;
> u32 data_direction;
> @@ -2534,8 +2535,8 @@ static void ufshcd_prepare_req_desc_hdr(struct
> ufshcd_lrb *lrbp,
> *upiu_flags = UPIU_CMD_FLAGS_NONE;
> }
>
> - dword_0 = data_direction | (lrbp->command_type
> - << UPIU_COMMAND_TYPE_OFFSET);
> + dword_0 = data_direction | (lrbp->command_type <<
> UPIU_COMMAND_TYPE_OFFSET) |
> + ehs_length << 8;
> if (lrbp->intr_cmd)
> dword_0 |= UTP_REQ_DESC_INT_CMD;
>
> @@ -2590,8 +2591,7 @@ void ufshcd_prepare_utp_scsi_cmd_upiu(struct
> ufshcd_lrb *lrbp, u8 upiu_flags) }
>
> /**
> - * ufshcd_prepare_utp_query_req_upiu() - fills the utp_transfer_req_desc,
> - * for query requsts
> + * ufshcd_prepare_utp_query_req_upiu() - fill the utp_transfer_req_desc
> + for query request
> * @hba: UFS hba
> * @lrbp: local reference block pointer
> * @upiu_flags: flags
> @@ -2662,7 +2662,7 @@ static int ufshcd_compose_devman_upiu(struct
> ufs_hba *hba,
> else
> lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
>
> - ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, DMA_NONE);
> + 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) @@ -2690,8
> +2690,7 @@ static int ufshcd_comp_scsi_upiu(struct ufs_hba *hba, struct
> ufshcd_lrb *lrbp)
> lrbp->command_type = UTP_CMD_TYPE_UFS_STORAGE;
>
> if (likely(lrbp->cmd)) {
> - ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags,
> - lrbp->cmd->sc_data_direction);
> + ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags,
> + lrbp->cmd->sc_data_direction, 0);
> ufshcd_prepare_utp_scsi_cmd_upiu(lrbp, upiu_flags);
> } else {
> ret = -EINVAL;
> @@ -6862,7 +6861,7 @@ static int ufshcd_issue_devman_upiu_cmd(struct
> ufs_hba *hba,
> /* update the task tag in the request upiu */
> req_upiu->header.dword_0 |= cpu_to_be32(tag);
>
> - ufshcd_prepare_req_desc_hdr(lrbp, &upiu_flags, DMA_NONE);
> + 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));
> --
> 2.25.1