Message ID | 20221120222217.108492-6-beanhuo@iokpp.de (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | UFS Advanced RPMB | expand |
> From: Bean Huo <beanhuo@micron.com> > > 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 <beanhuo@micron.com> Reviewed-by: Avri Altman <avri.altman@wdc.com> > --- > 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
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));