linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 0/7] hisi_sas: SATA IO workaround and other misc patches
@ 2017-01-18 16:32 John Garry
  2017-01-18 16:32 ` [PATCH 1/7] scsi: hisi_sas: workaround v2 hw SATA IO timeout issue John Garry
                   ` (6 more replies)
  0 siblings, 7 replies; 16+ messages in thread
From: John Garry @ 2017-01-18 16:32 UTC (permalink / raw)
  To: jejb, martin.petersen
  Cc: linuxarm, zhangfei.gao, xuwei5, john.garry2, linux-scsi,
	linux-kernel, John Garry

This patchset introduces some misc fixes and improvements.

Most signifigantly this patchset includes a workaround
for a SATA IO issue on v2 hw (hip06/7).

John Garry (2):
  scsi: hisi_sas: downgrade refclk message
  scsi: hisi_sas: downgrade internal abort exit print

Xiang Chen (5):
  scsi: hisi_sas: workaround v2 hw SATA IO timeout issue
  scsi: hisi_sas: modify some values of ITCT table
  scsi: hisi_sas: modify hard reset for directed-attached disk
  scsi: hisi_sas: fix probe ordering problem
  scsi: hisi_sas: decrease running_req in hisi_sas_slot_task_free()

 drivers/scsi/hisi_sas/hisi_sas_main.c  |  20 +++----
 drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 106 +++++++++++++++++++++++++++++----
 2 files changed, 103 insertions(+), 23 deletions(-)

-- 
1.9.1

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

* [PATCH 1/7] scsi: hisi_sas: workaround v2 hw SATA IO timeout issue
  2017-01-18 16:32 [PATCH 0/7] hisi_sas: SATA IO workaround and other misc patches John Garry
@ 2017-01-18 16:32 ` John Garry
  2017-01-19  8:41   ` Johannes Thumshirn
  2017-01-18 16:32 ` [PATCH 2/7] scsi: hisi_sas: modify some values of ITCT table John Garry
                   ` (5 subsequent siblings)
  6 siblings, 1 reply; 16+ messages in thread
From: John Garry @ 2017-01-18 16:32 UTC (permalink / raw)
  To: jejb, martin.petersen
  Cc: linuxarm, zhangfei.gao, xuwei5, john.garry2, linux-scsi,
	linux-kernel, Xiang Chen, John Garry

From: Xiang Chen <chenxiang66@hisilicon.com>

The v2 SAS controller needs more time to detect channel idle
and send setup link request than SATA disk does, so it is
difficult for SAS controller to setup an STP link. Therefore it
may cause some IO timeouts.

We need to periodically configure the SAS controller so it
doesn't receive STP setup requests from SATA disks for a while,
so IO can be sent during this period.

Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
---
 drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 75 +++++++++++++++++++++++++++++++++-
 1 file changed, 74 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
index 69b0f06..6c787eb 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
@@ -215,6 +215,7 @@
 #define RX_IDAF_DWORD5			(PORT_BASE + 0xd8)
 #define RX_IDAF_DWORD6			(PORT_BASE + 0xdc)
 #define RXOP_CHECK_CFG_H		(PORT_BASE + 0xfc)
+#define CON_CONTROL			(PORT_BASE + 0x118)
 #define DONE_RECEIVED_TIME		(PORT_BASE + 0x11c)
 #define CHL_INT0			(PORT_BASE + 0x1b4)
 #define CHL_INT0_HOTPLUG_TOUT_OFF	0
@@ -526,6 +527,8 @@ enum {
 #define SATA_PROTOCOL_FPDMA		0x8
 #define SATA_PROTOCOL_ATAPI		0x10
 
+static void hisi_sas_link_timeout_disable_link(unsigned long data);
+
 static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off)
 {
 	void __iomem *regs = hisi_hba->regs + off;
@@ -978,6 +981,50 @@ static void init_reg_v2_hw(struct hisi_hba *hisi_hba)
 			 upper_32_bits(hisi_hba->initial_fis_dma));
 }
 
