aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/crypto/marvell/cesa.h27
-rw-r--r--drivers/crypto/marvell/cipher.c7
-rw-r--r--drivers/crypto/marvell/hash.c8
3 files changed, 33 insertions, 9 deletions
diff --git a/drivers/crypto/marvell/cesa.h b/drivers/crypto/marvell/cesa.h
index b60698b30d30..bc2a55bc35e4 100644
--- a/drivers/crypto/marvell/cesa.h
+++ b/drivers/crypto/marvell/cesa.h
@@ -687,6 +687,33 @@ static inline u32 mv_cesa_get_int_mask(struct mv_cesa_engine *engine)
687 687
688int mv_cesa_queue_req(struct crypto_async_request *req); 688int mv_cesa_queue_req(struct crypto_async_request *req);
689 689
690/*
691 * Helper function that indicates whether a crypto request needs to be
692 * cleaned up or not after being enqueued using mv_cesa_queue_req().
693 */
694static inline int mv_cesa_req_needs_cleanup(struct crypto_async_request *req,
695 int ret)
696{
697 /*
698 * The queue still had some space, the request was queued
699 * normally, so there's no need to clean it up.
700 */
701 if (ret == -EINPROGRESS)
702 return false;
703
704 /*
705 * The queue had not space left, but since the request is
706 * flagged with CRYPTO_TFM_REQ_MAY_BACKLOG, it was added to
707 * the backlog and will be processed later. There's no need to
708 * clean it up.
709 */
710 if (ret == -EBUSY && req->flags & CRYPTO_TFM_REQ_MAY_BACKLOG)
711 return false;
712
713 /* Request wasn't queued, we need to clean it up */
714 return true;
715}
716
690/* TDMA functions */ 717/* TDMA functions */
691 718
692static inline void mv_cesa_req_dma_iter_init(struct mv_cesa_dma_iter *iter, 719static inline void mv_cesa_req_dma_iter_init(struct mv_cesa_dma_iter *iter,
diff --git a/drivers/crypto/marvell/cipher.c b/drivers/crypto/marvell/cipher.c
index 0745cf3b9c0e..3df2f4e7adb2 100644
--- a/drivers/crypto/marvell/cipher.c
+++ b/drivers/crypto/marvell/cipher.c
@@ -189,7 +189,6 @@ static inline void mv_cesa_ablkcipher_prepare(struct crypto_async_request *req,
189{ 189{
190 struct ablkcipher_request *ablkreq = ablkcipher_request_cast(req); 190 struct ablkcipher_request *ablkreq = ablkcipher_request_cast(req);
191 struct mv_cesa_ablkcipher_req *creq = ablkcipher_request_ctx(ablkreq); 191 struct mv_cesa_ablkcipher_req *creq = ablkcipher_request_ctx(ablkreq);
192
193 creq->req.base.engine = engine; 192 creq->req.base.engine = engine;
194 193
195 if (creq->req.base.type == CESA_DMA_REQ) 194 if (creq->req.base.type == CESA_DMA_REQ)
@@ -431,7 +430,7 @@ static int mv_cesa_des_op(struct ablkcipher_request *req,
431 return ret; 430 return ret;
432 431
433 ret = mv_cesa_queue_req(&req->base); 432 ret = mv_cesa_queue_req(&req->base);
434 if (ret && ret != -EINPROGRESS) 433 if (mv_cesa_req_needs_cleanup(&req->base, ret))
435 mv_cesa_ablkcipher_cleanup(req); 434 mv_cesa_ablkcipher_cleanup(req);
436 435
437 return ret; 436 return ret;
@@ -551,7 +550,7 @@ static int mv_cesa_des3_op(struct ablkcipher_request *req,
551 return ret; 550 return ret;
552 551
553 ret = mv_cesa_queue_req(&req->base); 552 ret = mv_cesa_queue_req(&req->base);
554 if (ret && ret != -EINPROGRESS) 553 if (mv_cesa_req_needs_cleanup(&req->base, ret))
555 mv_cesa_ablkcipher_cleanup(req); 554 mv_cesa_ablkcipher_cleanup(req);
556 555
557 return ret; 556 return ret;
@@ -693,7 +692,7 @@ static int mv_cesa_aes_op(struct ablkcipher_request *req,
693 return ret; 692 return ret;
694 693
695 ret = mv_cesa_queue_req(&req->base); 694 ret = mv_cesa_queue_req(&req->base);
696 if (ret && ret != -EINPROGRESS) 695 if (mv_cesa_req_needs_cleanup(&req->base, ret))
697 mv_cesa_ablkcipher_cleanup(req); 696 mv_cesa_ablkcipher_cleanup(req);
698 697
699 return ret; 698 return ret;
diff --git a/drivers/crypto/marvell/hash.c b/drivers/crypto/marvell/hash.c
index ae9272eb9c1a..e8d0d7128137 100644
--- a/drivers/crypto/marvell/hash.c
+++ b/drivers/crypto/marvell/hash.c
@@ -739,10 +739,8 @@ static int mv_cesa_ahash_update(struct ahash_request *req)
739 return 0; 739 return 0;
740 740
741 ret = mv_cesa_queue_req(&req->base); 741 ret = mv_cesa_queue_req(&req->base);
742 if (ret && ret != -EINPROGRESS) { 742 if (mv_cesa_req_needs_cleanup(&req->base, ret))
743 mv_cesa_ahash_cleanup(req); 743 mv_cesa_ahash_cleanup(req);
744 return ret;
745 }
746 744
747 return ret; 745 return ret;
748} 746}
@@ -766,7 +764,7 @@ static int mv_cesa_ahash_final(struct ahash_request *req)
766 return 0; 764 return 0;
767 765
768 ret = mv_cesa_queue_req(&req->base); 766 ret = mv_cesa_queue_req(&req->base);
769 if (ret && ret != -EINPROGRESS) 767 if (mv_cesa_req_needs_cleanup(&req->base, ret))
770 mv_cesa_ahash_cleanup(req); 768 mv_cesa_ahash_cleanup(req);
771 769
772 return ret; 770 return ret;
@@ -791,7 +789,7 @@ static int mv_cesa_ahash_finup(struct ahash_request *req)
791 return 0; 789 return 0;
792 790
793 ret = mv_cesa_queue_req(&req->base); 791 ret = mv_cesa_queue_req(&req->base);
794 if (ret && ret != -EINPROGRESS) 792 if (mv_cesa_req_needs_cleanup(&req->base, ret))
795 mv_cesa_ahash_cleanup(req); 793 mv_cesa_ahash_cleanup(req);
796 794
797 return ret; 795 return ret;