]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
scsi: ufs: core: Update CQ Entry to UFS 4.1 format
authorPeter Wang <peter.wang@mediatek.com>
Thu, 16 Oct 2025 02:32:31 +0000 (10:32 +0800)
committerMartin K. Petersen <martin.petersen@oracle.com>
Wed, 22 Oct 2025 01:16:04 +0000 (21:16 -0400)
Update the completion queue (CQ) entry format according to the UFS 4.1
specification. UFS 4.1 introduces new members in reserved record
DW5. Also refine DW4 with detailed members defined in UFS 4.0. Modify
the code to incorporate these changes by updating the overall_status in
the CQ entry structure.

Signed-off-by: Peter Wang <peter.wang@mediatek.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Link: https://patch.msgid.link/20251016023507.1000664-2-peter.wang@mediatek.com
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufshcd.c
include/ufs/ufshci.h

index 8339fec975b9230c67cc6c5338fed2fbf01af2af..864b2c490feba40b80ee5eeb0ae20acfb5a89ae2 100644 (file)
@@ -856,7 +856,7 @@ static enum utp_ocs ufshcd_get_tr_ocs(struct ufshcd_lrb *lrbp,
                                      struct cq_entry *cqe)
 {
        if (cqe)
-               return le32_to_cpu(cqe->status) & MASK_OCS;
+               return cqe->overall_status & MASK_OCS;
 
        return lrbp->utr_descriptor_ptr->header.ocs & MASK_OCS;
 }
@@ -5646,7 +5646,7 @@ void ufshcd_compl_one_cqe(struct ufs_hba *hba, int task_tag,
                scsi_done(cmd);
        } else {
                if (cqe) {
-                       ocs = le32_to_cpu(cqe->status) & MASK_OCS;
+                       ocs = cqe->overall_status & MASK_OCS;
                        lrbp->utr_descriptor_ptr->header.ocs = ocs;
                }
                complete(&hba->dev_cmd.complete);
index e64b701321010be384175d6fbe1d8893023536e1..bfc5401a9a0a0ca96a335e048c5208379a210bc9 100644 (file)
@@ -569,10 +569,26 @@ struct cq_entry {
        __le16  prd_table_offset;
 
        /* DW 4 */
-       __le32 status;
+       u8 overall_status;
+       u8 extended_error_code;
+       __le16 reserved_1;
 
-       /* DW 5-7 */
-       __le32 reserved[3];
+       /* DW 5 */
+       u8 task_tag;
+       u8 lun;
+#if defined(__BIG_ENDIAN)
+       u8 ext_iid:4;
+       u8 iid:4;
+#elif defined(__LITTLE_ENDIAN)
+       u8 iid:4;
+       u8 ext_iid:4;
+#else
+#error
+#endif
+       u8 reserved_2;
+
+       /* DW 6-7 */
+       __le32 reserved_3[2];
 };
 
 static_assert(sizeof(struct cq_entry) == 32);