All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V2 0/9] pm80xx updates
@ 2015-02-17 23:36 Viswas G
  2015-02-17 23:36 ` [PATCH V2 1/9] pm80xx : redefine sas_identify_frame structure Viswas G
                   ` (9 more replies)
  0 siblings, 10 replies; 19+ messages in thread
From: Viswas G @ 2015-02-17 23:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, deepak.ukey, Raj.Dinesh,
	jinpu.wang, martin.petersen

This patch set include some bug fixes and enhancement for pm80xx driver.

Changes from V1:

	- sas_identify_frame_local structure moved to pm80xx_hwi.h
	- sata abort handling patch split to four patches.
		- tag allocation for phy control request.
		- cleanup in pm8001_abort_task function.
		- modified port reset timer value for PM8006 card
		- corrected SATA abort handling sequence.

Viswas G (9):
  pm80xx : redefine sas_identify_frame structure
  pm80xx : ILA and inactive firmware version through sysfs
  pm80xx : Different SAS addresses for phys.
  pm80xx : tag allocation for phy control request.
  pm80xx : cleanup in pm8001_abort_task function.
  pm80xx : modified port reset timer value for PM8006 card
  pm80xx : corrected SATA abort handling sequence.
  pm80xx : panic on ncq error cleaning up the read log.
  pm80xx : corrected linkrate value.

 drivers/scsi/pm8001/pm8001_ctl.c  |  54 +++++++++++++++++
 drivers/scsi/pm8001/pm8001_hwi.c  |  11 +++-
 drivers/scsi/pm8001/pm8001_init.c |  13 +++--
 drivers/scsi/pm8001/pm8001_sas.c  | 118 ++++++++++++++++++++++++++------------
 drivers/scsi/pm8001/pm8001_sas.h  |  10 ++++
 drivers/scsi/pm8001/pm80xx_hwi.c  |  61 ++++++++++++++++----
 drivers/scsi/pm8001/pm80xx_hwi.h  | 102 +++++++++++++++++++++++++++++++-
 7 files changed, 313 insertions(+), 56 deletions(-)

-- 
2.12.3

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

* [PATCH V2 1/9] pm80xx : redefine sas_identify_frame structure
  2015-02-17 23:36 [PATCH V2 0/9] pm80xx updates Viswas G
@ 2015-02-17 23:36 ` Viswas G
  2017-09-13 11:09   ` Jinpu Wang
  2015-02-17 23:36 ` [PATCH V2 2/9] pm80xx : ILA and inactive firmware version through sysfs Viswas G
                   ` (8 subsequent siblings)
  9 siblings, 1 reply; 19+ messages in thread
From: Viswas G @ 2015-02-17 23:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, deepak.ukey, Raj.Dinesh,
	jinpu.wang, martin.petersen

sas_identify structure defined by pm80xx doesn't have CRC field.
So added a new sas_identify structure without CRC.

v2:
	- Since the structure changes is applicable for only pm80xx,
	  sas_identify_frame_local structure moved to pm80xx_hwi.h.

Signed-off-by: Raj Dinesh <Raj.Dinesh@microsemi.com>
Signed-off-by: Viswas G <Viswas.G@microsemi.com>
---
 drivers/scsi/pm8001/pm80xx_hwi.h | 98 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 97 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/pm8001/pm80xx_hwi.h b/drivers/scsi/pm8001/pm80xx_hwi.h
index 7a443bad6163..82b8cf581da9 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.h
+++ b/drivers/scsi/pm8001/pm80xx_hwi.h
@@ -229,6 +229,102 @@
 #define IT_NEXUS_TIMEOUT       0x7D0
 #define PORT_RECOVERY_TIMEOUT  ((IT_NEXUS_TIMEOUT/100) + 30)
 
+#ifdef __LITTLE_ENDIAN_BITFIELD
+struct sas_identify_frame_local {
+	/* Byte 0 */
+	u8  frame_type:4;
+	u8  dev_type:3;
+	u8  _un0:1;
+
+	/* Byte 1 */
+	u8  _un1;
+
+	/* Byte 2 */
+	union {
+		struct {
+			u8  _un20:1;
+			u8  smp_iport:1;
+			u8  stp_iport:1;
+			u8  ssp_iport:1;
+			u8  _un247:4;
+		};
+		u8 initiator_bits;
+	};
+
+	/* Byte 3 */
+	union {
+		struct {
+			u8  _un30:1;
+			u8 smp_tport:1;
+			u8 stp_tport:1;
+			u8 ssp_tport:1;
+			u8 _un347:4;
+		};
+		u8 target_bits;
+	};
+
+	/* Byte 4 - 11 */
+	u8 _un4_11[8];
+
+	/* Byte 12 - 19 */
+	u8 sas_addr[SAS_ADDR_SIZE];
+
+	/* Byte 20 */
+	u8 phy_id;
+
+	u8 _un21_27[7];
+
+} __packed;
+
+#elif defined(__BIG_ENDIAN_BITFIELD)
+struct sas_identify_frame_local {
+	/* Byte 0 */
+	u8  _un0:1;
+	u8  dev_type:3;
+	u8  frame_type:4;
+
+	/* Byte 1 */
+	u8  _un1;
+
+	/* Byte 2 */
+	union {
+		struct {
+			u8  _un247:4;
+			u8  ssp_iport:1;
+			u8  stp_iport:1;
+			u8  smp_iport:1;
+			u8  _un20:1;
+		};
+		u8 initiator_bits;
+	};
+
+	/* Byte 3 */
+	union {
+		struct {
+			u8 _un347:4;
+			u8 ssp_tport:1;
+			u8 stp_tport:1;
+			u8 smp_tport:1;
+			u8 _un30:1;
+		};
+		u8 target_bits;
+	};
+
+	/* Byte 4 - 11 */
+	u8 _un4_11[8];
+
+	/* Byte 12 - 19 */
+	u8 sas_addr[SAS_ADDR_SIZE];
+
+	/* Byte 20 */
+	u8 phy_id;
+
+	u8 _un21_27[7];
+} __packed;
+#else
+#error "Bitfield order not defined!"
+#endif
+
 struct mpi_msg_hdr {
 	__le32	header;	/* Bits [11:0] - Message operation code */
 	/* Bits [15:12] - Message Category */
@@ -248,7 +344,7 @@ struct mpi_msg_hdr {
 struct phy_start_req {
 	__le32	tag;
 	__le32	ase_sh_lm_slr_phyid;
-	struct sas_identify_frame sas_identify; /* 28 Bytes */
+	struct sas_identify_frame_local sas_identify; /* 28 Bytes */
 	__le32 spasti;
 	u32	reserved[21];
 } __attribute__((packed, aligned(4)));
-- 
2.12.3

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

* [PATCH V2 2/9] pm80xx : ILA and inactive firmware version through sysfs
  2015-02-17 23:36 [PATCH V2 0/9] pm80xx updates Viswas G
  2015-02-17 23:36 ` [PATCH V2 1/9] pm80xx : redefine sas_identify_frame structure Viswas G
@ 2015-02-17 23:36 ` Viswas G
  2015-02-17 23:36 ` [PATCH V2 3/9] pm80xx : Different SAS addresses for phys Viswas G
                   ` (7 subsequent siblings)
  9 siblings, 0 replies; 19+ messages in thread
From: Viswas G @ 2015-02-17 23:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, deepak.ukey, Raj.Dinesh,
	jinpu.wang, martin.petersen

Added support to read ILA version and inactive firmware version
from MPI configuration table and export through sysfs.

Signed-off-by: Deepak Ukey <deepak.ukey@microsemi.com>
Signed-off-by: Viswas G <Viswas.G@microsemi.com>

Acked-by: Jack Wang <jinpu.wang@profitbricks.com>
---
 drivers/scsi/pm8001/pm8001_ctl.c | 54 ++++++++++++++++++++++++++++++++++++++++
 drivers/scsi/pm8001/pm8001_sas.h |  2 ++
 drivers/scsi/pm8001/pm80xx_hwi.c |  5 ++++
 drivers/scsi/pm8001/pm80xx_hwi.h |  2 ++
 4 files changed, 63 insertions(+)

diff --git a/drivers/scsi/pm8001/pm8001_ctl.c b/drivers/scsi/pm8001/pm8001_ctl.c
index be8269c8d127..596f3ff965f5 100644
--- a/drivers/scsi/pm8001/pm8001_ctl.c
+++ b/drivers/scsi/pm8001/pm8001_ctl.c
@@ -98,6 +98,58 @@ static ssize_t pm8001_ctl_fw_version_show(struct device *cdev,
 	}
 }
 static DEVICE_ATTR(fw_version, S_IRUGO, pm8001_ctl_fw_version_show, NULL);
+
+/**
+ * pm8001_ctl_ila_version_show - ila version
+ * @cdev: pointer to embedded class device
+ * @buf: the buffer returned
+ *
+ * A sysfs 'read-only' shost attribute.
+ */
+static ssize_t pm8001_ctl_ila_version_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;
+
+	if (pm8001_ha->chip_id != chip_8001) {
+		return snprintf(buf, PAGE_SIZE, "%02x.%02x.%02x.%02x\n",
+		(u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.ila_version >> 24),
+		(u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.ila_version >> 16),
+		(u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.ila_version >> 8),
+		(u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.ila_version));
+	}
+	return 0;
+}
+static DEVICE_ATTR(ila_version, 0444, pm8001_ctl_ila_version_show, NULL);
+
+/**
+ * pm8001_ctl_inactive_fw_version_show - Inacative firmware version number
+ * @cdev: pointer to embedded class device
+ * @buf: the buffer returned
+ *
+ * A sysfs 'read-only' shost attribute.
+ */
+static ssize_t pm8001_ctl_inactive_fw_version_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;
+
+	if (pm8001_ha->chip_id != chip_8001) {
+		return snprintf(buf, PAGE_SIZE, "%02x.%02x.%02x.%02x\n",
+		(u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.inc_fw_version >> 24),
+		(u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.inc_fw_version >> 16),
+		(u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.inc_fw_version >> 8),
+		(u8)(pm8001_ha->main_cfg_tbl.pm80xx_tbl.inc_fw_version));
+	}
+	return 0;
+}
+static
+DEVICE_ATTR(inc_fw_ver, 0444, pm8001_ctl_inactive_fw_version_show, NULL);
+
 /**
  * pm8001_ctl_max_out_io_show - max outstanding io supported
  * @cdev: pointer to embedded class device
@@ -748,6 +800,8 @@ struct device_attribute *pm8001_host_attrs[] = {
 	&dev_attr_bios_version,
 	&dev_attr_ib_log,
 	&dev_attr_ob_log,
+	&dev_attr_ila_version,
+	&dev_attr_inc_fw_ver,
 	NULL,
 };
 
diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
index e81a8fa7ef1a..c75de413e062 100644
--- a/drivers/scsi/pm8001/pm8001_sas.h
+++ b/drivers/scsi/pm8001/pm8001_sas.h
@@ -404,6 +404,8 @@ union main_cfg_table {
 	u32			port_recovery_timer;
 	u32			interrupt_reassertion_delay;
 	u32			fatal_n_non_fatal_dump;	        /* 0x28 */
