crypto: stm32 - remove flag HASH_FLAGS_DMA_READY
authorThomas Bourgoin <thomas.bourgoin@foss.st.com>
Thu, 13 Jul 2023 15:15:18 +0000 (17:15 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sat, 22 Jul 2023 01:59:38 +0000 (13:59 +1200)
Remove flag HASH_FLAGS_DMA_READY as it can put the driver in a deadlock
state.
If the DMA automatically set the DCAL bit, the interrupt indicating the
end of a computation can be raised before the DMA complete sequence.

Signed-off-by: Thomas Bourgoin <thomas.bourgoin@foss.st.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/stm32/stm32-hash.c

index a48e6a1..88a186c 100644 (file)
 #define HASH_FLAGS_INIT                        BIT(0)
 #define HASH_FLAGS_OUTPUT_READY                BIT(1)
 #define HASH_FLAGS_CPU                 BIT(2)
-#define HASH_FLAGS_DMA_READY           BIT(3)
-#define HASH_FLAGS_DMA_ACTIVE          BIT(4)
-#define HASH_FLAGS_HMAC_INIT           BIT(5)
-#define HASH_FLAGS_HMAC_FINAL          BIT(6)
-#define HASH_FLAGS_HMAC_KEY            BIT(7)
-#define HASH_FLAGS_SHA3_MODE           BIT(8)
+#define HASH_FLAGS_DMA_ACTIVE          BIT(3)
+#define HASH_FLAGS_HMAC_INIT           BIT(4)
+#define HASH_FLAGS_HMAC_FINAL          BIT(5)
+#define HASH_FLAGS_HMAC_KEY            BIT(6)
+#define HASH_FLAGS_SHA3_MODE           BIT(7)
 #define HASH_FLAGS_FINAL               BIT(15)
 #define HASH_FLAGS_FINUP               BIT(16)
 #define HASH_FLAGS_ALGO_MASK           GENMASK(20, 17)
@@ -585,8 +584,6 @@ static void stm32_hash_dma_callback(void *param)
        struct stm32_hash_dev *hdev = param;
 
        complete(&hdev->dma_completion);
-
-       hdev->flags |= HASH_FLAGS_DMA_READY;
 }
 
 static int stm32_hash_hmac_dma_send(struct stm32_hash_dev *hdev)
@@ -1241,11 +1238,9 @@ static irqreturn_t stm32_hash_irq_thread(int irq, void *dev_id)
                        hdev->flags &= ~HASH_FLAGS_OUTPUT_READY;
                        goto finish;
                }
-       } else if (HASH_FLAGS_DMA_READY & hdev->flags) {
-               if (HASH_FLAGS_DMA_ACTIVE & hdev->flags) {
-                       hdev->flags &= ~HASH_FLAGS_DMA_ACTIVE;
-                               goto finish;
-               }
+       } else if (HASH_FLAGS_DMA_ACTIVE & hdev->flags) {
+               hdev->flags &= ~HASH_FLAGS_DMA_ACTIVE;
+                       goto finish;
        }
 
        return IRQ_HANDLED;