crypto: tegra - finalize crypto req on error

Call the crypto finalize function before exiting *do_one_req() functions.
This allows the driver to take up further requests even if the previous
one fails.

Fixes: 0880bb3b00 ("crypto: tegra - Add Tegra Security Engine driver")
Signed-off-by: Akhil R <akhilrajeev@nvidia.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
Akhil R 2025-02-24 14:46:03 +05:30 committed by Herbert Xu
parent 1cb328da4e
commit 1e245948ca

View File

@ -275,8 +275,10 @@ static int tegra_aes_do_one_req(struct crypto_engine *engine, void *areq)
rctx->datbuf.size = rctx->len; rctx->datbuf.size = rctx->len;
rctx->datbuf.buf = dma_alloc_coherent(se->dev, rctx->datbuf.size, rctx->datbuf.buf = dma_alloc_coherent(se->dev, rctx->datbuf.size,
&rctx->datbuf.addr, GFP_KERNEL); &rctx->datbuf.addr, GFP_KERNEL);
if (!rctx->datbuf.buf) if (!rctx->datbuf.buf) {
return -ENOMEM; ret = -ENOMEM;
goto out_finalize;
}
scatterwalk_map_and_copy(rctx->datbuf.buf, req->src, 0, req->cryptlen, 0); scatterwalk_map_and_copy(rctx->datbuf.buf, req->src, 0, req->cryptlen, 0);
@ -292,6 +294,7 @@ static int tegra_aes_do_one_req(struct crypto_engine *engine, void *areq)
dma_free_coherent(ctx->se->dev, rctx->datbuf.size, dma_free_coherent(ctx->se->dev, rctx->datbuf.size,
rctx->datbuf.buf, rctx->datbuf.addr); rctx->datbuf.buf, rctx->datbuf.addr);
out_finalize:
crypto_finalize_skcipher_request(se->engine, req, ret); crypto_finalize_skcipher_request(se->engine, req, ret);
return 0; return 0;
@ -1152,21 +1155,21 @@ static int tegra_ccm_do_one_req(struct crypto_engine *engine, void *areq)
ret = tegra_ccm_crypt_init(req, se, rctx); ret = tegra_ccm_crypt_init(req, se, rctx);
if (ret) if (ret)
return ret; goto out_finalize;
/* Allocate buffers required */ /* Allocate buffers required */
rctx->inbuf.size = rctx->assoclen + rctx->authsize + rctx->cryptlen + 100; rctx->inbuf.size = rctx->assoclen + rctx->authsize + rctx->cryptlen + 100;
rctx->inbuf.buf = dma_alloc_coherent(ctx->se->dev, rctx->inbuf.size, rctx->inbuf.buf = dma_alloc_coherent(ctx->se->dev, rctx->inbuf.size,
&rctx->inbuf.addr, GFP_KERNEL); &rctx->inbuf.addr, GFP_KERNEL);
if (!rctx->inbuf.buf) if (!rctx->inbuf.buf)
return -ENOMEM; goto out_finalize;
rctx->outbuf.size = rctx->assoclen + rctx->authsize + rctx->cryptlen + 100; rctx->outbuf.size = rctx->assoclen + rctx->authsize + rctx->cryptlen + 100;
rctx->outbuf.buf = dma_alloc_coherent(ctx->se->dev, rctx->outbuf.size, rctx->outbuf.buf = dma_alloc_coherent(ctx->se->dev, rctx->outbuf.size,
&rctx->outbuf.addr, GFP_KERNEL); &rctx->outbuf.addr, GFP_KERNEL);
if (!rctx->outbuf.buf) { if (!rctx->outbuf.buf) {
ret = -ENOMEM; ret = -ENOMEM;
goto outbuf_err; goto out_free_inbuf;
} }
if (rctx->encrypt) { if (rctx->encrypt) {
@ -1195,10 +1198,11 @@ static int tegra_ccm_do_one_req(struct crypto_engine *engine, void *areq)
dma_free_coherent(ctx->se->dev, rctx->inbuf.size, dma_free_coherent(ctx->se->dev, rctx->inbuf.size,
rctx->outbuf.buf, rctx->outbuf.addr); rctx->outbuf.buf, rctx->outbuf.addr);
outbuf_err: out_free_inbuf:
dma_free_coherent(ctx->se->dev, rctx->outbuf.size, dma_free_coherent(ctx->se->dev, rctx->outbuf.size,
rctx->inbuf.buf, rctx->inbuf.addr); rctx->inbuf.buf, rctx->inbuf.addr);
out_finalize:
crypto_finalize_aead_request(ctx->se->engine, req, ret); crypto_finalize_aead_request(ctx->se->engine, req, ret);
return 0; return 0;
@ -1229,15 +1233,17 @@ static int tegra_gcm_do_one_req(struct crypto_engine *engine, void *areq)
rctx->inbuf.size = rctx->assoclen + rctx->authsize + rctx->cryptlen; rctx->inbuf.size = rctx->assoclen + rctx->authsize + rctx->cryptlen;
rctx->inbuf.buf = dma_alloc_coherent(ctx->se->dev, rctx->inbuf.size, rctx->inbuf.buf = dma_alloc_coherent(ctx->se->dev, rctx->inbuf.size,
&rctx->inbuf.addr, GFP_KERNEL); &rctx->inbuf.addr, GFP_KERNEL);
if (!rctx->inbuf.buf) if (!rctx->inbuf.buf) {
return -ENOMEM; ret = -ENOMEM;
goto out_finalize;
}
rctx->outbuf.size = rctx->assoclen + rctx->authsize + rctx->cryptlen; rctx->outbuf.size = rctx->assoclen + rctx->authsize + rctx->cryptlen;
rctx->outbuf.buf = dma_alloc_coherent(ctx->se->dev, rctx->outbuf.size, rctx->outbuf.buf = dma_alloc_coherent(ctx->se->dev, rctx->outbuf.size,
&rctx->outbuf.addr, GFP_KERNEL); &rctx->outbuf.addr, GFP_KERNEL);
if (!rctx->outbuf.buf) { if (!rctx->outbuf.buf) {
ret = -ENOMEM; ret = -ENOMEM;
goto outbuf_err; goto out_free_inbuf;
} }
/* If there is associated data perform GMAC operation */ /* If there is associated data perform GMAC operation */
@ -1266,11 +1272,11 @@ static int tegra_gcm_do_one_req(struct crypto_engine *engine, void *areq)
dma_free_coherent(ctx->se->dev, rctx->outbuf.size, dma_free_coherent(ctx->se->dev, rctx->outbuf.size,
rctx->outbuf.buf, rctx->outbuf.addr); rctx->outbuf.buf, rctx->outbuf.addr);
outbuf_err: out_free_inbuf:
dma_free_coherent(ctx->se->dev, rctx->inbuf.size, dma_free_coherent(ctx->se->dev, rctx->inbuf.size,
rctx->inbuf.buf, rctx->inbuf.addr); rctx->inbuf.buf, rctx->inbuf.addr);
/* Finalize the request if there are no errors */ out_finalize:
crypto_finalize_aead_request(ctx->se->engine, req, ret); crypto_finalize_aead_request(ctx->se->engine, req, ret);
return 0; return 0;