+	u32			ila_version;
+	u32			inc_fw_version;
 	} pm80xx_tbl;
 };
 
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index eb4fee61df72..8fb5ddf08cc4 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -312,6 +312,11 @@ static void read_main_config_table(struct pm8001_hba_info *pm8001_ha)
 	/* read port recover and reset timeout */
 	pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer =
 		pm8001_mr32(address, MAIN_PORT_RECOVERY_TIMER);
+	/* read ILA and inactive firmware version */
+	pm8001_ha->main_cfg_tbl.pm80xx_tbl.ila_version =
+		pm8001_mr32(address, MAIN_MPI_ILA_RELEASE_TYPE);
+	pm8001_ha->main_cfg_tbl.pm80xx_tbl.inc_fw_version =
+		pm8001_mr32(address, MAIN_MPI_INACTIVE_FW_VERSION);
 }
 
 /**
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.h b/drivers/scsi/pm8001/pm80xx_hwi.h
index 82b8cf581da9..e36c5176f9a9 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.h
+++ b/drivers/scsi/pm8001/pm80xx_hwi.h
@@ -1445,6 +1445,8 @@ typedef struct SASProtocolTimerConfig SASProtocolTimerConfig_t;
 #define MAIN_SAS_PHY_ATTR_TABLE_OFFSET	0x90 /* DWORD 0x24 */
 #define MAIN_PORT_RECOVERY_TIMER	0x94 /* DWORD 0x25 */
 #define MAIN_INT_REASSERTION_DELAY	0x98 /* DWORD 0x26 */
+#define MAIN_MPI_ILA_RELEASE_TYPE	0xA4 /* DWORD 0x29 */
+#define MAIN_MPI_INACTIVE_FW_VERSION	0XB0 /* DWORD 0x2C */
 
 /* Gereral Status Table offset - byte offset */
 #define GST_GSTLEN_MPIS_OFFSET		0x00
-- 
2.12.3

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

* [PATCH V2 3/9] pm80xx : Different SAS addresses for phys.
  2015-02-17 23:36 [PATCH V2 0/9] pm80xx updates Viswas G
  2015-02-17 23:36 ` [PATCH V2 1/9] pm80xx : redefine sas_identify_frame structure Viswas G
  2015-02-17 23:36 ` [PATCH V2 2/9] pm80xx : ILA and inactive firmware version through sysfs Viswas G
