crypto: inside-secure - handle more result requests when counter is full
authorAntoine Ténart <antoine.tenart@free-electrons.com>
Thu, 14 Dec 2017 14:26:56 +0000 (15:26 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Fri, 22 Dec 2017 09:03:35 +0000 (20:03 +1100)
This patch modifies the result handling logic to continue handling
results when the completed requests counter is full and not showing the
actual number of requests to handle.

Suggested-by: Ofer Heifetz <oferh@marvell.com>
Signed-off-by: Antoine Tenart <antoine.tenart@free-electrons.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/inside-secure/safexcel.c
drivers/crypto/inside-secure/safexcel.h

index 36c9a72c47b19c703a963fd5e8d8c158209f8619..8042922b4ed8530cbd935341e57cb5c899290260 100644 (file)
@@ -600,12 +600,15 @@ static inline void safexcel_handle_result_descriptor(struct safexcel_crypto_priv
 {
        struct safexcel_request *sreq;
        struct safexcel_context *ctx;
-       int ret, i, nreq, ndesc = 0, tot_descs = 0, done;
+       int ret, i, nreq, ndesc, tot_descs, done;
        bool should_complete;
 
+handle_results:
+       tot_descs = 0;
+
        nreq = readl(priv->base + EIP197_HIA_RDR(ring) + EIP197_HIA_xDR_PROC_COUNT);
-       nreq >>= 24;
-       nreq &= GENMASK(6, 0);
+       nreq >>= EIP197_xDR_PROC_xD_PKT_OFFSET;
+       nreq &= EIP197_xDR_PROC_xD_PKT_MASK;
        if (!nreq)
                goto requests_left;
 
@@ -642,6 +645,12 @@ acknowledge:
                       priv->base + EIP197_HIA_RDR(ring) + EIP197_HIA_xDR_PROC_COUNT);
        }
 
+       /* If the number of requests overflowed the counter, try to proceed more
+        * requests.
+        */
+       if (nreq == EIP197_xDR_PROC_xD_PKT_MASK)
+               goto handle_results;
+
 requests_left:
        spin_lock_bh(&priv->ring[ring].egress_lock);
 
index 2a0ab6ce716a9cc5e31b0155eccb280d4283a2b9..0c47e792192d0b8f7769099c9ab09694141fb30b 100644 (file)
 #define EIP197_xDR_PREP_CLR_COUNT              BIT(31)
 
 /* EIP197_HIA_xDR_PROC_COUNT */
+#define EIP197_xDR_PROC_xD_PKT_OFFSET          24
+#define EIP197_xDR_PROC_xD_PKT_MASK            GENMASK(6, 0)
 #define EIP197_xDR_PROC_xD_COUNT(n)            ((n) << 2)
 #define EIP197_xDR_PROC_xD_PKT(n)              ((n) << 24)
 #define EIP197_xDR_PROC_CLR_COUNT              BIT(31)