linux-scsi.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v4 0/2] mpt3sas: Additional retries when reading specific registers
@ 2023-08-29  9:00 Ranjan Kumar
  2023-08-29  9:00 ` [PATCH v4 1/2] mpt3sas: Perform additional retries if Doorbell read returns 0 Ranjan Kumar
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Ranjan Kumar @ 2023-08-29  9:00 UTC (permalink / raw)
  To: linux-scsi, martin.petersen
  Cc: sathya.prakash, sreekanth.reddy, sumit.saxena, Ranjan Kumar

[-- Attachment #1: Type: text/plain, Size: 725 bytes --]

Doorbell and Host diagnostic registers could return 0 even
after 3 retries and that leads to occasional resets of the
controllers, hence increased the retry count to thirty.

v1->v2:
-added a new patch for volatile as suggested by Greg KH.
-renamed macro as suggested by Damien Le Moal.

v2->v3:
-Modified patch description with more details.

v3->v4:
- Code simplification

Ranjan Kumar (2):
  mpt3sas: Perform additional retries if Doorbell read returns 0
  mpt3sas: Removing volatile qualifier

 drivers/scsi/mpt3sas/mpi/mpi2.h     |  2 +-
 drivers/scsi/mpt3sas/mpt3sas_base.c | 50 ++++++++++++++++++++---------
 drivers/scsi/mpt3sas/mpt3sas_base.h |  3 +-
 3 files changed, 38 insertions(+), 17 deletions(-)

-- 
2.31.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4209 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [PATCH v4 1/2] mpt3sas: Perform additional retries if Doorbell read returns 0
  2023-08-29  9:00 [PATCH v4 0/2] mpt3sas: Additional retries when reading specific registers Ranjan Kumar
@ 2023-08-29  9:00 ` Ranjan Kumar
  2023-08-29  9:00 ` [PATCH v4 2/2] mpt3sas: Removing volatile qualifier Ranjan Kumar
                   ` (2 subsequent siblings)
  3 siblings, 0 replies; 7+ messages in thread
From: Ranjan Kumar @ 2023-08-29  9:00 UTC (permalink / raw)
  To: linux-scsi, martin.petersen
  Cc: sathya.prakash, sreekanth.reddy, sumit.saxena, Ranjan Kumar,
	stable

[-- Attachment #1: Type: text/plain, Size: 6776 bytes --]

The driver retries certain register reads for 3 times if the
returned value is 0, this was done based on hardware specification
where the controller could possibly return 0 for certain registers
when there is a parallel access to some of other registers from the
firmware due to BMC out of band interactions.Recently it is observed
that in certain systems with increased BMC interactions, the values
returned are 0 even for 3 retries (the proper value is returned
between 4 to 6 retries).Hence this patch changes the retry
count 3 to 30, which is a revised recommendation, to avoid
the out of band conflict.

Fixes: b899202901a8 ("mpt3sas: Add separate function for aero doorbell reads")
Cc: stable@vger.kernel.org
Signed-off-by: Ranjan Kumar <ranjan.kumar@broadcom.com>
---
 drivers/scsi/mpt3sas/mpt3sas_base.c | 46 +++++++++++++++++++++--------
 drivers/scsi/mpt3sas/mpt3sas_base.h |  1 +
 2 files changed, 34 insertions(+), 13 deletions(-)

diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
index 53f5492579cb..5284584e4cd2 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
@@ -138,6 +138,9 @@ _base_get_ioc_facts(struct MPT3SAS_ADAPTER *ioc);
 static void
 _base_clear_outstanding_commands(struct MPT3SAS_ADAPTER *ioc);
 
+static u32
+_base_readl_ext_retry(const volatile void __iomem *addr);
+
 /**
  * mpt3sas_base_check_cmd_timeout - Function
  *		to check timeout and command termination due
@@ -213,6 +216,20 @@ _base_readl_aero(const volatile void __iomem *addr)
 	return ret_val;
 }
 
+static u32
+_base_readl_ext_retry(const volatile void __iomem *addr)
+{
+	u32 i, ret_val;
+
+	for (i = 0 ; i < 30 ; i++) {
+		ret_val = readl(addr);
+		if (ret_val == 0)
+			continue;
+	}
+
+	return ret_val;
+}
+
 static inline u32
 _base_readl(const volatile void __iomem *addr)
 {
@@ -940,7 +957,7 @@ mpt3sas_halt_firmware(struct MPT3SAS_ADAPTER *ioc)
 
 	dump_stack();
 
-	doorbell = ioc->base_readl(&ioc->chip->Doorbell);
+	doorbell = ioc->base_readl_ext_retry(&ioc->chip->Doorbell);
 	if ((doorbell & MPI2_IOC_STATE_MASK) == MPI2_IOC_STATE_FAULT) {
 		mpt3sas_print_fault_code(ioc, doorbell &
 		    MPI2_DOORBELL_DATA_MASK);
@@ -6686,7 +6703,7 @@ mpt3sas_base_get_iocstate(struct MPT3SAS_ADAPTER *ioc, int cooked)
 {
 	u32 s, sc;
 
-	s = ioc->base_readl(&ioc->chip->Doorbell);
+	s = ioc->base_readl_ext_retry(&ioc->chip->Doorbell);
 	sc = s & MPI2_IOC_STATE_MASK;
 	return cooked ? sc : s;
 }
@@ -6831,7 +6848,7 @@ _base_wait_for_doorbell_ack(struct MPT3SAS_ADAPTER *ioc, int timeout)
 					   __func__, count, timeout));
 			return 0;
 		} else if (int_status & MPI2_HIS_IOC2SYS_DB_STATUS) {
-			doorbell = ioc->base_readl(&ioc->chip->Doorbell);
+			doorbell = ioc->base_readl_ext_retry(&ioc->chip->Doorbell);
 			if ((doorbell & MPI2_IOC_STATE_MASK) ==
 			    MPI2_IOC_STATE_FAULT) {
 				mpt3sas_print_fault_code(ioc, doorbell);
@@ -6871,7 +6888,7 @@ _base_wait_for_doorbell_not_used(struct MPT3SAS_ADAPTER *ioc, int timeout)
 	count = 0;
 	cntdn = 1000 * timeout;
 	do {
-		doorbell_reg = ioc->base_readl(&ioc->chip->Doorbell);
+		doorbell_reg = ioc->base_readl_ext_retry(&ioc->chip->Doorbell);
 		if (!(doorbell_reg & MPI2_DOORBELL_USED)) {
 			dhsprintk(ioc,
 				  ioc_info(ioc, "%s: successful count(%d), timeout(%d)\n",
@@ -7019,7 +7036,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
 	__le32 *mfp;
 
 	/* make sure doorbell is not in use */
-	if ((ioc->base_readl(&ioc->chip->Doorbell) & MPI2_DOORBELL_USED)) {
+	if ((ioc->base_readl_ext_retry(&ioc->chip->Doorbell) & MPI2_DOORBELL_USED)) {
 		ioc_err(ioc, "doorbell is in use (line=%d)\n", __LINE__);
 		return -EFAULT;
 	}
@@ -7068,7 +7085,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
 	}
 
 	/* read the first two 16-bits, it gives the total length of the reply */
-	reply[0] = le16_to_cpu(ioc->base_readl(&ioc->chip->Doorbell)
+	reply[0] = le16_to_cpu(ioc->base_readl_ext_retry(&ioc->chip->Doorbell)
 	    & MPI2_DOORBELL_DATA_MASK);
 	writel(0, &ioc->chip->HostInterruptStatus);
 	if ((_base_wait_for_doorbell_int(ioc, 5))) {
@@ -7076,7 +7093,7 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
 			__LINE__);
 		return -EFAULT;
 	}
-	reply[1] = le16_to_cpu(ioc->base_readl(&ioc->chip->Doorbell)
+	reply[1] = le16_to_cpu(ioc->base_readl_ext_retry(&ioc->chip->Doorbell)
 	    & MPI2_DOORBELL_DATA_MASK);
 	writel(0, &ioc->chip->HostInterruptStatus);
 
@@ -7087,10 +7104,10 @@ _base_handshake_req_reply_wait(struct MPT3SAS_ADAPTER *ioc, int request_bytes,
 			return -EFAULT;
 		}
 		if (i >=  reply_bytes/2) /* overflow case */
-			ioc->base_readl(&ioc->chip->Doorbell);
+			ioc->base_readl_ext_retry(&ioc->chip->Doorbell);
 		else
 			reply[i] = le16_to_cpu(
-			    ioc->base_readl(&ioc->chip->Doorbell)
+			    ioc->base_readl_ext_retry(&ioc->chip->Doorbell)
 			    & MPI2_DOORBELL_DATA_MASK);
 		writel(0, &ioc->chip->HostInterruptStatus);
 	}
@@ -7949,7 +7966,7 @@ _base_diag_reset(struct MPT3SAS_ADAPTER *ioc)
 			goto out;
 		}
 
