aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZain Wang <wzz@rock-chips.com>2017-07-23 21:23:14 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2017-08-03 02:00:23 -0400
commit9a42e4eed3fcd7ba8dff6622384cd08bfe5ef707 (patch)
tree028c03333db731d410cf51018598301a4b1dca8b
parent641eacd15696a65b08880985701c8082872da136 (diff)
crypto: rockchip - return the err code when unable dequeue the crypto request
Sometime we would unable to dequeue the crypto request, in this case, we should finish crypto and return the err code. Signed-off-by: zain wang <wzz@rock-chips.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r--drivers/crypto/rockchip/rk3288_crypto.c19
-rw-r--r--drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c15
-rw-r--r--drivers/crypto/rockchip/rk3288_crypto_ahash.c14
3 files changed, 29 insertions, 19 deletions
diff --git a/drivers/crypto/rockchip/rk3288_crypto.c b/drivers/crypto/rockchip/rk3288_crypto.c
index c2b1dd70f9f7..57c37831bd42 100644
--- a/drivers/crypto/rockchip/rk3288_crypto.c
+++ b/drivers/crypto/rockchip/rk3288_crypto.c
@@ -187,27 +187,8 @@ static irqreturn_t rk_crypto_irq_handle(int irq, void *dev_id)
187static void rk_crypto_queue_task_cb(unsigned long data) 187static void rk_crypto_queue_task_cb(unsigned long data)
188{ 188{
189 struct rk_crypto_info *dev = (struct rk_crypto_info *)data; 189 struct rk_crypto_info *dev = (struct rk_crypto_info *)data;
190 struct crypto_async_request *async_req, *backlog;
191 unsigned long flags;
192 int err = 0; 190 int err = 0;
193 191
194 spin_lock_irqsave(&dev->lock, flags);
195 backlog = crypto_get_backlog(&dev->queue);
196 async_req = crypto_dequeue_request(&dev->queue);
197 spin_unlock_irqrestore(&dev->lock, flags);
198 if (!async_req) {
199 dev_err(dev->dev, "async_req is NULL !!\n");
200 return;
201 }
202 if (backlog) {
203 backlog->complete(backlog, -EINPROGRESS);
204 backlog = NULL;
205 }
206
207 if (crypto_tfm_alg_type(async_req->tfm) == CRYPTO_ALG_TYPE_ABLKCIPHER)
208 dev->ablk_req = ablkcipher_request_cast(async_req);
209 else
210 dev->ahash_req = ahash_request_cast(async_req);
211 dev->err = 0; 192 dev->err = 0;
212 err = dev->start(dev); 193 err = dev->start(dev);
213 if (err) 194 if (err)
diff --git a/drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c b/drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c
index 8787e44593f8..dbe78def7b65 100644
--- a/drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c
+++ b/drivers/crypto/rockchip/rk3288_crypto_ablkcipher.c
@@ -25,6 +25,7 @@ static int rk_handle_req(struct rk_crypto_info *dev,
25 struct ablkcipher_request *req) 25 struct ablkcipher_request *req)
26{ 26{
27 unsigned long flags; 27 unsigned long flags;
28 struct crypto_async_request *async_req, *backlog;
28 int err; 29 int err;
29 30
30 if (!IS_ALIGNED(req->nbytes, dev->align_size)) 31 if (!IS_ALIGNED(req->nbytes, dev->align_size))
@@ -41,7 +42,21 @@ static int rk_handle_req(struct rk_crypto_info *dev,
41 42
42 spin_lock_irqsave(&dev->lock, flags); 43 spin_lock_irqsave(&dev->lock, flags);
43 err = ablkcipher_enqueue_request(&dev->queue, req); 44 err = ablkcipher_enqueue_request(&dev->queue, req);
45 backlog = crypto_get_backlog(&dev->queue);
46 async_req = crypto_dequeue_request(&dev->queue);
44 spin_unlock_irqrestore(&dev->lock, flags); 47 spin_unlock_irqrestore(&dev->lock, flags);
48
49 if (!async_req) {
50 dev_err(dev->dev, "async_req is NULL !!\n");
51 return err;
52 }
53 if (backlog) {
54 backlog->complete(backlog, -EINPROGRESS);
55 backlog = NULL;
56 }
57
58 dev->ablk_req = ablkcipher_request_cast(async_req);
59
45 tasklet_schedule(&dev->queue_task); 60 tasklet_schedule(&dev->queue_task);
46 return err; 61 return err;
47} 62}
diff --git a/drivers/crypto/rockchip/rk3288_crypto_ahash.c b/drivers/crypto/rockchip/rk3288_crypto_ahash.c
index 9b55585a20fa..ebc46e007804 100644
--- a/drivers/crypto/rockchip/rk3288_crypto_ahash.c
+++ b/drivers/crypto/rockchip/rk3288_crypto_ahash.c
@@ -166,6 +166,7 @@ static int rk_ahash_digest(struct ahash_request *req)
166{ 166{
167 struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); 167 struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
168 struct rk_ahash_ctx *tctx = crypto_tfm_ctx(req->base.tfm); 168 struct rk_ahash_ctx *tctx = crypto_tfm_ctx(req->base.tfm);
169 struct crypto_async_request *async_req, *backlog;
169 struct rk_crypto_info *dev = NULL; 170 struct rk_crypto_info *dev = NULL;
170 unsigned long flags; 171 unsigned long flags;
171 int ret; 172 int ret;
@@ -202,8 +203,21 @@ static int rk_ahash_digest(struct ahash_request *req)
202 203
203 spin_lock_irqsave(&dev->lock, flags); 204 spin_lock_irqsave(&dev->lock, flags);
204 ret = crypto_enqueue_request(&dev->queue, &req->base); 205 ret = crypto_enqueue_request(&dev->queue, &req->base);
206 backlog = crypto_get_backlog(&dev->queue);
207 async_req = crypto_dequeue_request(&dev->queue);
205 spin_unlock_irqrestore(&dev->lock, flags); 208 spin_unlock_irqrestore(&dev->lock, flags);
206 209
210 if (!async_req) {
211 dev_err(dev->dev, "async_req is NULL !!\n");
212 return ret;
213 }
214 if (backlog) {
215 backlog->complete(backlog, -EINPROGRESS);
216 backlog = NULL;
217 }
218
219 dev->ahash_req = ahash_request_cast(async_req);
220
207 tasklet_schedule(&dev->queue_task); 221 tasklet_schedule(&dev->queue_task);
208 222
209 /* 223 /*