Commit 5efa7186 authored by Herbert Xu's avatar Herbert Xu
Browse files

crypto: marvell/cesa - Use crypto_wait_req



This patch replaces the custom crypto completion function with
crypto_req_done.

Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 3ce2d597
Loading
Loading
Loading
Loading
+8 −33
Original line number Diff line number Diff line
@@ -1104,47 +1104,27 @@ struct ahash_alg mv_sha256_alg = {
	}
};

struct mv_cesa_ahash_result {
	struct completion completion;
	int error;
};

static void mv_cesa_hmac_ahash_complete(struct crypto_async_request *req,
					int error)
{
	struct mv_cesa_ahash_result *result = req->data;

	if (error == -EINPROGRESS)
		return;

	result->error = error;
	complete(&result->completion);
}

static int mv_cesa_ahmac_iv_state_init(struct ahash_request *req, u8 *pad,
				       void *state, unsigned int blocksize)
{
	struct mv_cesa_ahash_result result;
	DECLARE_CRYPTO_WAIT(result);
	struct scatterlist sg;
	int ret;

	ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
				   mv_cesa_hmac_ahash_complete, &result);
				   crypto_req_done, &result);
	sg_init_one(&sg, pad, blocksize);
	ahash_request_set_crypt(req, &sg, pad, blocksize);
	init_completion(&result.completion);

	ret = crypto_ahash_init(req);
	if (ret)
		return ret;

	ret = crypto_ahash_update(req);
	if (ret && ret != -EINPROGRESS)
		return ret;
	ret = crypto_wait_req(ret, &result);

	wait_for_completion_interruptible(&result.completion);
	if (result.error)
		return result.error;
	if (ret)
		return ret;

	ret = crypto_ahash_export(req, state);
	if (ret)
@@ -1158,7 +1138,7 @@ static int mv_cesa_ahmac_pad_init(struct ahash_request *req,
				  u8 *ipad, u8 *opad,
				  unsigned int blocksize)
{
	struct mv_cesa_ahash_result result;
	DECLARE_CRYPTO_WAIT(result);
	struct scatterlist sg;
	int ret;
	int i;
@@ -1172,17 +1152,12 @@ static int mv_cesa_ahmac_pad_init(struct ahash_request *req,
			return -ENOMEM;

		ahash_request_set_callback(req, CRYPTO_TFM_REQ_MAY_BACKLOG,
					   mv_cesa_hmac_ahash_complete,
					   &result);
					   crypto_req_done, &result);
		sg_init_one(&sg, keydup, keylen);
		ahash_request_set_crypt(req, &sg, ipad, keylen);
		init_completion(&result.completion);

		ret = crypto_ahash_digest(req);
		if (ret == -EINPROGRESS) {
			wait_for_completion_interruptible(&result.completion);
			ret = result.error;
		}
		ret = crypto_wait_req(ret, &result);

		/* Set the memory region to 0 to avoid any leak. */
		kfree_sensitive(keydup);