diff options
author | Ryder Lee <ryder.lee@mediatek.com> | 2017-01-20 08:41:09 +0300 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2017-01-23 17:50:29 +0300 |
commit | 4432861fb9747fce52f94bc13da0d9b41292ef69 (patch) | |
tree | 5fb79adb5e88a5825f825f5043761b3ac16df390 /drivers/crypto/mediatek/mtk-sha.c | |
parent | a873996238e4019c54c49b56fcc1fef35a93da41 (diff) | |
download | linux-4432861fb9747fce52f94bc13da0d9b41292ef69.tar.xz |
crypto: mediatek - fix incorrect data transfer result
This patch fixes mtk_aes_xmit() data transfer bug.
The original function uses the same loop and ring->pos
to handle both command and result descriptors. But this
produces incomplete results when src.sg_len != dst.sg_len.
To solve the problem, we splits the descriptors into different
loops and uses cmd_pos and res_pos to record them respectively.
Signed-off-by: Ryder Lee <ryder.lee@mediatek.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto/mediatek/mtk-sha.c')
-rw-r--r-- | drivers/crypto/mediatek/mtk-sha.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/drivers/crypto/mediatek/mtk-sha.c b/drivers/crypto/mediatek/mtk-sha.c index 8cbff218debb..2536ebc53602 100644 --- a/drivers/crypto/mediatek/mtk-sha.c +++ b/drivers/crypto/mediatek/mtk-sha.c @@ -426,8 +426,8 @@ static int mtk_sha_xmit(struct mtk_cryp *cryp, struct mtk_sha_rec *sha, { struct mtk_sha_reqctx *ctx = ahash_request_ctx(sha->req); struct mtk_ring *ring = cryp->ring[sha->id]; - struct mtk_desc *cmd = ring->cmd_base + ring->pos; - struct mtk_desc *res = ring->res_base + ring->pos; + struct mtk_desc *cmd = ring->cmd_base + ring->cmd_pos; + struct mtk_desc *res = ring->res_base + ring->res_pos; int err; err = mtk_sha_info_map(cryp, sha, len); @@ -451,9 +451,10 @@ static int mtk_sha_xmit(struct mtk_cryp *cryp, struct mtk_sha_rec *sha, cmd->ct_hdr = ctx->ct_hdr; cmd->tfm = cpu_to_le32(ctx->tfm_dma); - if (++ring->pos == MTK_DESC_NUM) - ring->pos = 0; + if (++ring->cmd_pos == MTK_DESC_NUM) + ring->cmd_pos = 0; + ring->res_pos = ring->cmd_pos; /* * Make sure that all changes to the DMA ring are done before we * start engine. @@ -472,8 +473,8 @@ static int mtk_sha_xmit2(struct mtk_cryp *cryp, size_t len1, size_t len2) { struct mtk_ring *ring = cryp->ring[sha->id]; - struct mtk_desc *cmd = ring->cmd_base + ring->pos; - struct mtk_desc *res = ring->res_base + ring->pos; + struct mtk_desc *cmd = ring->cmd_base + ring->cmd_pos; + struct mtk_desc *res = ring->res_base + ring->res_pos; int err; err = mtk_sha_info_map(cryp, sha, len1 + len2); @@ -492,11 +493,13 @@ static int mtk_sha_xmit2(struct mtk_cryp *cryp, cmd->ct_hdr = ctx->ct_hdr; cmd->tfm = cpu_to_le32(ctx->tfm_dma); - if (++ring->pos == MTK_DESC_NUM) - ring->pos = 0; + if (++ring->cmd_pos == MTK_DESC_NUM) + ring->cmd_pos = 0; - cmd = ring->cmd_base + ring->pos; - res = ring->res_base + ring->pos; + ring->res_pos = ring->cmd_pos; + + cmd = ring->cmd_base + ring->cmd_pos; + res = ring->res_base + ring->res_pos; res->hdr = MTK_DESC_BUF_LEN(len2) | MTK_DESC_LAST; res->buf = cpu_to_le32(cryp->tmp_dma); @@ -504,8 +507,10 @@ static int mtk_sha_xmit2(struct mtk_cryp *cryp, cmd->hdr = MTK_DESC_BUF_LEN(len2) | MTK_DESC_LAST; cmd->buf = cpu_to_le32(ctx->dma_addr); - if (++ring->pos == MTK_DESC_NUM) - ring->pos = 0; + if (++ring->cmd_pos == MTK_DESC_NUM) + ring->cmd_pos = 0; + + ring->res_pos = ring->cmd_pos; /* * Make sure that all changes to the DMA ring are done before we |