Commit 9a42e4ee authored by Zain Wang's avatar Zain Wang Committed by Herbert Xu

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: default avatarzain wang <wzz@rock-chips.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 641eacd1
...@@ -187,27 +187,8 @@ static irqreturn_t rk_crypto_irq_handle(int irq, void *dev_id) ...@@ -187,27 +187,8 @@ static irqreturn_t rk_crypto_irq_handle(int irq, void *dev_id)
static void rk_crypto_queue_task_cb(unsigned long data) static void rk_crypto_queue_task_cb(unsigned long data)
{ {
struct rk_crypto_info *dev = (struct rk_crypto_info *)data; struct rk_crypto_info *dev = (struct rk_crypto_info *)data;
struct crypto_async_request *async_req, *backlog;
unsigned long flags;
int err = 0; int err = 0;
spin_lock_irqsave(&dev->lock, flags);
backlog = crypto_get_backlog(&dev->queue);
async_req = crypto_dequeue_request(&dev->queue);
spin_unlock_irqrestore(&dev->lock, flags);
if (!async_req) {
dev_err(dev->dev, "async_req is NULL !!\n");
return;
}
if (backlog) {
backlog->complete(backlog, -EINPROGRESS);
backlog = NULL;
}
if (crypto_tfm_alg_type(async_req->tfm) == CRYPTO_ALG_TYPE_ABLKCIPHER)
dev->ablk_req = ablkcipher_request_cast(async_req);
else
dev->ahash_req = ahash_request_cast(async_req);
dev->err = 0; dev->err = 0;
err = dev->start(dev); err = dev->start(dev);
if (err) if (err)
......
...@@ -25,6 +25,7 @@ static int rk_handle_req(struct rk_crypto_info *dev, ...@@ -25,6 +25,7 @@ static int rk_handle_req(struct rk_crypto_info *dev,
struct ablkcipher_request *req) struct ablkcipher_request *req)
{ {
unsigned long flags; unsigned long flags;
struct crypto_async_request *async_req, *backlog;
int err; int err;
if (!IS_ALIGNED(req->nbytes, dev->align_size)) if (!IS_ALIGNED(req->nbytes, dev->align_size))
...@@ -41,7 +42,21 @@ static int rk_handle_req(struct rk_crypto_info *dev, ...@@ -41,7 +42,21 @@ static int rk_handle_req(struct rk_crypto_info *dev,
spin_lock_irqsave(&dev->lock, flags); spin_lock_irqsave(&dev->lock, flags);
err = ablkcipher_enqueue_request(&dev->queue, req); err = ablkcipher_enqueue_request(&dev->queue, req);
backlog = crypto_get_backlog(&dev->queue);
async_req = crypto_dequeue_request(&dev->queue);
spin_unlock_irqrestore(&dev->lock, flags); spin_unlock_irqrestore(&dev->lock, flags);
if (!async_req) {
dev_err(dev->dev, "async_req is NULL !!\n");
return err;
}
if (backlog) {
backlog->complete(backlog, -EINPROGRESS);
backlog = NULL;
}
dev->ablk_req = ablkcipher_request_cast(async_req);
tasklet_schedule(&dev->queue_task); tasklet_schedule(&dev->queue_task);
return err; return err;
} }
......
...@@ -166,6 +166,7 @@ static int rk_ahash_digest(struct ahash_request *req) ...@@ -166,6 +166,7 @@ static int rk_ahash_digest(struct ahash_request *req)
{ {
struct crypto_ahash *tfm = crypto_ahash_reqtfm(req); struct crypto_ahash *tfm = crypto_ahash_reqtfm(req);
struct rk_ahash_ctx *tctx = crypto_tfm_ctx(req->base.tfm); struct rk_ahash_ctx *tctx = crypto_tfm_ctx(req->base.tfm);
struct crypto_async_request *async_req, *backlog;
struct rk_crypto_info *dev = NULL; struct rk_crypto_info *dev = NULL;
unsigned long flags; unsigned long flags;
int ret; int ret;
...@@ -202,8 +203,21 @@ static int rk_ahash_digest(struct ahash_request *req) ...@@ -202,8 +203,21 @@ static int rk_ahash_digest(struct ahash_request *req)
spin_lock_irqsave(&dev->lock, flags); spin_lock_irqsave(&dev->lock, flags);
ret = crypto_enqueue_request(&dev->queue, &req->base); ret = crypto_enqueue_request(&dev->queue, &req->base);
backlog = crypto_get_backlog(&dev->queue);
async_req = crypto_dequeue_request(&dev->queue);
spin_unlock_irqrestore(&dev->lock, flags); spin_unlock_irqrestore(&dev->lock, flags);
if (!async_req) {
dev_err(dev->dev, "async_req is NULL !!\n");
return ret;
}
if (backlog) {
backlog->complete(backlog, -EINPROGRESS);
backlog = NULL;
}
dev->ahash_req = ahash_request_cast(async_req);
tasklet_schedule(&dev->queue_task); tasklet_schedule(&dev->queue_task);
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment