All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH V2 0/8] pm80xx: Driver updates
@ 2015-08-11  9:36 Viswas.G
  2015-08-11  9:36 ` [PATCH V2 1/8] pm80xx: Updated link rate Viswas.G
                   ` (7 more replies)
  0 siblings, 8 replies; 13+ messages in thread
From: Viswas.G @ 2015-08-11  9:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Jack Wang, JBottomley, Tomas Henzl, Suresh.Thiagarajan, Viswas.G,
	Hannes Reinecke

From: Viswas G <Viswas.G@pmcs.com>

This patch set contains bug fixes for pm80xx driver.
Please consider these patches for next kernel release.

Changes From V1:
Corrected device state changes in I_T_Nexus_Reset.


Viswas G (8):
  pm80xx: Updated link rate
  pm80xx: Corrected device state changes in I_T_Nexus_Reset.
  pm80xx: Update For Thermal Page Code
  pm80xx: Fix for Incorrect DMA Unmapping of SG List
  pm80xx: Remove unnecessary phy disconnect while link error
  pm80xx: Add PORT RECOVERY TIMEOUT support
  pm80xx: Handling Invalid SSP Response frame
  pm80xx: Bump pm80xx driver version to 0.1.38

 drivers/scsi/pm8001/pm8001_defs.h |    1 +
 drivers/scsi/pm8001/pm8001_hwi.c  |    4 +
 drivers/scsi/pm8001/pm8001_sas.c  |   19 +++++--
 drivers/scsi/pm8001/pm8001_sas.h  |   12 +++-
 drivers/scsi/pm8001/pm80xx_hwi.c  |  111 +++++++++++++++++++++++++++----------
 drivers/scsi/pm8001/pm80xx_hwi.h  |    5 +-
 6 files changed, 114 insertions(+), 38 deletions(-)


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

* [PATCH V2 1/8] pm80xx: Updated link rate
  2015-08-11  9:36 [PATCH V2 0/8] pm80xx: Driver updates Viswas.G
@ 2015-08-11  9:36 ` Viswas.G
  2015-08-11  9:36 ` [PATCH V2 2/8] pm80xx: Corrected device state changes in I_T_Nexus_Reset Viswas.G
                   ` (6 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Viswas.G @ 2015-08-11  9:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Jack Wang, JBottomley, Tomas Henzl, Suresh.Thiagarajan, Viswas.G,
	Hannes Reinecke

From: Viswas G <Viswas.G@pmcs.com>

Updated 12G linkrate to libsas.

Changes from V1:
None

Signed-off-by: Viswas G <Viswas.G@pmcs.com>

Reviewed-by: Suresh Thiagarajan <Suresh.Thiagarajan@pmcs.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Jack Wang <jinpu.wang@profitbricks.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
---
 drivers/scsi/pm8001/pm8001_defs.h |    1 +
 drivers/scsi/pm8001/pm8001_hwi.c  |    4 ++++
 2 files changed, 5 insertions(+), 0 deletions(-)

diff --git a/drivers/scsi/pm8001/pm8001_defs.h b/drivers/scsi/pm8001/pm8001_defs.h
index 74a4bb9..d4d20cc 100644
--- a/drivers/scsi/pm8001/pm8001_defs.h
+++ b/drivers/scsi/pm8001/pm8001_defs.h
@@ -56,6 +56,7 @@ enum phy_speed {
 	PHY_SPEED_15 = 0x01,
 	PHY_SPEED_30 = 0x02,
 	PHY_SPEED_60 = 0x04,
+	PHY_SPEED_120 = 0x08,
 };
 
 enum data_direction {
diff --git a/drivers/scsi/pm8001/pm8001_hwi.c b/drivers/scsi/pm8001/pm8001_hwi.c
index 96dcc09..39306b1 100644
--- a/drivers/scsi/pm8001/pm8001_hwi.c
+++ b/drivers/scsi/pm8001/pm8001_hwi.c
@@ -3263,6 +3263,10 @@ void pm8001_get_lrate_mode(struct pm8001_phy *phy, u8 link_rate)
 	struct sas_phy *sas_phy = phy->sas_phy.phy;
 
 	switch (link_rate) {
+	case PHY_SPEED_120:
+		phy->sas_phy.linkrate = SAS_LINK_RATE_12_0_GBPS;
+		phy->sas_phy.phy->negotiated_linkrate = SAS_LINK_RATE_12_0_GBPS;
+		break;
 	case PHY_SPEED_60:
 		phy->sas_phy.linkrate = SAS_LINK_RATE_6_0_GBPS;
 		phy->sas_phy.phy->negotiated_linkrate = SAS_LINK_RATE_6_0_GBPS;
-- 
1.7.1


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

* [PATCH V2 2/8] pm80xx: Corrected device state changes in I_T_Nexus_Reset.
  2015-08-11  9:36 [PATCH V2 0/8] pm80xx: Driver updates Viswas.G
  2015-08-11  9:36 ` [PATCH V2 1/8] pm80xx: Updated link rate Viswas.G
@ 2015-08-11  9:36 ` Viswas.G
  2015-08-13 12:43   ` Jinpu Wang
  2015-08-20 14:51   ` Tomas Henzl
  2015-08-11  9:36 ` [PATCH V2 3/8] pm80xx: Update For Thermal Page Code Viswas.G
                   ` (5 subsequent siblings)
  7 siblings, 2 replies; 13+ messages in thread
From: Viswas.G @ 2015-08-11  9:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Jack Wang, JBottomley, Tomas Henzl, Suresh.Thiagarajan, Viswas.G,
	Hannes Reinecke

From: Viswas G <Viswas.G@pmcs.com>

In Nexus reset the device state request are not needed.

Changes from V1:
Device state change request has been removed as the firmware
will handle it during internal cleanup. Also updated the
proper return value in case of failures.

Signed-off-by: Viswas G <Viswas.G@pmcs.com>

Reviewed-by: Suresh Thiagarajan <Suresh.Thiagarajan@pmcs.com>
---
 drivers/scsi/pm8001/pm8001_sas.c |   18 +++++++++++++-----
 drivers/scsi/pm8001/pm8001_sas.h |    8 ++++++++
 2 files changed, 21 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c
index b93f289..48f4627 100644
--- a/drivers/scsi/pm8001/pm8001_sas.c
+++ b/drivers/scsi/pm8001/pm8001_sas.c
@@ -975,19 +975,27 @@ int pm8001_I_T_nexus_reset(struct domain_device *dev)
 	phy = sas_get_local_phy(dev);
 
 	if (dev_is_sata(dev)) {
-		DECLARE_COMPLETION_ONSTACK(completion_setstate);
 		if (scsi_is_sas_phy_local(phy)) {
 			rc = 0;
 			goto out;
 		}
 		rc = sas_phy_reset(phy, 1);
+		if (rc) {
+			PM8001_EH_DBG(pm8001_ha,
+			pm8001_printk("phy reset failed for device %x\n"
+			"with rc %d\n", pm8001_dev->device_id, rc));
+			rc = TMF_RESP_FUNC_FAILED;
+			goto out;
+		}
 		msleep(2000);
 		rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev ,
 			dev, 1, 0);
-		pm8001_dev->setds_completion = &completion_setstate;
-		rc = PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha,
-			pm8001_dev, 0x01);
-		wait_for_completion(&completion_setstate);
+		if (rc) {
+			PM8001_EH_DBG(pm8001_ha,
+			pm8001_printk("task abort failed %x\n"
+			"with rc %d\n", pm8001_dev->device_id, rc));
+			rc = TMF_RESP_FUNC_FAILED;
+		}
 	} else {
 		rc = sas_phy_reset(phy, 1);
 		msleep(2000);
diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
index 8dd8b78..c9736cc 100644
--- a/drivers/scsi/pm8001/pm8001_sas.h
+++ b/drivers/scsi/pm8001/pm8001_sas.h
@@ -569,6 +569,14 @@ struct pm8001_fw_image_header {
 #define	NCQ_READ_LOG_FLAG			0x80000000
 #define	NCQ_ABORT_ALL_FLAG			0x40000000
 #define	NCQ_2ND_RLE_FLAG			0x20000000
+
+/* Device states */
+#define DS_OPERATIONAL				0x01
+#define DS_PORT_IN_RESET			0x02
+#define DS_IN_RECOVERY				0x03
+#define DS_IN_ERROR				0x04
+#define DS_NON_OPERATIONAL			0x07
+
 /**
  * brief param structure for firmware flash update.
  */
-- 
1.7.1


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

* [PATCH V2 3/8] pm80xx: Update For Thermal Page Code
  2015-08-11  9:36 [PATCH V2 0/8] pm80xx: Driver updates Viswas.G
  2015-08-11  9:36 ` [PATCH V2 1/8] pm80xx: Updated link rate Viswas.G
  2015-08-11  9:36 ` [PATCH V2 2/8] pm80xx: Corrected device state changes in I_T_Nexus_Reset Viswas.G
@ 2015-08-11  9:36 ` Viswas.G
  2015-08-11  9:36 ` [PATCH V2 4/8] pm80xx: Fix for Incorrect DMA Unmapping of SG List Viswas.G
                   ` (4 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Viswas.G @ 2015-08-11  9:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Jack Wang, JBottomley, Tomas Henzl, Suresh.Thiagarajan, Viswas.G,
	Hannes Reinecke

From: Viswas G <Viswas.G@pmcs.com>

Thermal page code has been changed to 7 for the 12G controllers.

Changes From V1:
None

Signed-off-by: Viswas G <Viswas.G@pmcs.com>

Reviewed-by: Suresh Thiagarajan <Suresh.Thiagarajan@pmcs.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Jack Wang <jinpu.wang@profitbricks.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
---
 drivers/scsi/pm8001/pm80xx_hwi.c |    9 ++++++++-
 drivers/scsi/pm8001/pm80xx_hwi.h |    3 ++-
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index 05cce46..dced9f7 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -843,6 +843,7 @@ pm80xx_set_thermal_config(struct pm8001_hba_info *pm8001_ha)
 	int rc;
 	u32 tag;
 	u32 opc = OPC_INB_SET_CONTROLLER_CONFIG;
+	u32 page_code;
 
 	memset(&payload, 0, sizeof(struct set_ctrl_cfg_req));
 	rc = pm8001_tag_alloc(pm8001_ha, &tag);
@@ -851,8 +852,14 @@ pm80xx_set_thermal_config(struct pm8001_hba_info *pm8001_ha)
 
 	circularQ = &pm8001_ha->inbnd_q_tbl[0];
 	payload.tag = cpu_to_le32(tag);
+
+	if (IS_SPCV_12G(pm8001_ha->pdev))
+		page_code = THERMAL_PAGE_CODE_7H;
+	else
+		page_code = THERMAL_PAGE_CODE_8H;
+
 	payload.cfg_pg[0] = (THERMAL_LOG_ENABLE << 9) |
-			(THERMAL_ENABLE << 8) | THERMAL_OP_CODE;
+				(THERMAL_ENABLE << 8) | page_code;
 	payload.cfg_pg[1] = (LTEMPHIL << 24) | (RTEMPHIL << 8);
 
 	rc = pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.h b/drivers/scsi/pm8001/pm80xx_hwi.h
index 9970a38..a083cc6 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.h
+++ b/drivers/scsi/pm8001/pm80xx_hwi.h
@@ -177,7 +177,8 @@
 /* Thermal related */
 #define	THERMAL_ENABLE			0x1
 #define	THERMAL_LOG_ENABLE		0x1
-#define THERMAL_OP_CODE			0x6
+#define THERMAL_PAGE_CODE_7H		0x6
+#define THERMAL_PAGE_CODE_8H		0x7
 #define LTEMPHIL			 70
 #define RTEMPHIL			100
 
-- 
1.7.1


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

* [PATCH V2 4/8] pm80xx: Fix for Incorrect DMA Unmapping of SG List
  2015-08-11  9:36 [PATCH V2 0/8] pm80xx: Driver updates Viswas.G
                   ` (2 preceding siblings ...)
  2015-08-11  9:36 ` [PATCH V2 3/8] pm80xx: Update For Thermal Page Code Viswas.G
@ 2015-08-11  9:36 ` Viswas.G
  2015-08-11  9:36 ` [PATCH V2 5/8] pm80xx: Remove unnecessary phy disconnect while link error Viswas.G
                   ` (3 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Viswas.G @ 2015-08-11  9:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Jack Wang, JBottomley, Tomas Henzl, Suresh.Thiagarajan, Viswas.G,
	Hannes Reinecke

From: Viswas G <Viswas.G@pmcs.com>

In pm8001_ccb_task_free(), the dma unmapping is done based on
ccb->n_elem value. This should be initialized to zero in the
task_abort(). Otherwise, pm8001_ccb_task_free() will try for
dma_unmap_sg() which is invalid for task abort and can lead to
kernel crash.

Changes From V1:
None

Signed-off-by: Viswas G <Viswas.G@pmcs.com>

Reviewed-by: Suresh Thiagarajan <Suresh.Thiagarajan@pmcs.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Jack Wang <jinpu.wang@profitbricks.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
---
 drivers/scsi/pm8001/pm8001_sas.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c
index 48f4627..949198c 100644
--- a/drivers/scsi/pm8001/pm8001_sas.c
+++ b/drivers/scsi/pm8001/pm8001_sas.c
@@ -790,6 +790,7 @@ pm8001_exec_internal_task_abort(struct pm8001_hba_info *pm8001_ha,
 		ccb->device = pm8001_dev;
 		ccb->ccb_tag = ccb_tag;
 		ccb->task = task;
+		ccb->n_elem = 0;
 
 		res = PM8001_CHIP_DISP->task_abort(pm8001_ha,
 			pm8001_dev, flag, task_tag, ccb_tag);
-- 
1.7.1


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

* [PATCH V2 5/8] pm80xx: Remove unnecessary phy disconnect while link error
  2015-08-11  9:36 [PATCH V2 0/8] pm80xx: Driver updates Viswas.G
                   ` (3 preceding siblings ...)
  2015-08-11  9:36 ` [PATCH V2 4/8] pm80xx: Fix for Incorrect DMA Unmapping of SG List Viswas.G
@ 2015-08-11  9:36 ` Viswas.G
  2015-08-11  9:36 ` [PATCH V2 6/8] pm80xx: Add PORT RECOVERY TIMEOUT support Viswas.G
                   ` (2 subsequent siblings)
  7 siblings, 0 replies; 13+ messages in thread
From: Viswas.G @ 2015-08-11  9:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Jack Wang, JBottomley, Tomas Henzl, Suresh.Thiagarajan, Viswas.G,
	Hannes Reinecke

From: Viswas G <Viswas.G@pmcs.com>

If the link error happens, we don't need to disconnect the phy,
which will remove the drive. Instead acknowledging the controller
and logging the error will be enough.

Changes From V1:
None

Signed-off-by: Viswas G <Viswas.G@pmcs.com>

Reviewed-by: Suresh Thiagarajan <Suresh.Thiagarajan@pmcs.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Jack Wang <jinpu.wang@profitbricks.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
---
 drivers/scsi/pm8001/pm80xx_hwi.c |   12 ------------
 1 files changed, 0 insertions(+), 12 deletions(-)

diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index dced9f7..3d8b4ae 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -3176,9 +3176,6 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
 			pm8001_printk("HW_EVENT_LINK_ERR_INVALID_DWORD\n"));
 		pm80xx_hw_event_ack_req(pm8001_ha, 0,
 			HW_EVENT_LINK_ERR_INVALID_DWORD, 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);
 		break;
 	case HW_EVENT_LINK_ERR_DISPARITY_ERROR:
 		PM8001_MSG_DBG(pm8001_ha,
@@ -3186,9 +3183,6 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
 		pm80xx_hw_event_ack_req(pm8001_ha, 0,
 			HW_EVENT_LINK_ERR_DISPARITY_ERROR,
 			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);
 		break;
 	case HW_EVENT_LINK_ERR_CODE_VIOLATION:
 		PM8001_MSG_DBG(pm8001_ha,
@@ -3196,9 +3190,6 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
 		pm80xx_hw_event_ack_req(pm8001_ha, 0,
 			HW_EVENT_LINK_ERR_CODE_VIOLATION,
 			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);
 		break;
 	case HW_EVENT_LINK_ERR_LOSS_OF_DWORD_SYNCH:
 		PM8001_MSG_DBG(pm8001_ha, pm8001_printk(
@@ -3206,9 +3197,6 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
 		pm80xx_hw_event_ack_req(pm8001_ha, 0,
 			HW_EVENT_LINK_ERR_LOSS_OF_DWORD_SYNCH,
 			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);
 		break;
 	case HW_EVENT_MALFUNCTION:
 		PM8001_MSG_DBG(pm8001_ha,
-- 
1.7.1


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

* [PATCH V2 6/8] pm80xx: Add PORT RECOVERY TIMEOUT support
  2015-08-11  9:36 [PATCH V2 0/8] pm80xx: Driver updates Viswas.G
                   ` (4 preceding siblings ...)
  2015-08-11  9:36 ` [PATCH V2 5/8] pm80xx: Remove unnecessary phy disconnect while link error Viswas.G
@ 2015-08-11  9:36 ` Viswas.G
  2015-08-11  9:36 ` [PATCH V2 7/8] pm80xx: Handling Invalid SSP Response frame Viswas.G
  2015-08-11  9:36 ` [PATCH V2 8/8] pm80xx: Bump pm80xx driver version to 0.1.38 Viswas.G
  7 siblings, 0 replies; 13+ messages in thread
From: Viswas.G @ 2015-08-11  9:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Jack Wang, JBottomley, Tomas Henzl, Suresh.Thiagarajan, Viswas.G,
	Hannes Reinecke

From: Viswas G <Viswas.G@pmcs.com>

PORT RECOVERY TIMEOUT is the maximum time between the controller's
detection of the PHY down until the receipt of the ID_Frame (from the
same remote SAS port). If the time expires before the ID_FRAME is
received, the port is considered INVALID and can be removed. The
IOP_EVENT_PORT_RECOVERY_TIMER_TMO event is reported following the
IOP_EVENT_ PHY_DOWN event when the PHY/port does not recover after
Port Recovery Time.

Changes From V1:
None

Signed-off-by: Viswas G <Viswas.G@pmcs.com>

Reviewed-by: Suresh Thiagarajan <Suresh.Thiagarajan@pmcs.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Jack Wang <jinpu.wang@profitbricks.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
---
 drivers/scsi/pm8001/pm8001_sas.h |    2 +-
 drivers/scsi/pm8001/pm80xx_hwi.c |   83 ++++++++++++++++++++++++++++++-------
 2 files changed, 68 insertions(+), 17 deletions(-)

diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
index c9736cc..2788026 100644
--- a/drivers/scsi/pm8001/pm8001_sas.h
+++ b/drivers/scsi/pm8001/pm8001_sas.h
@@ -241,7 +241,7 @@ struct pm8001_chip_info {
 struct pm8001_port {
 	struct asd_sas_port	sas_port;
 	u8			port_attached;
-	u8			wide_port_phymap;
+	u16			wide_port_phymap;
 	u8			port_state;
 	struct list_head	list;
 };
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index 3d8b4ae..8817ce6 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -309,6 +309,9 @@ static void read_main_config_table(struct pm8001_hba_info *pm8001_ha)
 		pm8001_mr32(address, MAIN_INT_VECTOR_TABLE_OFFSET);
 	pm8001_ha->main_cfg_tbl.pm80xx_tbl.phy_attr_table_offset =
 		pm8001_mr32(address, MAIN_SAS_PHY_ATTR_TABLE_OFFSET);
+	/* read port recover and reset timeout */
+	pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer =
+		pm8001_mr32(address, MAIN_PORT_RECOVERY_TIMER);
 }
 
 /**
@@ -585,6 +588,12 @@ static void update_main_config_table(struct pm8001_hba_info *pm8001_ha)
 		pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer);
 	pm8001_mw32(address, MAIN_INT_REASSERTION_DELAY,
 		pm8001_ha->main_cfg_tbl.pm80xx_tbl.interrupt_reassertion_delay);
+
+	pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer &= 0xffff0000;
+	pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer |=
+							PORT_RECOVERY_TIMEOUT;
+	pm8001_mw32(address, MAIN_PORT_RECOVERY_TIMER,
+			pm8001_ha->main_cfg_tbl.pm80xx_tbl.port_recovery_timer);
 }
 
 /**
@@ -2836,6 +2845,32 @@ static void pm80xx_hw_event_ack_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);
 
+static void hw_event_port_recover(struct pm8001_hba_info *pm8001_ha,
+					void *piomb)
+{
+	struct hw_event_resp *pPayload = (struct hw_event_resp *)(piomb + 4);
+	u32 phyid_npip_portstate = le32_to_cpu(pPayload->phyid_npip_portstate);
+	u8 phy_id = (u8)((phyid_npip_portstate & 0xFF0000) >> 16);
+	u32 lr_status_evt_portid =
+		le32_to_cpu(pPayload->lr_status_evt_portid);
+	u8 deviceType = pPayload->sas_identify.dev_type;
+	u8 link_rate = (u8)((lr_status_evt_portid & 0xF0000000) >> 28);
+	struct pm8001_phy *phy = &pm8001_ha->phy[phy_id];
+	u8 port_id = (u8)(lr_status_evt_portid & 0x000000FF);
+	struct pm8001_port *port = &pm8001_ha->port[port_id];
+
+	if (deviceType == SAS_END_DEVICE) {
+		pm80xx_chip_phy_ctl_req(pm8001_ha, phy_id,
+					PHY_NOTIFY_ENABLE_SPINUP);
+	}
+
+	port->wide_port_phymap |= (1U << phy_id);
+	pm8001_get_lrate_mode(phy, link_rate);
+	phy->sas_phy.oob_mode = SAS_OOB_MODE;
+	phy->phy_state = PHY_STATE_LINK_UP_SPCV;
+	phy->phy_attached = 1;
+}
+
 /**
  * hw_event_sas_phy_up -FW tells me a SAS phy up event.
  * @pm8001_ha: our hba card information
@@ -2863,6 +2898,7 @@ hw_event_sas_phy_up(struct pm8001_hba_info *pm8001_ha, void *piomb)
 	unsigned long flags;
 	u8 deviceType = pPayload->sas_identify.dev_type;
 	port->port_state = portstate;
+	port->wide_port_phymap |= (1U << phy_id);
 	phy->phy_state = PHY_STATE_LINK_UP_SPCV;
 	PM8001_MSG_DBG(pm8001_ha, pm8001_printk(
 		"portid:%d; phyid:%d; linkrate:%d; "
@@ -2988,7 +3024,6 @@ 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];
 	port->port_state = portstate;
-	phy->phy_type = 0;
 	phy->identify.device_type = 0;
 	phy->phy_attached = 0;
 	memset(&phy->dev_sas_addr, 0, SAS_ADDR_SIZE);
@@ -3000,9 +3035,13 @@ 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"));
-		port->port_attached = 0;
-		pm80xx_hw_event_ack_req(pm8001_ha, 0, HW_EVENT_PHY_DOWN,
-			port_id, phy_id, 0, 0);
+		if (phy->phy_type & PORT_TYPE_SATA) {
+			phy->phy_type = 0;
+			port->port_attached = 0;
+			pm80xx_hw_event_ack_req(pm8001_ha, 0, HW_EVENT_PHY_DOWN,
+					port_id, phy_id, 0, 0);
+		}
+		sas_phy_disconnected(&phy->sas_phy);
 		break;
 	case PORT_IN_RESET:
 		PM8001_MSG_DBG(pm8001_ha,
@@ -3010,22 +3049,26 @@ hw_event_phy_down(struct pm8001_hba_info *pm8001_ha, void *piomb)
 		break;
 	case PORT_NOT_ESTABLISHED:
 		PM8001_MSG_DBG(pm8001_ha,
-			pm8001_printk(" phy Down and PORT_NOT_ESTABLISHED\n"));
+			pm8001_printk(" Phy Down and PORT_NOT_ESTABLISHED\n"));
 		port->port_attached = 0;
 		break;
 	case PORT_LOSTCOMM:
 		PM8001_MSG_DBG(pm8001_ha,
-			pm8001_printk(" phy Down and PORT_LOSTCOMM\n"));
+			pm8001_printk(" Phy Down and PORT_LOSTCOMM\n"));
 		PM8001_MSG_DBG(pm8001_ha,
 			pm8001_printk(" Last phy Down and port invalid\n"));
-		port->port_attached = 0;
-		pm80xx_hw_event_ack_req(pm8001_ha, 0, HW_EVENT_PHY_DOWN,
-			port_id, phy_id, 0, 0);
+		if (phy->phy_type & PORT_TYPE_SATA) {
+			port->port_attached = 0;
+			phy->phy_type = 0;
+			pm80xx_hw_event_ack_req(pm8001_ha, 0, HW_EVENT_PHY_DOWN,
+					port_id, phy_id, 0, 0);
+		}
+		sas_phy_disconnected(&phy->sas_phy);
 		break;
 	default:
 		port->port_attached = 0;
 		PM8001_MSG_DBG(pm8001_ha,
-			pm8001_printk(" phy Down and(default) = 0x%x\n",
+			pm8001_printk(" Phy Down and(default) = 0x%x\n",
 			portstate));
 		break;
 
@@ -3091,7 +3134,7 @@ static int mpi_thermal_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
  */
 static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
 {
-	unsigned long flags;
+	unsigned long flags, i;
 	struct hw_event_resp *pPayload =
 		(struct hw_event_resp *)(piomb + 4);
 	u32 lr_status_evt_portid =
@@ -3104,9 +3147,9 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
 		(u16)((lr_status_evt_portid & 0x00FFFF00) >> 8);
 	u8 status =
 		(u8)((lr_status_evt_portid & 0x0F000000) >> 24);
-
 	struct sas_ha_struct *sas_ha = pm8001_ha->sas;
 	struct pm8001_phy *phy = &pm8001_ha->phy[phy_id];
+	struct pm8001_port *port = &pm8001_ha->port[port_id];
 	struct asd_sas_phy *sas_phy = sas_ha->sas_phy[phy_id];
 	PM8001_MSG_DBG(pm8001_ha,
 		pm8001_printk("portid:%d phyid:%d event:0x%x status:0x%x\n",
@@ -3132,7 +3175,9 @@ 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"));
-		sas_ha->notify_phy_event(&phy->sas_phy, PHYE_LOSS_OF_SIGNAL);
+		if (phy->phy_type & PORT_TYPE_SATA)
+			sas_ha->notify_phy_event(&phy->sas_phy,
+				PHYE_LOSS_OF_SIGNAL);
 		phy->phy_attached = 0;
 		phy->phy_state = 0;
 		hw_event_phy_down(pm8001_ha, piomb);
@@ -3252,13 +3297,19 @@ static int mpi_hw_event(struct pm8001_hba_info *pm8001_ha, void *piomb)
 		pm80xx_hw_event_ack_req(pm8001_ha, 0,
 			HW_EVENT_PORT_RECOVERY_TIMER_TMO,
 			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);
+		for (i = 0; i < pm8001_ha->chip->n_phy; i++) {
+			if (port->wide_port_phymap & (1 << i)) {
+				phy = &pm8001_ha->phy[i];
+				sas_ha->notify_phy_event(&phy->sas_phy,
+						PHYE_LOSS_OF_SIGNAL);
+				port->wide_port_phymap &= ~(1 << i);
+			}
+		}
 		break;
 	case HW_EVENT_PORT_RECOVER:
 		PM8001_MSG_DBG(pm8001_ha,
 			pm8001_printk("HW_EVENT_PORT_RECOVER\n"));
+		hw_event_port_recover(pm8001_ha, piomb);
 		break;
 	case HW_EVENT_PORT_RESET_COMPLETE:
 		PM8001_MSG_DBG(pm8001_ha,
-- 
1.7.1


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

* [PATCH V2 7/8] pm80xx: Handling Invalid SSP Response frame
  2015-08-11  9:36 [PATCH V2 0/8] pm80xx: Driver updates Viswas.G
                   ` (5 preceding siblings ...)
  2015-08-11  9:36 ` [PATCH V2 6/8] pm80xx: Add PORT RECOVERY TIMEOUT support Viswas.G
@ 2015-08-11  9:36 ` Viswas.G
  2015-08-11  9:36 ` [PATCH V2 8/8] pm80xx: Bump pm80xx driver version to 0.1.38 Viswas.G
  7 siblings, 0 replies; 13+ messages in thread
From: Viswas.G @ 2015-08-11  9:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Jack Wang, JBottomley, Tomas Henzl, Suresh.Thiagarajan, Viswas.G,
	Hannes Reinecke

From: Viswas G <Viswas.G@pmcs.com>

The request has to be retried incase if the length of the SSP
Response IU is invalid.

Changes From V1:
None

Signed-off-by: Viswas G <Viswas.G@pmcs.com>

Reviewed-by: Suresh Thiagarajan <Suresh.Thiagarajan@pmcs.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Jack Wang <jinpu.wang@profitbricks.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
---
 drivers/scsi/pm8001/pm80xx_hwi.c |    7 +++++++
 drivers/scsi/pm8001/pm80xx_hwi.h |    2 +-
 2 files changed, 8 insertions(+), 1 deletions(-)

diff --git a/drivers/scsi/pm8001/pm80xx_hwi.c b/drivers/scsi/pm8001/pm80xx_hwi.c
index 8817ce6..0e1628f 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.c
+++ b/drivers/scsi/pm8001/pm80xx_hwi.c
@@ -1609,6 +1609,13 @@ mpi_ssp_completion(struct pm8001_hba_info *pm8001_ha , void *piomb)
 		ts->stat = SAS_OPEN_REJECT;
 		ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
 		break;
+	case IO_XFER_ERROR_INVALID_SSP_RSP_FRAME:
+		PM8001_IO_DBG(pm8001_ha,
+			pm8001_printk("IO_XFER_ERROR_INVALID_SSP_RSP_FRAME\n"));
+		ts->resp = SAS_TASK_COMPLETE;
+		ts->stat = SAS_OPEN_REJECT;
+		ts->open_rej_reason = SAS_OREJ_RSVD_RETRY;
+		break;
 	case IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED:
 		PM8001_IO_DBG(pm8001_ha,
 		pm8001_printk("IO_OPEN_CNX_ERROR_PROTOCOL_NOT_SUPPORTED\n"));
diff --git a/drivers/scsi/pm8001/pm80xx_hwi.h b/drivers/scsi/pm8001/pm80xx_hwi.h
index a083cc6..7a443ba 100644
--- a/drivers/scsi/pm8001/pm80xx_hwi.h
+++ b/drivers/scsi/pm8001/pm80xx_hwi.h
@@ -1175,7 +1175,7 @@ typedef struct SASProtocolTimerConfig SASProtocolTimerConfig_t;
 #define IO_XFER_ERROR_INTERNAL_CRC_ERROR	0x54
 #define MPI_IO_RQE_BUSY_FULL			0x55
 #define IO_XFER_ERR_EOB_DATA_OVERRUN		0x56
-#define IO_XFR_ERROR_INVALID_SSP_RSP_FRAME	0x57
+#define IO_XFER_ERROR_INVALID_SSP_RSP_FRAME	0x57
 #define IO_OPEN_CNX_ERROR_OPEN_PREEMPTED	0x58
 
 #define MPI_ERR_IO_RESOURCE_UNAVAILABLE		0x1004
-- 
1.7.1


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

* [PATCH V2 8/8] pm80xx: Bump pm80xx driver version to 0.1.38
  2015-08-11  9:36 [PATCH V2 0/8] pm80xx: Driver updates Viswas.G
                   ` (6 preceding siblings ...)
  2015-08-11  9:36 ` [PATCH V2 7/8] pm80xx: Handling Invalid SSP Response frame Viswas.G
@ 2015-08-11  9:36 ` Viswas.G
  7 siblings, 0 replies; 13+ messages in thread
From: Viswas.G @ 2015-08-11  9:36 UTC (permalink / raw)
  To: linux-scsi
  Cc: Jack Wang, JBottomley, Tomas Henzl, Suresh.Thiagarajan, Viswas.G,
	Hannes Reinecke

From: Viswas G <Viswas.G@pmcs.com>

Bump pm80xx driver version to 0.1.38.

Changes From V1:
None

Signed-off-by: Viswas G <Viswas.G@pmcs.com>

Reviewed-by: Suresh Thiagarajan <Suresh.Thiagarajan@pmcs.com>
Reviewed-by: Hannes Reinecke <hare@suse.com>
Reviewed-by: Jack Wang <jinpu.wang@profitbricks.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>
---
 drivers/scsi/pm8001/pm8001_sas.h |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
index 2788026..e2e97db 100644
--- a/drivers/scsi/pm8001/pm8001_sas.h
+++ b/drivers/scsi/pm8001/pm8001_sas.h
@@ -58,7 +58,7 @@
 #include "pm8001_defs.h"
 
 #define DRV_NAME		"pm80xx"
-#define DRV_VERSION		"0.1.37"
+#define DRV_VERSION		"0.1.38"
 #define PM8001_FAIL_LOGGING	0x01 /* Error message logging */
 #define PM8001_INIT_LOGGING	0x02 /* driver init logging */
 #define PM8001_DISC_LOGGING	0x04 /* discovery layer logging */
-- 
1.7.1


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

* Re: [PATCH V2 2/8] pm80xx: Corrected device state changes in I_T_Nexus_Reset.
  2015-08-11  9:36 ` [PATCH V2 2/8] pm80xx: Corrected device state changes in I_T_Nexus_Reset Viswas.G
@ 2015-08-13 12:43   ` Jinpu Wang
  2015-08-14  7:15     ` Viswas G
  2015-08-20 14:51   ` Tomas Henzl
  1 sibling, 1 reply; 13+ messages in thread
From: Jinpu Wang @ 2015-08-13 12:43 UTC (permalink / raw)
  To: Viswas G
  Cc: linux-scsi, JBottomley, Tomas Henzl, Suresh Thiagarajan, Hannes Reinecke

Hi

On Tue, Aug 11, 2015 at 11:36 AM,  <Viswas.G@pmcs.com> wrote:
> From: Viswas G <Viswas.G@pmcs.com>
>
> In Nexus reset the device state request are not needed.
>
> Changes from V1:
> Device state change request has been removed as the firmware
> will handle it during internal cleanup. Also updated the
> proper return value in case of failures.

If above is true, should we remove the device state change command
support at all?

Other than that, please feel free to add:
Acked-by: Jack Wang <jinpu.wang@profitbricks.com>

Thanks
Jack


>
> Signed-off-by: Viswas G <Viswas.G@pmcs.com>
>
> Reviewed-by: Suresh Thiagarajan <Suresh.Thiagarajan@pmcs.com>
> ---
>  drivers/scsi/pm8001/pm8001_sas.c |   18 +++++++++++++-----
>  drivers/scsi/pm8001/pm8001_sas.h |    8 ++++++++
>  2 files changed, 21 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c
> index b93f289..48f4627 100644
> --- a/drivers/scsi/pm8001/pm8001_sas.c
> +++ b/drivers/scsi/pm8001/pm8001_sas.c
> @@ -975,19 +975,27 @@ int pm8001_I_T_nexus_reset(struct domain_device *dev)
>         phy = sas_get_local_phy(dev);
>
>         if (dev_is_sata(dev)) {
> -               DECLARE_COMPLETION_ONSTACK(completion_setstate);
>                 if (scsi_is_sas_phy_local(phy)) {
>                         rc = 0;
>                         goto out;
>                 }
>                 rc = sas_phy_reset(phy, 1);
> +               if (rc) {
> +                       PM8001_EH_DBG(pm8001_ha,
> +                       pm8001_printk("phy reset failed for device %x\n"
> +                       "with rc %d\n", pm8001_dev->device_id, rc));
> +                       rc = TMF_RESP_FUNC_FAILED;
> +                       goto out;
> +               }
>                 msleep(2000);
>                 rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev ,
>                         dev, 1, 0);
> -               pm8001_dev->setds_completion = &completion_setstate;
> -               rc = PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha,
> -                       pm8001_dev, 0x01);
> -               wait_for_completion(&completion_setstate);
> +               if (rc) {
> +                       PM8001_EH_DBG(pm8001_ha,
> +                       pm8001_printk("task abort failed %x\n"
> +                       "with rc %d\n", pm8001_dev->device_id, rc));
> +                       rc = TMF_RESP_FUNC_FAILED;
> +               }
>         } else {
>                 rc = sas_phy_reset(phy, 1);
>                 msleep(2000);
> diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
> index 8dd8b78..c9736cc 100644
> --- a/drivers/scsi/pm8001/pm8001_sas.h
> +++ b/drivers/scsi/pm8001/pm8001_sas.h
> @@ -569,6 +569,14 @@ struct pm8001_fw_image_header {
>  #define        NCQ_READ_LOG_FLAG                       0x80000000
>  #define        NCQ_ABORT_ALL_FLAG                      0x40000000
>  #define        NCQ_2ND_RLE_FLAG                        0x20000000
> +
> +/* Device states */
> +#define DS_OPERATIONAL                         0x01
> +#define DS_PORT_IN_RESET                       0x02
> +#define DS_IN_RECOVERY                         0x03
> +#define DS_IN_ERROR                            0x04
> +#define DS_NON_OPERATIONAL                     0x07
> +
>  /**
>   * brief param structure for firmware flash update.
>   */
> --
> 1.7.1
>



-- 
Mit freundlichen Grüßen,
Best Regards,

Jack Wang

Linux Kernel Developer Storage
ProfitBricks GmbH  The IaaS-Company.

ProfitBricks GmbH
Greifswalder Str. 207
D - 10405 Berlin
Tel: +49 30 5770083-42
Fax: +49 30 5770085-98
Email: jinpu.wang@profitbricks.com
URL: http://www.profitbricks.de

Sitz der Gesellschaft: Berlin.
Registergericht: Amtsgericht Charlottenburg, HRB 125506 B.
Geschäftsführer: Andreas Gauger, Achim Weiss.
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* RE: [PATCH V2 2/8] pm80xx: Corrected device state changes in I_T_Nexus_Reset.
  2015-08-13 12:43   ` Jinpu Wang
@ 2015-08-14  7:15     ` Viswas G
  2015-08-17  7:52       ` Jinpu Wang
  0 siblings, 1 reply; 13+ messages in thread
From: Viswas G @ 2015-08-14  7:15 UTC (permalink / raw)
  To: Jinpu Wang
  Cc: linux-scsi, JBottomley, Tomas Henzl, Suresh Thiagarajan, Hannes Reinecke

On Thu, Aug 13, 2015 at 6:13 PM, Jinpu Wang <jinpu.wang@profitbricks.com> wrote:
> Hi
>
> On Tue, Aug 11, 2015 at 11:36 AM,  <Viswas.G@pmcs.com> wrote:
>> From: Viswas G <Viswas.G@pmcs.com>
>>
>> In Nexus reset the device state request are not needed.
>>
>> Changes from V1:
>> Device state change request has been removed as the firmware
>> will handle it during internal cleanup. Also updated the
>> proper return value in case of failures.
>
> If above is true, should we remove the device state change command
> support at all?
>

We can't remove the state change command as it is required for 
some task management command such as ABORT_TASK.

> Other than that, please feel free to add:
> Acked-by: Jack Wang <jinpu.wang@profitbricks.com>
>
> Thanks
> Jack
>
>
>>
>> Signed-off-by: Viswas G <Viswas.G@pmcs.com>
>>
>> Reviewed-by: Suresh Thiagarajan <Suresh.Thiagarajan@pmcs.com>
>> ---
>>  drivers/scsi/pm8001/pm8001_sas.c |   18 +++++++++++++-----
>>  drivers/scsi/pm8001/pm8001_sas.h |    8 ++++++++
>>  2 files changed, 21 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c
>> index b93f289..48f4627 100644
>> --- a/drivers/scsi/pm8001/pm8001_sas.c
>> +++ b/drivers/scsi/pm8001/pm8001_sas.c
>> @@ -975,19 +975,27 @@ int pm8001_I_T_nexus_reset(struct domain_device *dev)
>>         phy = sas_get_local_phy(dev);
>>
>>         if (dev_is_sata(dev)) {
>> -               DECLARE_COMPLETION_ONSTACK(completion_setstate);
>>                 if (scsi_is_sas_phy_local(phy)) {
>>                         rc = 0;
>>                         goto out;
>>                 }
>>                 rc = sas_phy_reset(phy, 1);
>> +               if (rc) {
>> +                       PM8001_EH_DBG(pm8001_ha,
>> +                       pm8001_printk("phy reset failed for device %x\n"
>> +                       "with rc %d\n", pm8001_dev->device_id, rc));
>> +                       rc = TMF_RESP_FUNC_FAILED;
>> +                       goto out;
>> +               }
>>                 msleep(2000);
>>                 rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev ,
>>                         dev, 1, 0);
>> -               pm8001_dev->setds_completion = &completion_setstate;
>> -               rc = PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha,
>> -                       pm8001_dev, 0x01);
>> -               wait_for_completion(&completion_setstate);
>> +               if (rc) {
>> +                       PM8001_EH_DBG(pm8001_ha,
>> +                       pm8001_printk("task abort failed %x\n"
>> +                       "with rc %d\n", pm8001_dev->device_id, rc));
>> +                       rc = TMF_RESP_FUNC_FAILED;
>> +               }
>>         } else {
>>                 rc = sas_phy_reset(phy, 1);
>>                 msleep(2000);
>> diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
>> index 8dd8b78..c9736cc 100644
>> --- a/drivers/scsi/pm8001/pm8001_sas.h
>> +++ b/drivers/scsi/pm8001/pm8001_sas.h
>> @@ -569,6 +569,14 @@ struct pm8001_fw_image_header {
>>  #define        NCQ_READ_LOG_FLAG                       0x80000000
>>  #define        NCQ_ABORT_ALL_FLAG                      0x40000000
>>  #define        NCQ_2ND_RLE_FLAG                        0x20000000
>> +
>> +/* Device states */
>> +#define DS_OPERATIONAL                         0x01
>> +#define DS_PORT_IN_RESET                       0x02
>> +#define DS_IN_RECOVERY                         0x03
>> +#define DS_IN_ERROR                            0x04
>> +#define DS_NON_OPERATIONAL                     0x07
>> +
>>  /**
>>   * brief param structure for firmware flash update.
>>   */
>> --
>> 1.7.1
>>
>
>
>
> --
> Mit freundlichen Grüßen,
> Best Regards,
>
> Jack Wang
>
> Linux Kernel Developer Storage
> ProfitBricks GmbH  The IaaS-Company.
>
> ProfitBricks GmbH
> Greifswalder Str. 207
> D - 10405 Berlin
> Tel: +49 30 5770083-42
> Fax: +49 30 5770085-98
> Email: jinpu.wang@profitbricks.com
> URL: http://www.profitbricks.de
>
> Sitz der Gesellschaft: Berlin.
> Registergericht: Amtsgericht Charlottenburg, HRB 125506 B.
> Geschäftsführer: Andreas Gauger, Achim Weiss.
> --
> To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH V2 2/8] pm80xx: Corrected device state changes in I_T_Nexus_Reset.
  2015-08-14  7:15     ` Viswas G
@ 2015-08-17  7:52       ` Jinpu Wang
  0 siblings, 0 replies; 13+ messages in thread
From: Jinpu Wang @ 2015-08-17  7:52 UTC (permalink / raw)
  To: Viswas G
  Cc: linux-scsi, JBottomley, Tomas Henzl, Suresh Thiagarajan, Hannes Reinecke

On Fri, Aug 14, 2015 at 9:15 AM, Viswas G <Viswas.G@pmcs.com> wrote:
> On Thu, Aug 13, 2015 at 6:13 PM, Jinpu Wang <jinpu.wang@profitbricks.com> wrote:
>> Hi
>>
>> On Tue, Aug 11, 2015 at 11:36 AM,  <Viswas.G@pmcs.com> wrote:
>>> From: Viswas G <Viswas.G@pmcs.com>
>>>
>>> In Nexus reset the device state request are not needed.
>>>
>>> Changes from V1:
>>> Device state change request has been removed as the firmware
>>> will handle it during internal cleanup. Also updated the
>>> proper return value in case of failures.
>>
>> If above is true, should we remove the device state change command
>> support at all?
>>
>
> We can't remove the state change command as it is required for
> some task management command such as ABORT_TASK.
>

Ok, thanks

-- 
Mit freundlichen Grüßen,
Best Regards,

Jack Wang

Linux Kernel Developer Storage
ProfitBricks GmbH  The IaaS-Company.

ProfitBricks GmbH
Greifswalder Str. 207
D - 10405 Berlin
Tel: +49 30 5770083-42
Fax: +49 30 5770085-98
Email: jinpu.wang@profitbricks.com
URL: http://www.profitbricks.de

Sitz der Gesellschaft: Berlin.
Registergericht: Amtsgericht Charlottenburg, HRB 125506 B.
Geschäftsführer: Andreas Gauger, Achim Weiss.
--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

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

* Re: [PATCH V2 2/8] pm80xx: Corrected device state changes in I_T_Nexus_Reset.
  2015-08-11  9:36 ` [PATCH V2 2/8] pm80xx: Corrected device state changes in I_T_Nexus_Reset Viswas.G
  2015-08-13 12:43   ` Jinpu Wang
@ 2015-08-20 14:51   ` Tomas Henzl
  1 sibling, 0 replies; 13+ messages in thread
From: Tomas Henzl @ 2015-08-20 14:51 UTC (permalink / raw)
  To: Viswas.G, linux-scsi
  Cc: Jack Wang, JBottomley, Suresh.Thiagarajan, Hannes Reinecke

On 11.8.2015 11:36, Viswas.G@pmcs.com wrote:
> From: Viswas G <Viswas.G@pmcs.com>
> 
> In Nexus reset the device state request are not needed.
> 
> Changes from V1:
> Device state change request has been removed as the firmware
> will handle it during internal cleanup. Also updated the
> proper return value in case of failures.
> 
> Signed-off-by: Viswas G <Viswas.G@pmcs.com>
> 
> Reviewed-by: Suresh Thiagarajan <Suresh.Thiagarajan@pmcs.com>
Reviewed-by: Tomas Henzl <thenzl@redhat.com>

Tomas

> ---
>  drivers/scsi/pm8001/pm8001_sas.c |   18 +++++++++++++-----
>  drivers/scsi/pm8001/pm8001_sas.h |    8 ++++++++
>  2 files changed, 21 insertions(+), 5 deletions(-)
> 
> diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c
> index b93f289..48f4627 100644
> --- a/drivers/scsi/pm8001/pm8001_sas.c
> +++ b/drivers/scsi/pm8001/pm8001_sas.c
> @@ -975,19 +975,27 @@ int pm8001_I_T_nexus_reset(struct domain_device *dev)
>  	phy = sas_get_local_phy(dev);
>  
>  	if (dev_is_sata(dev)) {
> -		DECLARE_COMPLETION_ONSTACK(completion_setstate);
>  		if (scsi_is_sas_phy_local(phy)) {
>  			rc = 0;
>  			goto out;
>  		}
>  		rc = sas_phy_reset(phy, 1);
> +		if (rc) {
> +			PM8001_EH_DBG(pm8001_ha,
> +			pm8001_printk("phy reset failed for device %x\n"
> +			"with rc %d\n", pm8001_dev->device_id, rc));
> +			rc = TMF_RESP_FUNC_FAILED;
> +			goto out;
> +		}
>  		msleep(2000);
>  		rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev ,
>  			dev, 1, 0);
> -		pm8001_dev->setds_completion = &completion_setstate;
> -		rc = PM8001_CHIP_DISP->set_dev_state_req(pm8001_ha,
> -			pm8001_dev, 0x01);
> -		wait_for_completion(&completion_setstate);
> +		if (rc) {
> +			PM8001_EH_DBG(pm8001_ha,
> +			pm8001_printk("task abort failed %x\n"
> +			"with rc %d\n", pm8001_dev->device_id, rc));
> +			rc = TMF_RESP_FUNC_FAILED;
> +		}
>  	} else {
>  		rc = sas_phy_reset(phy, 1);
>  		msleep(2000);
> diff --git a/drivers/scsi/pm8001/pm8001_sas.h b/drivers/scsi/pm8001/pm8001_sas.h
> index 8dd8b78..c9736cc 100644
> --- a/drivers/scsi/pm8001/pm8001_sas.h
> +++ b/drivers/scsi/pm8001/pm8001_sas.h
> @@ -569,6 +569,14 @@ struct pm8001_fw_image_header {
>  #define	NCQ_READ_LOG_FLAG			0x80000000
>  #define	NCQ_ABORT_ALL_FLAG			0x40000000
>  #define	NCQ_2ND_RLE_FLAG			0x20000000
> +
> +/* Device states */
> +#define DS_OPERATIONAL				0x01
> +#define DS_PORT_IN_RESET			0x02
> +#define DS_IN_RECOVERY				0x03
> +#define DS_IN_ERROR				0x04
> +#define DS_NON_OPERATIONAL			0x07
> +
>  /**
>   * brief param structure for firmware flash update.
>   */
> 


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

end of thread, other threads:[~2015-08-20 14:51 UTC | newest]

Thread overview: 13+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-08-11  9:36 [PATCH V2 0/8] pm80xx: Driver updates Viswas.G
2015-08-11  9:36 ` [PATCH V2 1/8] pm80xx: Updated link rate Viswas.G
2015-08-11  9:36 ` [PATCH V2 2/8] pm80xx: Corrected device state changes in I_T_Nexus_Reset Viswas.G
2015-08-13 12:43   ` Jinpu Wang
2015-08-14  7:15     ` Viswas G
2015-08-17  7:52       ` Jinpu Wang
2015-08-20 14:51   ` Tomas Henzl
2015-08-11  9:36 ` [PATCH V2 3/8] pm80xx: Update For Thermal Page Code Viswas.G
2015-08-11  9:36 ` [PATCH V2 4/8] pm80xx: Fix for Incorrect DMA Unmapping of SG List Viswas.G
2015-08-11  9:36 ` [PATCH V2 5/8] pm80xx: Remove unnecessary phy disconnect while link error Viswas.G
2015-08-11  9:36 ` [PATCH V2 6/8] pm80xx: Add PORT RECOVERY TIMEOUT support Viswas.G
2015-08-11  9:36 ` [PATCH V2 7/8] pm80xx: Handling Invalid SSP Response frame Viswas.G
2015-08-11  9:36 ` [PATCH V2 8/8] pm80xx: Bump pm80xx driver version to 0.1.38 Viswas.G

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.