summaryrefslogtreecommitdiff
path: root/drivers/crypto
diff options
context:
space:
mode:
authorHoria Geanta <horia.geanta@freescale.com>2013-12-17 13:50:47 (GMT)
committerJose Rivera <German.Rivera@freescale.com>2014-01-23 14:07:55 (GMT)
commitc96eeec5d0ab2a2725d0bce47ff23b9816c2e484 (patch)
tree8193a34462ea1add4cf92d779b97fdd6a9dc81cc /drivers/crypto
parentc21109dae0bc9a4c73adbb193912090aaa2b8597 (diff)
downloadlinux-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.c31
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;
}
}