Commit cc6eeaa3 authored by Sudeep Holla's avatar Sudeep Holla Committed by Jassi Brar

mailbox: skip complete wait event if timer expired

If a wait_for_completion_timeout() call returns due to a timeout,
complete() can get called after returning from the wait which is
incorrect and can cause subsequent transmissions on a channel to fail.
Since the wait_for_completion_timeout() sees the completion variable
is non-zero caused by the erroneous/spurious complete() call, and
it immediately returns without waiting for the time as expected by the

This patch fixes the issue by skipping complete() call for the timer

Fixes: 2b6d83e2 ("mailbox: Introduce framework for mailbox")
Reported-by: default avatarAlexey Klimov <>
Signed-off-by: default avatarSudeep Holla <>
Signed-off-by: default avatarJassi Brar <>
parent c61b781e
......@@ -107,7 +107,7 @@ static void tx_tick(struct mbox_chan *chan, int r)
if (mssg && chan->cl->tx_done)
chan->cl->tx_done(chan->cl, mssg, r);
if (chan->cl->tx_block)
if (r != -ETIME && chan->cl->tx_block)
......@@ -271,8 +271,8 @@ int mbox_send_message(struct mbox_chan *chan, void *mssg)
ret = wait_for_completion_timeout(&chan->tx_complete, wait);
if (ret == 0) {
t = -EIO;
tx_tick(chan, -EIO);
t = -ETIME;
tx_tick(chan, t);
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment