return crypto4xx_build_pd(&req->base, ctx, req->src, req->dst,
                req->cryptlen, iv, ivlen, decrypt ? ctx->sa_in : ctx->sa_out,
-               ctx->sa_len, 0);
+               ctx->sa_len, 0, NULL);
 }
 
 int crypto4xx_encrypt_noiv(struct skcipher_request *req)
 
        return crypto4xx_build_pd(&req->base, ctx, req->src, req->dst,
                                  req->cryptlen, iv, AES_IV_SIZE,
-                                 ctx->sa_out, ctx->sa_len, 0);
+                                 ctx->sa_out, ctx->sa_len, 0, NULL);
 }
 
 int crypto4xx_rfc3686_decrypt(struct skcipher_request *req)
 
        return crypto4xx_build_pd(&req->base, ctx, req->src, req->dst,
                                  req->cryptlen, iv, AES_IV_SIZE,
-                                 ctx->sa_out, ctx->sa_len, 0);
+                                 ctx->sa_out, ctx->sa_len, 0, NULL);
 }
 
 static int
 static int crypto4xx_crypt_aes_ccm(struct aead_request *req, bool decrypt)
 {
        struct crypto4xx_ctx *ctx  = crypto_tfm_ctx(req->base.tfm);
+       struct crypto4xx_aead_reqctx *rctx = aead_request_ctx(req);
        struct crypto_aead *aead = crypto_aead_reqtfm(req);
        __le32 iv[16];
        u32 tmp_sa[SA_AES128_CCM_LEN + 4];
 
        return crypto4xx_build_pd(&req->base, ctx, req->src, req->dst,
                                  len, iv, sizeof(iv),
-                                 sa, ctx->sa_len, req->assoclen);
+                                 sa, ctx->sa_len, req->assoclen, rctx->dst);
 }
 
 int crypto4xx_encrypt_aes_ccm(struct aead_request *req)
        return crypto4xx_build_pd(&req->base, ctx, req->src, req->dst,
                                  len, iv, sizeof(iv),
                                  decrypt ? ctx->sa_in : ctx->sa_out,
-                                 ctx->sa_len, req->assoclen);
+                                 ctx->sa_len, req->assoclen, rctx->dst);
 }
 
 int crypto4xx_encrypt_aes_gcm(struct aead_request *req)
 
        return crypto4xx_build_pd(&req->base, ctx, req->src, &dst,
                                  req->nbytes, NULL, 0, ctx->sa_in,
-                                 ctx->sa_len, 0);
+                                 ctx->sa_len, 0, NULL);
 }
 
 int crypto4xx_hash_final(struct ahash_request *req)
 
        return crypto4xx_build_pd(&req->base, ctx, req->src, &dst,
                                  req->nbytes, NULL, 0, ctx->sa_in,
-                                 ctx->sa_len, 0);
+                                 ctx->sa_len, 0, NULL);
 }
 
 /**
 
                       const __le32 *iv, const u32 iv_len,
                       const struct dynamic_sa_ctl *req_sa,
                       const unsigned int sa_len,
-                      const unsigned int assoclen)
+                      const unsigned int assoclen,
+                      struct scatterlist *_dst)
 {
-       struct scatterlist _dst[2];
        struct crypto4xx_device *dev = ctx->dev;
        struct dynamic_sa_ctl *sa;
        struct ce_gd *gd;
 
        amcc_alg = container_of(alg, struct crypto4xx_alg, alg.u.aead);
        crypto4xx_ctx_init(amcc_alg, ctx);
-       crypto_aead_set_reqsize(tfm, sizeof(struct aead_request) +
-                               max(sizeof(struct crypto4xx_ctx), 32 +
-                               crypto_aead_reqsize(ctx->sw_cipher.aead)));
+       crypto_aead_set_reqsize(tfm, max(sizeof(struct aead_request) + 32 +
+                               crypto_aead_reqsize(ctx->sw_cipher.aead),
+                               sizeof(struct crypto4xx_aead_reqctx)));
        return 0;
 }
 
 
        } sw_cipher;
 };
 
+struct crypto4xx_aead_reqctx {
+       struct scatterlist dst[2];
+};
+
 struct crypto4xx_alg_common {
        u32 type;
        union {
                       const __le32 *iv, const u32 iv_len,
                       const struct dynamic_sa_ctl *sa,
                       const unsigned int sa_len,
-                      const unsigned int assoclen);
+                      const unsigned int assoclen,
+                      struct scatterlist *dst_tmp);
 int crypto4xx_setkey_aes_cbc(struct crypto_skcipher *cipher,
                             const u8 *key, unsigned int keylen);
 int crypto4xx_setkey_aes_cfb(struct crypto_skcipher *cipher,