@ 2015-02-17 23:36 ` Viswas G
  2015-02-17 23:36 ` [PATCH V2 4/9] pm80xx : tag allocation for phy control request Viswas G
                   ` (6 subsequent siblings)
  9 siblings, 0 replies; 19+ messages in thread
From: Viswas G @ 2015-02-17 23:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, deepak.ukey, Raj.Dinesh,
	jinpu.wang, martin.petersen

Different SAS addresses are assigned for each set of phys.

Signed-off-by: Viswas G <Viswas.G@microsemi.com>
Acked-by: Jack Wang <jinpu.wang@profitbricks.com>
---
 drivers/scsi/pm8001/pm8001_init.c | 13 +++++++++----
 drivers/scsi/pm8001/pm80xx_hwi.c  |  3 +--
 2 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/pm8001/pm8001_init.c b/drivers/scsi/pm8001/pm8001_init.c
index 034b2f7d1135..d282f1562615 100644
--- a/drivers/scsi/pm8001/pm8001_init.c
+++ b/drivers/scsi/pm8001/pm8001_init.c
@@ -132,7 +132,7 @@ static void pm8001_phy_init(struct pm8001_hba_info *pm8001_ha, int phy_id)
 	sas_phy->oob_mode = OOB_NOT_CONNECTED;
 	sas_phy->linkrate = SAS_LINK_RATE_UNKNOWN;
 	sas_phy->id = phy_id;
-	sas_phy->sas_addr = &pm8001_ha->sas_addr[0];
+	sas_phy->sas_addr = (u8 *)&phy->dev_sas_addr;
 	sas_phy->frame_rcvd = &phy->frame_rcvd[0];
 	sas_phy->ha = (struct sas_ha_struct *)pm8001_ha->shost->hostdata;
 	sas_phy->lldd_phy = phy;
@@ -593,10 +593,12 @@ static void  pm8001_post_sas_ha_init(struct Scsi_Host *shost,
 	for (i = 0; i < chip_info->n_phy; i++) {
 		sha->sas_phy[i] = &pm8001_ha->phy[i].sas_phy;
 		sha->sas_port[i] = &pm8001_ha->port[i].sas_port;
+		sha->sas_phy[i]->sas_addr =
+			(u8 *)&pm8001_ha->phy[i].dev_sas_addr;
 	}
 	sha->sas_ha_name = DRV_NAME;
 	sha->dev = pm8001_ha->dev;
-
+	sha->strict_wide_ports = 1;
 	sha->lldd_module = THIS_MODULE;
 	sha->sas_addr = &pm8001_ha->sas_addr[0];
 	sha->num_phys = chip_info->n_phy;
@@ -613,6 +615,7 @@ static void  pm8001_post_sas_ha_init(struct Scsi_Host *shost,
 static void pm8001_init_sas_add(struct pm8001_hba_info *pm8001_ha)
 {
 	u8 i, j;
+	u8 sas_add[8];
 #ifdef PM8001_READ_VPD
 	/* For new SPC controllers WWN is stored in flash vpd
 	*  For SPC/SPCve controllers WWN is stored in EEPROM
@@ -674,10 +677,12 @@ static void pm8001_init_sas_add(struct pm8001_hba_info *pm8001_ha)
 			pm8001_ha->sas_addr[j] =
 					payload.func_specific[0x804 + i];
 	}
-
+	memcpy(sas_add, pm8001_ha->sas_addr, SAS_ADDR_SIZE);
 	for (i = 0; i < pm8001_ha->chip->n_phy; i++) {
+		if (i && ((i % 4) == 0))
+			sas_add[7] = sas_add[7] + 4;
 		memcpy(&pm8001_ha->phy[i].dev_sas_addr,
-			pm8001_ha->sas_addr, SAS_ADDR_SIZE);
+			sas_add, SAS_ADDR_SIZE);
 		PM8001_INIT_DBG(pm8001_ha,
 			pm8001_printk("phy %d sas_addr = %016llx\n", i,
 			pm8001_ha->phy[i].dev_sas_addr));
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index 8fb5ddf08cc4..2b26445d1b97 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -3041,7 +3041,6 @@ hw_event_phy_down(struct pm8001_hba_info *pm8001_ha, void *piomb)
 	port->port_state = portstate;
 	phy->identify.device_type = 0;
 	phy->phy_attached = 0;
-	memset(&phy->dev_sas_addr, 0, SAS_ADDR_SIZE);
 	switch (portstate) {
 	case PORT_VALID:
 		break;
@@ -4394,7 +4393,7 @@ pm80xx_chip_phy_start_req(struct pm8001_hba_info *pm8001_ha, u8 phy_id)
 	payload.sas_identify.dev_type = SAS_END_DEVICE;
 	payload.sas_identify.initiator_bits = SAS_PROTOCOL_ALL;
 	memcpy(payload.sas_identify.sas_addr,
-		pm8001_ha->sas_addr, SAS_ADDR_SIZE);
+	  &pm8001_ha->phy[phy_id].dev_sas_addr, SAS_ADDR_SIZE);
 	payload.sas_identify.phy_id = phy_id;
 	ret = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opcode, &payload, 0);
 	return ret;
-- 
2.12.3

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

* [PATCH V2 4/9] pm80xx : tag allocation for phy control request.
  2015-02-17 23:36 [PATCH V2 0/9] pm80xx updates Viswas G
                   ` (2 preceding siblings ...)
  2015-02-17 23:36 ` [PATCH V2 3/9] pm80xx : Different SAS addresses for phys Viswas G
@ 2015-02-17 23:36 ` Viswas G
  2017-09-13 11:10   ` Jinpu Wang
  2015-02-17 23:36 ` [PATCH V2 5/9] pm80xx : cleanup in pm8001_abort_task function Viswas G
                   ` (5 subsequent siblings)
  9 siblings, 1 reply; 19+ messages in thread
From: Viswas G @ 2015-02-17 23:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, deepak.ukey, Raj.Dinesh,
	jinpu.wang, martin.petersen

tag is taken from the tag pool instead of using the hardcoded
tag value(1).

Signed-off-by: Deepak Ukey <deepak.ukey@microsemi.com>
Signed-off-by: Viswas G <Viswas.G@microsemi.com>
---
 drivers/scsi/pm8001/pm8001_hwi.c |  3 +++
 drivers/scsi/pm8001/pm80xx_hwi.c | 10 +++++++---
 2 files changed, 10 insertions(+), 3 deletions(-)

diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c
index 10546faac58c..bc4a6f649ec9 100644
--- a/drivers/scsi/pm8001/pm8001_hwi.c
+++ b/drivers/scsi/pm8001/pm8001_hwi.c
@@ -3198,11 +3198,13 @@ pm8001_mpi_get_nvmd_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)
 
 int pm8001_mpi_local_phy_ctl(struct pm8001_hba_info *pm8001_ha, void *piomb)
 {
+	u32 tag;
 	struct local_phy_ctl_resp *pPayload =
 		(struct local_phy_ctl_resp *)(piomb + 4);
 	u32 status = le32_to_cpu(pPayload->status);
 	u32 phy_id = le32_to_cpu(pPayload->phyop_phyid) & ID_BITS;
 	u32 phy_op = le32_to_cpu(pPayload->phyop_phyid) & OP_BITS;
+	tag = le32_to_cpu(pPayload->tag);
 	if (status != 0) {
 		PM8001_MSG_DBG(pm8001_ha,
 			pm8001_printk("%x phy execute %x phy op failed!\n",
@@ -3211,6 +3213,7 @@ int pm8001_mpi_local_phy_ctl(struct pm8001_hba_info *pm8001_ha, void *piomb)
 		PM8001_MSG_DBG(pm8001_ha,
 			pm8001_printk("%x phy execute %x phy op success!\n",
 			phy_id, phy_op));
+	pm8001_tag_free(pm8001_ha, tag);
 	return 0;
 }
 
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index 2b26445d1b97..baab8a19c78e 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -4500,17 +4500,21 @@ static int pm80xx_chip_reg_dev_req(struct pm8001_hba_info *pm8001_ha,
 static int pm80xx_chip_phy_ctl_req(struct pm8001_hba_info *pm8001_ha,
 	u32 phyId, u32 phy_op)
 {
+	u32 tag;
+	int rc;
 	struct local_phy_ctl_req payload;
 	struct inbound_queue_table *circularQ;
 	int ret;
 	u32 opc = OPC_INB_LOCAL_PHY_CONTROL;
 	memset(&payload, 0, sizeof(payload));
+	rc = pm8001_tag_alloc(pm8001_ha, &tag);
+	if (rc)
+		return rc;
 	circularQ = &pm8001_ha->inbnd_q_tbl[0];
-	payload.tag = cpu_to_le32(1);
+	payload.tag = cpu_to_le32(tag);
 	payload.phyop_phyid =
 		cpu_to_le32(((phy_op & 0xFF) << 8) | (phyId & 0xFF));
-	ret = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
-	return ret;
+	return pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
 }
 
 static u32 pm80xx_chip_is_our_interupt(struct pm8001_hba_info *pm8001_ha)
-- 
2.12.3

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

* [PATCH V2 5/9] pm80xx : cleanup in pm8001_abort_task function.
  2015-02-17 23:36 [PATCH V2 0/9] pm80xx updates Viswas G
                   ` (3 preceding siblings ...)
  2015-02-17 23:36 ` [PATCH V2 4/9] pm80xx : tag allocation for phy control request Viswas G
@ 2015-02-17 23:36 ` Viswas G
  2017-09-13 13:12   ` Jinpu Wang
  2015-02-17 23:36 ` [PATCH V2 6/9] pm80xx : modified port reset timer value for PM8006 card Viswas G
                   ` (4 subsequent siblings)
  9 siblings, 1 reply; 19+ messages in thread
From: Viswas G @ 2015-02-17 23:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, deepak.ukey, Raj.Dinesh,
	jinpu.wang, martin.petersen

Signed-off-by: Deepak Ukey <deepak.ukey@microsemi.com>
Signed-off-by: Viswas G <Viswas.G@microsemi.com>
---
 drivers/scsi/pm8001/pm8001_sas.c | 49 +++++++++++-----------------------------
 1 file changed, 13 insertions(+), 36 deletions(-)

diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c
index ce584c31d36e..e80b0542a67f 100644
--- a/drivers/scsi/pm8001/pm8001_sas.c
+++ b/drivers/scsi/pm8001/pm8001_sas.c
@@ -1159,40 +1159,35 @@ int pm8001_query_task(struct sas_task *task)
 int pm8001_abort_task(struct sas_task *task)
 {
 	unsigned long flags;
-	u32 tag = 0xdeadbeef;
+	u32 tag;
 	u32 device_id;
 	struct domain_device *dev ;
-	struct pm8001_hba_info *pm8001_ha = NULL;
+	struct pm8001_hba_info *pm8001_ha;
 	struct pm8001_ccb_info *ccb;
 	struct scsi_lun lun;
 	struct pm8001_device *pm8001_dev;
 	struct pm8001_tmf_task tmf_task;
 	int rc = TMF_RESP_FUNC_FAILED;
 	if (unlikely(!task || !task->lldd_task || !task->dev))
-		return rc;
+		return TMF_RESP_FUNC_FAILED;
+	dev = task->dev;
+	pm8001_dev = dev->lldd_dev;
+	pm8001_ha = pm8001_find_ha_by_dev(dev);
+	device_id = pm8001_dev->device_id;
+	rc = pm8001_find_tag(task, &tag);
+	if (rc == 0) {
+		pm8001_printk("no tag for task:%p\n", task);
+		return TMF_RESP_FUNC_FAILED;
+	}
 	spin_lock_irqsave(&task->task_state_lock, flags);
 	if (task->task_state_flags & SAS_TASK_STATE_DONE) {
 		spin_unlock_irqrestore(&task->task_state_lock, flags);
-		rc = TMF_RESP_FUNC_COMPLETE;
-		goto out;
+		return TMF_RESP_FUNC_COMPLETE;
 	}
 	spin_unlock_irqrestore(&task->task_state_lock, flags);
 	if (task->task_proto & SAS_PROTOCOL_SSP) {
 		struct scsi_cmnd *cmnd = task->uldd_task;
-		dev = task->dev;
-		ccb = task->lldd_task;
-		pm8001_dev = dev->lldd_dev;
-		pm8001_ha = pm8001_find_ha_by_dev(dev);
 		int_to_scsilun(cmnd->device->lun, &lun);
-		rc = pm8001_find_tag(task, &tag);
-		if (rc == 0) {
-			printk(KERN_INFO "No such tag in %s\n", __func__);
-			rc = TMF_RESP_FUNC_FAILED;
-			return rc;
-		}
-		device_id = pm8001_dev->device_id;
-		PM8001_EH_DBG(pm8001_ha,
-			pm8001_printk("abort io to deviceid= %d\n", device_id));
 		tmf_task.tmf = TMF_ABORT_TASK;
 		tmf_task.tag_of_task_to_be_managed = tag;
 		rc = pm8001_issue_ssp_tmf(dev, lun.scsi_lun, &tmf_task);
@@ -1200,28 +1195,10 @@ int pm8001_abort_task(struct sas_task *task)
 			pm8001_dev->sas_device, 0, tag);
 	} else if (task->task_proto & SAS_PROTOCOL_SATA ||
 		task->task_proto & SAS_PROTOCOL_STP) {
-		dev = task->dev;
-		pm8001_dev = dev->lldd_dev;
-		pm8001_ha = pm8001_find_ha_by_dev(dev);
-		rc = pm8001_find_tag(task, &tag);
-		if (rc == 0) {
-			printk(KERN_INFO "No such tag in %s\n", __func__);
-			rc = TMF_RESP_FUNC_FAILED;
-			return rc;
-		}
 		rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev,
 			pm8001_dev->sas_device, 0, tag);
 	} else if (task->task_proto & SAS_PROTOCOL_SMP) {
 		/* SMP */
-		dev = task->dev;
-		pm8001_dev = dev->lldd_dev;
-		pm8001_ha = pm8001_find_ha_by_dev(dev);
-		rc = pm8001_find_tag(task, &tag);
-		if (rc == 0) {
-			printk(KERN_INFO "No such tag in %s\n", __func__);
-			rc = TMF_RESP_FUNC_FAILED;
-			return rc;
-		}
 		rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev,
 			pm8001_dev->sas_device, 0, tag);
 
-- 
2.12.3

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

* [PATCH V2 6/9] pm80xx : modified port reset timer value for PM8006 card
  2015-02-17 23:36 [PATCH V2 0/9] pm80xx updates Viswas G
                   ` (4 preceding siblings ...)
  2015-02-17 23:36 ` [PATCH V2 5/9] pm80xx : cleanup in pm8001_abort_task function Viswas G
@ 2015-02-17 23:36 ` Viswas G
  2017-09-13 11:10   ` Jinpu Wang
  2015-02-17 23:36 ` [PATCH V2 7/9] pm80xx : corrected SATA abort handling sequence Viswas G
                   ` (3 subsequent siblings)
  9 siblings, 1 reply; 19+ messages in thread
From: Viswas G @ 2015-02-17 23:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, deepak.ukey, Raj.Dinesh,
	jinpu.wang, martin.petersen

Added port reset timer value as 2000ms for PM8006 sata controller.

Signed-off-by: Deepak Ukey <deepak.ukey@microsemi.com>
Signed-off-by: Viswas G <Viswas.G@microsemi.com>
---
 drivers/scsi/pm8001/pm80xx_hwi.c | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index baab8a19c78e..8f1f5dc77d71 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -597,6 +597,12 @@ static void update_main_config_table(struct pm8001_hba_info *pm8001_ha)
 	pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer &= 0xffff0000;
 	pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer |=
 							PORT_RECOVERY_TIMEOUT;
+	if (pm8001_ha->chip_id == chip_8006) {
+		pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer &=
+					0x0000ffff;
+		pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer |=
+					0x140000;
+	}
 	pm8001_mw32(address, MAIN_PORT_RECOVERY_TIMER,
 			pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer);
 }
-- 
2.12.3

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

* [PATCH V2 7/9] pm80xx : corrected SATA abort handling sequence.
  2015-02-17 23:36 [PATCH V2 0/9] pm80xx updates Viswas G
                   ` (5 preceding siblings ...)
  2015-02-17 23:36 ` [PATCH V2 6/9] pm80xx : modified port reset timer value for PM8006 card Viswas G
@ 2015-02-17 23:36 ` Viswas G
  2017-09-13 11:12   ` Jinpu Wang
  2015-02-17 23:36 ` [PATCH V2 8/9] pm80xx : panic on ncq error cleaning up the read log Viswas G
                   ` (2 subsequent siblings)
  9 siblings, 1 reply; 19+ messages in thread
From: Viswas G @ 2015-02-17 23:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, deepak.ukey, Raj.Dinesh,
	jinpu.wang, martin.petersen

Modified SATA abort handling with following steps:
1) Set device state as recovery.
2) Send phy reset.
3) Wait for reset completion.
4) After successful reset, abort all IO's to the device.
5) After aborting all IO's to device, set device state as operational.

Signed-off-by: Deepak Ukey <deepak.ukey@microsemi.com>
Signed-off-by: Viswas G <Viswas.G@microsemi.com>
---
 drivers/scsi/pm8001/pm8001_hwi.c |  8 ++++-
 drivers/scsi/pm8001/pm8001_sas.c | 71 ++++++++++++++++++++++++++++++++++++++--
 drivers/scsi/pm8001/pm8001_sas.h |  8 +++++
 drivers/scsi/pm8001/pm80xx_hwi.c | 36 ++++++++++++++++----
 4 files changed, 113 insertions(+), 10 deletions(-)

diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c
index bc4a6f649ec9..db88a8e7ee0e 100644
--- a/drivers/scsi/pm8001/pm8001_hwi.c
+++ b/drivers/scsi/pm8001/pm8001_hwi.c
@@ -3209,10 +3209,16 @@ int pm8001_mpi_local_phy_ctl(struct pm8001_hba_info *pm8001_ha, void *piomb)
 		PM8001_MSG_DBG(pm8001_ha,
 			pm8001_printk("%x phy execute %x phy op failed!\n",
 			phy_id, phy_op));
-	} else
+	} else {
 		PM8001_MSG_DBG(pm8001_ha,
 			pm8001_printk("%x phy execute %x phy op success!\n",
 			phy_id, phy_op));
+		pm8001_ha->phy[phy_id].reset_success = true;
+	}
+	if (pm8001_ha->phy[phy_id].enable_completion) {
+		complete(pm8001_ha->phy[phy_id].enable_completion);
+		pm8001_ha->phy[phy_id].enable_completion = NULL;
+	}
 	pm8001_tag_free(pm8001_ha, tag);
 	return 0;
 }
diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c
index e80b0542a67f..60d5bec5c45e 100644
--- a/drivers/scsi/pm8001/pm8001_sas.c
+++ b/drivers/scsi/pm8001/pm8001_sas.c
@@ -1167,13 +1167,16 @@ int pm8001_abort_task(struct sas_task *task)
 	struct scsi_lun lun;
 	struct pm8001_device *pm8001_dev;
 	struct pm8001_tmf_task tmf_task;
-	int rc = TMF_RESP_FUNC_FAILED;
+	int rc = TMF_RESP_FUNC_FAILED, ret;
+	u32 phy_id;
+	struct sas_task_slow slow_task;
 	if (unlikely(!task || !task->lldd_task || !task->dev))
 		return TMF_RESP_FUNC_FAILED;
 	dev = task->dev;
 	pm8001_dev = dev->lldd_dev;
 	pm8001_ha = pm8001_find_ha_by_dev(dev);
 	device_id = pm8001_dev->device_id;
+	phy_id = pm8001_dev->attached_phy;
 	rc = pm8001_find_tag(task, &tag);
 	if (rc == 0) {
 		pm8001_printk("no tag for task:%p\n", task);
@@ -1184,6 +1187,11 @@ int pm8001_abort_task(struct sas_task *task)
 		spin_unlock_irqrestore(&task->task_state_lock, flags);
 		return TMF_RESP_FUNC_COMPLETE;
 	}
+	task->task_state_flags |= SAS_TASK_STATE_ABORTED;
+	if (task->slow_task == NULL) {
+		init_completion(&slow_task.completion);
+		task->slow_task = &slow_task;
+	}
 	spin_unlock_irqrestore(&task->task_state_lock, flags);
 	if (task->task_proto & SAS_PROTOCOL_SSP) {
 		struct scsi_cmnd *cmnd = task->uldd_task;
@@ -1195,8 +1203,61 @@ int pm8001_abort_task(struct sas_task *task)
 			pm8001_dev->sas_device, 0, tag);
 	} else if (task->task_proto & SAS_PROTOCOL_SATA ||
 		task->task_proto & SAS_PROTOCOL_STP) {
-		rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev,
-			pm8001_dev->sas_device, 0, tag);
+		if (pm8001_ha->chip_id == chip_8006) {
+			DECLARE_COMPLETION_ONSTACK(completion_reset);
+			DECLARE_COMPLETION_ONSTACK(completion);
+			struct pm8001_phy *phy = pm8001_ha->phy + phy_id;
+			/* 1. Set Device state as Recovery*/
+			pm8001_dev->setds_completion = &completion;
+			PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha,
+				pm8001_dev, 0x03);
+			wait_for_completion(&completion);
+			/* 2. Send Phy Control Hard Reset */
+			reinit_completion(&completion);
+			phy->reset_success = false;
+			phy->enable_completion = &completion;
+			phy->reset_completion = &completion_reset;
+			ret = PM8001_CHIP_DISP->phy_ctl_req(pm8001_ha, phy_id,
+				PHY_HARD_RESET);
+			if (ret)
+				goto out;
+			PM8001_MSG_DBG(pm8001_ha,
+				pm8001_printk("Waiting for local phy ctl\n"));
+			wait_for_completion(&completion);
+			if (!phy->reset_success)
+				goto out;
+			/* 3. Wait for Port Reset complete / Port reset TMO*/
+			PM8001_MSG_DBG(pm8001_ha,
+				pm8001_printk("Waiting for Port reset\n"));
+			wait_for_completion(&completion_reset);
+			if (phy->port_reset_status)
+				goto out;
+			/* 4. SATA Abort ALL
+			 * we wait for the task to be aborted so that the task
+			 * is removed from the ccb. on success the caller is
+			 * going to free the task.
+			 */
+			ret = pm8001_exec_internal_task_abort(pm8001_ha,
+				pm8001_dev, pm8001_dev->sas_device, 1, tag);
+			if (ret)
+				goto out;
+			ret = wait_for_completion_timeout(
+				&task->slow_task->completion,
+				PM8001_TASK_TIMEOUT * HZ);
+			if (!ret)
+				goto out;
+
+			/* 5. Set Device State as Operational */
+			reinit_completion(&completion);
+			pm8001_dev->setds_completion = &completion;
+			PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha,
+				pm8001_dev, 0x01);
+			wait_for_completion(&completion);
+		} else {
+			rc = pm8001_exec_internal_task_abort(pm8001_ha,
+				pm8001_dev, pm8001_dev->sas_device, 0, tag);
+		}
+		rc = TMF_RESP_FUNC_COMPLETE;
 	} else if (task->task_proto & SAS_PROTOCOL_SMP) {
 		/* SMP */
 		rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev,
@@ -1204,6 +1265,10 @@ int pm8001_abort_task(struct sas_task *task)
 
 	}
 out:
+	spin_lock_irqsave(&task->task_state_lock, flags);
+	if (task->slow_task == &slow_task)
+		task->slow_task = NULL;
+	spin_unlock_irqrestore(&task->task_state_lock, flags);
 	if (rc != TMF_RESP_FUNC_COMPLETE)
 		pm8001_printk("rc= %d\n", rc);
 	return rc;
diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
index c75de413e062..80b4dd6df0c2 100644
--- a/drivers/scsi/pm8001/pm8001_sas.h
+++ b/drivers/scsi/pm8001/pm8001_sas.h
@@ -263,8 +263,15 @@ struct pm8001_phy {
 	u8			phy_state;
 	enum sas_linkrate	minimum_linkrate;
 	enum sas_linkrate	maximum_linkrate;
+	struct completion	*reset_completion;
+	bool			port_reset_status;
+	bool			reset_success;
 };
 
+/* port reset status */
+#define PORT_RESET_SUCCESS	0x00
+#define PORT_RESET_TMO		0x01
+
 struct pm8001_device {
 	enum sas_device_type	dev_type;
 	struct domain_device	*sas_device;
@@ -533,6 +540,7 @@ struct pm8001_hba_info {
 	u32			smp_exp_mode;
 	const struct firmware 	*fw_image;
 	struct isr_param irq_vector[PM8001_MAX_MSIX_VEC];
+	u32			reset_in_progress;
 };
 
 struct pm8001_work {
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index 8f1f5dc77d71..92d2045dea68 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -1781,6 +1781,8 @@ mpi_ssp_completion(struct pm8001_hba_info *pm8001_ha , void *piomb)
 			"task 0x%p done with io_status 0x%x resp 0x%x "
 			"stat 0x%x but aborted by upper layer!\n",
 			t, status, ts->resp, ts->stat));
+		if (t->slow_task)
+			complete(&t->slow_task->completion);
 		pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
 	} else {
 		spin_unlock_irqrestore(&t->task_state_lock, flags);
@@ -3044,6 +3046,7 @@ hw_event_phy_down(struct pm8001_hba_info *pm8001_ha, void *piomb)
 
 	struct pm8001_port *port = &pm8001_ha->port[port_id];
 	struct pm8001_phy *phy = &pm8001_ha->phy[phy_id];
+	u32 port_sata = (phy->phy_type & PORT_TYPE_SATA);
 	port->port_state = portstate;
 	phy->identify.device_type = 0;
 	phy->phy_attached = 0;
@@ -3055,7 +3058,7 @@ hw_event_phy_down(struct pm8001_hba_info *pm8001_ha, void *piomb)
 			pm8001_printk(" PortInvalid portID %d\n", port_id));
 		PM8001_MSG_DBG(pm8001_ha,
 			pm8001_printk(" Last phy Down and port invalid\n"));
-		if (phy->phy_type & PORT_TYPE_SATA) {
+		if (port_sata) {
 			phy->phy_type = 0;
 			port->port_attached = 0;
 			pm80xx_hw_event_ack_req(pm8001_ha, 0, HW_EVENT_PHY_DOWN,
@@ -3077,7 +3080,7 @@ hw_event_phy_down(struct pm8001_hba_info *pm8001_ha, void *piomb)
 			pm8001_printk(" Phy Down and PORT_LOSTCOMM\n"));
 		PM8001_MSG_DBG(pm8001_ha,
 			pm8001_printk(" Last phy Down and port invalid\n"));
-		if (phy->phy_type & PORT_TYPE_SATA) {
+		if (port_sata) {
 			port->port_attached = 0;
 			phy->phy_type = 0;
 			pm80xx_hw_event_ack_req(pm8001_ha, 0, HW_EVENT_PHY_DOWN,
@@ -3093,6 +3096,11 @@ hw_event_phy_down(struct pm8001_hba_info *pm8001_ha, void *piomb)
 		break;
 
 	}
+	if (port_sata && (portstate != PORT_IN_RESET)) {
+		struct sas_ha_struct *sas_ha = pm8001_ha->sas;
+
+		sas_ha->notify_phy_event(&phy->sas_phy, PHYE_LOSS_OF_SIGNAL);
+	}
 }
 
 static int mpi_phy_start_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)
@@ -3195,12 +3203,14 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
 	case HW_EVENT_PHY_DOWN:
 		PM8001_MSG_DBG(pm8001_ha,
 			pm8001_printk("HW_EVENT_PHY_DOWN\n"));
-		if (phy->phy_type & PORT_TYPE_SATA)
-			sas_ha->notify_phy_event(&phy->sas_phy,
-				PHYE_LOSS_OF_SIGNAL);
+		hw_event_phy_down(pm8001_ha, piomb);
+		if (pm8001_ha->reset_in_progress) {
+			PM8001_MSG_DBG(pm8001_ha,
+				pm8001_printk("Reset in progress\n"));
+			return 0;
+		}
 		phy->phy_attached = 0;
 		phy->phy_state = 0;
-		hw_event_phy_down(pm8001_ha, piomb);
 		break;
 	case HW_EVENT_PORT_INVALID:
 		PM8001_MSG_DBG(pm8001_ha,
@@ -3307,9 +3317,17 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
 	case HW_EVENT_PORT_RESET_TIMER_TMO:
 		PM8001_MSG_DBG(pm8001_ha,
 			pm8001_printk("HW_EVENT_PORT_RESET_TIMER_TMO\n"));
+		pm80xx_hw_event_ack_req(pm8001_ha, 0, HW_EVENT_PHY_DOWN,
+			port_id, phy_id, 0, 0);
 		sas_phy_disconnected(sas_phy);
 		phy->phy_attached = 0;
 		sas_ha->notify_port_event(sas_phy, PORTE_LINK_RESET_ERR);
+		if (pm8001_ha->phy[phy_id].reset_completion) {
+			pm8001_ha->phy[phy_id].port_reset_status =
+					PORT_RESET_TMO;
+			complete(pm8001_ha->phy[phy_id].reset_completion);
+			pm8001_ha->phy[phy_id].reset_completion = NULL;
+		}
 		break;
 	case HW_EVENT_PORT_RECOVERY_TIMER_TMO:
 		PM8001_MSG_DBG(pm8001_ha,
@@ -3334,6 +3352,12 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
 	case HW_EVENT_PORT_RESET_COMPLETE:
 		PM8001_MSG_DBG(pm8001_ha,
 			pm8001_printk("HW_EVENT_PORT_RESET_COMPLETE\n"));
+		if (pm8001_ha->phy[phy_id].reset_completion) {
+			pm8001_ha->phy[phy_id].port_reset_status =
+					PORT_RESET_SUCCESS;
+			complete(pm8001_ha->phy[phy_id].reset_completion);
+			pm8001_ha->phy[phy_id].reset_completion = NULL;
+		}
 		break;
 	case EVENT_BROADCAST_ASYNCH_EVENT:
 		PM8001_MSG_DBG(pm8001_ha,
-- 
2.12.3

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

* [PATCH V2 8/9] pm80xx : panic on ncq error cleaning up the read log.
  2015-02-17 23:36 [PATCH V2 0/9] pm80xx updates Viswas G
                   ` (6 preceding siblings ...)
  2015-02-17 23:36 ` [PATCH V2 7/9] pm80xx : corrected SATA abort handling sequence Viswas G
@ 2015-02-17 23:36 ` Viswas G
  2017-09-13 11:13   ` Jinpu Wang
  2015-02-17 23:36 ` [PATCH V2 9/9] pm80xx : corrected linkrate value Viswas G
  2017-09-15 19:35 ` [PATCH V2 0/9] pm80xx updates Martin K. Petersen
  9 siblings, 1 reply; 19+ messages in thread
From: Viswas G @ 2015-02-17 23:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, deepak.ukey, Raj.Dinesh,
	jinpu.wang, martin.petersen

when there's an error in 'ncq mode' the host has to read the ncq
error log (10h) to clear the error state. however, the ccb that
is setup for doing this doesn't setup the ccb so that the
previous state is cleared. if the ccb was previously used for an IO
n_elems is set and pm8001_ccb_task_free() treats this as the signal
to go free a scatter-gather list (that's already been free-ed).

Signed-off-by: Deepak Ukey <deepak.ukey@microsemi.com>
Signed-off-by: Viswas G <Viswas.G@microsemi.com>
---
 drivers/scsi/pm8001/pm80xx_hwi.c | 1 +
 1 file changed, 1 insertion(+)

diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index 92d2045dea68..f2c0839afbe3 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -1489,6 +1489,7 @@ static void pm80xx_send_read_log(struct pm8001_hba_info *pm8001_ha,
 	ccb->device = pm8001_ha_dev;
 	ccb->ccb_tag = ccb_tag;
 	ccb->task = task;
+	ccb->n_elem = 0;
 	pm8001_ha_dev->id |= NCQ_READ_LOG_FLAG;
 	pm8001_ha_dev->id |= NCQ_2ND_RLE_FLAG;
 
-- 
2.12.3

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

* [PATCH V2 9/9] pm80xx : corrected linkrate value.
  2015-02-17 23:36 [PATCH V2 0/9] pm80xx updates Viswas G
                   ` (7 preceding siblings ...)
  2015-02-17 23:36 ` [PATCH V2 8/9] pm80xx : panic on ncq error cleaning up the read log Viswas G
@ 2015-02-17 23:36 ` Viswas G
  2017-09-15 19:35 ` [PATCH V2 0/9] pm80xx updates Martin K. Petersen
  9 siblings, 0 replies; 19+ messages in thread
From: Viswas G @ 2015-02-17 23:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Vasanthalakshmi.Tharmarajan, Viswas.G, deepak.ukey, Raj.Dinesh,
	jinpu.wang, martin.petersen

Corrected the value defined for LINKRATE_60 (6 Gig).

Signed-off-by: Raj Dinesh <Raj.Dinesh@microsemi.com>
Signed-off-by: Viswas G <viswas.g@microsemi.com>
Acked-by: Jack Wang <jinpu.wang@profitbricks.com>
---
 drivers/scsi/pm8001/pm80xx_hwi.h | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/pm8001/pm80xx_hwi.h b/drivers/scsi/pm8001/pm80xx_hwi.h
index e36c5176f9a9..889e69ce3689 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.h
+++ b/drivers/scsi/pm8001/pm80xx_hwi.h
@@ -167,7 +167,7 @@
 #define LINKMODE_AUTO			(0x03 << 12)
 #define LINKRATE_15			(0x01 << 8)
 #define LINKRATE_30			(0x02 << 8)
-#define LINKRATE_60			(0x06 << 8)
+#define LINKRATE_60			(0x04 << 8)
 #define LINKRATE_120			(0x08 << 8)
 
 /* phy_profile */
-- 
2.12.3

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

* Re: [PATCH V2 1/9] pm80xx : redefine sas_identify_frame structure
  2015-02-17 23:36 ` [PATCH V2 1/9] pm80xx : redefine sas_identify_frame structure Viswas G
@ 2017-09-13 11:09   ` Jinpu Wang
  0 siblings, 0 replies; 19+ messages in thread
From: Jinpu Wang @ 2017-09-13 11:09 UTC (permalink / raw)
  To: Viswas G
  Cc: Linux SCSI Mailinglist, Vasanthalakshmi.Tharmarajan, deepak.ukey,
	Raj.Dinesh, Martin K. Petersen

On Wed, Feb 18, 2015 at 12:36 AM, Viswas G <Viswas.G@microsemi.com> wrote:
> sas_identify structure defined by pm80xx doesn't have CRC field.
> So added a new sas_identify structure without CRC.
>
> v2:
>         - Since the structure changes is applicable for only pm80xx,
>           sas_identify_frame_local structure moved to pm80xx_hwi.h.
>
> Signed-off-by: Raj Dinesh <Raj.Dinesh@microsemi.com>
> Signed-off-by: Viswas G <Viswas.G@microsemi.com>
> ---
>  drivers/scsi/pm8001/pm80xx_hwi.h | 98 +++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 97 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/scsi/pm8001/pm80xx_hwi.h b/drivers/scsi/pm8001/pm80xx_hwi.h
> index 7a443bad6163..82b8cf581da9 100644
> --- a/drivers/scsi/pm8001/pm80xx_hwi.h
> +++ b/drivers/scsi/pm8001/pm80xx_hwi.h
> @@ -229,6 +229,102 @@
>  #define IT_NEXUS_TIMEOUT       0x7D0
>  #define PORT_RECOVERY_TIMEOUT  ((IT_NEXUS_TIMEOUT/100) + 30)
>
> +#ifdef __LITTLE_ENDIAN_BITFIELD
> +struct sas_identify_frame_local {
> +       /* Byte 0 */
> +       u8  frame_type:4;
> +       u8  dev_type:3;
> +       u8  _un0:1;
> +
> +       /* Byte 1 */
> +       u8  _un1;
> +
> +       /* Byte 2 */
> +       union {
> +               struct {
> +                       u8  _un20:1;
> +                       u8  smp_iport:1;
> +                       u8  stp_iport:1;
> +                       u8  ssp_iport:1;
> +                       u8  _un247:4;
> +               };
> +               u8 initiator_bits;
> +       };
> +
> +       /* Byte 3 */
> +       union {
> +               struct {
> +                       u8  _un30:1;
> +                       u8 smp_tport:1;
> +                       u8 stp_tport:1;
> +                       u8 ssp_tport:1;
> +                       u8 _un347:4;
> +               };
> +               u8 target_bits;
> +       };
> +
> +       /* Byte 4 - 11 */
> +       u8 _un4_11[8];
> +
> +       /* Byte 12 - 19 */
> +       u8 sas_addr[SAS_ADDR_SIZE];
> +
> +       /* Byte 20 */
> +       u8 phy_id;
> +
> +       u8 _un21_27[7];
> +
> +} __packed;
> +
> +#elif defined(__BIG_ENDIAN_BITFIELD)
> +struct sas_identify_frame_local {
> +       /* Byte 0 */
> +       u8  _un0:1;
> +       u8  dev_type:3;
> +       u8  frame_type:4;
> +
> +       /* Byte 1 */
> +       u8  _un1;
> +
> +       /* Byte 2 */
> +       union {
> +               struct {
> +                       u8  _un247:4;
> +                       u8  ssp_iport:1;
> +                       u8  stp_iport:1;
> +                       u8  smp_iport:1;
> +                       u8  _un20:1;
> +               };
> +               u8 initiator_bits;
> +       };
> +
> +       /* Byte 3 */
> +       union {
> +               struct {
> +                       u8 _un347:4;
> +                       u8 ssp_tport:1;
> +                       u8 stp_tport:1;
> +                       u8 smp_tport:1;
> +                       u8 _un30:1;
> +               };
> +               u8 target_bits;
> +       };
> +
> +       /* Byte 4 - 11 */
> +       u8 _un4_11[8];
> +
> +       /* Byte 12 - 19 */
> +       u8 sas_addr[SAS_ADDR_SIZE];
> +
> +       /* Byte 20 */
> +       u8 phy_id;
> +
> +       u8 _un21_27[7];
> +} __packed;
> +#else
> +#error "Bitfield order not defined!"
> +#endif
> +
>  struct mpi_msg_hdr {
>         __le32  header; /* Bits [11:0] - Message operation code */
>         /* Bits [15:12] - Message Category */
> @@ -248,7 +344,7 @@ struct mpi_msg_hdr {
>  struct phy_start_req {
>         __le32  tag;
>         __le32  ase_sh_lm_slr_phyid;
> -       struct sas_identify_frame sas_identify; /* 28 Bytes */
> +       struct sas_identify_frame_local sas_identify; /* 28 Bytes */
>         __le32 spasti;
>         u32     reserved[21];
>  } __attribute__((packed, aligned(4)));
> --
> 2.12.3
>
Thanks,
Acked-by: Jack Wang <jinpu.wang@profitbricks.com>

-- 
Jack Wang
Linux Kernel Developer

ProfitBricks GmbH
Greifswalder Str. 207
D - 10405 Berlin

Tel:       +49 30 577 008  042
Fax:      +49 30 577 008 299
Email:    jinpu.wang@profitbricks.com
URL:      https://www.profitbricks.de

Sitz der Gesellschaft: Berlin
Registergericht: Amtsgericht Charlottenburg, HRB 125506 B
Geschäftsführer: Achim Weiss

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

* Re: [PATCH V2 4/9] pm80xx : tag allocation for phy control request.
  2015-02-17 23:36 ` [PATCH V2 4/9] pm80xx : tag allocation for phy control request Viswas G
