summaryrefslogtreecommitdiffstats
path: root/drivers/crypto/omap-sham.c
diff options
context:
space:
mode:
authorTero Kristo <t-kristo@ti.com>2019-11-05 16:00:55 +0200
committerHerbert Xu <herbert@gondor.apana.org.au>2019-12-11 16:36:58 +0800
commit2b352489d0d6398f6d47383b48ed3527f7d078f8 (patch)
tree29e8631495bdf15f22f00350e603a83277e23742 /drivers/crypto/omap-sham.c
parent891dcbbb0e464da7313daf910956c3d78eb5d2d5 (diff)
downloadlinux-2b352489d0d6398f6d47383b48ed3527f7d078f8.tar.bz2
crypto: omap-sham - fix buffer handling for split test cases
Current buffer handling logic fails in a case where the buffer contains existing data from previous update which is divisible by block size. This results in a block size of data to be left missing from the sg list going out to the hw accelerator, ending up in stalling the crypto accelerator driver (the last request never completes fully due to missing data.) Fix this by passing the total size of the data instead of the data size of current request, and also parsing the buffer contents within the prepare request handling. Signed-off-by: Tero Kristo <t-kristo@ti.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto/omap-sham.c')
-rw-r--r--drivers/crypto/omap-sham.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/crypto/omap-sham.c b/drivers/crypto/omap-sham.c
index 0bf07a7c060b..e71cd977b621 100644
--- a/drivers/crypto/omap-sham.c
+++ b/drivers/crypto/omap-sham.c
@@ -740,11 +740,12 @@ static int omap_sham_align_sgs(struct scatterlist *sg,
struct scatterlist *sg_tmp = sg;
int new_len;
int offset = rctx->offset;
+ int bufcnt = rctx->bufcnt;
if (!sg || !sg->length || !nbytes)
return 0;
- new_len = nbytes - offset;
+ new_len = nbytes;
if (offset)
list_ok = false;
@@ -763,6 +764,16 @@ static int omap_sham_align_sgs(struct scatterlist *sg,
while (nbytes > 0 && sg_tmp) {
n++;
+ if (bufcnt) {
+ if (!IS_ALIGNED(bufcnt, bs)) {
+ aligned = false;
+ break;
+ }
+ nbytes -= bufcnt;
+ bufcnt = 0;
+ continue;
+ }
+
#ifdef CONFIG_ZONE_DMA
if (page_zonenum(sg_page(sg_tmp)) != ZONE_DMA) {
aligned = false;
@@ -859,7 +870,7 @@ static int omap_sham_prepare_request(struct ahash_request *req, bool update)
if (rctx->bufcnt)
memcpy(rctx->dd->xmit_buf, rctx->buffer, rctx->bufcnt);
- ret = omap_sham_align_sgs(req->src, nbytes, bs, final, rctx);
+ ret = omap_sham_align_sgs(req->src, rctx->total, bs, final, rctx);
if (ret)
return ret;