firmware: raspberrypi: Define timeout for transactions
authorStefan Wahren <stefan.wahren@i2se.com>
Sat, 6 Oct 2018 11:31:56 +0000 (13:31 +0200)
committerJunghoon Kim <jhoon20.kim@samsung.com>
Thu, 2 Apr 2020 04:09:02 +0000 (13:09 +0900)
We should never assume to get a reply from the firmware otherwise
the call could block forever and the user don't get informed. So
define a timeout of 1 sec and print a stacktrace once in the unlikely
case the timeout expired.

Signed-off-by: Stefan Wahren <stefan.wahren@i2se.com>
Reviewed-by: Eric Anholt <eric@anholt.net>
[jhoon20.kim: cherry picked from commit 0829187b17d8 for debugging booting issues]
Signed-off-by: Junghoon Kim <jhoon20.kim@samsung.com>
Change-Id: I2bb14167174662a84c6b2a8caaffc70485693816

drivers/firmware/raspberrypi.c

index efb405c..c1e8b90 100644 (file)
@@ -60,8 +60,12 @@ rpi_firmware_transaction(struct rpi_firmware *fw, u32 chan, u32 data)
        reinit_completion(&fw->c);
        ret = mbox_send_message(fw->chan, &message);
        if (ret >= 0) {
-               wait_for_completion(&fw->c);
-               ret = 0;
+               if (wait_for_completion_timeout(&fw->c, HZ)) {
+                       ret = 0;
+               } else {
+                       ret = -ETIMEDOUT;
+                       WARN_ONCE(1, "Firmware transaction timeout");
+               }
        } else {
                dev_err(fw->cl.dev, "mbox_send_message returned %d\n", ret);
        }