@ 2017-09-13 11:10   ` Jinpu Wang
  0 siblings, 0 replies; 19+ messages in thread
From: Jinpu Wang @ 2017-09-13 11:10 UTC (permalink / raw)
  To: Viswas G
  Cc: Linux SCSI Mailinglist, Vasanthalakshmi.Tharmarajan, deepak.ukey,
	Raj.Dinesh, Martin K. Petersen

On Wed, Feb 18, 2015 at 12:36 AM, Viswas G <Viswas.G@microsemi.com> wrote:
> tag is taken from the tag pool instead of using the hardcoded
> tag value(1).
>
> Signed-off-by: Deepak Ukey <deepak.ukey@microsemi.com>
> Signed-off-by: Viswas G <Viswas.G@microsemi.com>
> ---
>  drivers/scsi/pm8001/pm8001_hwi.c |  3 +++
>  drivers/scsi/pm8001/pm80xx_hwi.c | 10 +++++++---
>  2 files changed, 10 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c
> index 10546faac58c..bc4a6f649ec9 100644
> --- a/drivers/scsi/pm8001/pm8001_hwi.c
> +++ b/drivers/scsi/pm8001/pm8001_hwi.c
> @@ -3198,11 +3198,13 @@ pm8001_mpi_get_nvmd_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)
>
>  int pm8001_mpi_local_phy_ctl(struct pm8001_hba_info *pm8001_ha, void *piomb)
>  {
> +       u32 tag;
>         struct local_phy_ctl_resp *pPayload =
>                 (struct local_phy_ctl_resp *)(piomb + 4);
>         u32 status = le32_to_cpu(pPayload->status);
>         u32 phy_id = le32_to_cpu(pPayload->phyop_phyid) & ID_BITS;
>         u32 phy_op = le32_to_cpu(pPayload->phyop_phyid) & OP_BITS;
> +       tag = le32_to_cpu(pPayload->tag);
>         if (status != 0) {
>                 PM8001_MSG_DBG(pm8001_ha,
>                         pm8001_printk("%x phy execute %x phy op failed!\n",
> @@ -3211,6 +3213,7 @@ int pm8001_mpi_local_phy_ctl(struct pm8001_hba_info *pm8001_ha, void *piomb)
>                 PM8001_MSG_DBG(pm8001_ha,
>                         pm8001_printk("%x phy execute %x phy op success!\n",
>                         phy_id, phy_op));
> +       pm8001_tag_free(pm8001_ha, tag);
>         return 0;
>  }
>
> diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
> index 2b26445d1b97..baab8a19c78e 100644
> --- a/drivers/scsi/pm8001/pm80xx_hwi.c
> +++ b/drivers/scsi/pm8001/pm80xx_hwi.c
> @@ -4500,17 +4500,21 @@ static int pm80xx_chip_reg_dev_req(struct pm8001_hba_info *pm8001_ha,
>  static int pm80xx_chip_phy_ctl_req(struct pm8001_hba_info *pm8001_ha,
>         u32 phyId, u32 phy_op)
>  {
> +       u32 tag;
> +       int rc;
>         struct local_phy_ctl_req payload;
>         struct inbound_queue_table *circularQ;
>         int ret;
>         u32 opc = OPC_INB_LOCAL_PHY_CONTROL;
>         memset(&payload, 0, sizeof(payload));
> +       rc = pm8001_tag_alloc(pm8001_ha, &tag);
> +       if (rc)
> +               return rc;
>         circularQ = &pm8001_ha->inbnd_q_tbl[0];
> -       payload.tag = cpu_to_le32(1);
> +       payload.tag = cpu_to_le32(tag);
>         payload.phyop_phyid =
>                 cpu_to_le32(((phy_op & 0xFF) << 8) | (phyId & 0xFF));
> -       ret = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
> -       return ret;
> +       return pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
>  }
>
>  static u32 pm80xx_chip_is_our_interupt(struct pm8001_hba_info *pm8001_ha)
> --
> 2.12.3
>

Thanks,
Acked-by: Jack Wang <jinpu.wang@profitbricks.com>

-- 
Jack Wang
Linux Kernel Developer

ProfitBricks GmbH
Greifswalder Str. 207
D - 10405 Berlin

Tel:       +49 30 577 008  042
Fax:      +49 30 577 008 299
Email:    jinpu.wang@profitbricks.com
URL:      https://www.profitbricks.de

Sitz der Gesellschaft: Berlin
Registergericht: Amtsgericht Charlottenburg, HRB 125506 B
Geschäftsführer: Achim Weiss

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

* Re: [PATCH V2 6/9] pm80xx : modified port reset timer value for PM8006 card
  2015-02-17 23:36 ` [PATCH V2 6/9] pm80xx : modified port reset timer value for PM8006 card Viswas G
