scsi: ufs: mcq: Fix the search/wrap around logic
authorBao D. Nguyen <quic_nguyenb@quicinc.com>
Wed, 16 Aug 2023 01:38:29 +0000 (18:38 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Mon, 21 Aug 2023 21:19:02 +0000 (17:19 -0400)
The search and wrap around logic in the ufshcd_mcq_sqe_search() function
does not work correctly when the hwq's queue depth is not a power of two
number. Correct it so that any queue depth with a positive integer value
within the supported range would work.

Signed-off-by: "Bao D. Nguyen" <quic_nguyenb@quicinc.com>
Link: https://lore.kernel.org/r/ff49c15be205135ed3ec186f3086694c02867dbd.1692149603.git.quic_nguyenb@quicinc.com
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Fixes: 8d7290348992 ("scsi: ufs: mcq: Add supporting functions for MCQ abort")
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/ufs/core/ufs-mcq.c

index 6fb0e007af6362885ccf30c3ef667b230b2f0c04..386674ead7f0d43965a7378848b839ee33509b48 100644 (file)
@@ -580,7 +580,6 @@ static bool ufshcd_mcq_sqe_search(struct ufs_hba *hba,
 {
        struct ufshcd_lrb *lrbp = &hba->lrb[task_tag];
        struct utp_transfer_req_desc *utrd;
-       u32 mask = hwq->max_entries - 1;
        __le64  cmd_desc_base_addr;
        bool ret = false;
        u64 addr, match;
@@ -608,7 +607,10 @@ static bool ufshcd_mcq_sqe_search(struct ufs_hba *hba,
                        ret = true;
                        goto out;
                }
-               sq_head_slot = (sq_head_slot + 1) & mask;
+
+               sq_head_slot++;
+               if (sq_head_slot == hwq->max_entries)
+                       sq_head_slot = 0;
        }
 
 out: