* [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).