-		host_diagnostic = ioc->base_readl(&ioc->chip->HostDiagnostic);
+		host_diagnostic = ioc->base_readl_ext_retry(&ioc->chip->HostDiagnostic);
 		drsprintk(ioc,
 			  ioc_info(ioc, "wrote magic sequence: count(%d), host_diagnostic(0x%08x)\n",
 				   count, host_diagnostic));
@@ -7969,7 +7986,7 @@ _base_diag_reset(struct MPT3SAS_ADAPTER *ioc)
 	for (count = 0; count < (300000000 /
 		MPI2_HARD_RESET_PCIE_SECOND_READ_DELAY_MICRO_SEC); count++) {
 
-		host_diagnostic = ioc->base_readl(&ioc->chip->HostDiagnostic);
+		host_diagnostic = ioc->base_readl_ext_retry(&ioc->chip->HostDiagnostic);
 
 		if (host_diagnostic == 0xFFFFFFFF) {
 			ioc_info(ioc,
@@ -8359,10 +8376,13 @@ mpt3sas_base_attach(struct MPT3SAS_ADAPTER *ioc)
 	ioc->rdpq_array_enable_assigned = 0;
 	ioc->use_32bit_dma = false;
 	ioc->dma_mask = 64;
-	if (ioc->is_aero_ioc)
+	if (ioc->is_aero_ioc) {
 		ioc->base_readl = &_base_readl_aero;
-	else
+		ioc->base_readl_ext_retry = &_base_readl_ext_retry;
+	} else {
 		ioc->base_readl = &_base_readl;
+		ioc->base_readl_ext_retry = &_base_readl;
+	}
 	r = mpt3sas_base_map_resources(ioc);
 	if (r)
 		goto out_free_resources;
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h b/drivers/scsi/mpt3sas/mpt3sas_base.h
index 05364aa15ecd..10055c7e4a9f 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.h
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.h
@@ -1618,6 +1618,7 @@ struct MPT3SAS_ADAPTER {
 	u8		diag_trigger_active;
 	u8		atomic_desc_capable;
 	BASE_READ_REG	base_readl;
+	BASE_READ_REG	base_readl_ext_retry;
 	struct SL_WH_MASTER_TRIGGER_T diag_trigger_master;
 	struct SL_WH_EVENT_TRIGGERS_T diag_trigger_event;
 	struct SL_WH_SCSI_TRIGGERS_T diag_trigger_scsi;
-- 
2.31.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4209 bytes --]

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [PATCH v4 2/2] mpt3sas: Removing volatile qualifier
  2023-08-29  9:00 [PATCH v4 0/2] mpt3sas: Additional retries when reading specific registers Ranjan Kumar
  2023-08-29  9:00 ` [PATCH v4 1/2] mpt3sas: Perform additional retries if Doorbell read returns 0 Ranjan Kumar
@ 2023-08-29  9:00 ` Ranjan Kumar
  2023-08-31  1:39 ` [PATCH v4 0/2] mpt3sas: Additional retries when reading specific registers Martin K. Petersen
  2023-09-05 10:18 ` Martin K. Petersen
  3 siblings, 0 replies; 7+ messages in thread
From: Ranjan Kumar @ 2023-08-29  9:00 UTC (permalink / raw)
  To: linux-scsi, martin.petersen
  Cc: sathya.prakash, sreekanth.reddy, sumit.saxena, Ranjan Kumar

[-- Attachment #1: Type: text/plain, Size: 2720 bytes --]

Removing reduntant volatile qualifier

Signed-off-by: Ranjan Kumar <ranjan.kumar@broadcom.com>
---
 drivers/scsi/mpt3sas/mpi/mpi2.h     | 2 +-
 drivers/scsi/mpt3sas/mpt3sas_base.c | 8 ++++----
 drivers/scsi/mpt3sas/mpt3sas_base.h | 2 +-
 3 files changed, 6 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/mpt3sas/mpi/mpi2.h b/drivers/scsi/mpt3sas/mpi/mpi2.h
index ed3923f8db4f..6de35b32223c 100644
--- a/drivers/scsi/mpt3sas/mpi/mpi2.h
+++ b/drivers/scsi/mpt3sas/mpi/mpi2.h
@@ -199,7 +199,7 @@
 *
 *****************************************************************************/
 
-typedef volatile struct _MPI2_SYSTEM_INTERFACE_REGS {
+typedef struct _MPI2_SYSTEM_INTERFACE_REGS {
 	U32 Doorbell;		/*0x00 */
 	U32 WriteSequence;	/*0x04 */
 	U32 HostDiagnostic;	/*0x08 */
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.c b/drivers/scsi/mpt3sas/mpt3sas_base.c
index 5284584e4cd2..61a32bf00747 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.c
@@ -139,7 +139,7 @@ static void
 _base_clear_outstanding_commands(struct MPT3SAS_ADAPTER *ioc);
 
 static u32
-_base_readl_ext_retry(const volatile void __iomem *addr);
+_base_readl_ext_retry(const void __iomem *addr);
 
 /**
  * mpt3sas_base_check_cmd_timeout - Function
@@ -204,7 +204,7 @@ module_param_call(mpt3sas_fwfault_debug, _scsih_set_fwfault_debug,
  * while reading the system interface register.
  */
 static inline u32
-_base_readl_aero(const volatile void __iomem *addr)
+_base_readl_aero(const void __iomem *addr)
 {
 	u32 i = 0, ret_val;
 
@@ -217,7 +217,7 @@ _base_readl_aero(const volatile void __iomem *addr)
 }
 
 static u32
-_base_readl_ext_retry(const volatile void __iomem *addr)
+_base_readl_ext_retry(const void __iomem *addr)
 {
 	u32 i, ret_val;
 
@@ -231,7 +231,7 @@ _base_readl_ext_retry(const volatile void __iomem *addr)
 }
 
 static inline u32
-_base_readl(const volatile void __iomem *addr)
+_base_readl(const void __iomem *addr)
 {
 	return readl(addr);
 }
diff --git a/drivers/scsi/mpt3sas/mpt3sas_base.h b/drivers/scsi/mpt3sas/mpt3sas_base.h
index 10055c7e4a9f..1be0850ca17a 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_base.h
+++ b/drivers/scsi/mpt3sas/mpt3sas_base.h
@@ -994,7 +994,7 @@ typedef void (*NVME_BUILD_PRP)(struct MPT3SAS_ADAPTER *ioc, u16 smid,
 typedef void (*PUT_SMID_IO_FP_HIP) (struct MPT3SAS_ADAPTER *ioc, u16 smid,
 	u16 funcdep);
 typedef void (*PUT_SMID_DEFAULT) (struct MPT3SAS_ADAPTER *ioc, u16 smid);
-typedef u32 (*BASE_READ_REG) (const volatile void __iomem *addr);
+typedef u32 (*BASE_READ_REG) (const void __iomem *addr);
 /*
  * To get high iops reply queue's msix index when high iops mode is enabled
  * else get the msix index of general reply queues.
-- 
2.31.1


[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4209 bytes --]

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 0/2] mpt3sas: Additional retries when reading specific registers
  2023-08-29  9:00 [PATCH v4 0/2] mpt3sas: Additional retries when reading specific registers Ranjan Kumar
  2023-08-29  9:00 ` [PATCH v4 1/2] mpt3sas: Perform additional retries if Doorbell read returns 0 Ranjan Kumar
  2023-08-29  9:00 ` [PATCH v4 2/2] mpt3sas: Removing volatile qualifier Ranjan Kumar
@ 2023-08-31  1:39 ` Martin K. Petersen
  2023-12-09 20:21   ` patrick.strateman
  2023-09-05 10:18 ` Martin K. Petersen
  3 siblings, 1 reply; 7+ messages in thread
From: Martin K. Petersen @ 2023-08-31  1:39 UTC (permalink / raw)
  To: Ranjan Kumar
  Cc: linux-scsi, martin.petersen, sathya.prakash, sreekanth.reddy,
	sumit.saxena


Ranjan,

> Doorbell and Host diagnostic registers could return 0 even
> after 3 retries and that leads to occasional resets of the
> controllers, hence increased the retry count to thirty.

Applied to 6.6/scsi-staging, thanks!

-- 
Martin K. Petersen	Oracle Linux Engineering

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 0/2] mpt3sas: Additional retries when reading specific registers
  2023-08-29  9:00 [PATCH v4 0/2] mpt3sas: Additional retries when reading specific registers Ranjan Kumar
                   ` (2 preceding siblings ...)
  2023-08-31  1:39 ` [PATCH v4 0/2] mpt3sas: Additional retries when reading specific registers Martin K. Petersen
@ 2023-09-05 10:18 ` Martin K. Petersen
  3 siblings, 0 replies; 7+ messages in thread
From: Martin K. Petersen @ 2023-09-05 10:18 UTC (permalink / raw)
  To: linux-scsi, Ranjan Kumar
  Cc: Martin K . Petersen, sathya.prakash, sreekanth.reddy,
	sumit.saxena

On Tue, 29 Aug 2023 14:30:18 +0530, Ranjan Kumar wrote:

> Doorbell and Host diagnostic registers could return 0 even
> after 3 retries and that leads to occasional resets of the
> controllers, hence increased the retry count to thirty.
> 
> v1->v2:
> -added a new patch for volatile as suggested by Greg KH.
> -renamed macro as suggested by Damien Le Moal.
> 
> [...]

Applied to 6.6/scsi-queue, thanks!

[1/2] mpt3sas: Perform additional retries if Doorbell read returns 0
      https://git.kernel.org/mkp/scsi/c/4ca10f3e3174
[2/2] mpt3sas: Removing volatile qualifier
      https://git.kernel.org/mkp/scsi/c/0854065092a7

-- 
Martin K. Petersen	Oracle Linux Engineering

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 0/2] mpt3sas: Additional retries when reading specific registers
  2023-08-31  1:39 ` [PATCH v4 0/2] mpt3sas: Additional retries when reading specific registers Martin K. Petersen
@ 2023-12-09 20:21   ` patrick.strateman
  2023-12-11  9:42     ` Ranjan Kumar
  0 siblings, 1 reply; 7+ messages in thread
From: patrick.strateman @ 2023-12-09 20:21 UTC (permalink / raw)
  To: Martin K. Petersen, Ranjan Kumar
  Cc: linux-scsi, sathya.prakash, sreekanth.reddy, sumit.saxena

The loop in _base_readl_ext_retry is wrong, it runs 30 times regardless 
of the result from readl.

This results in the value being incorrect and the device being reset 
nearly continuously.

if (ret_val == 0) continue;

should be

if (ret_val != 0) break;

On 8/30/23 18:39, Martin K. Petersen wrote:
> Ranjan,
>
>> Doorbell and Host diagnostic registers could return 0 even
>> after 3 retries and that leads to occasional resets of the
>> controllers, hence increased the retry count to thirty.
> Applied to 6.6/scsi-staging, thanks!
>

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [PATCH v4 0/2] mpt3sas: Additional retries when reading specific registers
  2023-12-09 20:21   ` patrick.strateman
@ 2023-12-11  9:42     ` Ranjan Kumar
  0 siblings, 0 replies; 7+ messages in thread
From: Ranjan Kumar @ 2023-12-11  9:42 UTC (permalink / raw)
  To: patrick.strateman
  Cc: Martin K. Petersen, linux-scsi, sathya.prakash, sreekanth.reddy,
	sumit.saxena

[-- Attachment #1: Type: text/plain, Size: 877 bytes --]

Hi Patrick,

On Sun, Dec 10, 2023 at 1:51 AM <patrick.strateman@gmail.com> wrote:
>
> The loop in _base_readl_ext_retry is wrong, it runs 30 times regardless
> of the result from readl.
>
> This results in the value being incorrect and the device being reset
> nearly continuously.
>
> if (ret_val == 0) continue;
>
> should be
>
> if (ret_val != 0) break;

>The above code change is already submitted and accepted .
Reference : https://patchwork.kernel.org/project/linux-scsi/patch/20231020105849.6350-1-ranjan.kumar@broadcom.com/

> On 8/30/23 18:39, Martin K. Petersen wrote:
> > Ranjan,
> >
> >> Doorbell and Host diagnostic registers could return 0 even
> >> after 3 retries and that leads to occasional resets of the
> >> controllers, hence increased the retry count to thirty.
> > Applied to 6.6/scsi-staging, thanks!
> >

Thanks,
Ranjan

[-- Attachment #2: S/MIME Cryptographic Signature --]
[-- Type: application/pkcs7-signature, Size: 4209 bytes --]

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2023-12-11  9:42 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-08-29  9:00 [PATCH v4 0/2] mpt3sas: Additional retries when reading specific registers Ranjan Kumar
2023-08-29  9:00 ` [PATCH v4 1/2] mpt3sas: Perform additional retries if Doorbell read returns 0 Ranjan Kumar
2023-08-29  9:00 ` [PATCH v4 2/2] mpt3sas: Removing volatile qualifier Ranjan Kumar
2023-08-31  1:39 ` [PATCH v4 0/2] mpt3sas: Additional retries when reading specific registers Martin K. Petersen
2023-12-09 20:21   ` patrick.strateman
2023-12-11  9:42     ` Ranjan Kumar
2023-09-05 10:18 ` Martin K. Petersen

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).