Since we want cryptoengine to support handling more than one request, we need to remove cur_req_prepared. It is used only to choose if we need to unprepare() in crypto_finalize_request(). This choice is needed only in case of error, so let's handle error without crypto_finalize_request. Signed-off-by: Corentin Labbe <clabbe.montjoie@xxxxxxxxx> --- crypto/crypto_engine.c | 17 ++++++++++------- include/crypto/engine.h | 2 -- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/crypto/crypto_engine.c b/crypto/crypto_engine.c index feb0d82dd454..dfcb00e92e09 100644 --- a/crypto/crypto_engine.c +++ b/crypto/crypto_engine.c @@ -36,7 +36,7 @@ static void crypto_finalize_request(struct crypto_engine *engine, if (finalize_cur_req) { enginectx = crypto_tfm_ctx(req->tfm); - if (engine->cur_req_prepared && + if (enginectx->op.prepare_request && enginectx->op.unprepare_request) { ret = enginectx->op.unprepare_request(engine, req); if (ret) @@ -44,7 +44,6 @@ static void crypto_finalize_request(struct crypto_engine *engine, } spin_lock_irqsave(&engine->queue_lock, flags); engine->cur_req = NULL; - engine->cur_req_prepared = false; spin_unlock_irqrestore(&engine->queue_lock, flags); } @@ -118,7 +117,7 @@ static void crypto_pump_requests(struct crypto_engine *engine, ret = engine->prepare_crypt_hardware(engine); if (ret) { dev_err(engine->dev, "failed to prepare crypt hardware\n"); - goto req_err; + goto req_err2; } } @@ -129,9 +128,8 @@ static void crypto_pump_requests(struct crypto_engine *engine, if (ret) { dev_err(engine->dev, "failed to prepare request: %d\n", ret); - goto req_err; + goto req_err2; } - engine->cur_req_prepared = true; } if (!enginectx->op.do_one_request) { dev_err(engine->dev, "failed to do request\n"); @@ -146,7 +144,13 @@ static void crypto_pump_requests(struct crypto_engine *engine, return; req_err: - crypto_finalize_request(engine, async_req, ret); + if (enginectx->op.unprepare_request) { + ret = enginectx->op.unprepare_request(engine, async_req); + if (ret) + dev_err(engine->dev, "failed to unprepare request\n"); + } +req_err2: + async_req->complete(async_req, ret); return; out: @@ -398,7 +402,6 @@ struct crypto_engine *crypto_engine_alloc_init(struct device *dev, bool rt) engine->rt = rt; engine->running = false; engine->busy = false; - engine->cur_req_prepared = false; engine->priv_data = dev; snprintf(engine->name, sizeof(engine->name), "%s-engine", dev_name(dev)); diff --git a/include/crypto/engine.h b/include/crypto/engine.h index 7e7cbd9ca3b5..4d8a2602c9ed 100644 --- a/include/crypto/engine.h +++ b/include/crypto/engine.h @@ -23,7 +23,6 @@ * @name: the engine name * @busy: request pump is busy * @running: the engine is on working - * @cur_req_prepared: current request is prepared * @list: link with the global crypto engine list * @queue_lock: spinlock to syncronise access to request queue * @queue: the crypto queue of the engine @@ -43,7 +42,6 @@ struct crypto_engine { char name[ENGINE_NAME_LEN]; bool busy; bool running; - bool cur_req_prepared; struct list_head list; spinlock_t queue_lock; -- 2.24.1