Commit d0c89af3 authored by Bao D. Nguyen's avatar Bao D. Nguyen Committed by Martin K. Petersen
Browse files

scsi: ufs: mcq: Fix the search/wrap around logic



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: default avatar"Bao D. Nguyen" <quic_nguyenb@quicinc.com>
Link: https://lore.kernel.org/r/ff49c15be205135ed3ec186f3086694c02867dbd.1692149603.git.quic_nguyenb@quicinc.com


Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
Fixes: 8d729034 ("scsi: ufs: mcq: Add supporting functions for MCQ abort")
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent ef222f55
Loading
Loading
Loading
Loading
+4 −2
Original line number Diff line number Diff line
@@ -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: