aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorHimanshu Madhani <himanshu.madhani@qlogic.com>2015-04-09 15:00:03 -0400
committerJames Bottomley <JBottomley@Odin.com>2015-04-10 11:42:30 -0400
commitd14e72fb859cf9a767ce3758342466883611cc57 (patch)
tree3b800a971e74c7419c4f061f67fcb865a6148b9e /drivers/scsi
parent064135e01e0abc21bad9dfb9ae42d0b88c87ed32 (diff)
qla2xxx: Add debugging info for MBX timeout.
Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com> Signed-off-by: Himanshu Madhani <himanshu.madhani@qlogic.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Signed-off-by: James Bottomley <JBottomley@Odin.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/qla2xxx/qla_dbg.c4
-rw-r--r--drivers/scsi/qla2xxx/qla_def.h2
-rw-r--r--drivers/scsi/qla2xxx/qla_init.c68
-rw-r--r--drivers/scsi/qla2xxx/qla_mbx.c16
4 files changed, 77 insertions, 13 deletions
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index 5774c53dd257..b06b6b5a11c5 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -11,9 +11,9 @@
11 * ---------------------------------------------------------------------- 11 * ----------------------------------------------------------------------
12 * | Level | Last Value Used | Holes | 12 * | Level | Last Value Used | Holes |
13 * ---------------------------------------------------------------------- 13 * ----------------------------------------------------------------------
14 * | Module Init and Probe | 0x017d | 0x0144,0x0146 | 14 * | Module Init and Probe | 0x017f | 0x0146 |
15 * | | | 0x015b-0x0160 | 15 * | | | 0x015b-0x0160 |
16 * | | | 0x016e-0x0170 | 16 * | | | 0x016e-0x0170 |
17 * | Mailbox commands | 0x118d | 0x1115-0x1116 | 17 * | Mailbox commands | 0x118d | 0x1115-0x1116 |
18 * | | | 0x111a-0x111b | 18 * | | | 0x111a-0x111b |
19 * | Device Discovery | 0x2016 | 0x2020-0x2022, | 19 * | Device Discovery | 0x2016 | 0x2020-0x2022, |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index cdaf52e26fff..222d70a01c0c 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -3300,6 +3300,8 @@ struct qla_hw_data {
3300#define RISC_RDY_AFT_RESET 3 3300#define RISC_RDY_AFT_RESET 3
3301#define RISC_SRAM_DUMP_CMPL 4 3301#define RISC_SRAM_DUMP_CMPL 4
3302#define RISC_EXT_MEM_DUMP_CMPL 5 3302#define RISC_EXT_MEM_DUMP_CMPL 5
3303#define ISP_MBX_RDY 6
3304#define ISP_SOFT_RESET_CMPL 7
3303 int fw_dump_reading; 3305 int fw_dump_reading;
3304 int prev_minidump_failed; 3306 int prev_minidump_failed;
3305 dma_addr_t eft_dma; 3307 dma_addr_t eft_dma;
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index cb294e5cdddd..22ea00eb7750 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -1121,7 +1121,7 @@ qla81xx_reset_mpi(scsi_qla_host_t *vha)
1121 * 1121 *
1122 * Returns 0 on success. 1122 * Returns 0 on success.
1123 */ 1123 */
1124static inline void 1124static inline int
1125qla24xx_reset_risc(scsi_qla_host_t *vha) 1125qla24xx_reset_risc(scsi_qla_host_t *vha)
1126{ 1126{
1127 unsigned long flags = 0; 1127 unsigned long flags = 0;
@@ -1130,6 +1130,7 @@ qla24xx_reset_risc(scsi_qla_host_t *vha)
1130 uint32_t cnt, d2; 1130 uint32_t cnt, d2;
1131 uint16_t wd; 1131 uint16_t wd;
1132 static int abts_cnt; /* ISP abort retry counts */ 1132 static int abts_cnt; /* ISP abort retry counts */
1133 int rval = QLA_SUCCESS;
1133 1134
1134 spin_lock_irqsave(&ha->hardware_lock, flags); 1135 spin_lock_irqsave(&ha->hardware_lock, flags);
1135 1136
@@ -1142,26 +1143,57 @@ qla24xx_reset_risc(scsi_qla_host_t *vha)
1142 udelay(10); 1143 udelay(10);
1143 } 1144 }
1144 1145
1146 if (!(RD_REG_DWORD(&reg->ctrl_status) & CSRX_DMA_ACTIVE))
1147 set_bit(DMA_SHUTDOWN_CMPL, &ha->fw_dump_cap_flags);
1148
1149 ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x017e,
1150 "HCCR: 0x%x, Control Status %x, DMA active status:0x%x\n",
1151 RD_REG_DWORD(&reg->hccr),
1152 RD_REG_DWORD(&reg->ctrl_status),
1153 (RD_REG_DWORD(&reg->ctrl_status) & CSRX_DMA_ACTIVE));
1154
1145 WRT_REG_DWORD(&reg->ctrl_status, 1155 WRT_REG_DWORD(&reg->ctrl_status,
1146 CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES); 1156 CSRX_ISP_SOFT_RESET|CSRX_DMA_SHUTDOWN|MWB_4096_BYTES);
1147 pci_read_config_word(ha->pdev, PCI_COMMAND, &wd); 1157 pci_read_config_word(ha->pdev, PCI_COMMAND, &wd);
1148 1158
1149 udelay(100); 1159 udelay(100);
1160
1150 /* Wait for firmware to complete NVRAM accesses. */ 1161 /* Wait for firmware to complete NVRAM accesses. */
1151 d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0); 1162 d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
1152 for (cnt = 10000 ; cnt && d2; cnt--) { 1163 for (cnt = 10000; RD_REG_WORD(&reg->mailbox0) != 0 &&
1153 udelay(5); 1164 rval == QLA_SUCCESS; cnt--) {
1154 d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
1155 barrier(); 1165 barrier();
1166 if (cnt)
1167 udelay(5);
1168 else
1169 rval = QLA_FUNCTION_TIMEOUT;
1156 } 1170 }
1157 1171
1172 if (rval == QLA_SUCCESS)
1173 set_bit(ISP_MBX_RDY, &ha->fw_dump_cap_flags);
1174
1175 ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x017f,
1176 "HCCR: 0x%x, MailBox0 Status 0x%x\n",
1177 RD_REG_DWORD(&reg->hccr),
1178 RD_REG_DWORD(&reg->mailbox0));
1179
1158 /* Wait for soft-reset to complete. */ 1180 /* Wait for soft-reset to complete. */
1159 d2 = RD_REG_DWORD(&reg->ctrl_status); 1181 d2 = RD_REG_DWORD(&reg->ctrl_status);
1160 for (cnt = 6000000 ; cnt && (d2 & CSRX_ISP_SOFT_RESET); cnt--) { 1182 for (cnt = 0; cnt < 6000000; cnt++) {
1161 udelay(5);
1162 d2 = RD_REG_DWORD(&reg->ctrl_status);
1163 barrier(); 1183 barrier();
1184 if ((RD_REG_DWORD(&reg->ctrl_status) &
1185 CSRX_ISP_SOFT_RESET) == 0)
1186 break;
1187
1188 udelay(5);
1164 } 1189 }
1190 if (!(RD_REG_DWORD(&reg->ctrl_status) & CSRX_ISP_SOFT_RESET))
1191 set_bit(ISP_SOFT_RESET_CMPL, &ha->fw_dump_cap_flags);
1192
1193 ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x015d,
1194 "HCCR: 0x%x, Soft Reset status: 0x%x\n",
1195 RD_REG_DWORD(&reg->hccr),
1196 RD_REG_DWORD(&reg->ctrl_status));
1165 1197
1166 /* If required, do an MPI FW reset now */ 1198 /* If required, do an MPI FW reset now */
1167 if (test_and_clear_bit(MPI_RESET_NEEDED, &vha->dpc_flags)) { 1199 if (test_and_clear_bit(MPI_RESET_NEEDED, &vha->dpc_flags)) {
@@ -1190,16 +1222,32 @@ qla24xx_reset_risc(scsi_qla_host_t *vha)
1190 RD_REG_DWORD(&reg->hccr); 1222 RD_REG_DWORD(&reg->hccr);
1191 1223
1192 d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0); 1224 d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
1193 for (cnt = 6000000 ; cnt && d2; cnt--) { 1225 for (cnt = 6000000; RD_REG_WORD(&reg->mailbox0) != 0 &&
1194 udelay(5); 1226 rval == QLA_SUCCESS; cnt--) {
1195 d2 = (uint32_t) RD_REG_WORD(&reg->mailbox0);
1196 barrier(); 1227 barrier();
1228 if (cnt)
1229 udelay(5);
1230 else
1231 rval = QLA_FUNCTION_TIMEOUT;
1197 } 1232 }
1233 if (rval == QLA_SUCCESS)
1234 set_bit(RISC_RDY_AFT_RESET, &ha->fw_dump_cap_flags);
1235
1236 ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x015e,
1237 "Host Risc 0x%x, mailbox0 0x%x\n",
1238 RD_REG_DWORD(&reg->hccr),
1239 RD_REG_WORD(&reg->mailbox0));
1198 1240
1199 spin_unlock_irqrestore(&ha->hardware_lock, flags); 1241 spin_unlock_irqrestore(&ha->hardware_lock, flags);
1200 1242
1243 ql_dbg(ql_dbg_init + ql_dbg_verbose, vha, 0x015f,
1244 "Driver in %s mode\n",
1245 IS_NOPOLLING_TYPE(ha) ? "Interrupt" : "Polling");
1246
1201 if (IS_NOPOLLING_TYPE(ha)) 1247 if (IS_NOPOLLING_TYPE(ha))
1202 ha->isp_ops->enable_intrs(ha); 1248 ha->isp_ops->enable_intrs(ha);
1249
1250 return rval;
1203} 1251}
1204 1252
1205static void 1253static void
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c
index fe7b87d4ed86..02b1c1c5355b 100644
--- a/drivers/scsi/qla2xxx/qla_mbx.c
+++ b/drivers/scsi/qla2xxx/qla_mbx.c
@@ -33,7 +33,7 @@
33static int 33static int
34qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) 34qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
35{ 35{
36 int rval; 36 int rval, i;
37 unsigned long flags = 0; 37 unsigned long flags = 0;
38 device_reg_t *reg; 38 device_reg_t *reg;
39 uint8_t abort_active; 39 uint8_t abort_active;
@@ -43,10 +43,12 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp)
43 uint16_t __iomem *optr; 43 uint16_t __iomem *optr;
44 uint32_t cnt; 44 uint32_t cnt;
45 uint32_t mboxes; 45 uint32_t mboxes;
46 uint16_t __iomem *mbx_reg;
46 unsigned long wait_time; 47 unsigned long wait_time;
47 struct qla_hw_data *ha = vha->hw; 48 struct qla_hw_data *ha = vha->hw;
48 scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev); 49 scsi_qla_host_t *base_vha = pci_get_drvdata(ha->pdev);
49 50
51
50 ql_dbg(ql_dbg_mbx, vha, 0x1000, "Entered %s.\n", __func__); 52 ql_dbg(ql_dbg_mbx, vha, 0x1000, "Entered %s.\n", __func__);
51 53
52 if (ha->pdev->error_state > pci_channel_io_frozen) { 54 if (ha->pdev->error_state > pci_channel_io_frozen) {
@@ -376,6 +378,18 @@ mbx_done:
376 ql_dbg(ql_dbg_disc, base_vha, 0x1020, 378 ql_dbg(ql_dbg_disc, base_vha, 0x1020,
377 "**** Failed mbx[0]=%x, mb[1]=%x, mb[2]=%x, mb[3]=%x, cmd=%x ****.\n", 379 "**** Failed mbx[0]=%x, mb[1]=%x, mb[2]=%x, mb[3]=%x, cmd=%x ****.\n",
378 mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3], command); 380 mcp->mb[0], mcp->mb[1], mcp->mb[2], mcp->mb[3], command);
381
382 ql_dbg(ql_dbg_disc, vha, 0x1115,
383 "host status: 0x%x, flags:0x%lx, intr ctrl reg:0x%x, intr status:0x%x\n",
384 RD_REG_DWORD(&reg->isp24.host_status),
385 ha->fw_dump_cap_flags,
386 RD_REG_DWORD(&reg->isp24.ictrl),
387 RD_REG_DWORD(&reg->isp24.istatus));
388
389 mbx_reg = &reg->isp24.mailbox0;
390 for (i = 0; i < 6; i++)
391 ql_dbg(ql_dbg_disc + ql_dbg_verbose, vha, 0x1116,
392 "mbox[%d] 0x%04x\n", i, RD_REG_WORD(mbx_reg++));
379 } else { 393 } else {
380 ql_dbg(ql_dbg_mbx, base_vha, 0x1021, "Done %s.\n", __func__); 394 ql_dbg(ql_dbg_mbx, base_vha, 0x1021, "Done %s.\n", __func__);
381 } 395 }