Torsten Duwe 44db9e
From 1d6133123fb2626499e0e0a9d62e39bcdc5e593b Mon Sep 17 00:00:00 2001
Torsten Duwe 44db9e
From: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe 44db9e
Date: Wed, 17 Nov 2021 14:30:43 +0000
Torsten Duwe 44db9e
Subject: [PATCH] crypto: qat - handle retries due to collisions in
Torsten Duwe 44db9e
 adf_iov_putmsg()
Torsten Duwe 44db9e
Git-commit: 1d6133123fb2626499e0e0a9d62e39bcdc5e593b
Torsten Duwe 44db9e
Patch-mainline: v5.17-rc1
Torsten Duwe 44db9e
References: jsc#PED-1073
Torsten Duwe 44db9e
Torsten Duwe 44db9e
Rework __adf_iov_putmsg() to handle retries due to collisions
Torsten Duwe 44db9e
internally, removing the need for an external retry loop.
Torsten Duwe 44db9e
The functions __adf_iov_putmsg() and adf_iov_putmsg() have been merged
Torsten Duwe 44db9e
together maintaining the adf_iov_putmsg() name.
Torsten Duwe 44db9e
Torsten Duwe 44db9e
This will allow to use this function only for GEN2 devices, since
Torsten Duwe 44db9e
collision are peculiar of this generation and therefore should be
Torsten Duwe 44db9e
confined to the actual implementation of the transport/medium access.
Torsten Duwe 44db9e
Torsten Duwe 44db9e
Note that now adf_iov_putmsg() will retry to send a message only in case
Torsten Duwe 44db9e
of collisions and will now fail if an ACK is not received from the
Torsten Duwe 44db9e
remote function.
Torsten Duwe 44db9e
Torsten Duwe 44db9e
Signed-off-by: Marco Chiappero <marco.chiappero@intel.com>
Torsten Duwe 44db9e
Co-developed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 44db9e
Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Torsten Duwe 44db9e
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Torsten Duwe 44db9e
Signed-off-by: Torsten Duwe <duwe@suse.de>
Torsten Duwe 44db9e
Torsten Duwe 44db9e
---
Torsten Duwe 44db9e
 drivers/crypto/qat/qat_common/adf_pf2vf_msg.c | 52 +++++++------------
Torsten Duwe 44db9e
 1 file changed, 19 insertions(+), 33 deletions(-)
Torsten Duwe 44db9e
Torsten Duwe 44db9e
diff --git a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
Torsten Duwe 44db9e
index 201744825e23a..d98e3639c9d28 100644
Torsten Duwe 44db9e
--- a/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
Torsten Duwe 44db9e
+++ b/drivers/crypto/qat/qat_common/adf_pf2vf_msg.c
Torsten Duwe 44db9e
@@ -14,7 +14,7 @@
Torsten Duwe 44db9e
 					 ADF_PFVF_MSG_ACK_MAX_RETRY + \
Torsten Duwe 44db9e
 					 ADF_PFVF_MSG_COLLISION_DETECT_DELAY)
Torsten Duwe 44db9e
 
