]>
Commit | Line | Data |
---|---|---|
eedc2696 GKH |
1 | From 4359669a087633132203c52d67dd8c31e09e7b2e Mon Sep 17 00:00:00 2001 |
2 | From: Zhang Zhijie <zhangzj@rock-chips.com> | |
3 | Date: Wed, 13 Feb 2019 16:24:38 +0800 | |
4 | Subject: crypto: rockchip - fix scatterlist nents error | |
5 | ||
6 | From: Zhang Zhijie <zhangzj@rock-chips.com> | |
7 | ||
8 | commit 4359669a087633132203c52d67dd8c31e09e7b2e upstream. | |
9 | ||
10 | In some cases, the nents of src scatterlist is different from | |
11 | dst scatterlist. So two variables are used to handle the nents | |
12 | of src&dst scatterlist. | |
13 | ||
14 | Reported-by: Eric Biggers <ebiggers@google.com> | |
15 | Fixes: 433cd2c617bf ("crypto: rockchip - add crypto driver for rk3288") | |
16 | Cc: <stable@vger.kernel.org> # v4.5+ | |
17 | Signed-off-by: Zhang Zhijie <zhangzj@rock-chips.com> | |
18 | Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> | |
19 | Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> | |
20 | ||
21 | --- | |
22 | drivers/crypto/rockchip/rk3288_crypto.c | 2 +- | |
23 | drivers/crypto/rockchip/rk3288_crypto.h | 3 ++- | |
24 | drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c | 5 +++-- | |
25 | drivers/crypto/rockchip/rk3288_crypto_ahash.c | 2 +- | |
26 | 4 files changed, 7 insertions(+), 5 deletions(-) | |
27 | ||
28 | --- a/drivers/crypto/rockchip/rk3288_crypto.c | |
29 | +++ b/drivers/crypto/rockchip/rk3288_crypto.c | |
30 | @@ -119,7 +119,7 @@ static int rk_load_data(struct rk_crypto | |
31 | count = (dev->left_bytes > PAGE_SIZE) ? | |
32 | PAGE_SIZE : dev->left_bytes; | |
33 | ||
34 | - if (!sg_pcopy_to_buffer(dev->first, dev->nents, | |
35 | + if (!sg_pcopy_to_buffer(dev->first, dev->src_nents, | |
36 | dev->addr_vir, count, | |
37 | dev->total - dev->left_bytes)) { | |
38 | dev_err(dev->dev, "[%s:%d] pcopy err\n", | |
39 | --- a/drivers/crypto/rockchip/rk3288_crypto.h | |
40 | +++ b/drivers/crypto/rockchip/rk3288_crypto.h | |
41 | @@ -207,7 +207,8 @@ struct rk_crypto_info { | |
42 | void *addr_vir; | |
43 | int aligned; | |
44 | int align_size; | |
45 | - size_t nents; | |
46 | + size_t src_nents; | |
47 | + size_t dst_nents; | |
48 | unsigned int total; | |
49 | unsigned int count; | |
50 | dma_addr_t addr_in; | |
51 | --- a/drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c | |
52 | +++ b/drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c | |
53 | @@ -260,8 +260,9 @@ static int rk_ablk_start(struct rk_crypt | |
54 | dev->total = req->nbytes; | |
55 | dev->sg_src = req->src; | |
56 | dev->first = req->src; | |
57 | - dev->nents = sg_nents(req->src); | |
58 | + dev->src_nents = sg_nents(req->src); | |
59 | dev->sg_dst = req->dst; | |
60 | + dev->dst_nents = sg_nents(req->dst); | |
61 | dev->aligned = 1; | |
62 | ||
63 | spin_lock_irqsave(&dev->lock, flags); | |
64 | @@ -297,7 +298,7 @@ static int rk_ablk_rx(struct rk_crypto_i | |
65 | ||
66 | dev->unload_data(dev); | |
67 | if (!dev->aligned) { | |
68 | - if (!sg_pcopy_from_buffer(req->dst, dev->nents, | |
69 | + if (!sg_pcopy_from_buffer(req->dst, dev->dst_nents, | |
70 | dev->addr_vir, dev->count, | |
71 | dev->total - dev->left_bytes - | |
72 | dev->count)) { | |
73 | --- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c | |
74 | +++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c | |
75 | @@ -206,7 +206,7 @@ static int rk_ahash_start(struct rk_cryp | |
76 | dev->sg_dst = NULL; | |
77 | dev->sg_src = req->src; | |
78 | dev->first = req->src; | |
79 | - dev->nents = sg_nents(req->src); | |
80 | + dev->src_nents = sg_nents(req->src); | |
81 | rctx = ahash_request_ctx(req); | |
82 | rctx->mode = 0; | |
83 |