Torsten Duwe 734bc6
From af88d3c109aa5edfaa11c9a26d9c0ff21ddf501c Mon Sep 17 00:00:00 2001
Torsten Duwe 734bc6
From: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 734bc6
Date: Mon, 9 May 2022 14:34:09 +0100
Torsten Duwe 734bc6
Subject: [PATCH] crypto: qat - refactor submission logic
Torsten Duwe 734bc6
Git-commit: af88d3c109aa5edfaa11c9a26d9c0ff21ddf501c
Torsten Duwe 734bc6
Patch-mainline: v5.19-rc1
Torsten Duwe 734bc6
References: jsc#PED-1073
Torsten Duwe 734bc6
Torsten Duwe 734bc6
All the algorithms in qat_algs.c and qat_asym_algs.c use the same
Torsten Duwe 734bc6
pattern to submit messages to the HW queues. Move the submission loop
Torsten Duwe 734bc6
to a new function, qat_alg_send_message(), and share it between the
Torsten Duwe 734bc6
symmetric and the asymmetric algorithms.
Torsten Duwe 734bc6
Torsten Duwe 734bc6
As part of this rework, since the number of retries before returning an
Torsten Duwe 734bc6
error is inconsistent between the symmetric and asymmetric
Torsten Duwe 734bc6
implementations, set it to a value that works for both (i.e. 20, was 10
Torsten Duwe 734bc6
in qat_algs.c and 100 in qat_asym_algs.c)
Torsten Duwe 734bc6
Torsten Duwe 734bc6
In addition fix the return code reported when the HW queues are full.
Torsten Duwe 734bc6
In that case return -ENOSPC instead of -EBUSY.
Torsten Duwe 734bc6
Torsten Duwe 734bc6
Including stable in CC since (1) the error code returned if the HW queues
Torsten Duwe 734bc6
are full is incorrect and (2) to facilitate the backport of the next fix
Torsten Duwe 734bc6
"crypto: qat - add backlog mechanism".
Torsten Duwe 734bc6
Torsten Duwe 734bc6
Cc: stable@vger.kernel.org
Torsten Duwe 734bc6
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 734bc6
Reviewed-by: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe 734bc6
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe 734bc6
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe 734bc6
Torsten Duwe 734bc6
---
Torsten Duwe 734bc6
 drivers/crypto/qat/qat_common/Makefile        |  1 +
Torsten Duwe 734bc6
 drivers/crypto/qat/qat_common/qat_algs.c      | 68 +++++++++----------
Torsten Duwe 734bc6
 drivers/crypto/qat/qat_common/qat_algs_send.c | 21 ++++++
Torsten Duwe 734bc6
 drivers/crypto/qat/qat_common/qat_algs_send.h | 10 +++
Torsten Duwe 734bc6
 drivers/crypto/qat/qat_common/qat_asym_algs.c | 50 +++++++++-----
Torsten Duwe 734bc6
 drivers/crypto/qat/qat_common/qat_crypto.h    |  5 ++
Torsten Duwe 734bc6
 6 files changed, 101 insertions(+), 54 deletions(-)
Torsten Duwe 734bc6
 create mode 100644 drivers/crypto/qat/qat_common/qat_algs_send.c
Torsten Duwe 734bc6
 create mode 100644 drivers/crypto/qat/qat_common/qat_algs_send.h
Torsten Duwe 734bc6
Torsten Duwe 734bc6
diff --git a/drivers/crypto/qat/qat_common/Makefile b/drivers/crypto/qat/qat_common/Makefile
Torsten Duwe 734bc6
index f25a6c8edfc73..04f058acc4d37 100644
Torsten Duwe 734bc6
--- a/drivers/crypto/qat/qat_common/Makefile
Torsten Duwe 734bc6
+++ b/drivers/crypto/qat/qat_common/Makefile
Torsten Duwe 734bc6
@@ -16,6 +16,7 @@ intel_qat-objs := adf_cfg.o \
Torsten Duwe 734bc6
 	qat_crypto.o \
Torsten Duwe 734bc6
 	qat_algs.o \
Torsten Duwe 734bc6
 	qat_asym_algs.o \
Torsten Duwe 734bc6
+	qat_algs_send.o \
Torsten Duwe 734bc6
 	qat_uclo.o \
