crypto: caam/qi - return -EBADMSG for ICV check failure
authorHoria Geantă <horia.geanta@nxp.com>
Mon, 29 Jan 2018 08:38:35 +0000 (10:38 +0200)
committerHerbert Xu <herbert@gondor.apana.org.au>
Thu, 15 Feb 2018 15:26:53 +0000 (23:26 +0800)
Crypto drivers are expected to return -EBADMSG in case of
ICV check (authentication) failure.

In this case it also makes sense to suppress the error message
in the QI dequeue callback.

Signed-off-by: Horia Geantă <horia.geanta@nxp.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/caam/caamalg_qi.c
drivers/crypto/caam/qi.c

index 4aecc9435f6916fba2a988a8c35cb6671694ea46..f4db39495d228998f26a89cb46e0d2ac3837cc11 100644 (file)
@@ -562,8 +562,18 @@ static void aead_done(struct caam_drv_req *drv_req, u32 status)
        qidev = caam_ctx->qidev;
 
        if (unlikely(status)) {
+               u32 ssrc = status & JRSTA_SSRC_MASK;
+               u8 err_id = status & JRSTA_CCBERR_ERRID_MASK;
+
                caam_jr_strstatus(qidev, status);
-               ecode = -EIO;
+               /*
+                * verify hw auth check passed else return -EBADMSG
+                */
+               if (ssrc == JRSTA_SSRC_CCB_ERROR &&
+                   err_id == JRSTA_CCBERR_ERRID_ICVCHK)
+                       ecode = -EBADMSG;
+               else
+                       ecode = -EIO;
        }
 
        edesc = container_of(drv_req, typeof(*edesc), drv_req);
index f9a44f485aac3341a4a15e67dab55a323841dbb5..b9480828da385c993f7574d0bca8d30cab0ca47b 100644 (file)
@@ -579,8 +579,15 @@ static enum qman_cb_dqrr_result caam_rsp_fq_dqrr_cb(struct qman_portal *p,
 
        fd = &dqrr->fd;
        status = be32_to_cpu(fd->status);
-       if (unlikely(status))
-               dev_err(qidev, "Error: %#x in CAAM response FD\n", status);
+       if (unlikely(status)) {
+               u32 ssrc = status & JRSTA_SSRC_MASK;
+               u8 err_id = status & JRSTA_CCBERR_ERRID_MASK;
+
+               if (ssrc != JRSTA_SSRC_CCB_ERROR ||
+                   err_id != JRSTA_CCBERR_ERRID_ICVCHK)
+                       dev_err(qidev, "Error: %#x in CAAM response FD\n",
+                               status);
+       }
 
        if (unlikely(qm_fd_get_format(fd) != qm_fd_compound)) {
                dev_err(qidev, "Non-compound FD from CAAM\n");