mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-08-31 12:52:29 -04:00
RDMA/bng_re: return a timeout when firmware responses stall
__wait_for_resp() documents that it returns a non-zero error when a
firmware command does not complete, and bng_re_rcfw_send_message() already
marks the firmware as stalled when the helper returns -ENODEV.
However, the helper ignores wait_event_timeout() expiry. If the response
slot remains in use after the timeout and after the polled CREQ service
attempt, the loop starts another full timeout period and can repeat
forever.
Return -ENODEV after a timed out wait that still has no response. The
existing caller then marks FIRMWARE_STALL_DETECTED and returns
-ETIMEDOUT to the command issuer.
Fixes: 53c6ee7d7f ("RDMA/bng_re: Enable Firmware channel and query device attributes")
Signed-off-by: Pengpeng Hou <pengpeng@iscas.ac.cn>
Link: https://patch.msgid.link/20260625003614.27515-1-pengpeng@iscas.ac.cn
Reviewed-by: Siva Reddy Kallam <siva.kallam@broadcom.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
This commit is contained in:
committed by
Leon Romanovsky
parent
297b5b747a
commit
5f9576c673
@@ -401,14 +401,15 @@ static int __wait_for_resp(struct bng_re_rcfw *rcfw, u16 cookie)
|
||||
{
|
||||
struct bng_re_cmdq_ctx *cmdq;
|
||||
struct bng_re_crsqe *crsqe;
|
||||
unsigned long time_left;
|
||||
|
||||
cmdq = &rcfw->cmdq;
|
||||
crsqe = &rcfw->crsqe_tbl[cookie];
|
||||
|
||||
do {
|
||||
wait_event_timeout(cmdq->waitq,
|
||||
!crsqe->is_in_used,
|
||||
secs_to_jiffies(rcfw->max_timeout));
|
||||
time_left = wait_event_timeout(cmdq->waitq,
|
||||
!crsqe->is_in_used,
|
||||
secs_to_jiffies(rcfw->max_timeout));
|
||||
|
||||
if (!crsqe->is_in_used)
|
||||
return 0;
|
||||
@@ -417,6 +418,9 @@ static int __wait_for_resp(struct bng_re_rcfw *rcfw, u16 cookie)
|
||||
|
||||
if (!crsqe->is_in_used)
|
||||
return 0;
|
||||
|
||||
if (!time_left)
|
||||
return -ENODEV;
|
||||
} while (true);
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user