crypto: caam - Fix incorrect size when DMA unmapping buffer
authorVictoria Milhoan <vicki.milhoan@freescale.com>
Mon, 15 Jun 2015 23:52:57 +0000 (16:52 -0700)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 16 Jun 2015 06:35:07 +0000 (14:35 +0800)
The CAAM driver uses two data buffers to store data for a hashing operation,
with one buffer defined as active. This change forces switching of the
active buffer when executing a hashing operation to avoid a later DMA unmap
using the length of the opposite buffer.

Signed-off-by: Victoria Milhoan <vicki.milhoan@freescale.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/caam/caamhash.c

index ba0532e..75125a2 100644 (file)
@@ -835,17 +835,17 @@ static int ahash_update_ctx(struct ahash_request *req)
                        src_map_to_sec4_sg(jrdev, req->src, src_nents,
                                           edesc->sec4_sg + sec4_sg_src_index,
                                           chained);
-                       if (*next_buflen) {
+                       if (*next_buflen)
                                scatterwalk_map_and_copy(next_buf, req->src,
                                                         to_hash - *buflen,
                                                         *next_buflen, 0);
-                               state->current_buf = !state->current_buf;
-                       }
                } else {
                        (edesc->sec4_sg + sec4_sg_src_index - 1)->len |=
                                                        SEC4_SG_LEN_FIN;
                }
 
+               state->current_buf = !state->current_buf;
+
                sh_len = desc_len(sh_desc);
                desc = edesc->hw_desc;
                init_job_desc_shared(desc, ptr, sh_len, HDR_SHARE_DEFER |
@@ -1268,9 +1268,10 @@ static int ahash_update_no_ctx(struct ahash_request *req)
                        scatterwalk_map_and_copy(next_buf, req->src,
                                                 to_hash - *buflen,
                                                 *next_buflen, 0);
-                       state->current_buf = !state->current_buf;
                }
 
+               state->current_buf = !state->current_buf;
+
                sh_len = desc_len(sh_desc);
                desc = edesc->hw_desc;
                init_job_desc_shared(desc, ptr, sh_len, HDR_SHARE_DEFER |