diff options
author | Horia Geanta <horia.geanta@freescale.com> | 2013-12-17 13:50:47 (GMT) |
---|---|---|
committer | Jose Rivera <German.Rivera@freescale.com> | 2014-01-23 14:07:55 (GMT) |
commit | c96eeec5d0ab2a2725d0bce47ff23b9816c2e484 (patch) | |
tree | 8193a34462ea1add4cf92d779b97fdd6a9dc81cc /drivers/crypto | |
parent | c21109dae0bc9a4c73adbb193912090aaa2b8597 (diff) | |
download | linux-fsl-qoriq-c96eeec5d0ab2a2725d0bce47ff23b9816c2e484.tar.xz |
crypto: caam/qi - fix aead job descriptor
aead job descriptor is not initialized correctly:
platform caam_qi.0: Error: 0x40003401 in CAAM response FD
platform caam_qi.0: Rsp status: 0x40003401: DECO: desc idx 52: SGT Length Error. The descriptor is trying to read more data than is contained in the SGT table.
Fix it by using exactly the same logic as for caam.
Signed-off-by: Horia Geanta <horia.geanta@freescale.com>
Change-Id: Ia4695d6929cfbe34b83789a3719bfd9d51c8d0e6
Reviewed-on: http://git.am.freescale.net:8181/7370
Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com>
Reviewed-by: Alexandru Porosanu <alexandru.porosanu@freescale.com>
Reviewed-by: Jose Rivera <German.Rivera@freescale.com>
(cherry picked from commit c5021a423929fe719cfa7885565c8210f2fc40a7)
Change-Id: Ia4695d6929cfbe34b83789a3719bfd9d51c8d0e6
Reviewed-on: http://git.am.freescale.net:8181/7753
Tested-by: Review Code-CDREVIEW <CDREVIEW@freescale.com>
Reviewed-by: Jose Rivera <German.Rivera@freescale.com>
Diffstat (limited to 'drivers/crypto')
-rw-r--r-- | drivers/crypto/caam/caamalg_qi.c | 31 |
1 files changed, 15 insertions, 16 deletions
diff --git a/drivers/crypto/caam/caamalg_qi.c b/drivers/crypto/caam/caamalg_qi.c index 11c3923..7a476e4 100644 --- a/drivers/crypto/caam/caamalg_qi.c +++ b/drivers/crypto/caam/caamalg_qi.c @@ -676,7 +676,6 @@ static struct aead_edesc *aead_edesc_alloc(struct aead_request *req, fd_sgt[1].__reserved3 = 0; fd_sgt[1].offset = 0; - if (!all_contig) { fd_sgt[1].extension = 1; fd_sgt[1].addr = qm_sg_dma; @@ -696,28 +695,28 @@ static struct aead_edesc *aead_edesc_alloc(struct aead_request *req, fd_sgt[1].addr = sg_dma_address(req->assoc); } - if (dst_nents) { - fd_sgt[0].addr = qm_sg_dma + - (sizeof(struct qm_sg_entry) * qm_sg_index); - fd_sgt[0].extension = 1; - + if (dst_nents) sg_to_qm_sg_last(req->dst, dst_nents, sg_table + qm_sg_index, 0); + + if (req->dst == req->src) { + if (src_nents <= 1) { + fd_sgt[0].addr = sg_dma_address(req->src); + fd_sgt[0].extension = 0; + } else { + fd_sgt[0].extension = 1; + fd_sgt[0].addr = fd_sgt[1].addr + + sizeof(struct qm_sg_entry) * + ((edesc->assoc_nents ? : 1) + 1); + } } else { - if (req->dst != req->src) { + if (!dst_nents) { fd_sgt[0].addr = sg_dma_address(req->dst); fd_sgt[0].extension = 0; } else { - if (src_nents <= 1) { - fd_sgt[0].addr = sg_dma_address(req->dst); - fd_sgt[0].extension = 0; - } else { - fd_sgt[0].extension = 1; - fd_sgt[0].addr = qm_sg_dma + + fd_sgt[0].addr = qm_sg_dma + (sizeof(struct qm_sg_entry) * qm_sg_index); - sg_to_qm_sg_last(req->src, src_nents, - sg_table + qm_sg_index, 0); - } + fd_sgt[0].extension = 1; } } |