crypto: caam - Set last bit on src SG list
[firefly-linux-kernel-4.4.55.git] / drivers / crypto / picoxcell_crypto.c
index 9eb27c71cedf5fb081d396a8e64a0aef0e0dad82..c2fd860745adffcfa5fb55edf92bccf70011e3bc 100644 (file)
@@ -318,6 +318,7 @@ static int spacc_aead_make_ddts(struct spacc_req *req, u8 *giv)
        struct spacc_ddt *src_ddt, *dst_ddt;
        unsigned ivsize = crypto_aead_ivsize(crypto_aead_reqtfm(areq));
        unsigned nents = sg_count(areq->src, areq->cryptlen);
+       unsigned total;
        dma_addr_t iv_addr;
        struct scatterlist *cur;
        int i, dst_ents, src_ents, assoc_ents;
@@ -361,11 +362,18 @@ static int spacc_aead_make_ddts(struct spacc_req *req, u8 *giv)
         * Map the associated data. For decryption we don't copy the
         * associated data.
         */
+       total = areq->assoclen;
        for_each_sg(areq->assoc, cur, assoc_ents, i) {
-               ddt_set(src_ddt++, sg_dma_address(cur), sg_dma_len(cur));
+               unsigned len = sg_dma_len(cur);
+
+               if (len > total)
+                       len = total;
+
+               total -= len;
+
+               ddt_set(src_ddt++, sg_dma_address(cur), len);
                if (req->is_encrypt)
-                       ddt_set(dst_ddt++, sg_dma_address(cur),
-                               sg_dma_len(cur));
+                       ddt_set(dst_ddt++, sg_dma_address(cur), len);
        }
        ddt_set(src_ddt++, iv_addr, ivsize);