Torsten Duwe 734bc6
 	qat_hal.o
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
diff --git a/drivers/crypto/qat/qat_common/qat_algs.c b/drivers/crypto/qat/qat_common/qat_algs.c
Torsten Duwe 734bc6
index ec635fe44c1f4..6017ae82c7133 100644
Torsten Duwe 734bc6
--- a/drivers/crypto/qat/qat_common/qat_algs.c
Torsten Duwe 734bc6
+++ b/drivers/crypto/qat/qat_common/qat_algs.c
Torsten Duwe 734bc6
@@ -17,7 +17,7 @@
Torsten Duwe 734bc6
 #include <crypto/xts.h>
Torsten Duwe 734bc6
 #include <linux/dma-mapping.h>
Torsten Duwe 734bc6
 #include "adf_accel_devices.h"
Torsten Duwe 734bc6
-#include "adf_transport.h"
Torsten Duwe 734bc6
+#include "qat_algs_send.h"
Torsten Duwe 734bc6
 #include "adf_common_drv.h"
Torsten Duwe 734bc6
 #include "qat_crypto.h"
Torsten Duwe 734bc6
 #include "icp_qat_hw.h"
Torsten Duwe 734bc6
@@ -939,6 +939,17 @@ void qat_alg_callback(void *resp)
Torsten Duwe 734bc6
 	qat_req->cb(qat_resp, qat_req);
