summaryrefslogtreecommitdiff
path: root/drivers/mailbox
diff options
context:
space:
mode:
authorBeleswar Padhi <b-padhi@ti.com>2026-10-01 01:31:57 +0530
committerJassi Brar <jassisinghbrar@gmail.com>2026-10-11 19:50:47 -0500
commitbbf7f0d6162fc68af1fc0c7ad1c5e35a3e64010a (patch)
tree8e79ad67fe2b3ce5571716df428529610cb13651 /drivers/mailbox
parent65dacbb315a2a842a21979b5c3f27eccd72b215a (diff)
mailbox: ti-msgmgr: Do not report rx poll timeout as a send failure
In polled rx mode, used from system suspend until resume, ti_msgmgr_send_data() writes the message to the tx queue and then waits for the response. If no response arrives in time it returns the poll error. The mailbox core treats a ->send_data() error as a send failure. So, it leaves the message queued without making it the active request, and mbox_send_message() still returns success. The message is then submitted again on the next tx_tick() or mbox_send_message(), after the client has probably timed out and moved on. So, the firmware receives the same message twice, and later requests are sent late and can have responses matched to the wrong request. The message has already been transmitted at this point, so return 0 and only log the missing response. The client detects this case with its own response timeout anyways. Signed-off-by: Beleswar Padhi <b-padhi@ti.com> Acked-by: Andrew Davis <afd@ti.com> Signed-off-by: Jassi Brar <jassisinghbrar@gmail.com>
Diffstat (limited to 'drivers/mailbox')
-rw-r--r--drivers/mailbox/ti-msgmgr.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/drivers/mailbox/ti-msgmgr.c b/drivers/mailbox/ti-msgmgr.c
index 7ab0d07fe7a2..52136f99f54f 100644
--- a/drivers/mailbox/ti-msgmgr.c
+++ b/drivers/mailbox/ti-msgmgr.c
@@ -445,12 +445,24 @@ static int ti_msgmgr_send_data(struct mbox_chan *chan, void *data)
data_reg += sizeof(u32);
}
- /* If we are in polled mode, wait for a response before proceeding */
- if (ti_msgmgr_chan_has_polled_queue_rx(message->chan_rx))
+ /*
+ * If we are in polled mode, wait for a response before proceeding.
+ *
+ * The message has already been transmitted at this point, so do not
+ * report a missing response as a send failure. Doing so would make
+ * the mailbox core keep the message queued and submit it again later,
+ * after the client has possibly given up on it. The client detects the
+ * missing response by itself timing out.
+ */
+ if (ti_msgmgr_chan_has_polled_queue_rx(message->chan_rx)) {
ret = ti_msgmgr_queue_rx_poll_timeout(message->chan_rx,
message->timeout_rx_ms * 1000);
+ if (ret)
+ dev_err(dev, "Queue %s timed out waiting for response: %d\n",
+ qinst->name, ret);
+ }
- return ret;
+ return 0;
}
/**