@ 2017-09-13 11:10   ` Jinpu Wang
  0 siblings, 0 replies; 19+ messages in thread
From: Jinpu Wang @ 2017-09-13 11:10 UTC (permalink / raw)
  To: Viswas G
  Cc: Linux SCSI Mailinglist, Vasanthalakshmi.Tharmarajan, deepak.ukey,
	Raj.Dinesh, Martin K. Petersen

On Wed, Feb 18, 2015 at 12:36 AM, Viswas G <Viswas.G@microsemi.com> wrote:
> Added port reset timer value as 2000ms for PM8006 sata controller.
>
> Signed-off-by: Deepak Ukey <deepak.ukey@microsemi.com>
> Signed-off-by: Viswas G <Viswas.G@microsemi.com>
> ---
>  drivers/scsi/pm8001/pm80xx_hwi.c | 6 ++++++
>  1 file changed, 6 insertions(+)
>
> diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
> index baab8a19c78e..8f1f5dc77d71 100644
> --- a/drivers/scsi/pm8001/pm80xx_hwi.c
> +++ b/drivers/scsi/pm8001/pm80xx_hwi.c
> @@ -597,6 +597,12 @@ static void update_main_config_table(struct pm8001_hba_info *pm8001_ha)
>         pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer &= 0xffff0000;
>         pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer |=
>                                                         PORT_RECOVERY_TIMEOUT;
> +       if (pm8001_ha->chip_id == chip_8006) {
> +               pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer &=
> +                                       0x0000ffff;
> +               pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer |=
> +                                       0x140000;
> +       }
>         pm8001_mw32(address, MAIN_PORT_RECOVERY_TIMER,
>                         pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer);
>  }
> --
> 2.12.3
>

Thanks,
Acked-by: Jack Wang <jinpu.wang@profitbricks.com>

-- 
Jack Wang
Linux Kernel Developer

ProfitBricks GmbH
Greifswalder Str. 207
D - 10405 Berlin

Tel:       +49 30 577 008  042
Fax:      +49 30 577 008 299
Email:    jinpu.wang@profitbricks.com
URL:      https://www.profitbricks.de

Sitz der Gesellschaft: Berlin
Registergericht: Amtsgericht Charlottenburg, HRB 125506 B
Geschäftsführer: Achim Weiss

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

* Re: [PATCH V2 7/9] pm80xx : corrected SATA abort handling sequence.
  2015-02-17 23:36 ` [PATCH V2 7/9] pm80xx : corrected SATA abort handling sequence Viswas G