Torsten Duwe 44db9e
-static int __adf_iov_putmsg(struct adf_accel_dev *accel_dev, u32 msg, u8 vf_nr)
Torsten Duwe 44db9e
+static int adf_iov_putmsg(struct adf_accel_dev *accel_dev, u32 msg, u8 vf_nr)
Torsten Duwe 44db9e
 {
Torsten Duwe 44db9e
 	struct adf_accel_pci *pci_info = &accel_dev->accel_pci_dev;
Torsten Duwe 44db9e
 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
Torsten Duwe 44db9e
@@ -24,8 +24,9 @@ static int __adf_iov_putmsg(struct adf_accel_dev *accel_dev, u32 msg, u8 vf_nr)
Torsten Duwe 44db9e
 	u32 local_in_use_mask, local_in_use_pattern;
Torsten Duwe 44db9e
 	u32 remote_in_use_mask, remote_in_use_pattern;
Torsten Duwe 44db9e
 	struct mutex *lock;	/* lock preventing concurrent acces of CSR */
Torsten Duwe 44db9e
+	unsigned int retries = ADF_PFVF_MSG_MAX_RETRIES;
Torsten Duwe 44db9e
 	u32 int_bit;
Torsten Duwe 44db9e
-	int ret = 0;
Torsten Duwe 44db9e
+	int ret;
Torsten Duwe 44db9e
 
Torsten Duwe 44db9e
 	if (accel_dev->is_vf) {
Torsten Duwe 44db9e
 		pf2vf_offset = hw_data->get_pf2vf_offset(0);
Torsten Duwe 44db9e
@@ -45,20 +46,22 @@ static int __adf_iov_putmsg(struct adf_accel_dev *accel_dev, u32 msg, u8 vf_nr)
Torsten Duwe 44db9e
 		int_bit = ADF_PF2VF_INT;
Torsten Duwe 44db9e
 	}
Torsten Duwe 44db9e
 
Torsten Duwe 44db9e
+	msg &= ~local_in_use_mask;
Torsten Duwe 44db9e
+	msg |= local_in_use_pattern;
Torsten Duwe 44db9e
+
Torsten Duwe 44db9e
 	mutex_lock(lock);
Torsten Duwe 44db9e
 
Torsten Duwe 44db9e
+start:
Torsten Duwe 44db9e
+	ret = 0;
Torsten Duwe 44db9e
+
Torsten Duwe 44db9e
 	/* Check if the PFVF CSR is in use by remote function */
Torsten Duwe 44db9e
 	val = ADF_CSR_RD(pmisc_bar_addr, pf2vf_offset);
Torsten Duwe 44db9e
 	if ((val & remote_in_use_mask) == remote_in_use_pattern) {
Torsten Duwe 44db9e
 		dev_dbg(&GET_DEV(accel_dev),
Torsten Duwe 44db9e
 			"PFVF CSR in use by remote function\n");
Torsten Duwe 44db9e
-		ret = -EBUSY;
Torsten Duwe 44db9e
-		goto out;
Torsten Duwe 44db9e
+		goto retry;
Torsten Duwe 44db9e
 	}
Torsten Duwe 44db9e
 
Torsten Duwe 44db9e
-	msg &= ~local_in_use_mask;
Torsten Duwe 44db9e
-	msg |= local_in_use_pattern;
Torsten Duwe 44db9e
-
Torsten Duwe 44db9e
 	/* Attempt to get ownership of the PFVF CSR */
Torsten Duwe 44db9e
 	ADF_CSR_WR(pmisc_bar_addr, pf2vf_offset, msg | int_bit);
Torsten Duwe 44db9e
 
Torsten Duwe 44db9e
@@ -77,8 +80,7 @@ static int __adf_iov_putmsg(struct adf_accel_dev *accel_dev, u32 msg, u8 vf_nr)
Torsten Duwe 44db9e
 	if (val != msg) {
Torsten Duwe 44db9e
 		dev_dbg(&GET_DEV(accel_dev),
Torsten Duwe 44db9e
 			"Collision - PFVF CSR overwritten by remote function\n");
Torsten Duwe 44db9e
-		ret = -EIO;
Torsten Duwe 44db9e
-		goto out;
Torsten Duwe 44db9e
+		goto retry;
Torsten Duwe 44db9e
 	}
Torsten Duwe 44db9e
 
Torsten Duwe 44db9e
 	/* Finished with the PFVF CSR; relinquish it and leave msg in CSR */
Torsten Duwe 44db9e
@@ -86,31 +88,15 @@ static int __adf_iov_putmsg(struct adf_accel_dev *accel_dev, u32 msg, u8 vf_nr)
Torsten Duwe 44db9e
 out:
Torsten Duwe 44db9e
 	mutex_unlock(lock);
Torsten Duwe 44db9e
 	return ret;
Torsten Duwe 44db9e
-}
Torsten Duwe 44db9e
 
Torsten Duwe 44db9e
-/**
Torsten Duwe 44db9e
- * adf_iov_putmsg() - send PFVF message
Torsten Duwe 44db9e
- * @accel_dev:  Pointer to acceleration device.
Torsten Duwe 44db9e
- * @msg:	Message to send
Torsten Duwe 44db9e
- * @vf_nr:	VF number to which the message will be sent if on PF, ignored
Torsten Duwe 44db9e
- *		otherwise
Torsten Duwe 44db9e
- *
Torsten Duwe 44db9e
- * Function sends a message through the PFVF channel
Torsten Duwe 44db9e
- *
Torsten Duwe 44db9e
- * Return: 0 on success, error code otherwise.
Torsten Duwe 44db9e
- */
Torsten Duwe 44db9e
-static int adf_iov_putmsg(struct adf_accel_dev *accel_dev, u32 msg, u8 vf_nr)
Torsten Duwe 44db9e
-{
Torsten Duwe 44db9e
-	u32 count = 0;
Torsten Duwe 44db9e
-	int ret;
Torsten Duwe 44db9e
-
Torsten Duwe 44db9e
-	do {
Torsten Duwe 44db9e
-		ret = __adf_iov_putmsg(accel_dev, msg, vf_nr);
Torsten Duwe 44db9e
-		if (ret)
Torsten Duwe 44db9e
-			msleep(ADF_PFVF_MSG_RETRY_DELAY);
Torsten Duwe 44db9e
-	} while (ret && (count++ < ADF_PFVF_MSG_MAX_RETRIES));
Torsten Duwe 44db9e
-
Torsten Duwe 44db9e
-	return ret;
Torsten Duwe 44db9e
+retry:
Torsten Duwe 44db9e
+	if (--retries) {
Torsten Duwe 44db9e
+		msleep(ADF_PFVF_MSG_RETRY_DELAY);
Torsten Duwe 44db9e
+		goto start;
Torsten Duwe 44db9e
+	} else {
Torsten Duwe 44db9e
+		ret = -EBUSY;
Torsten Duwe 44db9e
+		goto out;
Torsten Duwe 44db9e
+	}
Torsten Duwe 44db9e
 }
Torsten Duwe 44db9e
 
Torsten Duwe 44db9e
 /**
Torsten Duwe 44db9e
-- 
Torsten Duwe 44db9e
2.35.3
Torsten Duwe 44db9e