static void rsa_io_unmap(struct device *dev, struct rsa_edesc *edesc,
                         struct akcipher_request *req)
 {
+       struct caam_rsa_req_ctx *req_ctx = akcipher_request_ctx(req);
+
        dma_unmap_sg(dev, req->dst, edesc->dst_nents, DMA_FROM_DEVICE);
-       dma_unmap_sg(dev, req->src, edesc->src_nents, DMA_TO_DEVICE);
+       dma_unmap_sg(dev, req_ctx->fixup_src, edesc->src_nents, DMA_TO_DEVICE);
 
        if (edesc->sec4_sg_bytes)
                dma_unmap_single(dev, edesc->sec4_sg_dma, edesc->sec4_sg_bytes,
                if (lzeros < 0)
                        return ERR_PTR(lzeros);
 
-               req->src_len -= lzeros;
-               req->src = scatterwalk_ffwd(req_ctx->src, req->src, lzeros);
+               req_ctx->fixup_src = scatterwalk_ffwd(req_ctx->src, req->src,
+                                                     lzeros);
+               req_ctx->fixup_src_len = req->src_len - lzeros;
        } else {
                /*
                 * input src is less then n key modulus,
                 * so there will be zero padding
                 */
                diff_size = key->n_sz - req->src_len;
+               req_ctx->fixup_src = req->src;
+               req_ctx->fixup_src_len = req->src_len;
        }
 
-       src_nents = sg_nents_for_len(req->src, req->src_len);
+       src_nents = sg_nents_for_len(req_ctx->fixup_src,
+                                    req_ctx->fixup_src_len);
        dst_nents = sg_nents_for_len(req->dst, req->dst_len);
 
        if (!diff_size && src_nents == 1)
        if (!edesc)
                return ERR_PTR(-ENOMEM);
 
-       sgc = dma_map_sg(dev, req->src, src_nents, DMA_TO_DEVICE);
+       sgc = dma_map_sg(dev, req_ctx->fixup_src, src_nents, DMA_TO_DEVICE);
        if (unlikely(!sgc)) {
                dev_err(dev, "unable to map source\n");
                goto src_fail;
                                   0);
 
        if (sec4_sg_index)
-               sg_to_sec4_sg_last(req->src, src_nents, edesc->sec4_sg +
-                                  !!diff_size, 0);
+               sg_to_sec4_sg_last(req_ctx->fixup_src, src_nents,
+                                  edesc->sec4_sg + !!diff_size, 0);
 
        if (dst_nents > 1)
                sg_to_sec4_sg_last(req->dst, dst_nents,
 sec4_sg_fail:
        dma_unmap_sg(dev, req->dst, dst_nents, DMA_FROM_DEVICE);
 dst_fail:
-       dma_unmap_sg(dev, req->src, src_nents, DMA_TO_DEVICE);
+       dma_unmap_sg(dev, req_ctx->fixup_src, src_nents, DMA_TO_DEVICE);
 src_fail:
        kfree(edesc);
        return ERR_PTR(-ENOMEM);
                           struct rsa_edesc *edesc)
 {
        struct crypto_akcipher *tfm = crypto_akcipher_reqtfm(req);
+       struct caam_rsa_req_ctx *req_ctx = akcipher_request_ctx(req);
        struct caam_rsa_ctx *ctx = akcipher_tfm_ctx(tfm);
        struct caam_rsa_key *key = &ctx->key;
        struct device *dev = ctx->dev;
                pdb->f_dma = edesc->sec4_sg_dma;
                sec4_sg_index += edesc->src_nents;
        } else {
-               pdb->f_dma = sg_dma_address(req->src);
+               pdb->f_dma = sg_dma_address(req_ctx->fixup_src);
        }
 
        if (edesc->dst_nents > 1) {
        }
 
        pdb->sgf |= (key->e_sz << RSA_PDB_E_SHIFT) | key->n_sz;
-       pdb->f_len = req->src_len;
+       pdb->f_len = req_ctx->fixup_src_len;
 
        return 0;
 }
                pdb->g_dma = edesc->sec4_sg_dma;
                sec4_sg_index += edesc->src_nents;
        } else {
-               pdb->g_dma = sg_dma_address(req->src);
+               struct caam_rsa_req_ctx *req_ctx = akcipher_request_ctx(req);
+
+               pdb->g_dma = sg_dma_address(req_ctx->fixup_src);
        }
 
        if (edesc->dst_nents > 1) {
                pdb->g_dma = edesc->sec4_sg_dma;
                sec4_sg_index += edesc->src_nents;
        } else {
-               pdb->g_dma = sg_dma_address(req->src);
+               struct caam_rsa_req_ctx *req_ctx = akcipher_request_ctx(req);
+
+               pdb->g_dma = sg_dma_address(req_ctx->fixup_src);
        }
 
        if (edesc->dst_nents > 1) {
                pdb->g_dma = edesc->sec4_sg_dma;
                sec4_sg_index += edesc->src_nents;
        } else {
-               pdb->g_dma = sg_dma_address(req->src);
+               struct caam_rsa_req_ctx *req_ctx = akcipher_request_ctx(req);
+
+               pdb->g_dma = sg_dma_address(req_ctx->fixup_src);
        }
 
        if (edesc->dst_nents > 1) {