@ 2017-09-13 11:12   ` Jinpu Wang
  0 siblings, 0 replies; 19+ messages in thread
From: Jinpu Wang @ 2017-09-13 11:12 UTC (permalink / raw)
  To: Viswas G
  Cc: Linux SCSI Mailinglist, Vasanthalakshmi.Tharmarajan, deepak.ukey,
	Raj.Dinesh, Martin K. Petersen

On Wed, Feb 18, 2015 at 12:36 AM, Viswas G <Viswas.G@microsemi.com> wrote:
> Modified SATA abort handling with following steps:
> 1) Set device state as recovery.
> 2) Send phy reset.
> 3) Wait for reset completion.
> 4) After successful reset, abort all IO's to the device.
> 5) After aborting all IO's to device, set device state as operational.
>
> Signed-off-by: Deepak Ukey <deepak.ukey@microsemi.com>
> Signed-off-by: Viswas G <Viswas.G@microsemi.com>
> ---
>  drivers/scsi/pm8001/pm8001_hwi.c |  8 ++++-
>  drivers/scsi/pm8001/pm8001_sas.c | 71 ++++++++++++++++++++++++++++++++++++++--
>  drivers/scsi/pm8001/pm8001_sas.h |  8 +++++
>  drivers/scsi/pm8001/pm80xx_hwi.c | 36 ++++++++++++++++----
>  4 files changed, 113 insertions(+), 10 deletions(-)
>
> diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c
> index bc4a6f649ec9..db88a8e7ee0e 100644
> --- a/drivers/scsi/pm8001/pm8001_hwi.c
> +++ b/drivers/scsi/pm8001/pm8001_hwi.c
> @@ -3209,10 +3209,16 @@ int pm8001_mpi_local_phy_ctl(struct pm8001_hba_info *pm8001_ha, void *piomb)
>                 PM8001_MSG_DBG(pm8001_ha,
>                         pm8001_printk("%x phy execute %x phy op failed!\n",
>                         phy_id, phy_op));
> -       } else
> +       } else {
>                 PM8001_MSG_DBG(pm8001_ha,
>                         pm8001_printk("%x phy execute %x phy op success!\n",
>                         phy_id, phy_op));
> +               pm8001_ha->phy[phy_id].reset_success = true;
> +       }
> +       if (pm8001_ha->phy[phy_id].enable_completion) {
> +               complete(pm8001_ha->phy[phy_id].enable_completion);
> +               pm8001_ha->phy[phy_id].enable_completion = NULL;
> +       }
>         pm8001_tag_free(pm8001_ha, tag);
>         return 0;
>  }
> diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c
> index e80b0542a67f..60d5bec5c45e 100644
> --- a/drivers/scsi/pm8001/pm8001_sas.c
> +++ b/drivers/scsi/pm8001/pm8001_sas.c
> @@ -1167,13 +1167,16 @@ int pm8001_abort_task(struct sas_task *task)
>         struct scsi_lun lun;
>         struct pm8001_device *pm8001_dev;
>         struct pm8001_tmf_task tmf_task;
> -       int rc = TMF_RESP_FUNC_FAILED;
> +       int rc = TMF_RESP_FUNC_FAILED, ret;
> +       u32 phy_id;
> +       struct sas_task_slow slow_task;
>         if (unlikely(!task || !task->lldd_task || !task->dev))
>                 return TMF_RESP_FUNC_FAILED;
>         dev = task->dev;
>         pm8001_dev = dev->lldd_dev;
>         pm8001_ha = pm8001_find_ha_by_dev(dev);
>         device_id = pm8001_dev->device_id;
> +       phy_id = pm8001_dev->attached_phy;
>         rc = pm8001_find_tag(task, &tag);
>         if (rc == 0) {
>                 pm8001_printk("no tag for task:%p\n", task);
> @@ -1184,6 +1187,11 @@ int pm8001_abort_task(struct sas_task *task)
>                 spin_unlock_irqrestore(&task->task_state_lock, flags);
>                 return TMF_RESP_FUNC_COMPLETE;
>         }
> +       task->task_state_flags |= SAS_TASK_STATE_ABORTED;
> +       if (task->slow_task == NULL) {
> +               init_completion(&slow_task.completion);
> +               task->slow_task = &slow_task;
> +       }
>         spin_unlock_irqrestore(&task->task_state_lock, flags);
>         if (task->task_proto & SAS_PROTOCOL_SSP) {
>                 struct scsi_cmnd *cmnd = task->uldd_task;
> @@ -1195,8 +1203,61 @@ int pm8001_abort_task(struct sas_task *task)
>                         pm8001_dev->sas_device, 0, tag);
>         } else if (task->task_proto & SAS_PROTOCOL_SATA ||
>                 task->task_proto & SAS_PROTOCOL_STP) {
> -               rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev,
> -                       pm8001_dev->sas_device, 0, tag);
> +               if (pm8001_ha->chip_id == chip_8006) {
> +                       DECLARE_COMPLETION_ONSTACK(completion_reset);
> +                       DECLARE_COMPLETION_ONSTACK(completion);
> +                       struct pm8001_phy *phy = pm8001_ha->phy + phy_id;
> +                       /* 1. Set Device state as Recovery*/
> +                       pm8001_dev->setds_completion = &completion;
> +                       PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha,
> +                               pm8001_dev, 0x03);
> +                       wait_for_completion(&completion);
> +                       /* 2. Send Phy Control Hard Reset */
> +                       reinit_completion(&completion);
> +                       phy->reset_success = false;
> +                       phy->enable_completion = &completion;
> +                       phy->reset_completion = &completion_reset;
> +                       ret = PM8001_CHIP_DISP->phy_ctl_req(pm8001_ha, phy_id,
> +                               PHY_HARD_RESET);
> +                       if (ret)
> +                               goto out;
> +                       PM8001_MSG_DBG(pm8001_ha,
> +                               pm8001_printk("Waiting for local phy ctl\n"));
> +                       wait_for_completion(&completion);
> +                       if (!phy->reset_success)
> +                               goto out;
> +                       /* 3. Wait for Port Reset complete / Port reset TMO*/
> +                       PM8001_MSG_DBG(pm8001_ha,
> +                               pm8001_printk("Waiting for Port reset\n"));
> +                       wait_for_completion(&completion_reset);
> +                       if (phy->port_reset_status)
> +                               goto out;
> +                       /* 4. SATA Abort ALL
> +                        * we wait for the task to be aborted so that the task
> +                        * is removed from the ccb. on success the caller is
> +                        * going to free the task.
> +                        */
> +                       ret = pm8001_exec_internal_task_abort(pm8001_ha,
> +                               pm8001_dev, pm8001_dev->sas_device, 1, tag);
> +                       if (ret)
> +                               goto out;
> +                       ret = wait_for_completion_timeout(
> +                               &task->slow_task->completion,
> +                               PM8001_TASK_TIMEOUT * HZ);
> +                       if (!ret)
> +                               goto out;
> +
> +                       /* 5. Set Device State as Operational */
> +                       reinit_completion(&completion);
> +                       pm8001_dev->setds_completion = &completion;
> +                       PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha,
> +                               pm8001_dev, 0x01);
> +                       wait_for_completion(&completion);
> +               } else {
> +                       rc = pm8001_exec_internal_task_abort(pm8001_ha,
> +                               pm8001_dev, pm8001_dev->sas_device, 0, tag);
> +               }
> +               rc = TMF_RESP_FUNC_COMPLETE;
>         } else if (task->task_proto & SAS_PROTOCOL_SMP) {
>                 /* SMP */
>                 rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev,
> @@ -1204,6 +1265,10 @@ int pm8001_abort_task(struct sas_task *task)
>
>         }
>  out:
> +       spin_lock_irqsave(&task->task_state_lock, flags);
> +       if (task->slow_task == &slow_task)
> +               task->slow_task = NULL;
> +       spin_unlock_irqrestore(&task->task_state_lock, flags);
>         if (rc != TMF_RESP_FUNC_COMPLETE)
>                 pm8001_printk("rc= %d\n", rc);
>         return rc;
> diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
> index c75de413e062..80b4dd6df0c2 100644
> --- a/drivers/scsi/pm8001/pm8001_sas.h
> +++ b/drivers/scsi/pm8001/pm8001_sas.h
> @@ -263,8 +263,15 @@ struct pm8001_phy {
>         u8                      phy_state;
>         enum sas_linkrate       minimum_linkrate;
>         enum sas_linkrate       maximum_linkrate;
> +       struct completion       *reset_completion;
> +       bool                    port_reset_status;
> +       bool                    reset_success;
>  };
>
> +/* port reset status */
> +#define PORT_RESET_SUCCESS     0x00
> +#define PORT_RESET_TMO         0x01
> +
>  struct pm8001_device {
>         enum sas_device_type    dev_type;
>         struct domain_device    *sas_device;
> @@ -533,6 +540,7 @@ struct pm8001_hba_info {
>         u32                     smp_exp_mode;
>         const struct firmware   *fw_image;
>         struct isr_param irq_vector[PM8001_MAX_MSIX_VEC];
> +       u32                     reset_in_progress;
>  };
>
>  struct pm8001_work {
> diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
> index 8f1f5dc77d71..92d2045dea68 100644
> --- a/drivers/scsi/pm8001/pm80xx_hwi.c
> +++ b/drivers/scsi/pm8001/pm80xx_hwi.c
> @@ -1781,6 +1781,8 @@ mpi_ssp_completion(struct pm8001_hba_info *pm8001_ha , void *piomb)
>                         "task 0x%p done with io_status 0x%x resp 0x%x "
>                         "stat 0x%x but aborted by upper layer!\n",
>                         t, status, ts->resp, ts->stat));
> +               if (t->slow_task)
> +                       complete(&t->slow_task->completion);
>                 pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
>         } else {
>                 spin_unlock_irqrestore(&t->task_state_lock, flags);
> @@ -3044,6 +3046,7 @@ hw_event_phy_down(struct pm8001_hba_info *pm8001_ha, void *piomb)
>
>         struct pm8001_port *port = &pm8001_ha->port[port_id];
>         struct pm8001_phy *phy = &pm8001_ha->phy[phy_id];
> +       u32 port_sata = (phy->phy_type & PORT_TYPE_SATA);
>         port->port_state = portstate;
>         phy->identify.device_type = 0;
>         phy->phy_attached = 0;
> @@ -3055,7 +3058,7 @@ hw_event_phy_down(struct pm8001_hba_info *pm8001_ha, void *piomb)
>                         pm8001_printk(" PortInvalid portID %d\n", port_id));
>                 PM8001_MSG_DBG(pm8001_ha,
>                         pm8001_printk(" Last phy Down and port invalid\n"));
> -               if (phy->phy_type & PORT_TYPE_SATA) {
> +               if (port_sata) {
>                         phy->phy_type = 0;
>                         port->port_attached = 0;
>                         pm80xx_hw_event_ack_req(pm8001_ha, 0, HW_EVENT_PHY_DOWN,
> @@ -3077,7 +3080,7 @@ hw_event_phy_down(struct pm8001_hba_info *pm8001_ha, void *piomb)
>                         pm8001_printk(" Phy Down and PORT_LOSTCOMM\n"));
>                 PM8001_MSG_DBG(pm8001_ha,
>                         pm8001_printk(" Last phy Down and port invalid\n"));
> -               if (phy->phy_type & PORT_TYPE_SATA) {
> +               if (port_sata) {
>                         port->port_attached = 0;
>                         phy->phy_type = 0;
>                         pm80xx_hw_event_ack_req(pm8001_ha, 0, HW_EVENT_PHY_DOWN,
> @@ -3093,6 +3096,11 @@ hw_event_phy_down(struct pm8001_hba_info *pm8001_ha, void *piomb)
>                 break;
>
>         }
> +       if (port_sata && (portstate != PORT_IN_RESET)) {
> +               struct sas_ha_struct *sas_ha = pm8001_ha->sas;
> +
> +               sas_ha->notify_phy_event(&phy->sas_phy, PHYE_LOSS_OF_SIGNAL);
> +       }
>  }
>
>  static int mpi_phy_start_resp(struct pm8001_hba_info *pm8001_ha, void *piomb)
> @@ -3195,12 +3203,14 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
>         case HW_EVENT_PHY_DOWN:
>                 PM8001_MSG_DBG(pm8001_ha,
>                         pm8001_printk("HW_EVENT_PHY_DOWN\n"));
> -               if (phy->phy_type & PORT_TYPE_SATA)
> -                       sas_ha->notify_phy_event(&phy->sas_phy,
> -                               PHYE_LOSS_OF_SIGNAL);
> +               hw_event_phy_down(pm8001_ha, piomb);
> +               if (pm8001_ha->reset_in_progress) {
> +                       PM8001_MSG_DBG(pm8001_ha,
> +                               pm8001_printk("Reset in progress\n"));
> +                       return 0;
> +               }
>                 phy->phy_attached = 0;
>                 phy->phy_state = 0;
> -               hw_event_phy_down(pm8001_ha, piomb);
>                 break;
>         case HW_EVENT_PORT_INVALID:
>                 PM8001_MSG_DBG(pm8001_ha,
> @@ -3307,9 +3317,17 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
>         case HW_EVENT_PORT_RESET_TIMER_TMO:
>                 PM8001_MSG_DBG(pm8001_ha,
>                         pm8001_printk("HW_EVENT_PORT_RESET_TIMER_TMO\n"));
> +               pm80xx_hw_event_ack_req(pm8001_ha, 0, HW_EVENT_PHY_DOWN,
> +                       port_id, phy_id, 0, 0);
>                 sas_phy_disconnected(sas_phy);
>                 phy->phy_attached = 0;
>                 sas_ha->notify_port_event(sas_phy, PORTE_LINK_RESET_ERR);
> +               if (pm8001_ha->phy[phy_id].reset_completion) {
> +                       pm8001_ha->phy[phy_id].port_reset_status =
> +                                       PORT_RESET_TMO;
> +                       complete(pm8001_ha->phy[phy_id].reset_completion);
> +                       pm8001_ha->phy[phy_id].reset_completion = NULL;
> +               }
>                 break;
>         case HW_EVENT_PORT_RECOVERY_TIMER_TMO:
>                 PM8001_MSG_DBG(pm8001_ha,
> @@ -3334,6 +3352,12 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
>         case HW_EVENT_PORT_RESET_COMPLETE:
>                 PM8001_MSG_DBG(pm8001_ha,
>                         pm8001_printk("HW_EVENT_PORT_RESET_COMPLETE\n"));
> +               if (pm8001_ha->phy[phy_id].reset_completion) {
> +                       pm8001_ha->phy[phy_id].port_reset_status =
> +                                       PORT_RESET_SUCCESS;
> +                       complete(pm8001_ha->phy[phy_id].reset_completion);
> +                       pm8001_ha->phy[phy_id].reset_completion = NULL;
> +               }
>                 break;
>         case EVENT_BROADCAST_ASYNCH_EVENT:
>                 PM8001_MSG_DBG(pm8001_ha,
> --
> 2.12.3
>

Thanks,
Acked-by: Jack Wang <jinpu.wang@profitbricks.com>

-- 
Jack Wang
Linux Kernel Developer

ProfitBricks GmbH
Greifswalder Str. 207
D - 10405 Berlin

Tel:       +49 30 577 008  042
Fax:      +49 30 577 008 299
Email:    jinpu.wang@profitbricks.com
URL:      https://www.profitbricks.de

Sitz der Gesellschaft: Berlin
Registergericht: Amtsgericht Charlottenburg, HRB 125506 B
Geschäftsführer: Achim Weiss

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

* Re: [PATCH V2 8/9] pm80xx : panic on ncq error cleaning up the read log.
  2015-02-17 23:36 ` [PATCH V2 8/9] pm80xx : panic on ncq error cleaning up the read log Viswas G
@ 2017-09-13 11:13   ` Jinpu Wang
  0 siblings, 0 replies; 19+ messages in thread
From: Jinpu Wang @ 2017-09-13 11:13 UTC (permalink / raw)
  To: Viswas G
  Cc: Linux SCSI Mailinglist, Vasanthalakshmi.Tharmarajan, deepak.ukey,
	Raj.Dinesh, Martin K. Petersen

On Wed, Feb 18, 2015 at 12:36 AM, Viswas G <Viswas.G@microsemi.com> wrote:
> when there's an error in 'ncq mode' the host has to read the ncq
> error log (10h) to clear the error state. however, the ccb that
> is setup for doing this doesn't setup the ccb so that the
> previous state is cleared. if the ccb was previously used for an IO
> n_elems is set and pm8001_ccb_task_free() treats this as the signal
> to go free a scatter-gather list (that's already been free-ed).
>
> Signed-off-by: Deepak Ukey <deepak.ukey@microsemi.com>
> Signed-off-by: Viswas G <Viswas.G@microsemi.com>
> ---
>  drivers/scsi/pm8001/pm80xx_hwi.c | 1 +
>  1 file changed, 1 insertion(+)
>
> diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
> index 92d2045dea68..f2c0839afbe3 100644
> --- a/drivers/scsi/pm8001/pm80xx_hwi.c
> +++ b/drivers/scsi/pm8001/pm80xx_hwi.c
> @@ -1489,6 +1489,7 @@ static void pm80xx_send_read_log(struct pm8001_hba_info *pm8001_ha,
>         ccb->device = pm8001_ha_dev;
>         ccb->ccb_tag = ccb_tag;
>         ccb->task = task;
> +       ccb->n_elem = 0;
>         pm8001_ha_dev->id |= NCQ_READ_LOG_FLAG;
>         pm8001_ha_dev->id |= NCQ_2ND_RLE_FLAG;
>
> --
> 2.12.3
>

Thanks,
Acked-by: Jack Wang <jinpu.wang@profitbricks.com>

-- 
Jack Wang
Linux Kernel Developer

ProfitBricks GmbH
Greifswalder Str. 207
D - 10405 Berlin

Tel:       +49 30 577 008  042
Fax:      +49 30 577 008 299
Email:    jinpu.wang@profitbricks.com
URL:      https://www.profitbricks.de

Sitz der Gesellschaft: Berlin
Registergericht: Amtsgericht Charlottenburg, HRB 125506 B
Geschäftsführer: Achim Weiss

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

* Re: [PATCH V2 5/9] pm80xx : cleanup in pm8001_abort_task function.
  2015-02-17 23:36 ` [PATCH V2 5/9] pm80xx : cleanup in pm8001_abort_task function Viswas G
