Skip to content

Commit

Permalink
scsi: ufs: core: Fix ufshcd_inc_sq_tail() function bug
Browse files Browse the repository at this point in the history
When qdepth is not power of 2, not every bit of the mask is 1, so
in sq_tail_slot some bits will be cleared unexpectedly.

Signed-off-by: zhanghui <zhanghui31@xiaomi.com>
Link: https://lore.kernel.org/r/20230601124613.1446-1-zhanghui31@xiaomi.com
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Reviewed-by: Stanley Chu <stanley.chu@mediatek.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
  • Loading branch information
zhanghui authored and Martin K. Petersen committed Jun 8, 2023
1 parent 7255403 commit e01d05b
Showing 1 changed file with 3 additions and 2 deletions.
5 changes: 3 additions & 2 deletions drivers/ufs/core/ufshcd-priv.h
Original file line number Diff line number Diff line change
Expand Up @@ -369,10 +369,11 @@ static inline bool ufs_is_valid_unit_desc_lun(struct ufs_dev_info *dev_info, u8
static inline void ufshcd_inc_sq_tail(struct ufs_hw_queue *q)
__must_hold(&q->sq_lock)
{
u32 mask = q->max_entries - 1;
u32 val;

q->sq_tail_slot = (q->sq_tail_slot + 1) & mask;
q->sq_tail_slot++;
if (q->sq_tail_slot == q->max_entries)
q->sq_tail_slot = 0;
val = q->sq_tail_slot * sizeof(struct utp_transfer_req_desc);
writel(val, q->mcq_sq_tail);
}
Expand Down

0 comments on commit e01d05b

Please sign in to comment.