Torsten Duwe 734bc6
 }
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
+static int qat_alg_send_sym_message(struct qat_crypto_request *qat_req,
Torsten Duwe 734bc6
+				    struct qat_crypto_instance *inst)
Torsten Duwe 734bc6
+{
Torsten Duwe 734bc6
+	struct qat_alg_req req;
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+	req.fw_req = (u32 *)&qat_req->req;
Torsten Duwe 734bc6
+	req.tx_ring = inst->sym_tx;
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+	return qat_alg_send_message(&req;;
Torsten Duwe 734bc6
+}
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
 static int qat_alg_aead_dec(struct aead_request *areq)
Torsten Duwe 734bc6
 {
Torsten Duwe 734bc6
 	struct crypto_aead *aead_tfm = crypto_aead_reqtfm(areq);
Torsten Duwe 734bc6
@@ -949,7 +960,7 @@ static int qat_alg_aead_dec(struct aead_request *areq)
Torsten Duwe 734bc6
 	struct icp_qat_fw_la_auth_req_params *auth_param;
Torsten Duwe 734bc6
 	struct icp_qat_fw_la_bulk_req *msg;
Torsten Duwe 734bc6
 	int digst_size = crypto_aead_authsize(aead_tfm);
Torsten Duwe 734bc6
-	int ret, ctr = 0;
Torsten Duwe 734bc6
+	int ret;
Torsten Duwe 734bc6
 	u32 cipher_len;
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
 	cipher_len = areq->cryptlen - digst_size;
Torsten Duwe 734bc6
@@ -975,15 +986,12 @@ static int qat_alg_aead_dec(struct aead_request *areq)
Torsten Duwe 734bc6
 	auth_param = (void *)((u8 *)cipher_param + sizeof(*cipher_param));
Torsten Duwe 734bc6
 	auth_param->auth_off = 0;
Torsten Duwe 734bc6
 	auth_param->auth_len = areq->assoclen + cipher_param->cipher_length;
Torsten Duwe 734bc6
-	do {
Torsten Duwe 734bc6
-		ret = adf_send_message(ctx->inst->sym_tx, (u32 *)msg);
Torsten Duwe 734bc6
-	} while (ret == -EAGAIN && ctr++ < 10);
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
-	if (ret == -EAGAIN) {
Torsten Duwe 734bc6
+	ret = qat_alg_send_sym_message(qat_req, ctx->inst);
Torsten Duwe 734bc6
+	if (ret == -ENOSPC)
Torsten Duwe 734bc6
 		qat_alg_free_bufl(ctx->inst, qat_req);
Torsten Duwe 734bc6
-		return -EBUSY;
Torsten Duwe 734bc6
-	}
Torsten Duwe 734bc6
-	return -EINPROGRESS;
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+	return ret;
Torsten Duwe 734bc6
 }
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
 static int qat_alg_aead_enc(struct aead_request *areq)
Torsten Duwe 734bc6
@@ -996,7 +1004,7 @@ static int qat_alg_aead_enc(struct aead_request *areq)
Torsten Duwe 734bc6
 	struct icp_qat_fw_la_auth_req_params *auth_param;
Torsten Duwe 734bc6
 	struct icp_qat_fw_la_bulk_req *msg;
Torsten Duwe 734bc6
 	u8 *iv = areq->iv;
Torsten Duwe 734bc6
-	int ret, ctr = 0;
Torsten Duwe 734bc6
+	int ret;
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
 	if (areq->cryptlen % AES_BLOCK_SIZE != 0)
Torsten Duwe 734bc6
 		return -EINVAL;
Torsten Duwe 734bc6
@@ -1023,15 +1031,11 @@ static int qat_alg_aead_enc(struct aead_request *areq)
Torsten Duwe 734bc6
 	auth_param->auth_off = 0;
Torsten Duwe 734bc6
 	auth_param->auth_len = areq->assoclen + areq->cryptlen;
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
-	do {
Torsten Duwe 734bc6
-		ret = adf_send_message(ctx->inst->sym_tx, (u32 *)msg);
Torsten Duwe 734bc6
-	} while (ret == -EAGAIN && ctr++ < 10);
Torsten Duwe 734bc6
-
Torsten Duwe 734bc6
-	if (ret == -EAGAIN) {
Torsten Duwe 734bc6
+	ret = qat_alg_send_sym_message(qat_req, ctx->inst);
Torsten Duwe 734bc6
+	if (ret == -ENOSPC)
Torsten Duwe 734bc6
 		qat_alg_free_bufl(ctx->inst, qat_req);
Torsten Duwe 734bc6
-		return -EBUSY;
Torsten Duwe 734bc6
-	}
Torsten Duwe 734bc6
-	return -EINPROGRESS;
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+	return ret;
Torsten Duwe 734bc6
 }
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
 static int qat_alg_skcipher_rekey(struct qat_alg_skcipher_ctx *ctx,
Torsten Duwe 734bc6
@@ -1184,7 +1188,7 @@ static int qat_alg_skcipher_encrypt(struct skcipher_request *req)
Torsten Duwe 734bc6
 	struct qat_crypto_request *qat_req = skcipher_request_ctx(req);
Torsten Duwe 734bc6
 	struct icp_qat_fw_la_cipher_req_params *cipher_param;
Torsten Duwe 734bc6
 	struct icp_qat_fw_la_bulk_req *msg;
Torsten Duwe 734bc6
-	int ret, ctr = 0;
Torsten Duwe 734bc6
+	int ret;
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
 	if (req->cryptlen == 0)
Torsten Duwe 734bc6
 		return 0;
Torsten Duwe 734bc6
@@ -1208,15 +1212,11 @@ static int qat_alg_skcipher_encrypt(struct skcipher_request *req)
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
 	qat_alg_set_req_iv(qat_req);
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
-	do {
Torsten Duwe 734bc6
-		ret = adf_send_message(ctx->inst->sym_tx, (u32 *)msg);
Torsten Duwe 734bc6
-	} while (ret == -EAGAIN && ctr++ < 10);
Torsten Duwe 734bc6
-
Torsten Duwe 734bc6
-	if (ret == -EAGAIN) {
Torsten Duwe 734bc6
+	ret = qat_alg_send_sym_message(qat_req, ctx->inst);
Torsten Duwe 734bc6
+	if (ret == -ENOSPC)
Torsten Duwe 734bc6
 		qat_alg_free_bufl(ctx->inst, qat_req);
Torsten Duwe 734bc6
-		return -EBUSY;
Torsten Duwe 734bc6
-	}
Torsten Duwe 734bc6
-	return -EINPROGRESS;
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+	return ret;
Torsten Duwe 734bc6
 }
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
 static int qat_alg_skcipher_blk_encrypt(struct skcipher_request *req)
Torsten Duwe 734bc6
@@ -1253,7 +1253,7 @@ static int qat_alg_skcipher_decrypt(struct skcipher_request *req)
Torsten Duwe 734bc6
 	struct qat_crypto_request *qat_req = skcipher_request_ctx(req);
Torsten Duwe 734bc6
 	struct icp_qat_fw_la_cipher_req_params *cipher_param;
Torsten Duwe 734bc6
 	struct icp_qat_fw_la_bulk_req *msg;
Torsten Duwe 734bc6
-	int ret, ctr = 0;
Torsten Duwe 734bc6
+	int ret;
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
 	if (req->cryptlen == 0)
Torsten Duwe 734bc6
 		return 0;
Torsten Duwe 734bc6
@@ -1278,15 +1278,11 @@ static int qat_alg_skcipher_decrypt(struct skcipher_request *req)
Torsten Duwe 734bc6
 	qat_alg_set_req_iv(qat_req);
Torsten Duwe 734bc6
 	qat_alg_update_iv(qat_req);
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
-	do {
Torsten Duwe 734bc6
-		ret = adf_send_message(ctx->inst->sym_tx, (u32 *)msg);
Torsten Duwe 734bc6
-	} while (ret == -EAGAIN && ctr++ < 10);
Torsten Duwe 734bc6
-
Torsten Duwe 734bc6
-	if (ret == -EAGAIN) {
Torsten Duwe 734bc6
+	ret = qat_alg_send_sym_message(qat_req, ctx->inst);
Torsten Duwe 734bc6
+	if (ret == -ENOSPC)
Torsten Duwe 734bc6
 		qat_alg_free_bufl(ctx->inst, qat_req);
Torsten Duwe 734bc6
-		return -EBUSY;
Torsten Duwe 734bc6
-	}
Torsten Duwe 734bc6
-	return -EINPROGRESS;
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+	return ret;
Torsten Duwe 734bc6
 }
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
 static int qat_alg_skcipher_blk_decrypt(struct skcipher_request *req)
Torsten Duwe 734bc6
diff --git a/drivers/crypto/qat/qat_common/qat_algs_send.c b/drivers/crypto/qat/qat_common/qat_algs_send.c
Torsten Duwe 734bc6
new file mode 100644
Torsten Duwe 734bc6
index 0000000000000..78f1bb8c26c08
Torsten Duwe 734bc6
--- /dev/null
Torsten Duwe 734bc6
+++ b/drivers/crypto/qat/qat_common/qat_algs_send.c
Torsten Duwe 734bc6
@@ -0,0 +1,21 @@
Torsten Duwe 734bc6
+// SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only)
Torsten Duwe 734bc6
+/* Copyright(c) 2022 Intel Corporation */
Torsten Duwe 734bc6
+#include "adf_transport.h"
Torsten Duwe 734bc6
+#include "qat_algs_send.h"
Torsten Duwe 734bc6
+#include "qat_crypto.h"
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+#define ADF_MAX_RETRIES		20
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+int qat_alg_send_message(struct qat_alg_req *req)
Torsten Duwe 734bc6
+{
Torsten Duwe 734bc6
+	int ret = 0, ctr = 0;
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+	do {
Torsten Duwe 734bc6
+		ret = adf_send_message(req->tx_ring, req->fw_req);
Torsten Duwe 734bc6
+	} while (ret == -EAGAIN && ctr++ < ADF_MAX_RETRIES);
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+	if (ret == -EAGAIN)
Torsten Duwe 734bc6
+		return -ENOSPC;
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+	return -EINPROGRESS;
Torsten Duwe 734bc6
+}
Torsten Duwe 734bc6
diff --git a/drivers/crypto/qat/qat_common/qat_algs_send.h b/drivers/crypto/qat/qat_common/qat_algs_send.h
Torsten Duwe 734bc6
new file mode 100644
Torsten Duwe 734bc6
index 0000000000000..3fa685d0c293a
Torsten Duwe 734bc6
--- /dev/null
Torsten Duwe 734bc6
+++ b/drivers/crypto/qat/qat_common/qat_algs_send.h
Torsten Duwe 734bc6
@@ -0,0 +1,10 @@
Torsten Duwe 734bc6
+/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0-only) */
Torsten Duwe 734bc6
+/* Copyright(c) 2022 Intel Corporation */
Torsten Duwe 734bc6
+#ifndef QAT_ALGS_SEND_H
Torsten Duwe 734bc6
+#define QAT_ALGS_SEND_H
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+#include "qat_crypto.h"
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+int qat_alg_send_message(struct qat_alg_req *req);
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+#endif
Torsten Duwe 734bc6
diff --git a/drivers/crypto/qat/qat_common/qat_asym_algs.c b/drivers/crypto/qat/qat_common/qat_asym_algs.c
Torsten Duwe 734bc6
index 5633f9df3b6fe..08b8d83e070a0 100644
Torsten Duwe 734bc6
--- a/drivers/crypto/qat/qat_common/qat_asym_algs.c
Torsten Duwe 734bc6
+++ b/drivers/crypto/qat/qat_common/qat_asym_algs.c
Torsten Duwe 734bc6
@@ -12,6 +12,7 @@
Torsten Duwe 734bc6
 #include <crypto/scatterwalk.h>
