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