* [PATCH V3 0/9] pm80xx updates
@ 2017-09-19 17:09 Viswas G
2017-09-19 17:09 ` [PATCH V3 1/9] pm80xx : redefine sas_identify_frame structure Viswas G
` (8 more replies)
0 siblings, 9 replies; 13+ messages in thread
From: Viswas G @ 2017-09-19 17:09 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 V2:
- Corrected date.
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] 13+ messages in thread
* [PATCH V3 1/9] pm80xx : redefine sas_identify_frame structure
2017-09-19 17:09 [PATCH V3 0/9] pm80xx updates Viswas G
@ 2017-09-19 17:09 ` Viswas G
2017-09-19 17:09 ` [PATCH V3 2/9] pm80xx : ILA and inactive firmware version through sysfs Viswas G
` (7 subsequent siblings)
8 siblings, 0 replies; 13+ messages in thread
From: Viswas G @ 2017-09-19 17:09 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>
Acked-by: Jack Wang <jinpu.wang@profitbricks.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] 13+ messages in thread
* [PATCH V3 2/9] pm80xx : ILA and inactive firmware version through sysfs
2017-09-19 17:09 [PATCH V3 0/9] pm80xx updates Viswas G
2017-09-19 17:09 ` [PATCH V3 1/9] pm80xx : redefine sas_identify_frame structure Viswas G
@ 2017-09-19 17:09 ` Viswas G
2017-09-19 17:09 ` [PATCH V3 3/9] pm80xx : Different SAS addresses for phys Viswas G
` (6 subsequent siblings)
8 siblings, 0 replies; 13+ messages in thread
From: Viswas G @ 2017-09-19 17:09 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] 13+ messages in thread
* [PATCH V3 3/9] pm80xx : Different SAS addresses for phys.
2017-09-19 17:09 [PATCH V3 0/9] pm80xx updates Viswas G
2017-09-19 17:09 ` [PATCH V3 1/9] pm80xx : redefine sas_identify_frame structure Viswas G
2017-09-19 17:09 ` [PATCH V3 2/9] pm80xx : ILA and inactive firmware version through sysfs Viswas G
@ 2017-09-19 17:09 ` Viswas G
2017-09-19 17:09 ` [PATCH V3 4/9] pm80xx : tag allocation for phy control request Viswas G
` (5 subsequent siblings)
8 siblings, 0 replies; 13+ messages in thread
From: Viswas G @ 2017-09-19 17:09 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 0e013f76b582..7a697ca68501 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;
@@ -591,10 +591,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;
@@ -611,6 +613,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
@@ -672,10 +675,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] 13+ messages in thread
* [PATCH V3 4/9] pm80xx : tag allocation for phy control request.
2017-09-19 17:09 [PATCH V3 0/9] pm80xx updates Viswas G
` (2 preceding siblings ...)
2017-09-19 17:09 ` [PATCH V3 3/9] pm80xx : Different SAS addresses for phys Viswas G
@ 2017-09-19 17:09 ` Viswas G
2017-09-20 15:18 ` kbuild test robot
2017-09-19 17:10 ` [PATCH V3 5/9] pm80xx : cleanup in pm8001_abort_task function Viswas G
` (4 subsequent siblings)
8 siblings, 1 reply; 13+ messages in thread
From: Viswas G @ 2017-09-19 17:09 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>
Acked-by: Jack Wang <jinpu.wang@profitbricks.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] 13+ messages in thread
* [PATCH V3 5/9] pm80xx : cleanup in pm8001_abort_task function.
2017-09-19 17:09 [PATCH V3 0/9] pm80xx updates Viswas G
` (3 preceding siblings ...)
2017-09-19 17:09 ` [PATCH V3 4/9] pm80xx : tag allocation for phy control request Viswas G
@ 2017-09-19 17:10 ` Viswas G
2017-09-20 15:57 ` kbuild test robot
2017-09-19 17:10 ` [PATCH V3 6/9] pm80xx : modified port reset timer value for PM8006 card Viswas G
` (3 subsequent siblings)
8 siblings, 1 reply; 13+ messages in thread
From: Viswas G @ 2017-09-19 17:10 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>
Acked-by: Jack Wang <jinpu.wang@profitbricks.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] 13+ messages in thread
* [PATCH V3 6/9] pm80xx : modified port reset timer value for PM8006 card
2017-09-19 17:09 [PATCH V3 0/9] pm80xx updates Viswas G
` (4 preceding siblings ...)
2017-09-19 17:10 ` [PATCH V3 5/9] pm80xx : cleanup in pm8001_abort_task function Viswas G
@ 2017-09-19 17:10 ` Viswas G
2017-09-19 17:10 ` [PATCH V3 7/9] pm80xx : corrected SATA abort handling sequence Viswas G
` (2 subsequent siblings)
8 siblings, 0 replies; 13+ messages in thread
From: Viswas G @ 2017-09-19 17:10 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>
Acked-by: Jack Wang <jinpu.wang@profitbricks.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] 13+ messages in thread
* [PATCH V3 7/9] pm80xx : corrected SATA abort handling sequence.
2017-09-19 17:09 [PATCH V3 0/9] pm80xx updates Viswas G
` (5 preceding siblings ...)
2017-09-19 17:10 ` [PATCH V3 6/9] pm80xx : modified port reset timer value for PM8006 card Viswas G
@ 2017-09-19 17:10 ` Viswas G
2017-09-19 17:10 ` [PATCH V3 8/9] pm80xx : panic on ncq error cleaning up the read log Viswas G
2017-09-19 17:10 ` [PATCH V3 9/9] pm80xx : corrected linkrate value Viswas G
8 siblings, 0 replies; 13+ messages in thread
From: Viswas G @ 2017-09-19 17:10 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>
Acked-by: Jack Wang <jinpu.wang@profitbricks.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] 13+ messages in thread
* [PATCH V3 8/9] pm80xx : panic on ncq error cleaning up the read log.
2017-09-19 17:09 [PATCH V3 0/9] pm80xx updates Viswas G
` (6 preceding siblings ...)
2017-09-19 17:10 ` [PATCH V3 7/9] pm80xx : corrected SATA abort handling sequence Viswas G
@ 2017-09-19 17:10 ` Viswas G
2017-09-19 17:10 ` [PATCH V3 9/9] pm80xx : corrected linkrate value Viswas G
8 siblings, 0 replies; 13+ messages in thread
From: Viswas G @ 2017-09-19 17:10 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>
Acked-by: Jack Wang <jinpu.wang@profitbricks.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] 13+ messages in thread
* [PATCH V3 9/9] pm80xx : corrected linkrate value.
2017-09-19 17:09 [PATCH V3 0/9] pm80xx updates Viswas G
` (7 preceding siblings ...)
2017-09-19 17:10 ` [PATCH V3 8/9] pm80xx : panic on ncq error cleaning up the read log Viswas G
@ 2017-09-19 17:10 ` Viswas G
8 siblings, 0 replies; 13+ messages in thread
From: Viswas G @ 2017-09-19 17:10 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] 13+ messages in thread
* Re: [PATCH V3 4/9] pm80xx : tag allocation for phy control request.
2017-09-19 17:09 ` [PATCH V3 4/9] pm80xx : tag allocation for phy control request Viswas G
@ 2017-09-20 15:18 ` kbuild test robot
2017-09-21 8:09 ` Jinpu Wang
0 siblings, 1 reply; 13+ messages in thread
From: kbuild test robot @ 2017-09-20 15:18 UTC (permalink / raw)
Cc: kbuild-all, linux-scsi, Vasanthalakshmi.Tharmarajan, Viswas.G,
deepak.ukey, Raj.Dinesh, jinpu.wang, martin.petersen
[-- Attachment #1: Type: text/plain, Size: 3196 bytes --]
Hi Viswas,
[auto build test WARNING on mkp-scsi/for-next]
[also build test WARNING on v4.14-rc1 next-20170920]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Viswas-G/pm80xx-updates/20170920-202506
base: https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
config: x86_64-randconfig-a0-09202136 (attached as .config)
compiler: gcc-4.4 (Debian 4.4.7-8) 4.4.7
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
All warnings (new ones prefixed by >>):
drivers/scsi/pm8001/pm80xx_hwi.c: In function 'pm80xx_chip_phy_ctl_req':
>> drivers/scsi/pm8001/pm80xx_hwi.c:4507: warning: unused variable 'ret'
vim +/ret +4507 drivers/scsi/pm8001/pm80xx_hwi.c
f5860992d Sakthivel K 2013-04-17 4492
f5860992d Sakthivel K 2013-04-17 4493 /**
f5860992d Sakthivel K 2013-04-17 4494 * pm80xx_chip_phy_ctl_req - support the local phy operation
f5860992d Sakthivel K 2013-04-17 4495 * @pm8001_ha: our hba card information.
f5860992d Sakthivel K 2013-04-17 4496 * @num: the inbound queue number
f5860992d Sakthivel K 2013-04-17 4497 * @phy_id: the phy id which we wanted to operate
f5860992d Sakthivel K 2013-04-17 4498 * @phy_op:
f5860992d Sakthivel K 2013-04-17 4499 */
f5860992d Sakthivel K 2013-04-17 4500 static int pm80xx_chip_phy_ctl_req(struct pm8001_hba_info *pm8001_ha,
f5860992d Sakthivel K 2013-04-17 4501 u32 phyId, u32 phy_op)
f5860992d Sakthivel K 2013-04-17 4502 {
18e9bdf60 Viswas G 2017-09-19 4503 u32 tag;
18e9bdf60 Viswas G 2017-09-19 4504 int rc;
f5860992d Sakthivel K 2013-04-17 4505 struct local_phy_ctl_req payload;
f5860992d Sakthivel K 2013-04-17 4506 struct inbound_queue_table *circularQ;
f5860992d Sakthivel K 2013-04-17 @4507 int ret;
f5860992d Sakthivel K 2013-04-17 4508 u32 opc = OPC_INB_LOCAL_PHY_CONTROL;
f5860992d Sakthivel K 2013-04-17 4509 memset(&payload, 0, sizeof(payload));
18e9bdf60 Viswas G 2017-09-19 4510 rc = pm8001_tag_alloc(pm8001_ha, &tag);
18e9bdf60 Viswas G 2017-09-19 4511 if (rc)
18e9bdf60 Viswas G 2017-09-19 4512 return rc;
f5860992d Sakthivel K 2013-04-17 4513 circularQ = &pm8001_ha->inbnd_q_tbl[0];
18e9bdf60 Viswas G 2017-09-19 4514 payload.tag = cpu_to_le32(tag);
f5860992d Sakthivel K 2013-04-17 4515 payload.phyop_phyid =
f5860992d Sakthivel K 2013-04-17 4516 cpu_to_le32(((phy_op & 0xFF) << 8) | (phyId & 0xFF));
18e9bdf60 Viswas G 2017-09-19 4517 return pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
f5860992d Sakthivel K 2013-04-17 4518 }
f5860992d Sakthivel K 2013-04-17 4519
:::::: The code at line 4507 was first introduced by commit
:::::: f5860992db55c9e36b0f120dff73f0c34abe510d [SCSI] pm80xx: Added SPCv/ve specific hardware functionalities and relevant changes in common files
:::::: TO: Sakthivel K <Sakthivel.SaravananKamalRaju@pmcs.com>
:::::: CC: James Bottomley <JBottomley@Parallels.com>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 27453 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH V3 5/9] pm80xx : cleanup in pm8001_abort_task function.
2017-09-19 17:10 ` [PATCH V3 5/9] pm80xx : cleanup in pm8001_abort_task function Viswas G
@ 2017-09-20 15:57 ` kbuild test robot
0 siblings, 0 replies; 13+ messages in thread
From: kbuild test robot @ 2017-09-20 15:57 UTC (permalink / raw)
Cc: kbuild-all, linux-scsi, Vasanthalakshmi.Tharmarajan, Viswas.G,
deepak.ukey, Raj.Dinesh, jinpu.wang, martin.petersen
[-- Attachment #1: Type: text/plain, Size: 5183 bytes --]
Hi Viswas,
[auto build test WARNING on mkp-scsi/for-next]
[also build test WARNING on v4.14-rc1 next-20170920]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
url: https://github.com/0day-ci/linux/commits/Viswas-G/pm80xx-updates/20170920-202506
base: https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
config: x86_64-randconfig-a0-09202136 (attached as .config)
compiler: gcc-4.4 (Debian 4.4.7-8) 4.4.7
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64
All warnings (new ones prefixed by >>):
drivers/scsi/pm8001/pm8001_sas.c: In function 'pm8001_abort_task':
drivers/scsi/pm8001/pm8001_sas.c:1206: warning: label 'out' defined but not used
>> drivers/scsi/pm8001/pm8001_sas.c:1166: warning: unused variable 'ccb'
vim +/ccb +1166 drivers/scsi/pm8001/pm8001_sas.c
dbf9bfe61 jack wang 2009-10-14 1157
dbf9bfe61 jack wang 2009-10-14 1158 /* mandatory SAM-3, still need free task/ccb info, abord the specified task */
dbf9bfe61 jack wang 2009-10-14 1159 int pm8001_abort_task(struct sas_task *task)
dbf9bfe61 jack wang 2009-10-14 1160 {
dbf9bfe61 jack wang 2009-10-14 1161 unsigned long flags;
a9d840710 Viswas G 2017-09-19 1162 u32 tag;
dbf9bfe61 jack wang 2009-10-14 1163 u32 device_id;
dbf9bfe61 jack wang 2009-10-14 1164 struct domain_device *dev ;
a9d840710 Viswas G 2017-09-19 1165 struct pm8001_hba_info *pm8001_ha;
dbf9bfe61 jack wang 2009-10-14 @1166 struct pm8001_ccb_info *ccb;
dbf9bfe61 jack wang 2009-10-14 1167 struct scsi_lun lun;
dbf9bfe61 jack wang 2009-10-14 1168 struct pm8001_device *pm8001_dev;
dbf9bfe61 jack wang 2009-10-14 1169 struct pm8001_tmf_task tmf_task;
dbf9bfe61 jack wang 2009-10-14 1170 int rc = TMF_RESP_FUNC_FAILED;
dbf9bfe61 jack wang 2009-10-14 1171 if (unlikely(!task || !task->lldd_task || !task->dev))
a9d840710 Viswas G 2017-09-19 1172 return TMF_RESP_FUNC_FAILED;
a9d840710 Viswas G 2017-09-19 1173 dev = task->dev;
a9d840710 Viswas G 2017-09-19 1174 pm8001_dev = dev->lldd_dev;
a9d840710 Viswas G 2017-09-19 1175 pm8001_ha = pm8001_find_ha_by_dev(dev);
a9d840710 Viswas G 2017-09-19 1176 device_id = pm8001_dev->device_id;
a9d840710 Viswas G 2017-09-19 1177 rc = pm8001_find_tag(task, &tag);
a9d840710 Viswas G 2017-09-19 1178 if (rc == 0) {
a9d840710 Viswas G 2017-09-19 1179 pm8001_printk("no tag for task:%p\n", task);
a9d840710 Viswas G 2017-09-19 1180 return TMF_RESP_FUNC_FAILED;
a9d840710 Viswas G 2017-09-19 1181 }
dbf9bfe61 jack wang 2009-10-14 1182 spin_lock_irqsave(&task->task_state_lock, flags);
dbf9bfe61 jack wang 2009-10-14 1183 if (task->task_state_flags & SAS_TASK_STATE_DONE) {
dbf9bfe61 jack wang 2009-10-14 1184 spin_unlock_irqrestore(&task->task_state_lock, flags);
a9d840710 Viswas G 2017-09-19 1185 return TMF_RESP_FUNC_COMPLETE;
dbf9bfe61 jack wang 2009-10-14 1186 }
dbf9bfe61 jack wang 2009-10-14 1187 spin_unlock_irqrestore(&task->task_state_lock, flags);
dbf9bfe61 jack wang 2009-10-14 1188 if (task->task_proto & SAS_PROTOCOL_SSP) {
dbf9bfe61 jack wang 2009-10-14 1189 struct scsi_cmnd *cmnd = task->uldd_task;
dbf9bfe61 jack wang 2009-10-14 1190 int_to_scsilun(cmnd->device->lun, &lun);
dbf9bfe61 jack wang 2009-10-14 1191 tmf_task.tmf = TMF_ABORT_TASK;
dbf9bfe61 jack wang 2009-10-14 1192 tmf_task.tag_of_task_to_be_managed = tag;
dbf9bfe61 jack wang 2009-10-14 1193 rc = pm8001_issue_ssp_tmf(dev, lun.scsi_lun, &tmf_task);
97ee20886 jack_wang 2009-11-05 1194 pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev,
dbf9bfe61 jack wang 2009-10-14 1195 pm8001_dev->sas_device, 0, tag);
dbf9bfe61 jack wang 2009-10-14 1196 } else if (task->task_proto & SAS_PROTOCOL_SATA ||
dbf9bfe61 jack wang 2009-10-14 1197 task->task_proto & SAS_PROTOCOL_STP) {
dbf9bfe61 jack wang 2009-10-14 1198 rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev,
dbf9bfe61 jack wang 2009-10-14 1199 pm8001_dev->sas_device, 0, tag);
dbf9bfe61 jack wang 2009-10-14 1200 } else if (task->task_proto & SAS_PROTOCOL_SMP) {
dbf9bfe61 jack wang 2009-10-14 1201 /* SMP */
dbf9bfe61 jack wang 2009-10-14 1202 rc = pm8001_exec_internal_task_abort(pm8001_ha, pm8001_dev,
dbf9bfe61 jack wang 2009-10-14 1203 pm8001_dev->sas_device, 0, tag);
dbf9bfe61 jack wang 2009-10-14 1204
dbf9bfe61 jack wang 2009-10-14 1205 }
dbf9bfe61 jack wang 2009-10-14 @1206 out:
dbf9bfe61 jack wang 2009-10-14 1207 if (rc != TMF_RESP_FUNC_COMPLETE)
dbf9bfe61 jack wang 2009-10-14 1208 pm8001_printk("rc= %d\n", rc);
dbf9bfe61 jack wang 2009-10-14 1209 return rc;
dbf9bfe61 jack wang 2009-10-14 1210 }
dbf9bfe61 jack wang 2009-10-14 1211
:::::: The code at line 1166 was first introduced by commit
:::::: dbf9bfe615717d1145f263c0049fe2328e6ed395 [SCSI] pm8001: add SAS/SATA HBA driver
:::::: TO: jack wang <jack_wang@usish.com>
:::::: CC: James Bottomley <James.Bottomley@suse.de>
---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation
[-- Attachment #2: .config.gz --]
[-- Type: application/gzip, Size: 27453 bytes --]
^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [PATCH V3 4/9] pm80xx : tag allocation for phy control request.
2017-09-20 15:18 ` kbuild test robot
@ 2017-09-21 8:09 ` Jinpu Wang
0 siblings, 0 replies; 13+ messages in thread
From: Jinpu Wang @ 2017-09-21 8:09 UTC (permalink / raw)
To: kbuild test robot
Cc: Viswas G, kbuild-all, Linux SCSI Mailinglist,
Vasanthalakshmi.Tharmarajan, deepak.ukey, Raj.Dinesh,
Martin K. Petersen
On Wed, Sep 20, 2017 at 5:18 PM, kbuild test robot <lkp@intel.com> wrote:
> Hi Viswas,
>
> [auto build test WARNING on mkp-scsi/for-next]
> [also build test WARNING on v4.14-rc1 next-20170920]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/Viswas-G/pm80xx-updates/20170920-202506
> base: https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
> config: x86_64-randconfig-a0-09202136 (attached as .config)
> compiler: gcc-4.4 (Debian 4.4.7-8) 4.4.7
> reproduce:
> # save the attached .config to linux build tree
> make ARCH=x86_64
>
> All warnings (new ones prefixed by >>):
>
> drivers/scsi/pm8001/pm80xx_hwi.c: In function 'pm80xx_chip_phy_ctl_req':
>>> drivers/scsi/pm8001/pm80xx_hwi.c:4507: warning: unused variable 'ret'
>
> vim +/ret +4507 drivers/scsi/pm8001/pm80xx_hwi.c
Indeed, ret is unused, Viswas, could you send a update patch to fix
the warning in this patch and patch5.
Thanks
>
> f5860992d Sakthivel K 2013-04-17 4492
> f5860992d Sakthivel K 2013-04-17 4493 /**
> f5860992d Sakthivel K 2013-04-17 4494 * pm80xx_chip_phy_ctl_req - support the local phy operation
> f5860992d Sakthivel K 2013-04-17 4495 * @pm8001_ha: our hba card information.
> f5860992d Sakthivel K 2013-04-17 4496 * @num: the inbound queue number
> f5860992d Sakthivel K 2013-04-17 4497 * @phy_id: the phy id which we wanted to operate
> f5860992d Sakthivel K 2013-04-17 4498 * @phy_op:
> f5860992d Sakthivel K 2013-04-17 4499 */
> f5860992d Sakthivel K 2013-04-17 4500 static int pm80xx_chip_phy_ctl_req(struct pm8001_hba_info *pm8001_ha,
> f5860992d Sakthivel K 2013-04-17 4501 u32 phyId, u32 phy_op)
> f5860992d Sakthivel K 2013-04-17 4502 {
> 18e9bdf60 Viswas G 2017-09-19 4503 u32 tag;
> 18e9bdf60 Viswas G 2017-09-19 4504 int rc;
> f5860992d Sakthivel K 2013-04-17 4505 struct local_phy_ctl_req payload;
> f5860992d Sakthivel K 2013-04-17 4506 struct inbound_queue_table *circularQ;
> f5860992d Sakthivel K 2013-04-17 @4507 int ret;
> f5860992d Sakthivel K 2013-04-17 4508 u32 opc = OPC_INB_LOCAL_PHY_CONTROL;
> f5860992d Sakthivel K 2013-04-17 4509 memset(&payload, 0, sizeof(payload));
> 18e9bdf60 Viswas G 2017-09-19 4510 rc = pm8001_tag_alloc(pm8001_ha, &tag);
> 18e9bdf60 Viswas G 2017-09-19 4511 if (rc)
> 18e9bdf60 Viswas G 2017-09-19 4512 return rc;
> f5860992d Sakthivel K 2013-04-17 4513 circularQ = &pm8001_ha->inbnd_q_tbl[0];
> 18e9bdf60 Viswas G 2017-09-19 4514 payload.tag = cpu_to_le32(tag);
> f5860992d Sakthivel K 2013-04-17 4515 payload.phyop_phyid =
> f5860992d Sakthivel K 2013-04-17 4516 cpu_to_le32(((phy_op & 0xFF) << 8) | (phyId & 0xFF));
> 18e9bdf60 Viswas G 2017-09-19 4517 return pm8001_mpi_build_cmd(pm8001_ha, circularQ, opc, &payload, 0);
> f5860992d Sakthivel K 2013-04-17 4518 }
> f5860992d Sakthivel K 2013-04-17 4519
>
> :::::: The code at line 4507 was first introduced by commit
> :::::: f5860992db55c9e36b0f120dff73f0c34abe510d [SCSI] pm80xx: Added SPCv/ve specific hardware functionalities and relevant changes in common files
>
> :::::: TO: Sakthivel K <Sakthivel.SaravananKamalRaju@pmcs.com>
> :::::: CC: James Bottomley <JBottomley@Parallels.com>
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
--
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] 13+ messages in thread
end of thread, other threads:[~2017-09-21 8:09 UTC | newest]
Thread overview: 13+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2017-09-19 17:09 [PATCH V3 0/9] pm80xx updates Viswas G
2017-09-19 17:09 ` [PATCH V3 1/9] pm80xx : redefine sas_identify_frame structure Viswas G
2017-09-19 17:09 ` [PATCH V3 2/9] pm80xx : ILA and inactive firmware version through sysfs Viswas G
2017-09-19 17:09 ` [PATCH V3 3/9] pm80xx : Different SAS addresses for phys Viswas G
2017-09-19 17:09 ` [PATCH V3 4/9] pm80xx : tag allocation for phy control request Viswas G
2017-09-20 15:18 ` kbuild test robot
2017-09-21 8:09 ` Jinpu Wang
2017-09-19 17:10 ` [PATCH V3 5/9] pm80xx : cleanup in pm8001_abort_task function Viswas G
2017-09-20 15:57 ` kbuild test robot
2017-09-19 17:10 ` [PATCH V3 6/9] pm80xx : modified port reset timer value for PM8006 card Viswas G
2017-09-19 17:10 ` [PATCH V3 7/9] pm80xx : corrected SATA abort handling sequence Viswas G
2017-09-19 17:10 ` [PATCH V3 8/9] pm80xx : panic on ncq error cleaning up the read log Viswas G
2017-09-19 17:10 ` [PATCH V3 9/9] pm80xx : corrected linkrate value Viswas G
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox