Reset firmware when inference cancellation fails
If an inference fails to be cancelled and it is still in a pending
state, reset the whole firmware. Indeed the assumption is that
something is at fault on the firmware side and it is not progressing.
Change-Id: I2f568b2167d86cda3cb96a5e83551b018f5fc55d
diff --git a/kernel/ethosu_device.c b/kernel/ethosu_device.c
index f66c2ac..6b911ca 100644
--- a/kernel/ethosu_device.c
+++ b/kernel/ethosu_device.c
@@ -83,6 +83,9 @@
struct ethosu_capabilities *cap =
container_of(msg, typeof(*cap), msg);
+ if (completion_done(&cap->done))
+ return;
+
cap->errno = -EFAULT;
complete(&cap->done);
}
@@ -349,7 +352,7 @@
return ret;
}
-static int ethosu_firmware_reset(struct ethosu_device *edev)
+int ethosu_firmware_reset(struct ethosu_device *edev)
{
int ret;
@@ -361,8 +364,8 @@
ret = reset_control_assert(edev->reset);
if (ret) {
- dev_warn(edev->dev, "Failed to reset assert firmware. ret=%d",
- ret);
+ dev_err(edev->dev, "Failed to reset assert firmware. ret=%d",
+ ret);
return ret;
}
@@ -375,16 +378,16 @@
*/
ret = reset_control_deassert(edev->reset);
if (ret) {
- dev_warn(edev->dev, "Failed to reset deassert firmware. ret=%d",
- ret);
+ dev_err(edev->dev, "Failed to reset deassert firmware. ret=%d",
+ ret);
goto fail;
}
/* Wait for firmware to boot up and initialize mailbox */
ret = ethosu_mailbox_wait_firmware(&edev->mailbox);
if (ret) {
- dev_warn(edev->dev, "Wait on firmware boot timed out. ret=%d",
- ret);
+ dev_err(edev->dev, "Wait on firmware boot timed out. ret=%d",
+ ret);
goto fail;
}
@@ -392,8 +395,12 @@
ethosu_watchdog_reset(&edev->watchdog);
ret = ethosu_mailbox_ping(&edev->mailbox);
- if (ret)
+ if (ret) {
+ dev_warn(edev->dev,
+ "Failed to send ping after firmware reset. ret=%d",
+ ret);
goto fail;
+ }
/* Resend messages */
ethosu_mailbox_resend(&edev->mailbox);