All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/7] pm80xx updates
@ 2021-02-24 15:57 Viswas G
  2021-02-24 15:57 ` [PATCH 1/7] pm80xx: Add sysfs attribute to check mpi state Viswas G
                   ` (6 more replies)
  0 siblings, 7 replies; 18+ messages in thread
From: Viswas G @ 2021-02-24 15:57 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, Ruksar.devadi, vishakhavc,
	radha, jinpu.wang

This patch set include some bug fixes fnd enhancementments for pm80xx driver.

Ruksar Devadi (1):
  pm80xx: Completing pending IO after fatal error

Vishakha Channapattan (4):
  pm80xx: Add sysfs attribute to check mpi state
  pm80xx: Add sysfs attribute to track RAAE count
  pm80xx: Add sysfs attribute to track iop0 count
  pm80xx: Add sysfs attribute to track iop1 count

Viswas G (2):
  pm80xx: Reset PI and CI memory during re-initialize
  pm80xx: remove global lock from outbound queue processing

 drivers/scsi/pm8001/pm8001_ctl.c  | 111 +++++++++++++++++++++++++++++++++++++-
 drivers/scsi/pm8001/pm8001_hwi.c  |  68 ++++++++++++++++++++---
 drivers/scsi/pm8001/pm8001_hwi.h  |   1 +
 drivers/scsi/pm8001/pm8001_init.c |   9 ++--
 drivers/scsi/pm8001/pm8001_sas.c  |   2 +-
 drivers/scsi/pm8001/pm8001_sas.h  |   2 +
 drivers/scsi/pm8001/pm80xx_hwi.c  |   7 ++-
 drivers/scsi/pm8001/pm80xx_hwi.h  |   1 +
 8 files changed, 188 insertions(+), 13 deletions(-)

-- 
2.16.3


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

* [PATCH 1/7] pm80xx: Add sysfs attribute to check mpi state
  2021-02-24 15:57 [PATCH 0/7] pm80xx updates Viswas G
@ 2021-02-24 15:57 ` Viswas G
  2021-03-04  9:27   ` Jinpu Wang
  2021-02-24 15:57 ` [PATCH 2/7] pm80xx: Add sysfs attribute to track RAAE count Viswas G
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 18+ messages in thread
From: Viswas G @ 2021-02-24 15:57 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, Ruksar.devadi, vishakhavc,
	radha, jinpu.wang

From: Vishakha Channapattan <vishakhavc@google.com>

A new sysfs variable 'ctl_mpi_state' is being introduced to
check the state of mpi.

Tested: Using 'ctl_mpi_state' sysfs variable we check the mpi state
mvae14:~# cat /sys/class/scsi_host/host*/ctl_mpi_state
MPI-S=MPI is successfully initialized   HMI_ERR=0
MPI-S=MPI is successfully initialized   HMI_ERR=0

Signed-off-by: Vishakha Channapattan <vishakhavc@google.com>
Signed-off-by: Viswas G <Viswas.G@microchip.com>
Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
Signed-off-by: Radha Ramachandran <radha@google.com>
---
 drivers/scsi/pm8001/pm8001_ctl.c | 36 +++++++++++++++++++++++++++++++++++-
 1 file changed, 35 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/pm8001/pm8001_ctl.c b/drivers/scsi/pm8001/pm8001_ctl.c
index 12035baf0997..035969ed1c2e 100644
--- a/drivers/scsi/pm8001/pm8001_ctl.c
+++ b/drivers/scsi/pm8001/pm8001_ctl.c
@@ -41,6 +41,7 @@
 #include <linux/slab.h>
 #include "pm8001_sas.h"
 #include "pm8001_ctl.h"
+#include "pm8001_chips.h"
 
 /* scsi host attributes */
 
@@ -883,9 +884,41 @@ static ssize_t pm8001_show_update_fw(struct device *cdev,
 			flash_error_table[i].err_code,
 			flash_error_table[i].reason);
 }
-
 static DEVICE_ATTR(update_fw, S_IRUGO|S_IWUSR|S_IWGRP,
 	pm8001_show_update_fw, pm8001_store_update_fw);
+
+/**
+ * ctl_mpi_state_show - controller MPI state check
+ * @cdev: pointer to embedded class device
+ * @buf: the buffer returned
+ *
+ * A sysfs 'read-only' shost attribute.
+ */
+
+char mpiStateText[][80] = {
+	"MPI is not initialized",
+	"MPI is successfully initialized",
+	"MPI termination is in progress",
+	"MPI initialization failed with error in [31:16]"
+};
+
+static ssize_t ctl_mpi_state_show(struct device *cdev,
+		struct device_attribute *attr, char *buf)
+{
+	struct Scsi_Host *shost = class_to_shost(cdev);
+	struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
+	struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
+	unsigned int mpidw0 = 0;
+	int c;
+
+	pm8001_dbg(pm8001_ha, IOCTL, "%s\n", __func__);
+	mpidw0 = pm8001_mr32(pm8001_ha->general_stat_tbl_addr, 0);
+	c = sprintf(buf, "MPI-S=%s\t HMI_ERR=%x\n", mpiStateText[mpidw0 & 0x0003],
+			((mpidw0 & 0xff00) >> 16));
+	return c;
+}
+static DEVICE_ATTR_RO(ctl_mpi_state);
+
 struct device_attribute *pm8001_host_attrs[] = {
 	&dev_attr_interface_rev,
 	&dev_attr_controller_fatal_error,
@@ -909,6 +942,7 @@ struct device_attribute *pm8001_host_attrs[] = {
 	&dev_attr_ob_log,
 	&dev_attr_ila_version,
 	&dev_attr_inc_fw_ver,
+	&dev_attr_ctl_mpi_state,
 	NULL,
 };
 
-- 
2.16.3


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

* [PATCH 2/7] pm80xx: Add sysfs attribute to track RAAE count
  2021-02-24 15:57 [PATCH 0/7] pm80xx updates Viswas G
  2021-02-24 15:57 ` [PATCH 1/7] pm80xx: Add sysfs attribute to check mpi state Viswas G
@ 2021-02-24 15:57 ` Viswas G
  2021-03-04  9:28   ` Jinpu Wang
  2021-02-24 15:57 ` [PATCH 3/7] pm80xx: Add sysfs attribute to track iop0 count Viswas G
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 18+ messages in thread
From: Viswas G @ 2021-02-24 15:57 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, Ruksar.devadi, vishakhavc,
	radha, jinpu.wang

From: Vishakha Channapattan <vishakhavc@google.com>

A new sysfs variable 'ctl_raae_count' is being introduced that tells if
the controller is alive by indicating controller ticks. If on subsequent
run we see the ticks changing in RAAE count that indicates that
controller
is not dead.

Tested: Using 'ctl_raae_count' sysfs variable we can see ticks
incrementing
mvae14:~# cat  /sys/class/scsi_host/host*/ctl_raae_count
MSGUTCNT=0x00002245
MSGUTCNT=0x00002253
MSGUTCNT=0x0000225e

Signed-off-by: Vishakha Channapattan <vishakhavc@google.com>
Signed-off-by: Viswas G <Viswas.G@microchip.com>
Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
Signed-off-by: Radha Ramachandran <radha@google.com>
---
 drivers/scsi/pm8001/pm8001_ctl.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/drivers/scsi/pm8001/pm8001_ctl.c b/drivers/scsi/pm8001/pm8001_ctl.c
index 035969ed1c2e..d415bb12718c 100644
--- a/drivers/scsi/pm8001/pm8001_ctl.c
+++ b/drivers/scsi/pm8001/pm8001_ctl.c
@@ -919,6 +919,30 @@ static ssize_t ctl_mpi_state_show(struct device *cdev,
 }
 static DEVICE_ATTR_RO(ctl_mpi_state);
 
+/**
+ * ctl_raae_count_show - controller raae count check
+ * @cdev: pointer to embedded class device
+ * @buf: the buffer returned
+ *
+ * A sysfs 'read-only' shost attribute.
+ */
+
+static ssize_t ctl_raae_count_show(struct device *cdev,
+		struct device_attribute *attr, char *buf)
+{
+	struct Scsi_Host *shost = class_to_shost(cdev);
+	struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
+	struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
+	unsigned int raaecnt = 0;
+	int c;
+
+	pm8001_dbg(pm8001_ha, IOCTL, "%s\n", __func__);
+	raaecnt = pm8001_mr32(pm8001_ha->general_stat_tbl_addr, 12);
+	c = sprintf(buf, "MSGUTCNT=0x%08x\n", raaecnt);
+	return c;
+}
+static DEVICE_ATTR_RO(ctl_raae_count);
+
 struct device_attribute *pm8001_host_attrs[] = {
 	&dev_attr_interface_rev,
 	&dev_attr_controller_fatal_error,
@@ -943,6 +967,7 @@ struct device_attribute *pm8001_host_attrs[] = {
 	&dev_attr_ila_version,
 	&dev_attr_inc_fw_ver,
 	&dev_attr_ctl_mpi_state,
+	&dev_attr_ctl_raae_count,
 	NULL,
 };
 
-- 
2.16.3


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

* [PATCH 3/7] pm80xx: Add sysfs attribute to track iop0 count
  2021-02-24 15:57 [PATCH 0/7] pm80xx updates Viswas G
  2021-02-24 15:57 ` [PATCH 1/7] pm80xx: Add sysfs attribute to check mpi state Viswas G
  2021-02-24 15:57 ` [PATCH 2/7] pm80xx: Add sysfs attribute to track RAAE count Viswas G
@ 2021-02-24 15:57 ` Viswas G
  2021-03-04  9:28   ` Jinpu Wang
  2021-02-24 15:57 ` [PATCH 4/7] pm80xx: Add sysfs attribute to track iop1 count Viswas G
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 18+ messages in thread
From: Viswas G @ 2021-02-24 15:57 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, Ruksar.devadi, vishakhavc,
	radha, jinpu.wang

From: Vishakha Channapattan <vishakhavc@google.com>

A new sysfs variable 'ctl_iop0_count' is being introduced that tells if
the controller is alive by indicating controller ticks. If on subsequent
run we see the ticks changing that indicates that controller is not
dead.

Tested: Using 'ctl_iop0_count' sysfs variable we can see ticks
incrementing
mvae14:~# cat  /sys/class/scsi_host/host*/ctl_iop0_count
IOP0TCNT=0x000000a3
IOP0TCNT=0x000001db
IOP0TCNT=0x000001e4
IOP0TCNT=0x000001e7

