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);