+static void hisi_sas_link_timeout_enable_link(unsigned long data)
+{
+	struct hisi_hba *hisi_hba = (struct hisi_hba *)data;
+	int i, reg_val;
+
+	for (i = 0; i < hisi_hba->n_phy; i++) {
+		reg_val = hisi_sas_phy_read32(hisi_hba, i, CON_CONTROL);
+		if (!(reg_val & BIT(0))) {
+			hisi_sas_phy_write32(hisi_hba, i,
+					CON_CONTROL, 0x7);
+			break;
+		}
+	}
+
+	hisi_hba->timer.function = hisi_sas_link_timeout_disable_link;
+	mod_timer(&hisi_hba->timer, jiffies + msecs_to_jiffies(900));
+}
+
+static void hisi_sas_link_timeout_disable_link(unsigned long data)
+{
+	struct hisi_hba *hisi_hba = (struct hisi_hba *)data;
+	int i, reg_val;
+
+	reg_val = hisi_sas_read32(hisi_hba, PHY_STATE);
+	for (i = 0; i < hisi_hba->n_phy && reg_val; i++) {
+		if (reg_val & BIT(i)) {
+			hisi_sas_phy_write32(hisi_hba, i,
+					CON_CONTROL, 0x6);
+			break;
+		}
+	}
+
+	hisi_hba->timer.function = hisi_sas_link_timeout_enable_link;
+	mod_timer(&hisi_hba->timer, jiffies + msecs_to_jiffies(100));
+}
+
+static void set_link_timer_quirk(struct hisi_hba *hisi_hba)
+{
+	hisi_hba->timer.data = (unsigned long)hisi_hba;
+	hisi_hba->timer.function = hisi_sas_link_timeout_disable_link;
+	hisi_hba->timer.expires = jiffies + msecs_to_jiffies(1000);
+	add_timer(&hisi_hba->timer);
+}
+
 static int hw_init_v2_hw(struct hisi_hba *hisi_hba)
 {
 	struct device *dev = &hisi_hba->pdev->dev;
@@ -2020,9 +2067,12 @@ static int phy_up_v2_hw(int phy_no, struct hisi_hba *hisi_hba)
 	if (phy->identify.device_type == SAS_END_DEVICE)
 		phy->identify.target_port_protocols =
 			SAS_PROTOCOL_SSP;
-	else if (phy->identify.device_type != SAS_PHY_UNUSED)
+	else if (phy->identify.device_type != SAS_PHY_UNUSED) {
 		phy->identify.target_port_protocols =
 			SAS_PROTOCOL_SMP;
+		if (!timer_pending(&hisi_hba->timer))
+			set_link_timer_quirk(hisi_hba);
+	}
 	queue_work(hisi_hba->wq, &phy->phyup_ws);
 
 end:
@@ -2033,10 +2083,23 @@ static int phy_up_v2_hw(int phy_no, struct hisi_hba *hisi_hba)
 	return res;
 }
 
+static bool check_any_wideports_v2_hw(struct hisi_hba *hisi_hba)
+{
+	u32 port_state;
+
+	port_state = hisi_sas_read32(hisi_hba, PORT_STATE);
+	if (port_state & 0x1ff)
+		return true;
+
+	return false;
+}
+
 static int phy_down_v2_hw(int phy_no, struct hisi_hba *hisi_hba)
 {
 	int res = 0;
 	u32 phy_state, sl_ctrl, txid_auto;
+	struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no];
+	struct hisi_sas_port *port = phy->port;
 
 	hisi_sas_phy_write32(hisi_hba, phy_no, PHYCTRL_NOT_RDY_MSK, 1);
 
@@ -2046,6 +2109,10 @@ static int phy_down_v2_hw(int phy_no, struct hisi_hba *hisi_hba)
 	sl_ctrl = hisi_sas_phy_read32(hisi_hba, phy_no, SL_CONTROL);
 	hisi_sas_phy_write32(hisi_hba, phy_no, SL_CONTROL,
 			     sl_ctrl & ~SL_CONTROL_CTA_MSK);