Torsten Duwe 734bc6
 #include "icp_qat_fw_pke.h"
Torsten Duwe 734bc6
 #include "adf_accel_devices.h"
Torsten Duwe 734bc6
+#include "qat_algs_send.h"
Torsten Duwe 734bc6
 #include "adf_transport.h"
Torsten Duwe 734bc6
 #include "adf_common_drv.h"
Torsten Duwe 734bc6
 #include "qat_crypto.h"
Torsten Duwe 734bc6
@@ -137,6 +138,17 @@ struct qat_asym_request {
Torsten Duwe 734bc6
 	void (*cb)(struct icp_qat_fw_pke_resp *resp);
Torsten Duwe 734bc6
 } __aligned(64);
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
+static int qat_alg_send_asym_message(struct qat_asym_request *qat_req,
Torsten Duwe 734bc6
+				     struct qat_crypto_instance *inst)
Torsten Duwe 734bc6
+{
Torsten Duwe 734bc6
+	struct qat_alg_req req;
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+	req.fw_req = (u32 *)&qat_req->req;
Torsten Duwe 734bc6
+	req.tx_ring = inst->pke_tx;
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+	return qat_alg_send_message(&req;;
Torsten Duwe 734bc6
+}
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
 static void qat_dh_cb(struct icp_qat_fw_pke_resp *resp)
Torsten Duwe 734bc6
 {
Torsten Duwe 734bc6
 	struct qat_asym_request *req = (void *)(__force long)resp->opaque;
Torsten Duwe 734bc6
@@ -213,7 +225,7 @@ static int qat_dh_compute_value(struct kpp_request *req)
Torsten Duwe 734bc6
 	struct qat_asym_request *qat_req =
Torsten Duwe 734bc6
 			PTR_ALIGN(kpp_request_ctx(req), 64);
Torsten Duwe 734bc6
 	struct icp_qat_fw_pke_request *msg = &qat_req->req;
Torsten Duwe 734bc6
-	int ret, ctr = 0;
Torsten Duwe 734bc6
+	int ret;
Torsten Duwe 734bc6
 	int n_input_params = 0;
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
 	if (unlikely(!ctx->xa))
Torsten Duwe 734bc6
@@ -338,13 +350,13 @@ static int qat_dh_compute_value(struct kpp_request *req)
Torsten Duwe 734bc6
 	msg->input_param_count = n_input_params;
Torsten Duwe 734bc6
 	msg->output_param_count = 1;
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
-	do {
Torsten Duwe 734bc6
-		ret = adf_send_message(ctx->inst->pke_tx, (u32 *)msg);
Torsten Duwe 734bc6
-	} while (ret == -EBUSY && ctr++ < 100);
Torsten Duwe 734bc6
+	ret = qat_alg_send_asym_message(qat_req, ctx->inst);
Torsten Duwe 734bc6
+	if (ret == -ENOSPC)
Torsten Duwe 734bc6
+		goto unmap_all;
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
-	if (!ret)
Torsten Duwe 734bc6
-		return -EINPROGRESS;
Torsten Duwe 734bc6
+	return ret;
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
+unmap_all:
Torsten Duwe 734bc6
 	if (!dma_mapping_error(dev, qat_req->phy_out))
Torsten Duwe 734bc6
 		dma_unmap_single(dev, qat_req->phy_out,
Torsten Duwe 734bc6
 				 sizeof(struct qat_dh_output_params),
Torsten Duwe 734bc6
@@ -645,7 +657,7 @@ static int qat_rsa_enc(struct akcipher_request *req)
Torsten Duwe 734bc6
 	struct qat_asym_request *qat_req =
Torsten Duwe 734bc6
 			PTR_ALIGN(akcipher_request_ctx(req), 64);
Torsten Duwe 734bc6
 	struct icp_qat_fw_pke_request *msg = &qat_req->req;
Torsten Duwe 734bc6
-	int ret, ctr = 0;
Torsten Duwe 734bc6
+	int ret;
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
 	if (unlikely(!ctx->n || !ctx->e))
Torsten Duwe 734bc6
 		return -EINVAL;
Torsten Duwe 734bc6
@@ -735,13 +747,14 @@ static int qat_rsa_enc(struct akcipher_request *req)
Torsten Duwe 734bc6
 	msg->pke_mid.opaque = (u64)(__force long)qat_req;
Torsten Duwe 734bc6
 	msg->input_param_count = 3;
Torsten Duwe 734bc6
 	msg->output_param_count = 1;
Torsten Duwe 734bc6
-	do {
Torsten Duwe 734bc6
-		ret = adf_send_message(ctx->inst->pke_tx, (u32 *)msg);
Torsten Duwe 734bc6
-	} while (ret == -EBUSY && ctr++ < 100);
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
-	if (!ret)
Torsten Duwe 734bc6
-		return -EINPROGRESS;
Torsten Duwe 734bc6
+	ret = qat_alg_send_asym_message(qat_req, ctx->inst);
Torsten Duwe 734bc6
+	if (ret == -ENOSPC)
Torsten Duwe 734bc6
+		goto unmap_all;
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+	return ret;
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
+unmap_all:
Torsten Duwe 734bc6
 	if (!dma_mapping_error(dev, qat_req->phy_out))
Torsten Duwe 734bc6
 		dma_unmap_single(dev, qat_req->phy_out,
Torsten Duwe 734bc6
 				 sizeof(struct qat_rsa_output_params),
Torsten Duwe 734bc6
@@ -779,7 +792,7 @@ static int qat_rsa_dec(struct akcipher_request *req)
Torsten Duwe 734bc6
 	struct qat_asym_request *qat_req =
Torsten Duwe 734bc6
 			PTR_ALIGN(akcipher_request_ctx(req), 64);
Torsten Duwe 734bc6
 	struct icp_qat_fw_pke_request *msg = &qat_req->req;
Torsten Duwe 734bc6
-	int ret, ctr = 0;
Torsten Duwe 734bc6
+	int ret;
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
 	if (unlikely(!ctx->n || !ctx->d))
Torsten Duwe 734bc6
 		return -EINVAL;
Torsten Duwe 734bc6
@@ -887,13 +900,14 @@ static int qat_rsa_dec(struct akcipher_request *req)
Torsten Duwe 734bc6
 		msg->input_param_count = 3;
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
 	msg->output_param_count = 1;
Torsten Duwe 734bc6
-	do {
Torsten Duwe 734bc6
-		ret = adf_send_message(ctx->inst->pke_tx, (u32 *)msg);
Torsten Duwe 734bc6
-	} while (ret == -EBUSY && ctr++ < 100);
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
-	if (!ret)
Torsten Duwe 734bc6
-		return -EINPROGRESS;
Torsten Duwe 734bc6
+	ret = qat_alg_send_asym_message(qat_req, ctx->inst);
Torsten Duwe 734bc6
+	if (ret == -ENOSPC)
Torsten Duwe 734bc6
+		goto unmap_all;
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
+	return ret;
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
+unmap_all:
Torsten Duwe 734bc6
 	if (!dma_mapping_error(dev, qat_req->phy_out))
Torsten Duwe 734bc6
 		dma_unmap_single(dev, qat_req->phy_out,
Torsten Duwe 734bc6
 				 sizeof(struct qat_rsa_output_params),
Torsten Duwe 734bc6
diff --git a/drivers/crypto/qat/qat_common/qat_crypto.h b/drivers/crypto/qat/qat_common/qat_crypto.h
Torsten Duwe 734bc6
index 0928f159ea993..0dcba6fc358c9 100644
Torsten Duwe 734bc6
--- a/drivers/crypto/qat/qat_common/qat_crypto.h
Torsten Duwe 734bc6
+++ b/drivers/crypto/qat/qat_common/qat_crypto.h
Torsten Duwe 734bc6
@@ -9,6 +9,11 @@
Torsten Duwe 734bc6
 #include "adf_accel_devices.h"
Torsten Duwe 734bc6
 #include "icp_qat_fw_la.h"
Torsten Duwe 734bc6
 
Torsten Duwe 734bc6
+struct qat_alg_req {
Torsten Duwe 734bc6
+	u32 *fw_req;
Torsten Duwe 734bc6
+	struct adf_etr_ring_data *tx_ring;
Torsten Duwe 734bc6
+};
Torsten Duwe 734bc6
+
Torsten Duwe 734bc6
 struct qat_crypto_instance {
Torsten Duwe 734bc6
 	struct adf_etr_ring_data *sym_tx;
Torsten Duwe 734bc6
 	struct adf_etr_ring_data *sym_rx;
Torsten Duwe 734bc6
-- 
Torsten Duwe 734bc6
2.35.3
Torsten Duwe 734bc6