[for-3.18,13/15] mailbox: skip complete wait event if timer expired

Message ID 1501015526-32178-14-git-send-email-amit.pundir@linaro.org
State New
Headers show
  • Stable candidates for 3.18.y
Related show

Commit Message

Amit Pundir July 25, 2017, 8:45 p.m.
From: Sudeep Holla <sudeep.holla@arm.com>

commit cc6eeaa3029a6dbcb4ad41b1f92876483bd88965 upstream.

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: 2b6d83e2b8b7 ("mailbox: Introduce framework for mailbox")
Reported-by: Alexey Klimov <alexey.klimov@arm.com>
Signed-off-by: Sudeep Holla <sudeep.holla@arm.com>

Signed-off-by: Jassi Brar <jaswinder.singh@linaro.org>

Signed-off-by: Amit Pundir <amit.pundir@linaro.org>

 drivers/mailbox/mailbox.c | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)



diff --git a/drivers/mailbox/mailbox.c b/drivers/mailbox/mailbox.c
index 2691cb75b2e8..cbde6fccbc29 100644
--- a/drivers/mailbox/mailbox.c
+++ b/drivers/mailbox/mailbox.c
@@ -103,7 +103,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)
@@ -266,8 +266,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);