crypto: marvell/cesa - rearrange handling for sw padded hashes
authorRussell King <rmk+kernel@arm.linux.org.uk>
Sun, 18 Oct 2015 16:24:47 +0000 (17:24 +0100)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 20 Oct 2015 14:11:08 +0000 (22:11 +0800)
Rearrange the last request handling for hashes which require software
padding.

We prepare the padding to be appended, and then append as much of the
padding to any existing data that's already queued up, adding an
operation block and launching the operation.

Any remainder is then appended as a separate operation.

This ensures that the hardware only ever sees multiples of the hash
block size to be operated on for software padded hashes, thus ensuring
that the engine always indicates that it has finished the calculation.

Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/marvell/hash.c

index d282716e0ca7a0468caddb541d2ace5c7f7900c7..f4d5a72235601fc0b55de1757180a13096d57ddd 100644 (file)
@@ -559,38 +559,30 @@ mv_cesa_ahash_dma_last_req(struct mv_cesa_tdma_chain *chain,
 
        trailerlen = mv_cesa_ahash_pad_req(creq, ahashdreq->padding);
 
-       if (frag_len) {
-               op = mv_cesa_dma_add_frag(chain, &creq->op_tmpl, frag_len,
-                                         flags);
-               if (IS_ERR(op))
-                       return op;
-       } else {
-               op = NULL;
-       }
-
-       if (op) {
-               len = min(CESA_SA_SRAM_PAYLOAD_SIZE - dma_iter->base.op_len,
-                         trailerlen);
-               if (len) {
-                       ret = mv_cesa_dma_add_data_transfer(chain,
+       len = min(CESA_SA_SRAM_PAYLOAD_SIZE - frag_len, trailerlen);
+       if (len) {
+               ret = mv_cesa_dma_add_data_transfer(chain,
                                                CESA_SA_DATA_SRAM_OFFSET +
-                                               dma_iter->base.op_len,
+                                               frag_len,
                                                ahashdreq->padding_dma,
                                                len, CESA_TDMA_DST_IN_SRAM,
                                                flags);
-                       if (ret)
-                               return ERR_PTR(ret);
+               if (ret)
+                       return ERR_PTR(ret);
 
-                       mv_cesa_update_op_cfg(op, CESA_SA_DESC_CFG_MID_FRAG,
-                                             CESA_SA_DESC_CFG_FRAG_MSK);
-                       mv_cesa_set_mac_op_frag_len(op,
-                                       dma_iter->base.op_len + len);
-                       padoff += len;
-               }
-       }
+               op = mv_cesa_dma_add_frag(chain, &creq->op_tmpl, frag_len + len,
+                                         flags);
+               if (IS_ERR(op))
+                       return op;
 
-       if (padoff >= trailerlen)
-               return op;
+               mv_cesa_update_op_cfg(op, CESA_SA_DESC_CFG_MID_FRAG,
+                                     CESA_SA_DESC_CFG_FRAG_MSK);
+
+               if (len == trailerlen)
+                       return op;
+
+               padoff += len;
+       }
 
        if (!mv_cesa_mac_op_is_first_frag(&creq->op_tmpl))
                mv_cesa_update_op_cfg(&creq->op_tmpl,