RE: [PATCH v2 3/6] ufs: core: Split ufshcd_map_sg
From: Avri Altman
Date: Tue Nov 22 2022 - 03:15:46 EST
> From: Bean Huo <beanhuo@xxxxxxxxxx>
>
> 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@xxxxxxxxxx>
A nit below.
Reviewed-by: Avri Altman <avri.altman@xxxxxxx>
> ---
> 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