diff options
author | Himanshu Madhani <himanshu.madhani@qlogic.com> | 2015-04-09 15:00:03 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Odin.com> | 2015-04-10 11:42:30 -0400 |
commit | d14e72fb859cf9a767ce3758342466883611cc57 (patch) | |
tree | 3b800a971e74c7419c4f061f67fcb865a6148b9e /drivers/scsi | |
parent | 064135e01e0abc21bad9dfb9ae42d0b88c87ed32 (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.c | 4 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 2 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 68 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 16 |
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 | */ |
1124 | static inline void | 1124 | static inline int |
1125 | qla24xx_reset_risc(scsi_qla_host_t *vha) | 1125 | qla24xx_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(®->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(®->hccr), | ||
1152 | RD_REG_DWORD(®->ctrl_status), | ||
1153 | (RD_REG_DWORD(®->ctrl_status) & CSRX_DMA_ACTIVE)); | ||
1154 | |||
1145 | WRT_REG_DWORD(®->ctrl_status, | 1155 | WRT_REG_DWORD(®->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(®->mailbox0); | 1162 | d2 = (uint32_t) RD_REG_WORD(®->mailbox0); |
1152 | for (cnt = 10000 ; cnt && d2; cnt--) { | 1163 | for (cnt = 10000; RD_REG_WORD(®->mailbox0) != 0 && |
1153 | udelay(5); | 1164 | rval == QLA_SUCCESS; cnt--) { |
1154 | d2 = (uint32_t) RD_REG_WORD(®->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(®->hccr), | ||
1178 | RD_REG_DWORD(®->mailbox0)); | ||
1179 | |||
1158 | /* Wait for soft-reset to complete. */ | 1180 | /* Wait for soft-reset to complete. */ |
1159 | d2 = RD_REG_DWORD(®->ctrl_status); | 1181 | d2 = RD_REG_DWORD(®->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(®->ctrl_status); | ||
1163 | barrier(); | 1183 | barrier(); |
1184 | if ((RD_REG_DWORD(®->ctrl_status) & | ||
1185 | CSRX_ISP_SOFT_RESET) == 0) | ||
1186 | break; | ||
1187 | |||
1188 | udelay(5); | ||
1164 | } | 1189 | } |
1190 | if (!(RD_REG_DWORD(®->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(®->hccr), | ||
1196 | RD_REG_DWORD(®->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(®->hccr); | 1222 | RD_REG_DWORD(®->hccr); |
1191 | 1223 | ||
1192 | d2 = (uint32_t) RD_REG_WORD(®->mailbox0); | 1224 | d2 = (uint32_t) RD_REG_WORD(®->mailbox0); |
1193 | for (cnt = 6000000 ; cnt && d2; cnt--) { | 1225 | for (cnt = 6000000; RD_REG_WORD(®->mailbox0) != 0 && |
1194 | udelay(5); | 1226 | rval == QLA_SUCCESS; cnt--) { |
1195 | d2 = (uint32_t) RD_REG_WORD(®->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(®->hccr), | ||
1239 | RD_REG_WORD(®->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 | ||
1205 | static void | 1253 | static 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 @@ | |||
33 | static int | 33 | static int |
34 | qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | 34 | qla2x00_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(®->isp24.host_status), | ||
385 | ha->fw_dump_cap_flags, | ||
386 | RD_REG_DWORD(®->isp24.ictrl), | ||
387 | RD_REG_DWORD(®->isp24.istatus)); | ||
388 | |||
389 | mbx_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 | } |