@ 2017-09-13 13:12   ` Jinpu Wang
  0 siblings, 0 replies; 19+ messages in thread
From: Jinpu Wang @ 2017-09-13 13:12 UTC (permalink / raw)
  To: Viswas G
  Cc: Linux SCSI Mailinglist, Vasanthalakshmi.Tharmarajan, deepak.ukey,
	Raj.Dinesh, Martin K. Petersen

On Wed, Feb 18, 2015 at 12:36 AM, Viswas G <Viswas.G@microsemi.com> wrote:
> Signed-off-by: Deepak Ukey <deepak.ukey@microsemi.com>
> Signed-off-by: Viswas G <Viswas.G@microsemi.com>
> ---
>  drivers/scsi/pm8001/pm8001_sas.c | 49 +++++++++++-----------------------------
>  1 file changed, 13 insertions(+), 36 deletions(-)
>
> diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c
> index ce584c31d36e..e80b0542a67f 100644
> --- a/drivers/scsi/pm8001/pm8001_sas.c
> +++ b/drivers/scsi/pm8001/pm8001_sas.c
> @@ -1159,40 +1159,35 @@ int pm8001_query_task(struct sas_task *task)
>  int pm8001_abort_task(struct sas_task *task)
>  {
>         unsigned long flags;
> -       u32 tag = 0xdeadbeef;
> +       u32 tag;
>         u32 device_id;
>         struct domain_device *dev ;
> -       struct pm8001_hba_info *pm8001_ha = NULL;
> +       struct pm8001_hba_info *pm8001_ha;
>         struct pm8001_ccb_info *ccb;
>         struct scsi_lun lun;
>         struct pm8001_device *pm8001_dev;
>         struct pm8001_tmf_task tmf_task;
>         int rc = TMF_RESP_FUNC_FAILED;
>         if (unlikely(!task || !task->lldd_task || !task->dev))
> -               return rc;
> +               return TMF_RESP_FUNC_FAILED;
> +       dev = task->dev;
> +       pm8001_dev = dev->lldd_dev;
> +       pm8001_ha = pm8001_find_ha_by_dev(dev);
> +       device_id = pm8001_dev->device_id;
> +       rc = pm8001_find_tag(task, &tag);
> +       if (rc == 0) {
> +               pm8001_printk("no tag for task:%p\n", task);
> +               return TMF_RESP_FUNC_FAILED;
> +       }
>         spin_lock_irqsave(&task->task_state_lock, flags);
>         if (task->task_state_flags & SAS_TASK_STATE_DONE) {
>                 spin_unlock_irqrestore(&task->task_state_lock, flags);
> -               rc = TMF_RESP_FUNC_COMPLETE;
> -               goto out;
> +               return TMF_RESP_FUNC_COMPLETE;
>         }
>         spin_unlock_irqrestore(&task->task_state_lock, flags);
>         if (task->task_proto & SAS_PROTOCOL_SSP) {
>                 struct scsi_cmnd *cmnd = task->uldd_task;
> -               dev = task->dev;
> -               ccb = task->lldd_task;
> -               pm8001_dev = dev->lldd_dev;
> -               pm8001_ha = pm8001_find_ha_by_dev(dev);
>                 int_to_scsilun(cmnd->device->lun, &lun);
> -               rc = pm8001_find_tag(task, &tag);
> -               if (rc == 0) {
> -                       printk(KERN_INFO "No such tag in %s\n", __func__);
> -                       rc = TMF_RESP_FUNC_FAILED;
> -                       return rc;
> -               }
> -               device_id = pm8001_dev->device_id;
> -               PM8001_EH_DBG(pm8001_ha,
> -                       pm8001_printk("abort io to deviceid= %d\n", device_id));
>                 tmf_task.tmf = TMF_ABORT_TASK;
>                 tmf_task.tag_of_task_to_be_managed = tag;
>                 rc = pm8001_issue_ssp_tmf(dev, lun.scsi_lun, &tmf_task);
> @@ -1200,28 +1195,10 @@ int pm8001_abort_task(struct sas_task *task)
>                         pm8001_dev->sas_device, 0, tag);
>         } else if (task->task_proto & SAS_PROTOCOL_SATA ||
>                 task->task_proto & SAS_PROTOCOL_STP) {
> -               dev = task->dev;
> -               pm8001_dev = dev->lldd_dev;
> -               pm8001_ha = pm8001_find_ha_by_dev(dev);
> -               rc = pm8001_find_tag(task, &tag);
> -               if (rc == 0) {
> -                       printk(KERN_INFO "No such tag in %s\n", __func__);
> -                       rc = TMF_RESP_FUNC_FAILED;
> -                       return rc;
> -               }
>                 rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev,
>                         pm8001_dev->sas_device, 0, tag);
>         } else if (task->task_proto & SAS_PROTOCOL_SMP) {
>                 /* SMP */
> -               dev = task->dev;
> -               pm8001_dev = dev->lldd_dev;
> -               pm8001_ha = pm8001_find_ha_by_dev(dev);
> -               rc = pm8001_find_tag(task, &tag);
> -               if (rc == 0) {
> -                       printk(KERN_INFO "No such tag in %s\n", __func__);
> -                       rc = TMF_RESP_FUNC_FAILED;
> -                       return rc;
> -               }
>                 rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev,
>                         pm8001_dev->sas_device, 0, tag);
>
> --
> 2.12.3
>

Thanks,
Acked-by: Jack Wang <jinpu.wang@profitbricks.com>

-- 
Jack Wang
Linux Kernel Developer

ProfitBricks GmbH
Greifswalder Str. 207
D - 10405 Berlin

Tel:       +49 30 577 008  042
Fax:      +49 30 577 008 299
Email:    jinpu.wang@profitbricks.com
URL:      https://www.profitbricks.de

Sitz der Gesellschaft: Berlin
Registergericht: Amtsgericht Charlottenburg, HRB 125506 B
Geschäftsführer: Achim Weiss

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

* Re: [PATCH V2 0/9] pm80xx updates
  2015-02-17 23:36 [PATCH V2 0/9] pm80xx updates Viswas G
                   ` (8 preceding siblings ...)
  2015-02-17 23:36 ` [PATCH V2 9/9] pm80xx : corrected linkrate value Viswas G
@ 2017-09-15 19:35 ` Martin K. Petersen
  2017-09-16  5:22   ` Viswas G
  9 siblings, 1 reply; 19+ messages in thread
From: Martin K. Petersen @ 2017-09-15 19:35 UTC (permalink / raw)
  To: Viswas G
  Cc: linux-scsi, Vasanthalakshmi.Tharmarajan, deepak.ukey, Raj.Dinesh,
	jinpu.wang, martin.petersen


Viswas,

> This patch set include some bug fixes and enhancement for pm80xx
> driver.

You are still sending mail from 2015. Please fix your system
time. Thanks!

-- 
Martin K. Petersen	Oracle Linux Engineering

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

* RE: [PATCH V2 0/9] pm80xx updates
  2017-09-15 19:35 ` [PATCH V2 0/9] pm80xx updates Martin K. Petersen
@ 2017-09-16  5:22   ` Viswas G
  2017-09-25 23:20     ` Martin K. Petersen
  0 siblings, 1 reply; 19+ messages in thread
From: Viswas G @ 2017-09-16  5:22 UTC (permalink / raw)
  To: Martin K. Petersen
  Cc: linux-scsi, Vasanthalakshmi Tharmarajan, Deepak Ukey, Raj Dinesh,
	jinpu.wang

Thanks Martin.

Do we need to send V3 patch set with corrected date ? 

Regards,
Viswas G

> -----Original Message-----
> From: Martin K. Petersen [mailto:martin.petersen@oracle.com]
> Sent: Saturday, September 16, 2017 1:06 AM
> To: Viswas G <viswas.g@microsemi.com>
> Cc: linux-scsi@vger.kernel.org; Vasanthalakshmi Tharmarajan
> <vasanthalakshmi.thar@microsemi.com>; Deepak Ukey
> <deepak.ukey@microsemi.com>; Raj Dinesh <Raj.Dinesh@microsemi.com>;
> jinpu.wang@profitbricks.com; martin.petersen@oracle.com
> Subject: Re: [PATCH V2 0/9] pm80xx updates
> 
> EXTERNAL EMAIL
> 
> 
> Viswas,
> 
> > This patch set include some bug fixes and enhancement for pm80xx
> > driver.
> 
> You are still sending mail from 2015. Please fix your system
> time. Thanks!
> 
> --
> Martin K. Petersen      Oracle Linux Engineering

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

* Re: [PATCH V2 0/9] pm80xx updates
  2017-09-16  5:22   ` Viswas G
@ 2017-09-25 23:20     ` Martin K. Petersen
  0 siblings, 0 replies; 19+ messages in thread
From: Martin K. Petersen @ 2017-09-25 23:20 UTC (permalink / raw)
  To: Viswas G
  Cc: Martin K. Petersen, linux-scsi, Vasanthalakshmi Tharmarajan,
	Deepak Ukey, Raj Dinesh, jinpu.wang


Viswas,

> Do we need to send V3 patch set with corrected date ? 

Yes, please. And address Jack's/kbuild robot's comments.

Thanks!

-- 
Martin K. Petersen	Oracle Linux Engineering

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

end of thread, other threads:[~2017-09-25 23:20 UTC | newest]

Thread overview: 19+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-02-17 23:36 [PATCH V2 0/9] pm80xx updates Viswas G
2015-02-17 23:36 ` [PATCH V2 1/9] pm80xx : redefine sas_identify_frame structure Viswas G
2017-09-13 11:09   ` Jinpu Wang
2015-02-17 23:36 ` [PATCH V2 2/9] pm80xx : ILA and inactive firmware version through sysfs Viswas G
2015-02-17 23:36 ` [PATCH V2 3/9] pm80xx : Different SAS addresses for phys Viswas G
2015-02-17 23:36 ` [PATCH V2 4/9] pm80xx : tag allocation for phy control request Viswas G
2017-09-13 11:10   ` Jinpu Wang
2015-02-17 23:36 ` [PATCH V2 5/9] pm80xx : cleanup in pm8001_abort_task function Viswas G
2017-09-13 13:12   ` Jinpu Wang
2015-02-17 23:36 ` [PATCH V2 6/9] pm80xx : modified port reset timer value for PM8006 card Viswas G
2017-09-13 11:10   ` Jinpu Wang
2015-02-17 23:36 ` [PATCH V2 7/9] pm80xx : corrected SATA abort handling sequence Viswas G
2017-09-13 11:12   ` Jinpu Wang
2015-02-17 23:36 ` [PATCH V2 8/9] pm80xx : panic on ncq error cleaning up the read log Viswas G
2017-09-13 11:13   ` Jinpu Wang
2015-02-17 23:36 ` [PATCH V2 9/9] pm80xx : corrected linkrate value Viswas G
2017-09-15 19:35 ` [PATCH V2 0/9] pm80xx updates Martin K. Petersen
2017-09-16  5:22   ` Viswas G
2017-09-25 23:20     ` Martin K. Petersen

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.