Message ID | 20221120222217.108492-4-beanhuo@iokpp.de |
---|---|
State | Superseded |
Headers | show |
Series | UFS Advanced RPMB | expand |
> From: Bean Huo <beanhuo@micron.com> > > Take out the "map scatter-gather list to prdt" part of the code in > ufshcd_map_sg and split it into a new function ufshcd_sgl_to_prdt. > > Signed-off-by: Bean Huo <beanhuo@micron.com> A nit below. Reviewed-by: Avri Altman <avri.altman@wdc.com> > --- > drivers/ufs/core/ufshcd.c | 50 ++++++++++++++++++++++++--------------- > 1 file changed, 31 insertions(+), 19 deletions(-) > > diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index > 768cb49d269c..1b252e6cf93f 100644 > --- a/drivers/ufs/core/ufshcd.c > +++ b/drivers/ufs/core/ufshcd.c > @@ -2399,38 +2399,30 @@ int ufshcd_send_uic_cmd(struct ufs_hba *hba, > struct uic_command *uic_cmd) } > > /** > - * ufshcd_map_sg - Map scatter-gather list to prdt > - * @hba: per adapter instance > - * @lrbp: pointer to local reference block > - * > - * Returns 0 in case of success, non-zero value in case of failure > + * ufshcd_sgl_to_prdt - SG list to PRTD (Physical Region Description Table, > 4DW format) > + * @hba: per-adapter instance > + * @lrbp: pointer to local reference block > + * @sg_entries: The number of sg lists actually used > + * @sg_list: Pointer to SG list > */ > -static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) > +static void ufshcd_sgl_to_prdt(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, > int sg_entries, > + struct scatterlist *sg_list) > { > struct ufshcd_sg_entry *prd_table; > struct scatterlist *sg; > - struct scsi_cmnd *cmd; > - int sg_segments; > int i; > > - cmd = lrbp->cmd; > - sg_segments = scsi_dma_map(cmd); > - if (sg_segments < 0) > - return sg_segments; > - > - if (sg_segments) { > + if (sg_entries) { > > if (hba->quirks & UFSHCD_QUIRK_PRDT_BYTE_GRAN) > lrbp->utr_descriptor_ptr->prd_table_length = > - cpu_to_le16((sg_segments * > - sizeof(struct ufshcd_sg_entry))); > + cpu_to_le16((sg_entries * sizeof(struct > + ufshcd_sg_entry))); > else > - lrbp->utr_descriptor_ptr->prd_table_length = > - cpu_to_le16(sg_segments); > + lrbp->utr_descriptor_ptr->prd_table_length = > + cpu_to_le16(sg_entries); > > prd_table = lrbp->ucd_prdt_ptr; > > - scsi_for_each_sg(cmd, sg, sg_segments, i) { > + for_each_sg(sg_list, sg, sg_entries, i) { > const unsigned int len = sg_dma_len(sg); > > /* > @@ -2449,6 +2441,26 @@ static int ufshcd_map_sg(struct ufs_hba *hba, > struct ufshcd_lrb *lrbp) > } else { > lrbp->utr_descriptor_ptr->prd_table_length = 0; > } > +} > + > +/** > + * ufshcd_map_sg - Map scatter-gather list to prdt > + * @hba: per adapter instance > + * @lrbp: pointer to local reference block > + * > + * Returns 0 in case of success, non-zero value in case of failure */ > +static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) > +{ > + struct scsi_cmnd *cmd; > + int sg_segments; > + > + cmd = lrbp->cmd; > + sg_segments = scsi_dma_map(cmd); Maybe initialize in declaration? > + if (sg_segments < 0) > + return sg_segments; > + > + ufshcd_sgl_to_prdt(hba, lrbp, sg_segments, scsi_sglist(cmd)); > > return 0; > } > -- > 2.25.1
On Tue, 2022-11-22 at 08:15 +0000, Avri Altman wrote: > > + > > + cmd = lrbp->cmd; > > + sg_segments = scsi_dma_map(cmd); > > Maybe initialize in declaration? yes, agree, will change it in the next version Kind regards, Bean
diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c index 768cb49d269c..1b252e6cf93f 100644 --- a/drivers/ufs/core/ufshcd.c +++ b/drivers/ufs/core/ufshcd.c @@ -2399,38 +2399,30 @@ int ufshcd_send_uic_cmd(struct ufs_hba *hba, struct uic_command *uic_cmd) } /** - * ufshcd_map_sg - Map scatter-gather list to prdt - * @hba: per adapter instance - * @lrbp: pointer to local reference block - * - * Returns 0 in case of success, non-zero value in case of failure + * ufshcd_sgl_to_prdt - SG list to PRTD (Physical Region Description Table, 4DW format) + * @hba: per-adapter instance + * @lrbp: pointer to local reference block + * @sg_entries: The number of sg lists actually used + * @sg_list: Pointer to SG list */ -static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) +static void ufshcd_sgl_to_prdt(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, int sg_entries, + struct scatterlist *sg_list) { struct ufshcd_sg_entry *prd_table; struct scatterlist *sg; - struct scsi_cmnd *cmd; - int sg_segments; int i; - cmd = lrbp->cmd; - sg_segments = scsi_dma_map(cmd); - if (sg_segments < 0) - return sg_segments; - - if (sg_segments) { + if (sg_entries) { if (hba->quirks & UFSHCD_QUIRK_PRDT_BYTE_GRAN) lrbp->utr_descriptor_ptr->prd_table_length = - cpu_to_le16((sg_segments * - sizeof(struct ufshcd_sg_entry))); + cpu_to_le16((sg_entries * sizeof(struct ufshcd_sg_entry))); else - lrbp->utr_descriptor_ptr->prd_table_length = - cpu_to_le16(sg_segments); + lrbp->utr_descriptor_ptr->prd_table_length = cpu_to_le16(sg_entries); prd_table = lrbp->ucd_prdt_ptr; - scsi_for_each_sg(cmd, sg, sg_segments, i) { + for_each_sg(sg_list, sg, sg_entries, i) { const unsigned int len = sg_dma_len(sg); /* @@ -2449,6 +2441,26 @@ static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) } else { lrbp->utr_descriptor_ptr->prd_table_length = 0; } +} + +/** + * ufshcd_map_sg - Map scatter-gather list to prdt + * @hba: per adapter instance + * @lrbp: pointer to local reference block + * + * Returns 0 in case of success, non-zero value in case of failure + */ +static int ufshcd_map_sg(struct ufs_hba *hba, struct ufshcd_lrb *lrbp) +{ + struct scsi_cmnd *cmd; + int sg_segments; + + cmd = lrbp->cmd; + sg_segments = scsi_dma_map(cmd); + if (sg_segments < 0) + return sg_segments; + + ufshcd_sgl_to_prdt(hba, lrbp, sg_segments, scsi_sglist(cmd)); return 0; }