crypto: chelsio - Fix wrong error counter increments
authorHarsh Jain <harsh@chelsio.com>
Tue, 11 Dec 2018 10:51:42 +0000 (16:21 +0530)
committerHerbert Xu <herbert@gondor.apana.org.au>
Sun, 23 Dec 2018 03:52:43 +0000 (11:52 +0800)
Fix error counter increment in AEAD decrypt operation when
validation of tag is done in Driver instead of H/W.

Signed-off-by: Harsh Jain <harsh@chelsio.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/chelsio/chcr_algo.c
drivers/crypto/chelsio/chcr_core.c

index df526414f03fa817935b4d5f6511cff80b8a6c3b..eedc33128da4092ef72f8b751dfa07ab7d6ad499 100644 (file)
@@ -218,7 +218,7 @@ static inline void chcr_dec_wrcount(struct chcr_dev *dev)
        atomic_dec(&dev->inflight);
 }
 
-static inline void chcr_handle_aead_resp(struct aead_request *req,
+static inline int chcr_handle_aead_resp(struct aead_request *req,
                                         unsigned char *input,
                                         int err)
 {
@@ -233,6 +233,8 @@ static inline void chcr_handle_aead_resp(struct aead_request *req,
        }
        chcr_dec_wrcount(dev);
        req->base.complete(&req->base, err);
+
+       return err;
 }
 
 static void get_aes_decrypt_key(unsigned char *dec_key,
@@ -2072,14 +2074,13 @@ int chcr_handle_resp(struct crypto_async_request *req, unsigned char *input,
 
        switch (tfm->__crt_alg->cra_flags & CRYPTO_ALG_TYPE_MASK) {
        case CRYPTO_ALG_TYPE_AEAD:
-               chcr_handle_aead_resp(aead_request_cast(req), input, err);
+               err = chcr_handle_aead_resp(aead_request_cast(req), input, err);
                break;
 
        case CRYPTO_ALG_TYPE_ABLKCIPHER:
-                err = chcr_handle_cipher_resp(ablkcipher_request_cast(req),
+                chcr_handle_cipher_resp(ablkcipher_request_cast(req),
                                               input, err);
                break;
-
        case CRYPTO_ALG_TYPE_AHASH:
                chcr_handle_ahash_resp(ahash_request_cast(req), input, err);
                }
index e04b3e8fa62341a0e5c66de4d19acd4eab81e195..239b933d6df6507d2e405ae8a370468c7dfb3036 100644 (file)
@@ -169,12 +169,8 @@ static int cpl_fw6_pld_handler(struct chcr_dev *dev,
 
        ack_err_status =
                ntohl(*(__be32 *)((unsigned char *)&fw6_pld->data[0] + 4));
-       if (ack_err_status) {
-               if (CHK_MAC_ERR_BIT(ack_err_status) ||
-                   CHK_PAD_ERR_BIT(ack_err_status))
-                       error_status = -EBADMSG;
-               atomic_inc(&adap->chcr_stats.error);
-       }
+       if (CHK_MAC_ERR_BIT(ack_err_status) || CHK_PAD_ERR_BIT(ack_err_status))
+               error_status = -EBADMSG;
        /* call completion callback with failure status */
        if (req) {
                error_status = chcr_handle_resp(req, input, error_status);
@@ -182,6 +178,9 @@ static int cpl_fw6_pld_handler(struct chcr_dev *dev,
                pr_err("Incorrect request address from the firmware\n");
                return -EFAULT;
        }
+       if (error_status)
+               atomic_inc(&adap->chcr_stats.error);
+
        return 0;
 }