Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

scsi: ufs: core: Call ufshcd_init_lrb() later

Call ufshcd_init_lrb() from inside ufshcd_setup_dev_cmd() instead of
ufshcd_host_memory_configure(). This patch prepares for calling
ufshcd_host_memory_configure() before the information is available that
is required to call ufshcd_setup_dev_cmd().

Reviewed-by: Avri Altman <avri.altman@sandisk.com>
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Link: https://patch.msgid.link/20251031204029.2883185-20-bvanassche@acm.org
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>

authored by

Bart Van Assche and committed by
Martin K. Petersen
45e636ea f46b9a59

+27 -26
+27 -26
drivers/ufs/core/ufshcd.c
··· 2904 2904 ufshcd_prepare_utp_scsi_cmd_upiu(lrbp, upiu_flags); 2905 2905 } 2906 2906 2907 - static void __ufshcd_setup_cmd(struct ufshcd_lrb *lrbp, struct scsi_cmnd *cmd, u8 lun, int tag) 2907 + static void ufshcd_init_lrb(struct ufs_hba *hba, struct ufshcd_lrb *lrb, int i) 2908 2908 { 2909 + struct utp_transfer_cmd_desc *cmd_descp = 2910 + (void *)hba->ucdl_base_addr + i * ufshcd_get_ucd_size(hba); 2911 + struct utp_transfer_req_desc *utrdlp = hba->utrdl_base_addr; 2912 + dma_addr_t cmd_desc_element_addr = 2913 + hba->ucdl_dma_addr + i * ufshcd_get_ucd_size(hba); 2914 + u16 response_offset = le16_to_cpu(utrdlp[i].response_upiu_offset); 2915 + u16 prdt_offset = le16_to_cpu(utrdlp[i].prd_table_offset); 2916 + 2917 + lrb->utr_descriptor_ptr = utrdlp + i; 2918 + lrb->utrd_dma_addr = 2919 + hba->utrdl_dma_addr + i * sizeof(struct utp_transfer_req_desc); 2920 + lrb->ucd_req_ptr = (struct utp_upiu_req *)cmd_descp->command_upiu; 2921 + lrb->ucd_req_dma_addr = cmd_desc_element_addr; 2922 + lrb->ucd_rsp_ptr = (struct utp_upiu_rsp *)cmd_descp->response_upiu; 2923 + lrb->ucd_rsp_dma_addr = cmd_desc_element_addr + response_offset; 2924 + lrb->ucd_prdt_ptr = (struct ufshcd_sg_entry *)cmd_descp->prd_table; 2925 + lrb->ucd_prdt_dma_addr = cmd_desc_element_addr + prdt_offset; 2926 + } 2927 + 2928 + static void __ufshcd_setup_cmd(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, 2929 + struct scsi_cmnd *cmd, u8 lun, int tag) 2930 + { 2931 + ufshcd_init_lrb(hba, lrbp, tag); 2932 + 2909 2933 memset(lrbp->ucd_req_ptr, 0, sizeof(*lrbp->ucd_req_ptr)); 2910 2934 2911 2935 lrbp->cmd = cmd; ··· 2941 2917 static void ufshcd_setup_scsi_cmd(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, 2942 2918 struct scsi_cmnd *cmd, u8 lun, int tag) 2943 2919 { 2944 - __ufshcd_setup_cmd(lrbp, cmd, lun, tag); 2920 + __ufshcd_setup_cmd(hba, lrbp, cmd, lun, tag); 2945 2921 lrbp->intr_cmd = !ufshcd_is_intr_aggr_allowed(hba); 2946 2922 lrbp->req_abort_skip = false; 2947 2923 ··· 2994 2970 blk_mq_map_queues(map); 2995 2971 queue_offset += map->nr_queues; 2996 2972 } 2997 - } 2998 - 2999 - static void ufshcd_init_lrb(struct ufs_hba *hba, struct ufshcd_lrb *lrb, int i) 3000 - { 3001 - struct utp_transfer_cmd_desc *cmd_descp = (void *)hba->ucdl_base_addr + 3002 - i * ufshcd_get_ucd_size(hba); 3003 - struct utp_transfer_req_desc *utrdlp = hba->utrdl_base_addr; 3004 - dma_addr_t cmd_desc_element_addr = hba->ucdl_dma_addr + 3005 - i * ufshcd_get_ucd_size(hba); 3006 - u16 response_offset = le16_to_cpu(utrdlp[i].response_upiu_offset); 3007 - u16 prdt_offset = le16_to_cpu(utrdlp[i].prd_table_offset); 3008 - 3009 - lrb->utr_descriptor_ptr = utrdlp + i; 3010 - lrb->utrd_dma_addr = hba->utrdl_dma_addr + 3011 - i * sizeof(struct utp_transfer_req_desc); 3012 - lrb->ucd_req_ptr = (struct utp_upiu_req *)cmd_descp->command_upiu; 3013 - lrb->ucd_req_dma_addr = cmd_desc_element_addr; 3014 - lrb->ucd_rsp_ptr = (struct utp_upiu_rsp *)cmd_descp->response_upiu; 3015 - lrb->ucd_rsp_dma_addr = cmd_desc_element_addr + response_offset; 3016 - lrb->ucd_prdt_ptr = (struct ufshcd_sg_entry *)cmd_descp->prd_table; 3017 - lrb->ucd_prdt_dma_addr = cmd_desc_element_addr + prdt_offset; 3018 2973 } 3019 2974 3020 2975 /** ··· 3088 3085 static void ufshcd_setup_dev_cmd(struct ufs_hba *hba, struct ufshcd_lrb *lrbp, 3089 3086 enum dev_cmd_type cmd_type, u8 lun, int tag) 3090 3087 { 3091 - __ufshcd_setup_cmd(lrbp, NULL, lun, tag); 3088 + __ufshcd_setup_cmd(hba, lrbp, NULL, lun, tag); 3092 3089 lrbp->intr_cmd = true; /* No interrupt aggregation */ 3093 3090 hba->dev_cmd.type = cmd_type; 3094 3091 } ··· 4051 4048 utrdlp[i].response_upiu_length = 4052 4049 cpu_to_le16(ALIGNED_UPIU_SIZE >> 2); 4053 4050 } 4054 - 4055 - ufshcd_init_lrb(hba, &hba->lrb[i], i); 4056 4051 } 4057 4052 } 4058 4053