mirror of
https://github.com/torvalds/linux.git
synced 2026-05-27 08:33:17 +02:00
pds_core: fix error handling in pdsc_devcmd_wait
Fix two cases where pdsc_devcmd_wait() returns stale success from
the completion register instead of an error:
1. FW crash: If firmware stops running, the wait loop breaks early with
running=false. The condition "if ((!done || timeout) && running)" is
false, so error handling is bypassed and stale status is returned.
Check !running first and return -ENXIO.
2. Timeout: If a command times out, err is set to -ETIMEDOUT but then
overwritten by pdsc_err_to_errno(status) which reads stale status.
Return -ETIMEDOUT immediately after cleaning up.
Both errors now propagate to pdsc_devcmd_locked() which queues
health_work for recovery.
Fixes: 45d76f4929 ("pds_core: set up device and adminq")
Signed-off-by: Nikhil P. Rao <nikhil.rao@amd.com>
Link: https://patch.msgid.link/20260515212907.998028-1-nikhil.rao@amd.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
0cb5a74faa
commit
0e46b6635b
|
|
@ -162,12 +162,19 @@ static int pdsc_devcmd_wait(struct pdsc *pdsc, u8 opcode, int max_seconds)
|
|||
dev_dbg(dev, "DEVCMD %d %s after %ld secs\n",
|
||||
opcode, pdsc_devcmd_str(opcode), duration / HZ);
|
||||
|
||||
if ((!done || timeout) && running) {
|
||||
if (!running) {
|
||||
dev_err(dev, "DEVCMD %d %s fw not running\n",
|
||||
opcode, pdsc_devcmd_str(opcode));
|
||||
pdsc_devcmd_clean(pdsc);
|
||||
return -ENXIO;
|
||||
}
|
||||
|
||||
if (!done || timeout) {
|
||||
dev_err(dev, "DEVCMD %d %s timeout, done %d timeout %d max_seconds=%d\n",
|
||||
opcode, pdsc_devcmd_str(opcode), done, timeout,
|
||||
max_seconds);
|
||||
err = -ETIMEDOUT;
|
||||
pdsc_devcmd_clean(pdsc);
|
||||
return -ETIMEDOUT;
|
||||
}
|
||||
|
||||
status = pdsc_devcmd_status(pdsc);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user