scsi: ufs: Use pre-calculated offsets in ufshcd_init_lrb()
authorAvri Altman <avri.altman@wdc.com>
Tue, 10 Sep 2024 04:45:43 +0000 (07:45 +0300)
committerMartin K. Petersen <martin.petersen@oracle.com>
Fri, 4 Oct 2024 01:30:54 +0000 (21:30 -0400)
Replace manual offset calculations for response_upiu and prd_table in
ufshcd_init_lrb() with pre-calculated offsets already stored in the
utp_transfer_req_desc structure. The pre-calculated offsets are set
differently in ufshcd_host_memory_configure() based on the
UFSHCD_QUIRK_PRDT_BYTE_GRAN quirk, ensuring correct alignment and
access.

Fixes: 26f968d7de82 ("scsi: ufs: Introduce UFSHCD_QUIRK_PRDT_BYTE_GRAN quirk")
Cc: stable@vger.kernel.org
Signed-off-by: Avri Altman <avri.altman@wdc.com>
Link: https://lore.kernel.org/r/20240910044543.3812642-1-avri.altman@wdc.com
Acked-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufshcd.c

index 24a32e2..6a71ebf 100644 (file)
@@ -2933,9 +2933,8 @@ static void ufshcd_init_lrb(struct ufs_hba *hba, struct ufshcd_lrb *lrb, int i)
        struct utp_transfer_req_desc *utrdlp = hba->utrdl_base_addr;
        dma_addr_t cmd_desc_element_addr = hba->ucdl_dma_addr +
                i * ufshcd_get_ucd_size(hba);
-       u16 response_offset = offsetof(struct utp_transfer_cmd_desc,
-                                      response_upiu);
-       u16 prdt_offset = offsetof(struct utp_transfer_cmd_desc, prd_table);
+       u16 response_offset = le16_to_cpu(utrdlp[i].response_upiu_offset);
+       u16 prdt_offset = le16_to_cpu(utrdlp[i].prd_table_offset);
 
        lrb->utr_descriptor_ptr = utrdlp + i;
        lrb->utrd_dma_addr = hba->utrdl_dma_addr +