Signed-off-by: Vishakha Channapattan <vishakhavc@google.com>
Signed-off-by: Viswas G <Viswas.G@microchip.com>
Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
Signed-off-by: Radha Ramachandran <radha@google.com>
---
 drivers/scsi/pm8001/pm8001_ctl.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/drivers/scsi/pm8001/pm8001_ctl.c b/drivers/scsi/pm8001/pm8001_ctl.c
index d415bb12718c..8470bce2cee1 100644
--- a/drivers/scsi/pm8001/pm8001_ctl.c
+++ b/drivers/scsi/pm8001/pm8001_ctl.c
@@ -943,6 +943,30 @@ static ssize_t ctl_raae_count_show(struct device *cdev,
 }
 static DEVICE_ATTR_RO(ctl_raae_count);
 
+/**
+ * ctl_iop0_count_show - controller iop0 count check
+ * @cdev: pointer to embedded class device
+ * @buf: the buffer returned
+ *
+ * A sysfs 'read-only' shost attribute.
+ */
+
+static ssize_t ctl_iop0_count_show(struct device *cdev,
+		struct device_attribute *attr, char *buf)
+{
+	struct Scsi_Host *shost = class_to_shost(cdev);
+	struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
+	struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
+	unsigned int iop0cnt = 0;
+	int c;
+
+	pm8001_dbg(pm8001_ha, IOCTL, "%s\n", __func__);
+	iop0cnt = pm8001_mr32(pm8001_ha->general_stat_tbl_addr, 16);
+	c = sprintf(buf, "IOP0TCNT=0x%08x\n", iop0cnt);
+	return c;
+}
+static DEVICE_ATTR_RO(ctl_iop0_count);
+
 struct device_attribute *pm8001_host_attrs[] = {
 	&dev_attr_interface_rev,
 	&dev_attr_controller_fatal_error,
@@ -968,6 +992,7 @@ struct device_attribute *pm8001_host_attrs[] = {
 	&dev_attr_inc_fw_ver,
 	&dev_attr_ctl_mpi_state,
 	&dev_attr_ctl_raae_count,
+	&dev_attr_ctl_iop0_count,
 	NULL,
 };
 
-- 
2.16.3


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

* [PATCH 4/7] pm80xx: Add sysfs attribute to track iop1 count
  2021-02-24 15:57 [PATCH 0/7] pm80xx updates Viswas G
                   ` (2 preceding siblings ...)
  2021-02-24 15:57 ` [PATCH 3/7] pm80xx: Add sysfs attribute to track iop0 count Viswas G
@ 2021-02-24 15:57 ` Viswas G
  2021-03-04  9:28   ` Jinpu Wang
  2021-03-05  8:02   ` John Garry
  2021-02-24 15:58 ` [PATCH 5/7] pm80xx: Completing pending IO after fatal error Viswas G
                   ` (2 subsequent siblings)
  6 siblings, 2 replies; 18+ messages in thread
From: Viswas G @ 2021-02-24 15:57 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, Ruksar.devadi, vishakhavc,
	radha, jinpu.wang

From: Vishakha Channapattan <vishakhavc@google.com>

A new sysfs variable 'ctl_iop1_count' is being introduced that tells if
the controller is alive by indicating controller ticks. If on subsequent
run we see the ticks changing that indicates that controller is not
dead.

Tested: Using 'ctl_iop1_count' sysfs variable we can see ticks
incrementing
mvae14:~# cat  /sys/class/scsi_host/host*/ctl_iop1_count
IOP1TCNT=0x00000069
IOP1TCNT=0x0000006b
IOP1TCNT=0x0000006d
IOP1TCNT=0x00000072

Signed-off-by: Vishakha Channapattan <vishakhavc@google.com>
Signed-off-by: Viswas G <Viswas.G@microchip.com>
Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
Signed-off-by: Radha Ramachandran <radha@google.com>
---
 drivers/scsi/pm8001/pm8001_ctl.c | 25 +++++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git a/drivers/scsi/pm8001/pm8001_ctl.c b/drivers/scsi/pm8001/pm8001_ctl.c
index 8470bce2cee1..9bc9ef446801 100644
--- a/drivers/scsi/pm8001/pm8001_ctl.c
+++ b/drivers/scsi/pm8001/pm8001_ctl.c
@@ -967,6 +967,30 @@ static ssize_t ctl_iop0_count_show(struct device *cdev,
 }
 static DEVICE_ATTR_RO(ctl_iop0_count);
 
+/**
+ * ctl_iop1_count_show - controller iop1 count check
+ * @cdev: pointer to embedded class device
+ * @buf: the buffer returned
+ *
+ * A sysfs 'read-only' shost attribute.
+ */
+
+static ssize_t ctl_iop1_count_show(struct device *cdev,
+		struct device_attribute *attr, char *buf)
+{
+	struct Scsi_Host *shost = class_to_shost(cdev);
+	struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
+	struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
+	unsigned int iop1cnt = 0;
+	int c;
+
+	pm8001_dbg(pm8001_ha, IOCTL, "%s\n", __func__);
+	iop1cnt = pm8001_mr32(pm8001_ha->general_stat_tbl_addr, 20);
+	c = sprintf(buf, "IOP1TCNT=0x%08x\n", iop1cnt);
+	return c;
+}
+static DEVICE_ATTR_RO(ctl_iop1_count);
+
 struct device_attribute *pm8001_host_attrs[] = {
 	&dev_attr_interface_rev,
 	&dev_attr_controller_fatal_error,
@@ -993,6 +1017,7 @@ struct device_attribute *pm8001_host_attrs[] = {
 	&dev_attr_ctl_mpi_state,
 	&dev_attr_ctl_raae_count,
 	&dev_attr_ctl_iop0_count,
+	&dev_attr_ctl_iop1_count,
 	NULL,
 };
 
-- 
2.16.3


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

* [PATCH 5/7] pm80xx: Completing pending IO after fatal error
  2021-02-24 15:57 [PATCH 0/7] pm80xx updates Viswas G
                   ` (3 preceding siblings ...)
  2021-02-24 15:57 ` [PATCH 4/7] pm80xx: Add sysfs attribute to track iop1 count Viswas G
@ 2021-02-24 15:58 ` Viswas G
  2021-03-04  9:32   ` Jinpu Wang
  2021-02-24 15:58 ` [PATCH 6/7] pm80xx: Reset PI and CI memory during re-initialize Viswas G
  2021-02-24 15:58 ` [PATCH 7/7] pm80xx: remove global lock from outbound queue processing Viswas G
  6 siblings, 1 reply; 18+ messages in thread
From: Viswas G @ 2021-02-24 15:58 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, Ruksar.devadi, vishakhavc,
	radha, jinpu.wang

From: Ruksar Devadi <Ruksar.devadi@microchip.com>

When controller runs into fatal error, IOs get stuck with no response,
handler event is defined to complete the pending IOs
(SAS task and internal task) and also perform the cleanup for the
drives.

Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
Signed-off-by: Viswas G <Viswas.G@microchip.com>
Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
---
 drivers/scsi/pm8001/pm8001_hwi.c | 66 ++++++++++++++++++++++++++++++++++++----
 drivers/scsi/pm8001/pm8001_hwi.h |  1 +
 drivers/scsi/pm8001/pm8001_sas.c |  2 +-
 drivers/scsi/pm8001/pm8001_sas.h |  1 +
 drivers/scsi/pm8001/pm80xx_hwi.c |  1 +
 drivers/scsi/pm8001/pm80xx_hwi.h |  1 +
 6 files changed, 65 insertions(+), 7 deletions(-)

diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c
index 49bf2f70a470..4e0ce044ac69 100644
--- a/drivers/scsi/pm8001/pm8001_hwi.c
+++ b/drivers/scsi/pm8001/pm8001_hwi.c
@@ -1499,12 +1499,14 @@ void pm8001_work_fn(struct work_struct *work)
 	 * was cancelled. This nullification happens when the device
 	 * goes away.
 	 */
-	pm8001_dev = pw->data; /* Most stash device structure */
-	if ((pm8001_dev == NULL)
-	 || ((pw->handler != IO_XFER_ERROR_BREAK)
-	  && (pm8001_dev->dev_type == SAS_PHY_UNUSED))) {
-		kfree(pw);
-		return;
+	if (pw->handler != IO_FATAL_ERROR) {
+		pm8001_dev = pw->data; /* Most stash device structure */
+		if ((pm8001_dev == NULL)
+		 || ((pw->handler != IO_XFER_ERROR_BREAK)
+			 && (pm8001_dev->dev_type == SAS_PHY_UNUSED))) {
+			kfree(pw);
+			return;
+		}
 	}
 
 	switch (pw->handler) {
@@ -1668,6 +1670,58 @@ void pm8001_work_fn(struct work_struct *work)
 		dev = pm8001_dev->sas_device;
 		pm8001_I_T_nexus_reset(dev);
 		break;
+	case IO_FATAL_ERROR:
+	{
+		struct pm8001_hba_info *pm8001_ha = pw->pm8001_ha;
+		struct pm8001_ccb_info *ccb;
+		struct task_status_struct *ts;
+		struct sas_task *task;
+		int i;
+		u32 tag, device_id;
+
+		for (i = 0; ccb = NULL, i < PM8001_MAX_CCB; i++) {
+			ccb = &pm8001_ha->ccb_info[i];
+			task = ccb->task;
+			ts = &task->task_status;
+			tag = ccb->ccb_tag;
+			/* check if tag is NULL */
+			if (!tag) {
+				pm8001_dbg(pm8001_ha, FAIL,
+					"tag Null\n");
+				continue;
+			}
+			if (task != NULL) {
+				dev = task->dev;
+				if (!dev) {
+					pm8001_dbg(pm8001_ha, FAIL,
+						"dev is NULL\n");
+					continue;
+				}
+				/*complete sas task and update to top layer */
+				pm8001_ccb_task_free(pm8001_ha, task, ccb, tag);
+				ts->resp = SAS_TASK_COMPLETE;
+				task->task_done(task);
+			} else if (tag != 0xFFFFFFFF) {
+				/* complete the internal commands/non-sas task */
+				pm8001_dev = ccb->device;
+				if (pm8001_dev->dcompletion) {
+					complete(pm8001_dev->dcompletion);
+					pm8001_dev->dcompletion = NULL;
+				}
+				complete(pm8001_ha->nvmd_completion);
+				pm8001_tag_free(pm8001_ha, tag);
+			}
+		}
+		/* Deregsiter all the device ids  */
+		for (i = 0; i < PM8001_MAX_DEVICES; i++) {
+			pm8001_dev = &pm8001_ha->devices[i];
+			device_id = pm8001_dev->device_id;
+			if (device_id) {
+				PM8001_CHIP_DISP->dereg_dev_req(pm8001_ha, device_id);
+				pm8001_free_dev(pm8001_dev);
+			}
+		}
+	}	break;
 	}
 	kfree(pw);
 }
diff --git a/drivers/scsi/pm8001/pm8001_hwi.h b/drivers/scsi/pm8001/pm8001_hwi.h
index 6d91e2446542..d1f3aa93325b 100644
--- a/drivers/scsi/pm8001/pm8001_hwi.h
+++ b/drivers/scsi/pm8001/pm8001_hwi.h
@@ -805,6 +805,7 @@ struct set_dev_state_resp {
 #define IO_ABORT_IN_PROGRESS				0x40
 #define IO_ABORT_DELAYED				0x41
 #define IO_INVALID_LENGTH				0x42
+#define IO_FATAL_ERROR					0x51
 
 /* WARNING: This error code must always be the last number.
  * If you add error code, modify this code also
diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c
index a98d4496ff8b..edec599ac641 100644
--- a/drivers/scsi/pm8001/pm8001_sas.c
+++ b/drivers/scsi/pm8001/pm8001_sas.c
@@ -590,7 +590,7 @@ struct pm8001_device *pm8001_find_dev(struct pm8001_hba_info *pm8001_ha,
 	return NULL;
 }
 
-static void pm8001_free_dev(struct pm8001_device *pm8001_dev)
+void pm8001_free_dev(struct pm8001_device *pm8001_dev)
 {
 	u32 id = pm8001_dev->id;
 	memset(pm8001_dev, 0, sizeof(*pm8001_dev));
diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
index 039ed91e9841..36cd37c8c29a 100644
--- a/drivers/scsi/pm8001/pm8001_sas.h
+++ b/drivers/scsi/pm8001/pm8001_sas.h
@@ -727,6 +727,7 @@ ssize_t pm80xx_get_non_fatal_dump(struct device *cdev,
 		struct device_attribute *attr, char *buf);
 ssize_t pm8001_get_gsm_dump(struct device *cdev, u32, char *buf);
 int pm80xx_fatal_errors(struct pm8001_hba_info *pm8001_ha);
+void pm8001_free_dev(struct pm8001_device *pm8001_dev);
 /* ctl shared API */
 extern struct device_attribute *pm8001_host_attrs[];
 
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index 84315560e8e1..1aa3a499c85a 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -4126,6 +4126,7 @@ static int process_oq(struct pm8001_hba_info *pm8001_ha, u8 vec)
 			pm8001_dbg(pm8001_ha, FAIL,
 				   "Firmware Fatal error! Regval:0x%x\n",
 				   regval);
+			pm8001_handle_event(pm8001_ha, NULL, IO_FATAL_ERROR);
 			print_scratchpad_registers(pm8001_ha);
 			return ret;
 		}
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.h b/drivers/scsi/pm8001/pm80xx_hwi.h
index 2c8e85cfdbc4..c7e5d93bea92 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.h
+++ b/drivers/scsi/pm8001/pm80xx_hwi.h
@@ -1272,6 +1272,7 @@ typedef struct SASProtocolTimerConfig SASProtocolTimerConfig_t;
 #define IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE	0x47
 #define IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED	0x48
 #define IO_DS_INVALID					0x49
+#define IO_FATAL_ERROR					0x51
 /* WARNING: the value is not contiguous from here */
 #define IO_XFER_ERR_LAST_PIO_DATAIN_CRC_ERR	0x52
 #define IO_XFER_DMA_ACTIVATE_TIMEOUT		0x53
-- 
2.16.3


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

* [PATCH 6/7] pm80xx: Reset PI and CI memory during re-initialize
  2021-02-24 15:57 [PATCH 0/7] pm80xx updates Viswas G
                   ` (4 preceding siblings ...)
  2021-02-24 15:58 ` [PATCH 5/7] pm80xx: Completing pending IO after fatal error Viswas G
@ 2021-02-24 15:58 ` Viswas G
  2021-03-04  9:37   ` Jinpu Wang
  2021-02-24 15:58 ` [PATCH 7/7] pm80xx: remove global lock from outbound queue processing Viswas G
  6 siblings, 1 reply; 18+ messages in thread
From: Viswas G @ 2021-02-24 15:58 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, Ruksar.devadi, vishakhavc,
	radha, jinpu.wang

Producer index(PI) outbound queue and consumer index(CI)
for Outbound queue are in DMA memory. These values should
be reset to 0 during driver reinitialization.

Signed-off-by: Viswas G <Viswas.G@microchip.com>
Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
---
 drivers/scsi/pm8001/pm8001_hwi.c | 2 ++
 drivers/scsi/pm8001/pm80xx_hwi.c | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c
index 4e0ce044ac69..783149b8b127 100644
--- a/drivers/scsi/pm8001/pm8001_hwi.c
+++ b/drivers/scsi/pm8001/pm8001_hwi.c
@@ -240,6 +240,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
 			pm8001_ha->memoryMap.region[ci_offset + i].phys_addr_lo;
 		pm8001_ha->inbnd_q_tbl[i].ci_virt		=
 			pm8001_ha->memoryMap.region[ci_offset + i].virt_ptr;
+		pm8001_write_32(pm8001_ha->inbnd_q_tbl[i].ci_virt, 0, 0);
 		offsetib = i * 0x20;
 		pm8001_ha->inbnd_q_tbl[i].pi_pci_bar		=
 			get_pci_bar_index(pm8001_mr32(addressib,
@@ -268,6 +269,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
 			0 | (10 << 16) | (i << 24);
 		pm8001_ha->outbnd_q_tbl[i].pi_virt		=
 			pm8001_ha->memoryMap.region[pi_offset + i].virt_ptr;
+		pm8001_write_32(pm8001_ha->outbnd_q_tbl[i].pi_virt, 0, 0);
 		offsetob = i * 0x24;
 		pm8001_ha->outbnd_q_tbl[i].ci_pci_bar		=
 			get_pci_bar_index(pm8001_mr32(addressob,
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index 1aa3a499c85a..0f2c57e054ac 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -787,6 +787,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
 			pm8001_ha->memoryMap.region[ci_offset + i].phys_addr_lo;
 		pm8001_ha->inbnd_q_tbl[i].ci_virt		=
 			pm8001_ha->memoryMap.region[ci_offset + i].virt_ptr;
+		pm8001_write_32(pm8001_ha->inbnd_q_tbl[i].ci_virt, 0, 0);
 		offsetib = i * 0x20;
 		pm8001_ha->inbnd_q_tbl[i].pi_pci_bar		=
 			get_pci_bar_index(pm8001_mr32(addressib,
@@ -820,6 +821,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
 		pm8001_ha->outbnd_q_tbl[i].interrup_vec_cnt_delay = (i << 24);
 		pm8001_ha->outbnd_q_tbl[i].pi_virt		=
 			pm8001_ha->memoryMap.region[pi_offset + i].virt_ptr;
+		pm8001_write_32(pm8001_ha->outbnd_q_tbl[i].pi_virt, 0, 0);
 		offsetob = i * 0x24;
 		pm8001_ha->outbnd_q_tbl[i].ci_pci_bar		=
 			get_pci_bar_index(pm8001_mr32(addressob,
-- 
2.16.3


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

* [PATCH 7/7] pm80xx: remove global lock from outbound queue processing
  2021-02-24 15:57 [PATCH 0/7] pm80xx updates Viswas G
                   ` (5 preceding siblings ...)
  2021-02-24 15:58 ` [PATCH 6/7] pm80xx: Reset PI and CI memory during re-initialize Viswas G
@ 2021-02-24 15:58 ` Viswas G
  2021-03-04  9:39   ` Jinpu Wang
  6 siblings, 1 reply; 18+ messages in thread
From: Viswas G @ 2021-02-24 15:58 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, Ruksar.devadi, vishakhavc,
	radha, jinpu.wang

Introduced spin lock for outbound queue. With this, driver need not
acquire hba global lock for outbound queue processing.

Signed-off-by: Viswas G <Viswas.G@microchip.com>
Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
---
 drivers/scsi/pm8001/pm8001_init.c | 9 ++++++---
 drivers/scsi/pm8001/pm8001_sas.h  | 1 +
 drivers/scsi/pm8001/pm80xx_hwi.c  | 4 ++--
 3 files changed, 9 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c
index bd626ef876da..a3c8fb9a885f 100644
--- a/drivers/scsi/pm8001/pm8001_init.c
+++ b/drivers/scsi/pm8001/pm8001_init.c
@@ -267,7 +267,8 @@ static int pm8001_alloc(struct pm8001_hba_info *pm8001_ha,
 {
 	int i, count = 0, rc = 0;
 	u32 ci_offset, ib_offset, ob_offset, pi_offset;
-	struct inbound_queue_table *circularQ;
+	struct inbound_queue_table *ibq;
+	struct outbound_queue_table *obq;
 
 	spin_lock_init(&pm8001_ha->lock);
 	spin_lock_init(&pm8001_ha->bitmap_lock);
@@ -315,8 +316,8 @@ static int pm8001_alloc(struct pm8001_hba_info *pm8001_ha,
 	pm8001_ha->memoryMap.region[IOP].alignment = 32;
 
 	for (i = 0; i < count; i++) {
-		circularQ = &pm8001_ha->inbnd_q_tbl[i];
-		spin_lock_init(&circularQ->iq_lock);
+		ibq = &pm8001_ha->inbnd_q_tbl[i];
+		spin_lock_init(&ibq->iq_lock);
 		/* MPI Memory region 3 for consumer Index of inbound queues */
 		pm8001_ha->memoryMap.region[ci_offset+i].num_elements = 1;
 		pm8001_ha->memoryMap.region[ci_offset+i].element_size = 4;
@@ -345,6 +346,8 @@ static int pm8001_alloc(struct pm8001_hba_info *pm8001_ha,
 	}
 
 	for (i = 0; i < count; i++) {
+		obq = &pm8001_ha->outbnd_q_tbl[i];
+		spin_lock_init(&obq->oq_lock);
 		/* MPI Memory region 4 for producer Index of outbound queues */
 		pm8001_ha->memoryMap.region[pi_offset+i].num_elements = 1;
 		pm8001_ha->memoryMap.region[pi_offset+i].element_size = 4;
diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
index 36cd37c8c29a..f835557ee354 100644
--- a/drivers/scsi/pm8001/pm8001_sas.h
+++ b/drivers/scsi/pm8001/pm8001_sas.h
@@ -457,6 +457,7 @@ struct outbound_queue_table {
 	u32			dinterrup_to_pci_offset;
 	__le32			producer_index;
 	u32			consumer_idx;
+	spinlock_t		oq_lock;
 };
 struct pm8001_hba_memspace {
 	void __iomem  		*memvirtaddr;
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index 0f2c57e054ac..f1276baebe1d 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -4133,8 +4133,8 @@ static int process_oq(struct pm8001_hba_info *pm8001_ha, u8 vec)
 			return ret;
 		}
 	}
-	spin_lock_irqsave(&pm8001_ha->lock, flags);
 	circularQ = &pm8001_ha->outbnd_q_tbl[vec];
+	spin_lock_irqsave(&circularQ->oq_lock, flags);
 	do {
 		/* spurious interrupt during setup if kexec-ing and
 		 * driver doing a doorbell access w/ the pre-kexec oq
@@ -4160,7 +4160,7 @@ static int process_oq(struct pm8001_hba_info *pm8001_ha, u8 vec)
 				break;
 		}
 	} while (1);
-	spin_unlock_irqrestore(&pm8001_ha->lock, flags);
+	spin_unlock_irqrestore(&circularQ->oq_lock, flags);
 	return ret;
 }
 
-- 
2.16.3


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

* Re: [PATCH 1/7] pm80xx: Add sysfs attribute to check mpi state
  2021-02-24 15:57 ` [PATCH 1/7] pm80xx: Add sysfs attribute to check mpi state Viswas G
@ 2021-03-04  9:27   ` Jinpu Wang
  0 siblings, 0 replies; 18+ messages in thread
From: Jinpu Wang @ 2021-03-04  9:27 UTC (permalink / raw)
  To: Viswas G
  Cc: Linux SCSI Mailinglist, Vasanthalakshmi.Tharmarajan,
	Ruksar.devadi, Vishakha Channapattan, Radha Ramachandran

On Wed, Feb 24, 2021 at 4:48 PM Viswas G <Viswas.G@microchip.com> wrote:
>
> From: Vishakha Channapattan <vishakhavc@google.com>
>
> A new sysfs variable 'ctl_mpi_state' is being introduced to
> check the state of mpi.
>
> Tested: Using 'ctl_mpi_state' sysfs variable we check the mpi state
> mvae14:~# cat /sys/class/scsi_host/host*/ctl_mpi_state
> MPI-S=MPI is successfully initialized   HMI_ERR=0
> MPI-S=MPI is successfully initialized   HMI_ERR=0
>
> Signed-off-by: Vishakha Channapattan <vishakhavc@google.com>
> Signed-off-by: Viswas G <Viswas.G@microchip.com>
> Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
> Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
> Signed-off-by: Radha Ramachandran <radha@google.com>
> ---
>  drivers/scsi/pm8001/pm8001_ctl.c | 36 +++++++++++++++++++++++++++++++++++-
>  1 file changed, 35 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/scsi/pm8001/pm8001_ctl.c b/drivers/scsi/pm8001/pm8001_ctl.c
> index 12035baf0997..035969ed1c2e 100644
> --- a/drivers/scsi/pm8001/pm8001_ctl.c
> +++ b/drivers/scsi/pm8001/pm8001_ctl.c
> @@ -41,6 +41,7 @@
>  #include <linux/slab.h>
>  #include "pm8001_sas.h"
>  #include "pm8001_ctl.h"
> +#include "pm8001_chips.h"
>
>  /* scsi host attributes */
>
> @@ -883,9 +884,41 @@ static ssize_t pm8001_show_update_fw(struct device *cdev,
>                         flash_error_table[i].err_code,
>                         flash_error_table[i].reason);
>  }
> -
>  static DEVICE_ATTR(update_fw, S_IRUGO|S_IWUSR|S_IWGRP,
>         pm8001_show_update_fw, pm8001_store_update_fw);
> +
> +/**
> + * ctl_mpi_state_show - controller MPI state check
> + * @cdev: pointer to embedded class device
> + * @buf: the buffer returned
> + *
> + * A sysfs 'read-only' shost attribute.
> + */
> +
> +char mpiStateText[][80] = {
> +       "MPI is not initialized",
> +       "MPI is successfully initialized",
> +       "MPI termination is in progress",
> +       "MPI initialization failed with error in [31:16]"
> +};
> +
> +static ssize_t ctl_mpi_state_show(struct device *cdev,
> +               struct device_attribute *attr, char *buf)
> +{
> +       struct Scsi_Host *shost = class_to_shost(cdev);
> +       struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
> +       struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
> +       unsigned int mpidw0 = 0;
> +       int c;
> +
> +       pm8001_dbg(pm8001_ha, IOCTL, "%s\n", __func__);
> +       mpidw0 = pm8001_mr32(pm8001_ha->general_stat_tbl_addr, 0);
> +       c = sprintf(buf, "MPI-S=%s\t HMI_ERR=%x\n", mpiStateText[mpidw0 & 0x0003],
> +                       ((mpidw0 & 0xff00) >> 16));
> +       return c;
> +}
> +static DEVICE_ATTR_RO(ctl_mpi_state);
> +
New file should use  sysfs_emit instead of sprintf.

Thanks!

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

* Re: [PATCH 4/7] pm80xx: Add sysfs attribute to track iop1 count
  2021-02-24 15:57 ` [PATCH 4/7] pm80xx: Add sysfs attribute to track iop1 count Viswas G
@ 2021-03-04  9:28   ` Jinpu Wang
  2021-03-05  8:02   ` John Garry
  1 sibling, 0 replies; 18+ messages in thread
From: Jinpu Wang @ 2021-03-04  9:28 UTC (permalink / raw)
  To: Viswas G
  Cc: Linux SCSI Mailinglist, Vasanthalakshmi.Tharmarajan,
	Ruksar.devadi, Vishakha Channapattan, Radha Ramachandran

On Wed, Feb 24, 2021 at 4:48 PM Viswas G <Viswas.G@microchip.com> wrote:
>
> From: Vishakha Channapattan <vishakhavc@google.com>
>
> A new sysfs variable 'ctl_iop1_count' is being introduced that tells if
> the controller is alive by indicating controller ticks. If on subsequent
> run we see the ticks changing that indicates that controller is not
> dead.
>
> Tested: Using 'ctl_iop1_count' sysfs variable we can see ticks
> incrementing
> mvae14:~# cat  /sys/class/scsi_host/host*/ctl_iop1_count
> IOP1TCNT=0x00000069
> IOP1TCNT=0x0000006b
> IOP1TCNT=0x0000006d
> IOP1TCNT=0x00000072
>
> Signed-off-by: Vishakha Channapattan <vishakhavc@google.com>
> Signed-off-by: Viswas G <Viswas.G@microchip.com>
> Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
> Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
> Signed-off-by: Radha Ramachandran <radha@google.com>
> ---
>  drivers/scsi/pm8001/pm8001_ctl.c | 25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
>
> diff --git a/drivers/scsi/pm8001/pm8001_ctl.c b/drivers/scsi/pm8001/pm8001_ctl.c
> index 8470bce2cee1..9bc9ef446801 100644
> --- a/drivers/scsi/pm8001/pm8001_ctl.c
> +++ b/drivers/scsi/pm8001/pm8001_ctl.c
> @@ -967,6 +967,30 @@ static ssize_t ctl_iop0_count_show(struct device *cdev,
>  }
>  static DEVICE_ATTR_RO(ctl_iop0_count);
>
> +/**
> + * ctl_iop1_count_show - controller iop1 count check
> + * @cdev: pointer to embedded class device
> + * @buf: the buffer returned
> + *
> + * A sysfs 'read-only' shost attribute.
> + */
> +
> +static ssize_t ctl_iop1_count_show(struct device *cdev,
> +               struct device_attribute *attr, char *buf)
> +{
> +       struct Scsi_Host *shost = class_to_shost(cdev);
> +       struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
> +       struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
> +       unsigned int iop1cnt = 0;
> +       int c;
> +
> +       pm8001_dbg(pm8001_ha, IOCTL, "%s\n", __func__);
> +       iop1cnt = pm8001_mr32(pm8001_ha->general_stat_tbl_addr, 20);
> +       c = sprintf(buf, "IOP1TCNT=0x%08x\n", iop1cnt);
> +       return c;
> +}
New file should use  sysfs_emit instead of sprintf.
> +static DEVICE_ATTR_RO(ctl_iop1_count);
> +
>  struct device_attribute *pm8001_host_attrs[] = {
>         &dev_attr_interface_rev,
>         &dev_attr_controller_fatal_error,
> @@ -993,6 +1017,7 @@ struct device_attribute *pm8001_host_attrs[] = {
>         &dev_attr_ctl_mpi_state,
>         &dev_attr_ctl_raae_count,
>         &dev_attr_ctl_iop0_count,
> +       &dev_attr_ctl_iop1_count,
>         NULL,
>  };
>
> --
> 2.16.3
>

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

* Re: [PATCH 3/7] pm80xx: Add sysfs attribute to track iop0 count
  2021-02-24 15:57 ` [PATCH 3/7] pm80xx: Add sysfs attribute to track iop0 count Viswas G
@ 2021-03-04  9:28   ` Jinpu Wang
  0 siblings, 0 replies; 18+ messages in thread
From: Jinpu Wang @ 2021-03-04  9:28 UTC (permalink / raw)
  To: Viswas G
  Cc: Linux SCSI Mailinglist, Vasanthalakshmi.Tharmarajan,
	Ruksar.devadi, Vishakha Channapattan, Radha Ramachandran

On Wed, Feb 24, 2021 at 4:48 PM Viswas G <Viswas.G@microchip.com> wrote:
>
> From: Vishakha Channapattan <vishakhavc@google.com>
>
> A new sysfs variable 'ctl_iop0_count' is being introduced that tells if
> the controller is alive by indicating controller ticks. If on subsequent
> run we see the ticks changing that indicates that controller is not
> dead.
>
> Tested: Using 'ctl_iop0_count' sysfs variable we can see ticks
> incrementing
> mvae14:~# cat  /sys/class/scsi_host/host*/ctl_iop0_count
> IOP0TCNT=0x000000a3
> IOP0TCNT=0x000001db
> IOP0TCNT=0x000001e4
> IOP0TCNT=0x000001e7
>
> Signed-off-by: Vishakha Channapattan <vishakhavc@google.com>
> Signed-off-by: Viswas G <Viswas.G@microchip.com>
> Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
> Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
> Signed-off-by: Radha Ramachandran <radha@google.com>
> ---
>  drivers/scsi/pm8001/pm8001_ctl.c | 25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
>
> diff --git a/drivers/scsi/pm8001/pm8001_ctl.c b/drivers/scsi/pm8001/pm8001_ctl.c
> index d415bb12718c..8470bce2cee1 100644
> --- a/drivers/scsi/pm8001/pm8001_ctl.c
> +++ b/drivers/scsi/pm8001/pm8001_ctl.c
> @@ -943,6 +943,30 @@ static ssize_t ctl_raae_count_show(struct device *cdev,
>  }
>  static DEVICE_ATTR_RO(ctl_raae_count);
>
> +/**
> + * ctl_iop0_count_show - controller iop0 count check
> + * @cdev: pointer to embedded class device
> + * @buf: the buffer returned
> + *
> + * A sysfs 'read-only' shost attribute.
> + */
> +
> +static ssize_t ctl_iop0_count_show(struct device *cdev,
> +               struct device_attribute *attr, char *buf)
> +{
> +       struct Scsi_Host *shost = class_to_shost(cdev);
> +       struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
> +       struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
> +       unsigned int iop0cnt = 0;
> +       int c;
> +
> +       pm8001_dbg(pm8001_ha, IOCTL, "%s\n", __func__);
> +       iop0cnt = pm8001_mr32(pm8001_ha->general_stat_tbl_addr, 16);
> +       c = sprintf(buf, "IOP0TCNT=0x%08x\n", iop0cnt);
> +       return c;
> +}
New file should use  sysfs_emit instead of sprintf.
> +static DEVICE_ATTR_RO(ctl_iop0_count);
> +
>  struct device_attribute *pm8001_host_attrs[] = {
>         &dev_attr_interface_rev,
>         &dev_attr_controller_fatal_error,
> @@ -968,6 +992,7 @@ struct device_attribute *pm8001_host_attrs[] = {
>         &dev_attr_inc_fw_ver,
>         &dev_attr_ctl_mpi_state,
>         &dev_attr_ctl_raae_count,
> +       &dev_attr_ctl_iop0_count,
>         NULL,
>  };
>
> --
> 2.16.3
>

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

* Re: [PATCH 2/7] pm80xx: Add sysfs attribute to track RAAE count
  2021-02-24 15:57 ` [PATCH 2/7] pm80xx: Add sysfs attribute to track RAAE count Viswas G
@ 2021-03-04  9:28   ` Jinpu Wang
  0 siblings, 0 replies; 18+ messages in thread
From: Jinpu Wang @ 2021-03-04  9:28 UTC (permalink / raw)
  To: Viswas G
  Cc: Linux SCSI Mailinglist, Vasanthalakshmi.Tharmarajan,
	Ruksar.devadi, Vishakha Channapattan, Radha Ramachandran

On Wed, Feb 24, 2021 at 4:48 PM Viswas G <Viswas.G@microchip.com> wrote:
>
> From: Vishakha Channapattan <vishakhavc@google.com>
>
> A new sysfs variable 'ctl_raae_count' is being introduced that tells if
> the controller is alive by indicating controller ticks. If on subsequent
> run we see the ticks changing in RAAE count that indicates that
> controller
> is not dead.
>
> Tested: Using 'ctl_raae_count' sysfs variable we can see ticks
> incrementing
> mvae14:~# cat  /sys/class/scsi_host/host*/ctl_raae_count
> MSGUTCNT=0x00002245
> MSGUTCNT=0x00002253
> MSGUTCNT=0x0000225e
>
> Signed-off-by: Vishakha Channapattan <vishakhavc@google.com>
> Signed-off-by: Viswas G <Viswas.G@microchip.com>
> Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
> Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
> Signed-off-by: Radha Ramachandran <radha@google.com>
> ---
>  drivers/scsi/pm8001/pm8001_ctl.c | 25 +++++++++++++++++++++++++
>  1 file changed, 25 insertions(+)
>
> diff --git a/drivers/scsi/pm8001/pm8001_ctl.c b/drivers/scsi/pm8001/pm8001_ctl.c
> index 035969ed1c2e..d415bb12718c 100644
> --- a/drivers/scsi/pm8001/pm8001_ctl.c
> +++ b/drivers/scsi/pm8001/pm8001_ctl.c
> @@ -919,6 +919,30 @@ static ssize_t ctl_mpi_state_show(struct device *cdev,
>  }
>  static DEVICE_ATTR_RO(ctl_mpi_state);
>
> +/**
> + * ctl_raae_count_show - controller raae count check
> + * @cdev: pointer to embedded class device
> + * @buf: the buffer returned
> + *
> + * A sysfs 'read-only' shost attribute.
> + */
> +
> +static ssize_t ctl_raae_count_show(struct device *cdev,
> +               struct device_attribute *attr, char *buf)
> +{
> +       struct Scsi_Host *shost = class_to_shost(cdev);
> +       struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
> +       struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
> +       unsigned int raaecnt = 0;
> +       int c;
> +
> +       pm8001_dbg(pm8001_ha, IOCTL, "%s\n", __func__);
> +       raaecnt = pm8001_mr32(pm8001_ha->general_stat_tbl_addr, 12);
> +       c = sprintf(buf, "MSGUTCNT=0x%08x\n", raaecnt);
> +       return c;
> +}
> +static DEVICE_ATTR_RO(ctl_raae_count);
New file should use  sysfs_emit instead of sprintf.
> +
>  struct device_attribute *pm8001_host_attrs[] = {
>         &dev_attr_interface_rev,
>         &dev_attr_controller_fatal_error,
> @@ -943,6 +967,7 @@ struct device_attribute *pm8001_host_attrs[] = {
>         &dev_attr_ila_version,
>         &dev_attr_inc_fw_ver,
>         &dev_attr_ctl_mpi_state,
> +       &dev_attr_ctl_raae_count,
>         NULL,
>  };
>
> --
> 2.16.3
>

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

* Re: [PATCH 5/7] pm80xx: Completing pending IO after fatal error
  2021-02-24 15:58 ` [PATCH 5/7] pm80xx: Completing pending IO after fatal error Viswas G
@ 2021-03-04  9:32   ` Jinpu Wang
  0 siblings, 0 replies; 18+ messages in thread
From: Jinpu Wang @ 2021-03-04  9:32 UTC (permalink / raw)
  To: Viswas G
  Cc: Linux SCSI Mailinglist, Vasanthalakshmi.Tharmarajan,
	Ruksar.devadi, Vishakha Channapattan, Radha Ramachandran

On Wed, Feb 24, 2021 at 4:48 PM Viswas G <Viswas.G@microchip.com> wrote:
>
> From: Ruksar Devadi <Ruksar.devadi@microchip.com>
>
> When controller runs into fatal error, IOs get stuck with no response,
> handler event is defined to complete the pending IOs
> (SAS task and internal task) and also perform the cleanup for the
> drives.
>
> Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
> Signed-off-by: Viswas G <Viswas.G@microchip.com>
> Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
Looks ok to me, thx!
Acked-by: Jack Wang <jinpu.wang@cloud.ionos.com>
> ---
>  drivers/scsi/pm8001/pm8001_hwi.c | 66 ++++++++++++++++++++++++++++++++++++----
>  drivers/scsi/pm8001/pm8001_hwi.h |  1 +
>  drivers/scsi/pm8001/pm8001_sas.c |  2 +-
>  drivers/scsi/pm8001/pm8001_sas.h |  1 +
>  drivers/scsi/pm8001/pm80xx_hwi.c |  1 +
>  drivers/scsi/pm8001/pm80xx_hwi.h |  1 +
>  6 files changed, 65 insertions(+), 7 deletions(-)
>
> diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c
> index 49bf2f70a470..4e0ce044ac69 100644
> --- a/drivers/scsi/pm8001/pm8001_hwi.c
> +++ b/drivers/scsi/pm8001/pm8001_hwi.c
> @@ -1499,12 +1499,14 @@ void pm8001_work_fn(struct work_struct *work)
>          * was cancelled. This nullification happens when the device
>          * goes away.
>          */
> -       pm8001_dev = pw->data; /* Most stash device structure */
> -       if ((pm8001_dev == NULL)
> -        || ((pw->handler != IO_XFER_ERROR_BREAK)
> -         && (pm8001_dev->dev_type == SAS_PHY_UNUSED))) {
> -               kfree(pw);
> -               return;
> +       if (pw->handler != IO_FATAL_ERROR) {
> +               pm8001_dev = pw->data; /* Most stash device structure */
> +               if ((pm8001_dev == NULL)
> +                || ((pw->handler != IO_XFER_ERROR_BREAK)
> +                        && (pm8001_dev->dev_type == SAS_PHY_UNUSED))) {
> +                       kfree(pw);
> +                       return;
> +               }
>         }
>
>         switch (pw->handler) {
> @@ -1668,6 +1670,58 @@ void pm8001_work_fn(struct work_struct *work)
>                 dev = pm8001_dev->sas_device;
>                 pm8001_I_T_nexus_reset(dev);
>                 break;
> +       case IO_FATAL_ERROR:
> +       {
> +               struct pm8001_hba_info *pm8001_ha = pw->pm8001_ha;
> +               struct pm8001_ccb_info *ccb;
> +               struct task_status_struct *ts;
> +               struct sas_task *task;
> +               int i;
> +               u32 tag, device_id;
> +
> +               for (i = 0; ccb = NULL, i < PM8001_MAX_CCB; i++) {
> +                       ccb = &pm8001_ha->ccb_info[i];
> +                       task = ccb->task;
> +                       ts = &task->task_status;
> +                       tag = ccb->ccb_tag;
> +                       /* check if tag is NULL */
> +                       if (!tag) {
> +                               pm8001_dbg(pm8001_ha, FAIL,
> +                                       "tag Null\n");
> +                               continue;
> +                       }
> +                       if (task != NULL) {
> +                               dev = task->dev;
> +                               if (!dev) {
> +                                       pm8001_dbg(pm8001_ha, FAIL,
> +                                               "dev is NULL\n");
> +                                       continue;
> +                               }
> +                               /*complete sas task and update to top layer */
> +                               pm8001_ccb_task_free(pm8001_ha, task, ccb, tag);
> +                               ts->resp = SAS_TASK_COMPLETE;
> +                               task->task_done(task);
> +                       } else if (tag != 0xFFFFFFFF) {
> +                               /* complete the internal commands/non-sas task */
> +                               pm8001_dev = ccb->device;
> +                               if (pm8001_dev->dcompletion) {
> +                                       complete(pm8001_dev->dcompletion);
> +                                       pm8001_dev->dcompletion = NULL;
> +                               }
> +                               complete(pm8001_ha->nvmd_completion);
> +                               pm8001_tag_free(pm8001_ha, tag);
> +                       }
> +               }
> +               /* Deregsiter all the device ids  */
> +               for (i = 0; i < PM8001_MAX_DEVICES; i++) {
> +                       pm8001_dev = &pm8001_ha->devices[i];
> +                       device_id = pm8001_dev->device_id;
> +                       if (device_id) {
> +                               PM8001_CHIP_DISP->dereg_dev_req(pm8001_ha, device_id);
> +                               pm8001_free_dev(pm8001_dev);
> +                       }
> +               }
> +       }       break;
>         }
>         kfree(pw);
>  }
> diff --git a/drivers/scsi/pm8001/pm8001_hwi.h b/drivers/scsi/pm8001/pm8001_hwi.h
> index 6d91e2446542..d1f3aa93325b 100644
> --- a/drivers/scsi/pm8001/pm8001_hwi.h
> +++ b/drivers/scsi/pm8001/pm8001_hwi.h
> @@ -805,6 +805,7 @@ struct set_dev_state_resp {
>  #define IO_ABORT_IN_PROGRESS                           0x40
>  #define IO_ABORT_DELAYED                               0x41
>  #define IO_INVALID_LENGTH                              0x42
> +#define IO_FATAL_ERROR                                 0x51
>
>  /* WARNING: This error code must always be the last number.
>   * If you add error code, modify this code also
> diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c
> index a98d4496ff8b..edec599ac641 100644
> --- a/drivers/scsi/pm8001/pm8001_sas.c
> +++ b/drivers/scsi/pm8001/pm8001_sas.c
> @@ -590,7 +590,7 @@ struct pm8001_device *pm8001_find_dev(struct pm8001_hba_info *pm8001_ha,
>         return NULL;
>  }
>
> -static void pm8001_free_dev(struct pm8001_device *pm8001_dev)
> +void pm8001_free_dev(struct pm8001_device *pm8001_dev)
>  {
>         u32 id = pm8001_dev->id;
>         memset(pm8001_dev, 0, sizeof(*pm8001_dev));
> diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
> index 039ed91e9841..36cd37c8c29a 100644
> --- a/drivers/scsi/pm8001/pm8001_sas.h
> +++ b/drivers/scsi/pm8001/pm8001_sas.h
> @@ -727,6 +727,7 @@ ssize_t pm80xx_get_non_fatal_dump(struct device *cdev,
>                 struct device_attribute *attr, char *buf);
>  ssize_t pm8001_get_gsm_dump(struct device *cdev, u32, char *buf);
>  int pm80xx_fatal_errors(struct pm8001_hba_info *pm8001_ha);
> +void pm8001_free_dev(struct pm8001_device *pm8001_dev);
>  /* ctl shared API */
>  extern struct device_attribute *pm8001_host_attrs[];
>
> diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
> index 84315560e8e1..1aa3a499c85a 100644
> --- a/drivers/scsi/pm8001/pm80xx_hwi.c
> +++ b/drivers/scsi/pm8001/pm80xx_hwi.c
> @@ -4126,6 +4126,7 @@ static int process_oq(struct pm8001_hba_info *pm8001_ha, u8 vec)
>                         pm8001_dbg(pm8001_ha, FAIL,
>                                    "Firmware Fatal error! Regval:0x%x\n",
>                                    regval);
> +                       pm8001_handle_event(pm8001_ha, NULL, IO_FATAL_ERROR);
>                         print_scratchpad_registers(pm8001_ha);
>                         return ret;
>                 }
> diff --git a/drivers/scsi/pm8001/pm80xx_hwi.h b/drivers/scsi/pm8001/pm80xx_hwi.h
> index 2c8e85cfdbc4..c7e5d93bea92 100644
> --- a/drivers/scsi/pm8001/pm80xx_hwi.h
> +++ b/drivers/scsi/pm8001/pm80xx_hwi.h
> @@ -1272,6 +1272,7 @@ typedef struct SASProtocolTimerConfig SASProtocolTimerConfig_t;
>  #define IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_OPEN_COLLIDE   0x47
>  #define IO_OPEN_CNX_ERROR_IT_NEXUS_LOSS_PATHWAY_BLOCKED        0x48
>  #define IO_DS_INVALID                                  0x49
> +#define IO_FATAL_ERROR                                 0x51
>  /* WARNING: the value is not contiguous from here */
>  #define IO_XFER_ERR_LAST_PIO_DATAIN_CRC_ERR    0x52
>  #define IO_XFER_DMA_ACTIVATE_TIMEOUT           0x53
> --
> 2.16.3
>

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

* Re: [PATCH 6/7] pm80xx: Reset PI and CI memory during re-initialize
  2021-02-24 15:58 ` [PATCH 6/7] pm80xx: Reset PI and CI memory during re-initialize Viswas G
@ 2021-03-04  9:37   ` Jinpu Wang
  2021-03-04 16:40     ` Viswas.G
  0 siblings, 1 reply; 18+ messages in thread
From: Jinpu Wang @ 2021-03-04  9:37 UTC (permalink / raw)
  To: Viswas G
  Cc: Linux SCSI Mailinglist, Vasanthalakshmi.Tharmarajan,
	Ruksar.devadi, Vishakha Channapattan, Radha Ramachandran

On Wed, Feb 24, 2021 at 4:48 PM Viswas G <Viswas.G@microchip.com> wrote:
>
> Producer index(PI) outbound queue and consumer index(CI)
> for Outbound queue are in DMA memory. These values should
> be reset to 0 during driver reinitialization.

Why "reinitialization", the function  init_default_table_values is
called from chip init?
>
> Signed-off-by: Viswas G <Viswas.G@microchip.com>
> Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
> Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
> ---
>  drivers/scsi/pm8001/pm8001_hwi.c | 2 ++
>  drivers/scsi/pm8001/pm80xx_hwi.c | 2 ++
>  2 files changed, 4 insertions(+)
>
> diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c
> index 4e0ce044ac69..783149b8b127 100644
> --- a/drivers/scsi/pm8001/pm8001_hwi.c
> +++ b/drivers/scsi/pm8001/pm8001_hwi.c
> @@ -240,6 +240,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
>                         pm8001_ha->memoryMap.region[ci_offset + i].phys_addr_lo;
>                 pm8001_ha->inbnd_q_tbl[i].ci_virt               =
>                         pm8001_ha->memoryMap.region[ci_offset + i].virt_ptr;
> +               pm8001_write_32(pm8001_ha->inbnd_q_tbl[i].ci_virt, 0, 0);
>                 offsetib = i * 0x20;
>                 pm8001_ha->inbnd_q_tbl[i].pi_pci_bar            =
>                         get_pci_bar_index(pm8001_mr32(addressib,
> @@ -268,6 +269,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
>                         0 | (10 << 16) | (i << 24);
>                 pm8001_ha->outbnd_q_tbl[i].pi_virt              =
>                         pm8001_ha->memoryMap.region[pi_offset + i].virt_ptr;
> +               pm8001_write_32(pm8001_ha->outbnd_q_tbl[i].pi_virt, 0, 0);
>                 offsetob = i * 0x24;
>                 pm8001_ha->outbnd_q_tbl[i].ci_pci_bar           =
>                         get_pci_bar_index(pm8001_mr32(addressob,
> diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
> index 1aa3a499c85a..0f2c57e054ac 100644
> --- a/drivers/scsi/pm8001/pm80xx_hwi.c
> +++ b/drivers/scsi/pm8001/pm80xx_hwi.c
> @@ -787,6 +787,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
>                         pm8001_ha->memoryMap.region[ci_offset + i].phys_addr_lo;
>                 pm8001_ha->inbnd_q_tbl[i].ci_virt               =
>                         pm8001_ha->memoryMap.region[ci_offset + i].virt_ptr;
> +               pm8001_write_32(pm8001_ha->inbnd_q_tbl[i].ci_virt, 0, 0);
>                 offsetib = i * 0x20;
>                 pm8001_ha->inbnd_q_tbl[i].pi_pci_bar            =
>                         get_pci_bar_index(pm8001_mr32(addressib,
> @@ -820,6 +821,7 @@ static void init_default_table_values(struct pm8001_hba_info *pm8001_ha)
>                 pm8001_ha->outbnd_q_tbl[i].interrup_vec_cnt_delay = (i << 24);
>                 pm8001_ha->outbnd_q_tbl[i].pi_virt              =
>                         pm8001_ha->memoryMap.region[pi_offset + i].virt_ptr;
> +               pm8001_write_32(pm8001_ha->outbnd_q_tbl[i].pi_virt, 0, 0);
>                 offsetob = i * 0x24;
>                 pm8001_ha->outbnd_q_tbl[i].ci_pci_bar           =
>                         get_pci_bar_index(pm8001_mr32(addressob,
> --
> 2.16.3
>

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

* Re: [PATCH 7/7] pm80xx: remove global lock from outbound queue processing
  2021-02-24 15:58 ` [PATCH 7/7] pm80xx: remove global lock from outbound queue processing Viswas G
@ 2021-03-04  9:39   ` Jinpu Wang
  0 siblings, 0 replies; 18+ messages in thread
From: Jinpu Wang @ 2021-03-04  9:39 UTC (permalink / raw)
  To: Viswas G
  Cc: Linux SCSI Mailinglist, Vasanthalakshmi.Tharmarajan,
	Ruksar.devadi, Vishakha Channapattan, Radha Ramachandran

On Wed, Feb 24, 2021 at 4:48 PM Viswas G <Viswas.G@microchip.com> wrote:
>
> Introduced spin lock for outbound queue. With this, driver need not
> acquire hba global lock for outbound queue processing.
>
> Signed-off-by: Viswas G <Viswas.G@microchip.com>
> Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
> Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
Looks ok to me!
Acked-by: Jack Wang <jinpu.wang@cloud.ionos.com>
> ---
>  drivers/scsi/pm8001/pm8001_init.c | 9 ++++++---
>  drivers/scsi/pm8001/pm8001_sas.h  | 1 +
>  drivers/scsi/pm8001/pm80xx_hwi.c  | 4 ++--
>  3 files changed, 9 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c
> index bd626ef876da..a3c8fb9a885f 100644
> --- a/drivers/scsi/pm8001/pm8001_init.c
> +++ b/drivers/scsi/pm8001/pm8001_init.c
> @@ -267,7 +267,8 @@ static int pm8001_alloc(struct pm8001_hba_info *pm8001_ha,
>  {
>         int i, count = 0, rc = 0;
>         u32 ci_offset, ib_offset, ob_offset, pi_offset;
> -       struct inbound_queue_table *circularQ;
> +       struct inbound_queue_table *ibq;
> +       struct outbound_queue_table *obq;
>
>         spin_lock_init(&pm8001_ha->lock);
>         spin_lock_init(&pm8001_ha->bitmap_lock);
> @@ -315,8 +316,8 @@ static int pm8001_alloc(struct pm8001_hba_info *pm8001_ha,
>         pm8001_ha->memoryMap.region[IOP].alignment = 32;
>
>         for (i = 0; i < count; i++) {
> -               circularQ = &pm8001_ha->inbnd_q_tbl[i];
> -               spin_lock_init(&circularQ->iq_lock);
> +               ibq = &pm8001_ha->inbnd_q_tbl[i];
> +               spin_lock_init(&ibq->iq_lock);
>                 /* MPI Memory region 3 for consumer Index of inbound queues */
>                 pm8001_ha->memoryMap.region[ci_offset+i].num_elements = 1;
>                 pm8001_ha->memoryMap.region[ci_offset+i].element_size = 4;
> @@ -345,6 +346,8 @@ static int pm8001_alloc(struct pm8001_hba_info *pm8001_ha,
>         }
>
>         for (i = 0; i < count; i++) {
> +               obq = &pm8001_ha->outbnd_q_tbl[i];
> +               spin_lock_init(&obq->oq_lock);
>                 /* MPI Memory region 4 for producer Index of outbound queues */
>                 pm8001_ha->memoryMap.region[pi_offset+i].num_elements = 1;
>                 pm8001_ha->memoryMap.region[pi_offset+i].element_size = 4;
> diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
> index 36cd37c8c29a..f835557ee354 100644
> --- a/drivers/scsi/pm8001/pm8001_sas.h
> +++ b/drivers/scsi/pm8001/pm8001_sas.h
> @@ -457,6 +457,7 @@ struct outbound_queue_table {
>         u32                     dinterrup_to_pci_offset;
>         __le32                  producer_index;
>         u32                     consumer_idx;
> +       spinlock_t              oq_lock;
>  };
>  struct pm8001_hba_memspace {
>         void __iomem            *memvirtaddr;
> diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
> index 0f2c57e054ac..f1276baebe1d 100644
> --- a/drivers/scsi/pm8001/pm80xx_hwi.c
> +++ b/drivers/scsi/pm8001/pm80xx_hwi.c
> @@ -4133,8 +4133,8 @@ static int process_oq(struct pm8001_hba_info *pm8001_ha, u8 vec)
>                         return ret;
>                 }
>         }
> -       spin_lock_irqsave(&pm8001_ha->lock, flags);
>         circularQ = &pm8001_ha->outbnd_q_tbl[vec];
> +       spin_lock_irqsave(&circularQ->oq_lock, flags);
>         do {
>                 /* spurious interrupt during setup if kexec-ing and
>                  * driver doing a doorbell access w/ the pre-kexec oq
> @@ -4160,7 +4160,7 @@ static int process_oq(struct pm8001_hba_info *pm8001_ha, u8 vec)
>                                 break;
>                 }
>         } while (1);
> -       spin_unlock_irqrestore(&pm8001_ha->lock, flags);
> +       spin_unlock_irqrestore(&circularQ->oq_lock, flags);
>         return ret;
>  }
>
> --
> 2.16.3
>

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

* RE: [PATCH 6/7] pm80xx: Reset PI and CI memory during re-initialize
  2021-03-04  9:37   ` Jinpu Wang
@ 2021-03-04 16:40     ` Viswas.G
  2021-03-05  6:45       ` Jinpu Wang
  0 siblings, 1 reply; 18+ messages in thread
From: Viswas.G @ 2021-03-04 16:40 UTC (permalink / raw)
  To: jinpu.wang
  Cc: linux-scsi, Vasanthalakshmi.Tharmarajan, Ruksar.devadi,
	vishakhavc, radha


> -----Original Message-----
> From: Jinpu Wang <jinpu.wang@cloud.ionos.com>
> Sent: Thursday, March 4, 2021 3:07 PM
> To: Viswas G - I30667 <Viswas.G@microchip.com>
> Cc: Linux SCSI Mailinglist <linux-scsi@vger.kernel.org>; Vasanthalakshmi
> Tharmarajan - I30664 <Vasanthalakshmi.Tharmarajan@microchip.com>;
> Ruksar Devadi - I52327 <Ruksar.devadi@microchip.com>; Vishakha
> Channapattan <vishakhavc@google.com>; Radha Ramachandran
> <radha@google.com>
> Subject: Re: [PATCH 6/7] pm80xx: Reset PI and CI memory during re-initialize
> 
> EXTERNAL EMAIL: Do not click links or open attachments unless you know the
> content is safe
> 
> On Wed, Feb 24, 2021 at 4:48 PM Viswas G <Viswas.G@microchip.com>
> wrote:
> >
> > Producer index(PI) outbound queue and consumer index(CI) for Outbound
> > queue are in DMA memory. These values should be reset to 0 during
> > driver reinitialization.
> 
> Why "reinitialization", the function  init_default_table_values is called from
> chip init?

Yes. This called from both probe() and resume(). During resume(), the stale PI and CI 
Values will leads to unexpected behavior.

> >
> > Signed-off-by: Viswas G <Viswas.G@microchip.com>
> > Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
> > Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
> > ---
> >  drivers/scsi/pm8001/pm8001_hwi.c | 2 ++
> > drivers/scsi/pm8001/pm80xx_hwi.c | 2 ++
> >  2 files changed, 4 insertions(+)
> >
> > diff --git a/drivers/scsi/pm8001/pm8001_hwi.c
> > b/drivers/scsi/pm8001/pm8001_hwi.c
> > index 4e0ce044ac69..783149b8b127 100644
> > --- a/drivers/scsi/pm8001/pm8001_hwi.c
> > +++ b/drivers/scsi/pm8001/pm8001_hwi.c
> > @@ -240,6 +240,7 @@ static void init_default_table_values(struct
> pm8001_hba_info *pm8001_ha)
> >                         pm8001_ha->memoryMap.region[ci_offset + i].phys_addr_lo;
> >                 pm8001_ha->inbnd_q_tbl[i].ci_virt               =
> >                         pm8001_ha->memoryMap.region[ci_offset +
> > i].virt_ptr;
> > +               pm8001_write_32(pm8001_ha->inbnd_q_tbl[i].ci_virt, 0,
> > + 0);
> >                 offsetib = i * 0x20;
> >                 pm8001_ha->inbnd_q_tbl[i].pi_pci_bar            =
> >                         get_pci_bar_index(pm8001_mr32(addressib,
> > @@ -268,6 +269,7 @@ static void init_default_table_values(struct
> pm8001_hba_info *pm8001_ha)
> >                         0 | (10 << 16) | (i << 24);
> >                 pm8001_ha->outbnd_q_tbl[i].pi_virt              =
> >                         pm8001_ha->memoryMap.region[pi_offset +
> > i].virt_ptr;
> > +               pm8001_write_32(pm8001_ha->outbnd_q_tbl[i].pi_virt, 0,
> > + 0);
> >                 offsetob = i * 0x24;
> >                 pm8001_ha->outbnd_q_tbl[i].ci_pci_bar           =
> >                         get_pci_bar_index(pm8001_mr32(addressob,
> > diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c
> > b/drivers/scsi/pm8001/pm80xx_hwi.c
> > index 1aa3a499c85a..0f2c57e054ac 100644
> > --- a/drivers/scsi/pm8001/pm80xx_hwi.c
> > +++ b/drivers/scsi/pm8001/pm80xx_hwi.c
> > @@ -787,6 +787,7 @@ static void init_default_table_values(struct
> pm8001_hba_info *pm8001_ha)
> >                         pm8001_ha->memoryMap.region[ci_offset + i].phys_addr_lo;
> >                 pm8001_ha->inbnd_q_tbl[i].ci_virt               =
> >                         pm8001_ha->memoryMap.region[ci_offset +
> > i].virt_ptr;
> > +               pm8001_write_32(pm8001_ha->inbnd_q_tbl[i].ci_virt, 0,
> > + 0);
> >                 offsetib = i * 0x20;
> >                 pm8001_ha->inbnd_q_tbl[i].pi_pci_bar            =
> >                         get_pci_bar_index(pm8001_mr32(addressib,
> > @@ -820,6 +821,7 @@ static void init_default_table_values(struct
> pm8001_hba_info *pm8001_ha)
> >                 pm8001_ha->outbnd_q_tbl[i].interrup_vec_cnt_delay = (i << 24);
> >                 pm8001_ha->outbnd_q_tbl[i].pi_virt              =
> >                         pm8001_ha->memoryMap.region[pi_offset +
> > i].virt_ptr;
> > +               pm8001_write_32(pm8001_ha->outbnd_q_tbl[i].pi_virt, 0,
> > + 0);
> >                 offsetob = i * 0x24;
> >                 pm8001_ha->outbnd_q_tbl[i].ci_pci_bar           =
> >                         get_pci_bar_index(pm8001_mr32(addressob,
> > --
> > 2.16.3
> >

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

* Re: [PATCH 6/7] pm80xx: Reset PI and CI memory during re-initialize
  2021-03-04 16:40     ` Viswas.G
@ 2021-03-05  6:45       ` Jinpu Wang
  0 siblings, 0 replies; 18+ messages in thread
From: Jinpu Wang @ 2021-03-05  6:45 UTC (permalink / raw)
  To: Viswas G
  Cc: Linux SCSI Mailinglist, Vasanthalakshmi.Tharmarajan,
	Ruksar.devadi, Vishakha Channapattan, Radha Ramachandran

On Thu, Mar 4, 2021 at 5:47 PM <Viswas.G@microchip.com> wrote:
>
>
> > -----Original Message-----
> > From: Jinpu Wang <jinpu.wang@cloud.ionos.com>
> > Sent: Thursday, March 4, 2021 3:07 PM
> > To: Viswas G - I30667 <Viswas.G@microchip.com>
> > Cc: Linux SCSI Mailinglist <linux-scsi@vger.kernel.org>; Vasanthalakshmi
> > Tharmarajan - I30664 <Vasanthalakshmi.Tharmarajan@microchip.com>;
> > Ruksar Devadi - I52327 <Ruksar.devadi@microchip.com>; Vishakha
> > Channapattan <vishakhavc@google.com>; Radha Ramachandran
> > <radha@google.com>
> > Subject: Re: [PATCH 6/7] pm80xx: Reset PI and CI memory during re-initialize
> >
> > EXTERNAL EMAIL: Do not click links or open attachments unless you know the
> > content is safe
> >
> > On Wed, Feb 24, 2021 at 4:48 PM Viswas G <Viswas.G@microchip.com>
> > wrote:
> > >
> > > Producer index(PI) outbound queue and consumer index(CI) for Outbound
> > > queue are in DMA memory. These values should be reset to 0 during
> > > driver reinitialization.
> >
> > Why "reinitialization", the function  init_default_table_values is called from
> > chip init?
>
> Yes. This called from both probe() and resume(). During resume(), the stale PI and CI
> Values will leads to unexpected behavior.
Can you add this part to the commit message?
>
> > >
> > > Signed-off-by: Viswas G <Viswas.G@microchip.com>
> > > Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
> > > Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
With that,
Acked-by: Jack Wang <jinpu.wang@cloud.ionos.com>
> > > ---
> > >  drivers/scsi/pm8001/pm8001_hwi.c | 2 ++
> > > drivers/scsi/pm8001/pm80xx_hwi.c | 2 ++
> > >  2 files changed, 4 insertions(+)
> > >
> > > diff --git a/drivers/scsi/pm8001/pm8001_hwi.c
> > > b/drivers/scsi/pm8001/pm8001_hwi.c
> > > index 4e0ce044ac69..783149b8b127 100644
> > > --- a/drivers/scsi/pm8001/pm8001_hwi.c
> > > +++ b/drivers/scsi/pm8001/pm8001_hwi.c
> > > @@ -240,6 +240,7 @@ static void init_default_table_values(struct
> > pm8001_hba_info *pm8001_ha)
> > >                         pm8001_ha->memoryMap.region[ci_offset + i].phys_addr_lo;
> > >                 pm8001_ha->inbnd_q_tbl[i].ci_virt               =
> > >                         pm8001_ha->memoryMap.region[ci_offset +
> > > i].virt_ptr;
> > > +               pm8001_write_32(pm8001_ha->inbnd_q_tbl[i].ci_virt, 0,
> > > + 0);
> > >                 offsetib = i * 0x20;
> > >                 pm8001_ha->inbnd_q_tbl[i].pi_pci_bar            =
> > >                         get_pci_bar_index(pm8001_mr32(addressib,
> > > @@ -268,6 +269,7 @@ static void init_default_table_values(struct
> > pm8001_hba_info *pm8001_ha)
> > >                         0 | (10 << 16) | (i << 24);
> > >                 pm8001_ha->outbnd_q_tbl[i].pi_virt              =
> > >                         pm8001_ha->memoryMap.region[pi_offset +
> > > i].virt_ptr;
> > > +               pm8001_write_32(pm8001_ha->outbnd_q_tbl[i].pi_virt, 0,
> > > + 0);
> > >                 offsetob = i * 0x24;
> > >                 pm8001_ha->outbnd_q_tbl[i].ci_pci_bar           =
> > >                         get_pci_bar_index(pm8001_mr32(addressob,
> > > diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c
> > > b/drivers/scsi/pm8001/pm80xx_hwi.c
> > > index 1aa3a499c85a..0f2c57e054ac 100644
> > > --- a/drivers/scsi/pm8001/pm80xx_hwi.c
> > > +++ b/drivers/scsi/pm8001/pm80xx_hwi.c
> > > @@ -787,6 +787,7 @@ static void init_default_table_values(struct
> > pm8001_hba_info *pm8001_ha)
> > >                         pm8001_ha->memoryMap.region[ci_offset + i].phys_addr_lo;
> > >                 pm8001_ha->inbnd_q_tbl[i].ci_virt               =
> > >                         pm8001_ha->memoryMap.region[ci_offset +
> > > i].virt_ptr;
> > > +               pm8001_write_32(pm8001_ha->inbnd_q_tbl[i].ci_virt, 0,
> > > + 0);
> > >                 offsetib = i * 0x20;
> > >                 pm8001_ha->inbnd_q_tbl[i].pi_pci_bar            =
> > >                         get_pci_bar_index(pm8001_mr32(addressib,
> > > @@ -820,6 +821,7 @@ static void init_default_table_values(struct
> > pm8001_hba_info *pm8001_ha)
> > >                 pm8001_ha->outbnd_q_tbl[i].interrup_vec_cnt_delay = (i << 24);
> > >                 pm8001_ha->outbnd_q_tbl[i].pi_virt              =
> > >                         pm8001_ha->memoryMap.region[pi_offset +
> > > i].virt_ptr;
> > > +               pm8001_write_32(pm8001_ha->outbnd_q_tbl[i].pi_virt, 0,
> > > + 0);
> > >                 offsetob = i * 0x24;
> > >                 pm8001_ha->outbnd_q_tbl[i].ci_pci_bar           =
> > >                         get_pci_bar_index(pm8001_mr32(addressob,
> > > --
> > > 2.16.3
> > >

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

* Re: [PATCH 4/7] pm80xx: Add sysfs attribute to track iop1 count
  2021-02-24 15:57 ` [PATCH 4/7] pm80xx: Add sysfs attribute to track iop1 count Viswas G
  2021-03-04  9:28   ` Jinpu Wang
@ 2021-03-05  8:02   ` John Garry
  1 sibling, 0 replies; 18+ messages in thread
From: John Garry @ 2021-03-05  8:02 UTC (permalink / raw)
  To: Viswas G, linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Ruksar.devadi, vishakhavc, radha,
	jinpu.wang

On 24/02/2021 15:57, Viswas G wrote:
> From: Vishakha Channapattan <vishakhavc@google.com>
> 
> A new sysfs variable 'ctl_iop1_count' is being introduced that tells if
> the controller is alive by indicating controller ticks. If on subsequent
> run we see the ticks changing that indicates that controller is not
> dead.
> 

Some comments, if you don't mind:

> Tested: Using 'ctl_iop1_count' sysfs variable we can see ticks
> incrementing
> mvae14:~# cat  /sys/class/scsi_host/host*/ctl_iop1_count
> IOP1TCNT=0x00000069

why does this file not just hold the value, and rather print "IOP1TCNT=" 
as well?

> IOP1TCNT=0x0000006b
> IOP1TCNT=0x0000006d
> IOP1TCNT=0x00000072
> 
> Signed-off-by: Vishakha Channapattan <vishakhavc@google.com>
> Signed-off-by: Viswas G <Viswas.G@microchip.com>
> Signed-off-by: Ruksar Devadi <Ruksar.devadi@microchip.com>
> Signed-off-by: Ashokkumar N <Ashokkumar.N@microchip.com>
> Signed-off-by: Radha Ramachandran <radha@google.com>
> ---
>   drivers/scsi/pm8001/pm8001_ctl.c | 25 +++++++++++++++++++++++++
>   1 file changed, 25 insertions(+)
> 
> diff --git a/drivers/scsi/pm8001/pm8001_ctl.c b/drivers/scsi/pm8001/pm8001_ctl.c
> index 8470bce2cee1..9bc9ef446801 100644
> --- a/drivers/scsi/pm8001/pm8001_ctl.c
> +++ b/drivers/scsi/pm8001/pm8001_ctl.c
> @@ -967,6 +967,30 @@ static ssize_t ctl_iop0_count_show(struct device *cdev,
>   }
>   static DEVICE_ATTR_RO(ctl_iop0_count);
>   
> +/**
> + * ctl_iop1_count_show - controller iop1 count check
> + * @cdev: pointer to embedded class device
> + * @buf: the buffer returned
> + *
> + * A sysfs 'read-only' shost attribute.
> + */
> +
> +static ssize_t ctl_iop1_count_show(struct device *cdev,
> +		struct device_attribute *attr, char *buf)
> +{
> +	struct Scsi_Host *shost = class_to_shost(cdev);
> +	struct sas_ha_struct *sha = SHOST_TO_SAS_HA(shost);
> +	struct pm8001_hba_info *pm8001_ha = sha->lldd_ha;
> +	unsigned int iop1cnt = 0;

no need to set an initial value

> +	int c;
> +
> +	pm8001_dbg(pm8001_ha, IOCTL, "%s\n", __func__);

strange that you require a debug message for something so simple

> +	iop1cnt = pm8001_mr32(pm8001_ha->general_stat_tbl_addr, 20);
> +	c = sprintf(buf, "IOP1TCNT=0x%08x\n", iop1cnt); > +	return c;
> +}
> +static DEVICE_ATTR_RO(ctl_iop1_count);

Seems like a lot of duplication in these functions

> +
>   struct device_attribute *pm8001_host_attrs[] = {
>   	&dev_attr_interface_rev,
>   	&dev_attr_controller_fatal_error,
> @@ -993,6 +1017,7 @@ struct device_attribute *pm8001_host_attrs[] = {
>   	&dev_attr_ctl_mpi_state,
>   	&dev_attr_ctl_raae_count,
>   	&dev_attr_ctl_iop0_count,
> +	&dev_attr_ctl_iop1_count,
>   	NULL,
>   };
>   
> 


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

end of thread, other threads:[~2021-03-05  8:04 UTC | newest]

Thread overview: 18+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-02-24 15:57 [PATCH 0/7] pm80xx updates Viswas G
2021-02-24 15:57 ` [PATCH 1/7] pm80xx: Add sysfs attribute to check mpi state Viswas G
2021-03-04  9:27   ` Jinpu Wang
2021-02-24 15:57 ` [PATCH 2/7] pm80xx: Add sysfs attribute to track RAAE count Viswas G
2021-03-04  9:28   ` Jinpu Wang
2021-02-24 15:57 ` [PATCH 3/7] pm80xx: Add sysfs attribute to track iop0 count Viswas G
2021-03-04  9:28   ` Jinpu Wang
2021-02-24 15:57 ` [PATCH 4/7] pm80xx: Add sysfs attribute to track iop1 count Viswas G
2021-03-04  9:28   ` Jinpu Wang
2021-03-05  8:02   ` John Garry
2021-02-24 15:58 ` [PATCH 5/7] pm80xx: Completing pending IO after fatal error Viswas G
2021-03-04  9:32   ` Jinpu Wang
2021-02-24 15:58 ` [PATCH 6/7] pm80xx: Reset PI and CI memory during re-initialize Viswas G
2021-03-04  9:37   ` Jinpu Wang
2021-03-04 16:40     ` Viswas.G
2021-03-05  6:45       ` Jinpu Wang
2021-02-24 15:58 ` [PATCH 7/7] pm80xx: remove global lock from outbound queue processing Viswas G
2021-03-04  9:39   ` Jinpu Wang

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.