+	if (port && !get_wideport_bitmap_v2_hw(hisi_hba, port->id))
+		if (!check_any_wideports_v2_hw(hisi_hba) &&
+				timer_pending(&hisi_hba->timer))
+			del_timer(&hisi_hba->timer);
 
 	txid_auto = hisi_sas_phy_read32(hisi_hba, phy_no, TXID_AUTO);
 	hisi_sas_phy_write32(hisi_hba, phy_no, TXID_AUTO,
@@ -2821,6 +2888,12 @@ static int hisi_sas_v2_probe(struct platform_device *pdev)
 
 static int hisi_sas_v2_remove(struct platform_device *pdev)
 {
+	struct sas_ha_struct *sha = platform_get_drvdata(pdev);
+	struct hisi_hba *hisi_hba = sha->lldd_ha;
+
+	if (timer_pending(&hisi_hba->timer))
+		del_timer(&hisi_hba->timer);
+
 	return hisi_sas_remove(pdev);
 }
 
-- 
1.9.1

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

* [PATCH 2/7] scsi: hisi_sas: modify some values of ITCT table
  2017-01-18 16:32 [PATCH 0/7] hisi_sas: SATA IO workaround and other misc patches John Garry
  2017-01-18 16:32 ` [PATCH 1/7] scsi: hisi_sas: workaround v2 hw SATA IO timeout issue John Garry
@ 2017-01-18 16:32 ` John Garry
  2017-01-19  8:44   ` Johannes Thumshirn
  2017-01-18 16:32 ` [PATCH 3/7] scsi: hisi_sas: downgrade refclk message John Garry
                   ` (4 subsequent siblings)
  6 siblings, 1 reply; 16+ messages in thread
From: John Garry @ 2017-01-18 16:32 UTC (permalink / raw)
  To: jejb, martin.petersen
  Cc: linuxarm, zhangfei.gao, xuwei5, john.garry2, linux-scsi,
	linux-kernel, Xiang Chen, John Garry

From: Xiang Chen <chenxiang66@hisilicon.com>

Set SMP connection timeout and continue AWT timer;
Clear ITCT table when dev gone.

Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
---
 drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
index 6c787eb..452e329 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
@@ -334,6 +334,8 @@
 #define ITCT_HDR_MCR_MSK		(0xf << ITCT_HDR_MCR_OFF)
 #define ITCT_HDR_VLN_OFF		9
 #define ITCT_HDR_VLN_MSK		(0xf << ITCT_HDR_VLN_OFF)
+#define ITCT_HDR_SMP_TIMEOUT_OFF	16
+#define ITCT_HDR_AWT_CONTINUE_OFF	25
 #define ITCT_HDR_PORT_ID_OFF		28
 #define ITCT_HDR_PORT_ID_MSK		(0xf << ITCT_HDR_PORT_ID_OFF)
 /* qw2 */
@@ -696,6 +698,8 @@ static void setup_itct_v2_hw(struct hisi_hba *hisi_hba,
 	qw0 |= ((1 << ITCT_HDR_VALID_OFF) |
 		(device->linkrate << ITCT_HDR_MCR_OFF) |
 		(1 << ITCT_HDR_VLN_OFF) |
+		(0xfa << ITCT_HDR_SMP_TIMEOUT_OFF) |
+		(1 << ITCT_HDR_AWT_CONTINUE_OFF) |
 		(port->id << ITCT_HDR_PORT_ID_OFF));
 	itct->qw0 = cpu_to_le64(qw0);
 
@@ -705,7 +709,7 @@ static void setup_itct_v2_hw(struct hisi_hba *hisi_hba,
 
 	/* qw2 */
 	if (!dev_is_sata(device))
-		itct->qw2 = cpu_to_le64((500ULL << ITCT_HDR_INLT_OFF) |
+		itct->qw2 = cpu_to_le64((5000ULL << ITCT_HDR_INLT_OFF) |
 					(0x1ULL << ITCT_HDR_BITLT_OFF) |
 					(0x32ULL << ITCT_HDR_MCTLT_OFF) |
 					(0x1ULL << ITCT_HDR_RTOLT_OFF));
@@ -714,7 +718,7 @@ static void setup_itct_v2_hw(struct hisi_hba *hisi_hba,
 static void free_device_v2_hw(struct hisi_hba *hisi_hba,
 			      struct hisi_sas_device *sas_dev)
 {
-	u64 qw0, dev_id = sas_dev->device_id;
+	u64 dev_id = sas_dev->device_id;
 	struct device *dev = &hisi_hba->pdev->dev;
 	struct hisi_sas_itct *itct = &hisi_hba->itct[dev_id];
 	u32 reg_val = hisi_sas_read32(hisi_hba, ENT_INT_SRC3);
@@ -738,8 +742,7 @@ static void free_device_v2_hw(struct hisi_hba *hisi_hba,
 			dev_dbg(dev, "got clear ITCT done interrupt\n");
 
 			/* invalid the itct state*/
-			qw0 = cpu_to_le64(itct->qw0);
-			qw0 &= ~(1 << ITCT_HDR_VALID_OFF);
+			memset(itct, 0, sizeof(struct hisi_sas_itct));
 			hisi_sas_write32(hisi_hba, ENT_INT_SRC3,
 					 ENT_INT_SRC3_ITC_INT_MSK);
 
-- 
1.9.1

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

* [PATCH 3/7] scsi: hisi_sas: downgrade refclk message
  2017-01-18 16:32 [PATCH 0/7] hisi_sas: SATA IO workaround and other misc patches John Garry
  2017-01-18 16:32 ` [PATCH 1/7] scsi: hisi_sas: workaround v2 hw SATA IO timeout issue John Garry
  2017-01-18 16:32 ` [PATCH 2/7] scsi: hisi_sas: modify some values of ITCT table John Garry
@ 2017-01-18 16:32 ` John Garry
  2017-01-19  8:45   ` Johannes Thumshirn
  2017-01-18 16:32 ` [PATCH 4/7] scsi: hisi_sas: modify hard reset for directed-attached disk John Garry
                   ` (3 subsequent siblings)
  6 siblings, 1 reply; 16+ messages in thread
From: John Garry @ 2017-01-18 16:32 UTC (permalink / raw)
  To: jejb, martin.petersen
  Cc: linuxarm, zhangfei.gao, xuwei5, john.garry2, linux-scsi,
	linux-kernel, John Garry

The message to inform that the controller has no refclk
is currently at warning level, which is unnecessary, so
downgrade to debug.

Signed-off-by: John Garry <john.garry@huawei.com>
Reviewed-by: Xiang Chen <chenxiang66@hisilicon.com>
---
 drivers/scsi/hisi_sas/hisi_sas_main.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index 22dba01..eee7ae2 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -1453,7 +1453,7 @@ static struct Scsi_Host *hisi_sas_shost_alloc(struct platform_device *pdev,
 
 	refclk = devm_clk_get(&pdev->dev, NULL);
 	if (IS_ERR(refclk))
-		dev_info(dev, "no ref clk property\n");
+		dev_dbg(dev, "no ref clk property\n");
 	else
 		hisi_hba->refclk_frequency_mhz = clk_get_rate(refclk) / 1000000;
 
-- 
1.9.1

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

* [PATCH 4/7] scsi: hisi_sas: modify hard reset for directed-attached disk
  2017-01-18 16:32 [PATCH 0/7] hisi_sas: SATA IO workaround and other misc patches John Garry
                   ` (2 preceding siblings ...)
  2017-01-18 16:32 ` [PATCH 3/7] scsi: hisi_sas: downgrade refclk message John Garry
@ 2017-01-18 16:32 ` John Garry
  2017-01-19  8:46   ` Johannes Thumshirn
  2017-01-18 16:32 ` [PATCH 5/7] scsi: hisi_sas: downgrade internal abort exit print John Garry
                   ` (2 subsequent siblings)
  6 siblings, 1 reply; 16+ messages in thread
From: John Garry @ 2017-01-18 16:32 UTC (permalink / raw)
  To: jejb, martin.petersen
  Cc: linuxarm, zhangfei.gao, xuwei5, john.garry2, linux-scsi,
	linux-kernel, Xiang Chen, John Garry

From: Xiang Chen <chenxiang66@hisilicon.com>

Correctly set registers in v2 for root PHY hardreset for directly
attached disk.

Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
---
 drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
index 452e329..7519772 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
@@ -207,6 +207,8 @@
 #define TXID_AUTO			(PORT_BASE + 0xb8)
 #define TXID_AUTO_CT3_OFF		1
 #define TXID_AUTO_CT3_MSK		(0x1 << TXID_AUTO_CT3_OFF)
+#define TX_HARDRST_OFF          2
+#define TX_HARDRST_MSK          (0x1 << TX_HARDRST_OFF)
 #define RX_IDAF_DWORD0			(PORT_BASE + 0xc4)
 #define RX_IDAF_DWORD1			(PORT_BASE + 0xc8)
 #define RX_IDAF_DWORD2			(PORT_BASE + 0xcc)
@@ -1075,7 +1077,15 @@ static void stop_phy_v2_hw(struct hisi_hba *hisi_hba, int phy_no)
 
 static void phy_hard_reset_v2_hw(struct hisi_hba *hisi_hba, int phy_no)
 {
+	struct hisi_sas_phy *phy = &hisi_hba->phy[phy_no];
+	u32 txid_auto;
+
 	stop_phy_v2_hw(hisi_hba, phy_no);
+	if (phy->identify.device_type == SAS_END_DEVICE) {
+		txid_auto = hisi_sas_phy_read32(hisi_hba, phy_no, TXID_AUTO);
+		hisi_sas_phy_write32(hisi_hba, phy_no, TXID_AUTO,
+					txid_auto | TX_HARDRST_MSK);
+	}
 	msleep(100);
 	start_phy_v2_hw(hisi_hba, phy_no);
 }
-- 
1.9.1

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

* [PATCH 5/7] scsi: hisi_sas: downgrade internal abort exit print
  2017-01-18 16:32 [PATCH 0/7] hisi_sas: SATA IO workaround and other misc patches John Garry
                   ` (3 preceding siblings ...)
  2017-01-18 16:32 ` [PATCH 4/7] scsi: hisi_sas: modify hard reset for directed-attached disk John Garry
@ 2017-01-18 16:32 ` John Garry
  2017-01-19  8:47   ` Johannes Thumshirn
  2017-01-18 16:32 ` [PATCH 6/7] scsi: hisi_sas: fix probe ordering problem John Garry
  2017-01-18 16:32 ` [PATCH 7/7] scsi: hisi_sas: decrease running_req in hisi_sas_slot_task_free() John Garry
  6 siblings, 1 reply; 16+ messages in thread
From: John Garry @ 2017-01-18 16:32 UTC (permalink / raw)
  To: jejb, martin.petersen
  Cc: linuxarm, zhangfei.gao, xuwei5, john.garry2, linux-scsi,
	linux-kernel, John Garry

Downgrade the exit print in hisi_sas_internal_task_abort()
to dbg level, as info is not required.

Signed-off-by: John Garry <john.garry@huawei.com>
Reviewed-by: Xiang Chen <chenxiang66@hisilicon.com>
---
 drivers/scsi/hisi_sas/hisi_sas_main.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index eee7ae2..b2782ce 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -1121,7 +1121,7 @@ static int hisi_sas_query_task(struct sas_task *task)
 	}
 
 exit:
-	dev_info(dev, "internal task abort: task to dev %016llx task=%p "
+	dev_dbg(dev, "internal task abort: task to dev %016llx task=%p "
 		"resp: 0x%x sts 0x%x\n",
 		SAS_ADDR(device->sas_addr),
 		task,
-- 
1.9.1

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

* [PATCH 6/7] scsi: hisi_sas: fix probe ordering problem
  2017-01-18 16:32 [PATCH 0/7] hisi_sas: SATA IO workaround and other misc patches John Garry
                   ` (4 preceding siblings ...)
  2017-01-18 16:32 ` [PATCH 5/7] scsi: hisi_sas: downgrade internal abort exit print John Garry
@ 2017-01-18 16:32 ` John Garry
  2017-01-19  8:55   ` Johannes Thumshirn
  2017-01-18 16:32 ` [PATCH 7/7] scsi: hisi_sas: decrease running_req in hisi_sas_slot_task_free() John Garry
  6 siblings, 1 reply; 16+ messages in thread
From: John Garry @ 2017-01-18 16:32 UTC (permalink / raw)
  To: jejb, martin.petersen
  Cc: linuxarm, zhangfei.gao, xuwei5, john.garry2, linux-scsi,
	linux-kernel, Xiang Chen, John Garry

From: Xiang Chen <chenxiang66@hisilicon.com>

There is a potential probe issue in how we trigger the hw initialisation.
Although we use 1s timer to delay hw initialisation, there is still a
potential that sas_register_ha() is not be finished before we start
the PHY init from hw->hw_init().
To avoid this issue, initialise the hw after sas_register_ha() in the
same probe context.
Note: it is not necessary to use 1s timer now (modified v2 hw only).

Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
---
 drivers/scsi/hisi_sas/hisi_sas_main.c  | 8 ++++----
 drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 8 ++------
 2 files changed, 6 insertions(+), 10 deletions(-)

diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index b2782ce..8601cec 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -1552,10 +1552,6 @@ int hisi_sas_probe(struct platform_device *pdev,
 
 	hisi_sas_init_add(hisi_hba);
 
-	rc = hisi_hba->hw->hw_init(hisi_hba);
-	if (rc)
-		goto err_out_ha;
-
 	rc = scsi_add_host(shost, &pdev->dev);
 	if (rc)
 		goto err_out_ha;
@@ -1564,6 +1560,10 @@ int hisi_sas_probe(struct platform_device *pdev,
 	if (rc)
 		goto err_out_register_ha;
 
+	rc = hisi_hba->hw->hw_init(hisi_hba);
+	if (rc)
+		goto err_out_register_ha;
+
 	scsi_scan_host(shost);
 
 	return 0;
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
index 7519772..62655c7 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
@@ -1090,9 +1090,8 @@ static void phy_hard_reset_v2_hw(struct hisi_hba *hisi_hba, int phy_no)
 	start_phy_v2_hw(hisi_hba, phy_no);
 }
 
-static void start_phys_v2_hw(unsigned long data)
+static void start_phys_v2_hw(struct hisi_hba *hisi_hba)
 {
-	struct hisi_hba *hisi_hba = (struct hisi_hba *)data;
 	int i;
 
 	for (i = 0; i < hisi_hba->n_phy; i++)
@@ -1101,10 +1100,7 @@ static void start_phys_v2_hw(unsigned long data)
 
 static void phys_init_v2_hw(struct hisi_hba *hisi_hba)
 {
-	struct timer_list *timer = &hisi_hba->timer;
-
-	setup_timer(timer, start_phys_v2_hw, (unsigned long)hisi_hba);
-	mod_timer(timer, jiffies + HZ);
+	start_phys_v2_hw(hisi_hba);
 }
 
 static void sl_notify_v2_hw(struct hisi_hba *hisi_hba, int phy_no)
-- 
1.9.1

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

* [PATCH 7/7] scsi: hisi_sas: decrease running_req in hisi_sas_slot_task_free()
  2017-01-18 16:32 [PATCH 0/7] hisi_sas: SATA IO workaround and other misc patches John Garry
                   ` (5 preceding siblings ...)
  2017-01-18 16:32 ` [PATCH 6/7] scsi: hisi_sas: fix probe ordering problem John Garry
@ 2017-01-18 16:32 ` John Garry
  2017-01-19  8:57   ` Johannes Thumshirn
  6 siblings, 1 reply; 16+ messages in thread
From: John Garry @ 2017-01-18 16:32 UTC (permalink / raw)
  To: jejb, martin.petersen
  Cc: linuxarm, zhangfei.gao, xuwei5, john.garry2, linux-scsi,
	linux-kernel, Xiang Chen, John Garry

From: Xiang Chen <chenxiang66@hisilicon.com>

There is an issue that hisi_sas_dev.running_req is not
decremented properly for internal abort and TMF.

To resolve, only decrease running_req in hisi_sas_slot_task_free()

Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: John Garry <john.garry@huawei.com>
---
 drivers/scsi/hisi_sas/hisi_sas_main.c  | 8 ++++----
 drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 2 --
 2 files changed, 4 insertions(+), 6 deletions(-)

diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index 8601cec..53637a9 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -71,6 +71,8 @@ void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba, struct sas_task *task,
 			     struct hisi_sas_slot *slot)
 {
 	struct device *dev = &hisi_hba->pdev->dev;
+	struct domain_device *device = task->dev;
+	struct hisi_sas_device *sas_dev = device->lldd_dev;
 
 	if (!slot->task)
 		return;
@@ -97,6 +99,8 @@ void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba, struct sas_task *task,
 	slot->task = NULL;
 	slot->port = NULL;
 	hisi_sas_slot_index_free(hisi_hba, slot->idx);
+	if (sas_dev)
+		atomic64_dec(&sas_dev->running_req);
 	/* slot memory is fully zeroed when it is reused */
 }
 EXPORT_SYMBOL_GPL(hisi_sas_slot_task_free);
@@ -141,8 +145,6 @@ static void hisi_sas_slot_abort(struct work_struct *work)
 	struct hisi_hba *hisi_hba = dev_to_hisi_hba(task->dev);
 	struct scsi_cmnd *cmnd = task->uldd_task;
 	struct hisi_sas_tmf_task tmf_task;
-	struct domain_device *device = task->dev;
-	struct hisi_sas_device *sas_dev = device->lldd_dev;
 	struct scsi_lun lun;
 	struct device *dev = &hisi_hba->pdev->dev;
 	int tag = abort_slot->idx;
@@ -165,8 +167,6 @@ static void hisi_sas_slot_abort(struct work_struct *work)
 	spin_unlock_irqrestore(&hisi_hba->lock, flags);
 	if (task->task_done)
 		task->task_done(task);
-	if (sas_dev)
-		atomic64_dec(&sas_dev->running_req);
 }
 
 static int hisi_sas_task_prep(struct sas_task *task, struct hisi_hba *hisi_hba,
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
index 62655c7..de240d2 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
@@ -1827,8 +1827,6 @@ static void slot_err_v2_hw(struct hisi_hba *hisi_hba,
 	}
 
 out:
-	if (sas_dev)
-		atomic64_dec(&sas_dev->running_req);
 
 	hisi_sas_slot_task_free(hisi_hba, task, slot);
 	sts = ts->stat;
-- 
1.9.1

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

* Re: [PATCH 1/7] scsi: hisi_sas: workaround v2 hw SATA IO timeout issue
  2017-01-18 16:32 ` [PATCH 1/7] scsi: hisi_sas: workaround v2 hw SATA IO timeout issue John Garry
@ 2017-01-19  8:41   ` Johannes Thumshirn
  0 siblings, 0 replies; 16+ messages in thread
From: Johannes Thumshirn @ 2017-01-19  8:41 UTC (permalink / raw)
  To: John Garry
  Cc: jejb, martin.petersen, linuxarm, zhangfei.gao, xuwei5,
	john.garry2, linux-scsi, linux-kernel, Xiang Chen

On Thu, Jan 19, 2017 at 12:32:47AM +0800, John Garry wrote:
> From: Xiang Chen <chenxiang66@hisilicon.com>
> 
> The v2 SAS controller needs more time to detect channel idle
> and send setup link request than SATA disk does, so it is
> difficult for SAS controller to setup an STP link. Therefore it
> may cause some IO timeouts.
> 
> We need to periodically configure the SAS controller so it
> doesn't receive STP setup requests from SATA disks for a while,
> so IO can be sent during this period.
> 
> Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
> Signed-off-by: John Garry <john.garry@huawei.com>
> ---

Looks good,
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>

-- 
Johannes Thumshirn                                          Storage
jthumshirn@suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

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

* Re: [PATCH 2/7] scsi: hisi_sas: modify some values of ITCT table
  2017-01-18 16:32 ` [PATCH 2/7] scsi: hisi_sas: modify some values of ITCT table John Garry
@ 2017-01-19  8:44   ` Johannes Thumshirn
  2017-01-19  8:55     ` John Garry
  0 siblings, 1 reply; 16+ messages in thread
From: Johannes Thumshirn @ 2017-01-19  8:44 UTC (permalink / raw)
  To: John Garry
  Cc: jejb, martin.petersen, linuxarm, zhangfei.gao, xuwei5,
	john.garry2, linux-scsi, linux-kernel, Xiang Chen

On Thu, Jan 19, 2017 at 12:32:48AM +0800, John Garry wrote:
> From: Xiang Chen <chenxiang66@hisilicon.com>
> 
> Set SMP connection timeout and continue AWT timer;
> Clear ITCT table when dev gone.
> 
> Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
> Signed-off-by: John Garry <john.garry@huawei.com>
> ---
>  drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 11 +++++++----
>  1 file changed, 7 insertions(+), 4 deletions(-)
> 
> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
> index 6c787eb..452e329 100644
> --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
> +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
> @@ -334,6 +334,8 @@
>  #define ITCT_HDR_MCR_MSK		(0xf << ITCT_HDR_MCR_OFF)
>  #define ITCT_HDR_VLN_OFF		9
>  #define ITCT_HDR_VLN_MSK		(0xf << ITCT_HDR_VLN_OFF)
> +#define ITCT_HDR_SMP_TIMEOUT_OFF	16
> +#define ITCT_HDR_AWT_CONTINUE_OFF	25
>  #define ITCT_HDR_PORT_ID_OFF		28
>  #define ITCT_HDR_PORT_ID_MSK		(0xf << ITCT_HDR_PORT_ID_OFF)
>  /* qw2 */
> @@ -696,6 +698,8 @@ static void setup_itct_v2_hw(struct hisi_hba *hisi_hba,
>  	qw0 |= ((1 << ITCT_HDR_VALID_OFF) |
>  		(device->linkrate << ITCT_HDR_MCR_OFF) |
>  		(1 << ITCT_HDR_VLN_OFF) |
> +		(0xfa << ITCT_HDR_SMP_TIMEOUT_OFF) |
                 ^~ You may want to give that magic value a name.

Other than that,
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>

-- 
Johannes Thumshirn                                          Storage
jthumshirn@suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

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

* Re: [PATCH 3/7] scsi: hisi_sas: downgrade refclk message
  2017-01-18 16:32 ` [PATCH 3/7] scsi: hisi_sas: downgrade refclk message John Garry
@ 2017-01-19  8:45   ` Johannes Thumshirn
  0 siblings, 0 replies; 16+ messages in thread
From: Johannes Thumshirn @ 2017-01-19  8:45 UTC (permalink / raw)
  To: John Garry
  Cc: jejb, martin.petersen, linuxarm, zhangfei.gao, xuwei5,
	john.garry2, linux-scsi, linux-kernel

On Thu, Jan 19, 2017 at 12:32:49AM +0800, John Garry wrote:
> The message to inform that the controller has no refclk
> is currently at warning level, which is unnecessary, so
> downgrade to debug.
> 
> Signed-off-by: John Garry <john.garry@huawei.com>
> Reviewed-by: Xiang Chen <chenxiang66@hisilicon.com>
> ---

Looks good,
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>

-- 
Johannes Thumshirn                                          Storage
jthumshirn@suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

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

* Re: [PATCH 4/7] scsi: hisi_sas: modify hard reset for directed-attached disk
  2017-01-18 16:32 ` [PATCH 4/7] scsi: hisi_sas: modify hard reset for directed-attached disk John Garry
@ 2017-01-19  8:46   ` Johannes Thumshirn
  0 siblings, 0 replies; 16+ messages in thread
From: Johannes Thumshirn @ 2017-01-19  8:46 UTC (permalink / raw)
  To: John Garry
  Cc: jejb, martin.petersen, linuxarm, zhangfei.gao, xuwei5,
	john.garry2, linux-scsi, linux-kernel, Xiang Chen

On Thu, Jan 19, 2017 at 12:32:50AM +0800, John Garry wrote:
> From: Xiang Chen <chenxiang66@hisilicon.com>
> 
> Correctly set registers in v2 for root PHY hardreset for directly
> attached disk.
> 
> Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
> Signed-off-by: John Garry <john.garry@huawei.com>
> ---

Looks good,
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>

-- 
Johannes Thumshirn                                          Storage
jthumshirn@suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

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

* Re: [PATCH 5/7] scsi: hisi_sas: downgrade internal abort exit print
  2017-01-18 16:32 ` [PATCH 5/7] scsi: hisi_sas: downgrade internal abort exit print John Garry
@ 2017-01-19  8:47   ` Johannes Thumshirn
  0 siblings, 0 replies; 16+ messages in thread
From: Johannes Thumshirn @ 2017-01-19  8:47 UTC (permalink / raw)
  To: John Garry
  Cc: jejb, martin.petersen, linuxarm, zhangfei.gao, xuwei5,
	john.garry2, linux-scsi, linux-kernel

On Thu, Jan 19, 2017 at 12:32:51AM +0800, John Garry wrote:
> Downgrade the exit print in hisi_sas_internal_task_abort()
> to dbg level, as info is not required.
> 
> Signed-off-by: John Garry <john.garry@huawei.com>
> Reviewed-by: Xiang Chen <chenxiang66@hisilicon.com>
> ---

Looks good,
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>

-- 
Johannes Thumshirn                                          Storage
jthumshirn@suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

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

* Re: [PATCH 6/7] scsi: hisi_sas: fix probe ordering problem
  2017-01-18 16:32 ` [PATCH 6/7] scsi: hisi_sas: fix probe ordering problem John Garry
@ 2017-01-19  8:55   ` Johannes Thumshirn
  0 siblings, 0 replies; 16+ messages in thread
From: Johannes Thumshirn @ 2017-01-19  8:55 UTC (permalink / raw)
  To: John Garry
  Cc: jejb, martin.petersen, linuxarm, zhangfei.gao, xuwei5,
	john.garry2, linux-scsi, linux-kernel, Xiang Chen

On Thu, Jan 19, 2017 at 12:32:52AM +0800, John Garry wrote:
> From: Xiang Chen <chenxiang66@hisilicon.com>
> 
> There is a potential probe issue in how we trigger the hw initialisation.
> Although we use 1s timer to delay hw initialisation, there is still a
> potential that sas_register_ha() is not be finished before we start
> the PHY init from hw->hw_init().
> To avoid this issue, initialise the hw after sas_register_ha() in the
> same probe context.
> Note: it is not necessary to use 1s timer now (modified v2 hw only).
> 
> Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
> Signed-off-by: John Garry <john.garry@huawei.com>
> ---

Looks OK,
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>

-- 
Johannes Thumshirn                                          Storage
jthumshirn@suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

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

* Re: [PATCH 2/7] scsi: hisi_sas: modify some values of ITCT table
  2017-01-19  8:44   ` Johannes Thumshirn
@ 2017-01-19  8:55     ` John Garry
  0 siblings, 0 replies; 16+ messages in thread
From: John Garry @ 2017-01-19  8:55 UTC (permalink / raw)
  To: Johannes Thumshirn
  Cc: jejb, martin.petersen, linuxarm, zhangfei.gao, xuwei5,
	john.garry2, linux-scsi, linux-kernel, Xiang Chen

On 19/01/2017 08:44, Johannes Thumshirn wrote:
> On Thu, Jan 19, 2017 at 12:32:48AM +0800, John Garry wrote:
>> From: Xiang Chen <chenxiang66@hisilicon.com>
>>
>> Set SMP connection timeout and continue AWT timer;
>> Clear ITCT table when dev gone.
>>
>> Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
>> Signed-off-by: John Garry <john.garry@huawei.com>
>> ---
>>  drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 11 +++++++----
>>  1 file changed, 7 insertions(+), 4 deletions(-)
>>
>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>> index 6c787eb..452e329 100644
>> --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>> +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>> @@ -334,6 +334,8 @@
>>  #define ITCT_HDR_MCR_MSK		(0xf << ITCT_HDR_MCR_OFF)
>>  #define ITCT_HDR_VLN_OFF		9
>>  #define ITCT_HDR_VLN_MSK		(0xf << ITCT_HDR_VLN_OFF)
>> +#define ITCT_HDR_SMP_TIMEOUT_OFF	16
>> +#define ITCT_HDR_AWT_CONTINUE_OFF	25
>>  #define ITCT_HDR_PORT_ID_OFF		28
>>  #define ITCT_HDR_PORT_ID_MSK		(0xf << ITCT_HDR_PORT_ID_OFF)
>>  /* qw2 */
>> @@ -696,6 +698,8 @@ static void setup_itct_v2_hw(struct hisi_hba *hisi_hba,
>>  	qw0 |= ((1 << ITCT_HDR_VALID_OFF) |
>>  		(device->linkrate << ITCT_HDR_MCR_OFF) |
>>  		(1 << ITCT_HDR_VLN_OFF) |
>> +		(0xfa << ITCT_HDR_SMP_TIMEOUT_OFF) |
>                  ^~ You may want to give that magic value a name.
>

Thanks for having a look.

We will create a new patch without the mysterious value.

Regards,
John

> Other than that,
> Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>
>

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

* Re: [PATCH 7/7] scsi: hisi_sas: decrease running_req in hisi_sas_slot_task_free()
  2017-01-18 16:32 ` [PATCH 7/7] scsi: hisi_sas: decrease running_req in hisi_sas_slot_task_free() John Garry
@ 2017-01-19  8:57   ` Johannes Thumshirn
  0 siblings, 0 replies; 16+ messages in thread
From: Johannes Thumshirn @ 2017-01-19  8:57 UTC (permalink / raw)
  To: John Garry
  Cc: jejb, martin.petersen, linuxarm, zhangfei.gao, xuwei5,
	john.garry2, linux-scsi, linux-kernel, Xiang Chen

On Thu, Jan 19, 2017 at 12:32:53AM +0800, John Garry wrote:
> From: Xiang Chen <chenxiang66@hisilicon.com>
> 
> There is an issue that hisi_sas_dev.running_req is not
> decremented properly for internal abort and TMF.
> 
> To resolve, only decrease running_req in hisi_sas_slot_task_free()
> 
> Signed-off-by: Xiang Chen <chenxiang66@hisilicon.com>
> Signed-off-by: John Garry <john.garry@huawei.com>
> ---

Looks good,
Reviewed-by: Johannes Thumshirn <jthumshirn@suse.de>

-- 
Johannes Thumshirn                                          Storage
jthumshirn@suse.de                                +49 911 74053 689
SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Felix Imendörffer, Jane Smithard, Graham Norton
HRB 21284 (AG Nürnberg)
Key fingerprint = EC38 9CAB C2C4 F25D 8600 D0D0 0393 969D 2D76 0850

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

end of thread, other threads:[~2017-01-19  9:05 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2017-01-18 16:32 [PATCH 0/7] hisi_sas: SATA IO workaround and other misc patches John Garry
2017-01-18 16:32 ` [PATCH 1/7] scsi: hisi_sas: workaround v2 hw SATA IO timeout issue John Garry
2017-01-19  8:41   ` Johannes Thumshirn
2017-01-18 16:32 ` [PATCH 2/7] scsi: hisi_sas: modify some values of ITCT table John Garry
2017-01-19  8:44   ` Johannes Thumshirn
2017-01-19  8:55     ` John Garry
2017-01-18 16:32 ` [PATCH 3/7] scsi: hisi_sas: downgrade refclk message John Garry
2017-01-19  8:45   ` Johannes Thumshirn
2017-01-18 16:32 ` [PATCH 4/7] scsi: hisi_sas: modify hard reset for directed-attached disk John Garry
2017-01-19  8:46   ` Johannes Thumshirn
2017-01-18 16:32 ` [PATCH 5/7] scsi: hisi_sas: downgrade internal abort exit print John Garry
2017-01-19  8:47   ` Johannes Thumshirn
2017-01-18 16:32 ` [PATCH 6/7] scsi: hisi_sas: fix probe ordering problem John Garry
2017-01-19  8:55   ` Johannes Thumshirn
2017-01-18 16:32 ` [PATCH 7/7] scsi: hisi_sas: decrease running_req in hisi_sas_slot_task_free() John Garry
2017-01-19  8:57   ` Johannes Thumshirn

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