crypto: stm32 - Move polling into do_one_request
authorHerbert Xu <herbert@gondor.apana.org.au>
Sat, 11 Mar 2023 09:09:13 +0000 (17:09 +0800)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 17 Mar 2023 03:16:44 +0000 (11:16 +0800)
There is no need to poll separate for update and final.  We could
merge them into do_one_request.

Also fix the error handling so that we don't poll (and overwrite
the error) when an error has already occurred.

Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
Tested-by: Linus Walleij <linus.walleij@linaro.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/stm32/stm32-hash.c

index bde2b40..298cabd 100644 (file)
@@ -425,6 +425,8 @@ static int stm32_hash_update_cpu(struct stm32_hash_dev *hdev)
                bufcnt = rctx->bufcnt;
                rctx->bufcnt = 0;
                err = stm32_hash_xmit_cpu(hdev, rctx->buffer, bufcnt, 0);
+               if (err)
+                       return err;
        }
 
        stm32_hash_append_sg(rctx);
@@ -433,14 +435,6 @@ static int stm32_hash_update_cpu(struct stm32_hash_dev *hdev)
                bufcnt = rctx->bufcnt;
                rctx->bufcnt = 0;
                err = stm32_hash_xmit_cpu(hdev, rctx->buffer, bufcnt, 1);
-
-               /* If we have an IRQ, wait for that, else poll for completion */
-               if (hdev->polled) {
-                       if (stm32_hash_wait_busy(hdev))
-                               return -ETIMEDOUT;
-                       hdev->flags |= HASH_FLAGS_OUTPUT_READY;
-                       err = 0;
-               }
        }
 
        return err;
@@ -784,15 +778,6 @@ static int stm32_hash_final_req(struct stm32_hash_dev *hdev)
        else
                err = stm32_hash_xmit_cpu(hdev, rctx->buffer, buflen, 1);
 
-       /* If we have an IRQ, wait for that, else poll for completion */
-       if (hdev->polled) {
-               if (stm32_hash_wait_busy(hdev))
-                       return -ETIMEDOUT;
-               hdev->flags |= HASH_FLAGS_OUTPUT_READY;
-               /* Caller will call stm32_hash_finish_req() */
-               err = 0;
-       }
-
        return err;
 }
 
@@ -964,6 +949,16 @@ static int stm32_hash_one_request(struct crypto_engine *engine, void *areq)
        else if (rctx->op == HASH_OP_FINAL)
                err = stm32_hash_final_req(hdev);
 
+       /* If we have an IRQ, wait for that, else poll for completion */
+       if (err == -EINPROGRESS && hdev->polled) {
+               if (stm32_hash_wait_busy(hdev))
+                       err = -ETIMEDOUT;
+               else {
+                       hdev->flags |= HASH_FLAGS_OUTPUT_READY;
+                       err = 0;
+               }
+       }
+
        if (err != -EINPROGRESS)
        /* done task will not finish it, so do it here */
                stm32_hash_finish_req(req, err);