mirror of
https://github.com/torvalds/linux.git
synced 2026-11-07 06:17:02 +01:00
scsi: ufs: core: Clear stale UIC result byte before peer DME retries
Peer DME get and set retry a failed attempt with the same struct
uic_command. UIC completion ORs the ConfigResultCode into argument2[7:0],
and nothing clears it before the next attempt. Once an attempt fails, every
retry keeps reporting that error code, even when the device returns
success, so a transient failure becomes a hard failure after three
retries. Each such retry also triggers the WARN_ON_ONCE() in
ufshcd_dispatch_uic_cmd(). In ufshcd_dme_set_attr(), ufshcd_uic_cmd_compl()
also overwrites argument3 with the register readback before the next
attempt.
Clear the result byte and restore argument3 in ufshcd_dme_set_attr() when
an attempt fails.
Fixes: 64238fbd15 ("scsi: ufs: add retries to dme_peer get and set attribute")
Cc: stable@vger.kernel.org
Reviewed-by: Bean Huo <beanhuo@micron.com>
Signed-off-by: Stanley Jhu <stanleyjhu@google.com>
Reviewed-by: Peter Wang <peter.wang@mediatek.com>
Reviewed-by: Bart Van Assche <bvanassche@acm.org>
Link: https://patch.msgid.link/20261015001855.3450573-6-stanleyjhu@google.com
Signed-off-by: Martin K. Petersen (Oracle) <mkp@kernel.org>
This commit is contained in:
parent
1ae4251320
commit
e4a9b76409
|
|
@ -4359,9 +4359,12 @@ int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel,
|
|||
do {
|
||||
/* for peer attributes we retry upon failure */
|
||||
ret = ufshcd_send_uic_cmd(hba, &uic_cmd);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
dev_dbg(hba->dev, "%s: attr-id 0x%x val 0x%x error code %d\n",
|
||||
set, UIC_GET_ATTR_ID(attr_sel), mib_val, ret);
|
||||
uic_cmd.argument2 &= ~MASK_UIC_COMMAND_RESULT;
|
||||
uic_cmd.argument3 = mib_val;
|
||||
}
|
||||
} while (ret && peer && --retries);
|
||||
|
||||
if (ret)
|
||||
|
|
@ -4426,9 +4429,11 @@ int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel,
|
|||
do {
|
||||
/* for peer attributes we retry upon failure */
|
||||
ret = ufshcd_send_uic_cmd(hba, &uic_cmd);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
dev_dbg(hba->dev, "%s: attr-id 0x%x error code %d\n",
|
||||
get, UIC_GET_ATTR_ID(attr_sel), ret);
|
||||
uic_cmd.argument2 &= ~MASK_UIC_COMMAND_RESULT;
|
||||
}
|
||||
} while (ret && peer && --retries);
|
||||
|
||||
if (ret)
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user