aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/qla2xxx/qla_fw.h4
-rw-r--r--drivers/scsi/qla2xxx/qla_isr.c53
2 files changed, 56 insertions, 1 deletions
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h
index d5344d7a8625..db63386f96b0 100644
--- a/drivers/scsi/qla2xxx/qla_fw.h
+++ b/drivers/scsi/qla2xxx/qla_fw.h
@@ -942,7 +942,9 @@ struct device_reg_24xx {
942 uint16_t mailbox31; 942 uint16_t mailbox31;
943 943
944 uint32_t iobase_window; 944 uint32_t iobase_window;
945 uint32_t unused_4[8]; /* Gap. */ 945 uint32_t unused_4; /* Gap. */
946 uint32_t iobase_c8;
947 uint32_t unused_4_1[6]; /* Gap. */
946 uint32_t iobase_q; 948 uint32_t iobase_q;
947 uint32_t unused_5[2]; /* Gap. */ 949 uint32_t unused_5[2]; /* Gap. */
948 uint32_t iobase_select; 950 uint32_t iobase_select;
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index dcfb24b198f0..f61c2fe8eb59 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c
@@ -6,6 +6,7 @@
6 */ 6 */
7#include "qla_def.h" 7#include "qla_def.h"
8 8
9#include <linux/delay.h>
9#include <scsi/scsi_tcq.h> 10#include <scsi/scsi_tcq.h>
10 11
11static void qla2x00_mbx_completion(scsi_qla_host_t *, uint16_t); 12static void qla2x00_mbx_completion(scsi_qla_host_t *, uint16_t);
@@ -1484,6 +1485,52 @@ qla24xx_process_response_queue(struct scsi_qla_host *ha)
1484 WRT_REG_DWORD(&reg->rsp_q_out, ha->rsp_ring_index); 1485 WRT_REG_DWORD(&reg->rsp_q_out, ha->rsp_ring_index);
1485} 1486}
1486 1487
1488static void
1489qla2xxx_check_risc_status(scsi_qla_host_t *ha)
1490{
1491 int rval;
1492 uint32_t cnt;
1493 struct device_reg_24xx __iomem *reg = &ha->iobase->isp24;
1494
1495 if (!IS_QLA25XX(ha))
1496 return;
1497
1498 rval = QLA_SUCCESS;
1499 WRT_REG_DWORD(&reg->iobase_addr, 0x7C00);
1500 RD_REG_DWORD(&reg->iobase_addr);
1501 WRT_REG_DWORD(&reg->iobase_window, 0x0001);
1502 for (cnt = 10000; (RD_REG_DWORD(&reg->iobase_window) & BIT_0) == 0 &&
1503 rval == QLA_SUCCESS; cnt--) {
1504 if (cnt) {
1505 WRT_REG_DWORD(&reg->iobase_window, 0x0001);
1506 udelay(10);
1507 } else
1508 rval = QLA_FUNCTION_TIMEOUT;
1509 }
1510 if (rval == QLA_SUCCESS)
1511 goto next_test;
1512
1513 WRT_REG_DWORD(&reg->iobase_window, 0x0003);
1514 for (cnt = 100; (RD_REG_DWORD(&reg->iobase_window) & BIT_0) == 0 &&
1515 rval == QLA_SUCCESS; cnt--) {
1516 if (cnt) {
1517 WRT_REG_DWORD(&reg->iobase_window, 0x0003);
1518 udelay(10);
1519 } else
1520 rval = QLA_FUNCTION_TIMEOUT;
1521 }
1522 if (rval != QLA_SUCCESS)
1523 goto done;
1524
1525next_test:
1526 if (RD_REG_DWORD(&reg->iobase_c8) & BIT_3)
1527 qla_printk(KERN_INFO, ha, "Additional code -- 0x55AA.\n");
1528
1529done:
1530 WRT_REG_DWORD(&reg->iobase_window, 0x0000);
1531 RD_REG_DWORD(&reg->iobase_window);
1532}
1533
1487/** 1534/**
1488 * qla24xx_intr_handler() - Process interrupts for the ISP23xx and ISP63xx. 1535 * qla24xx_intr_handler() - Process interrupts for the ISP23xx and ISP63xx.
1489 * @irq: 1536 * @irq:
@@ -1526,6 +1573,9 @@ qla24xx_intr_handler(int irq, void *dev_id)
1526 1573
1527 qla_printk(KERN_INFO, ha, "RISC paused -- HCCR=%x, " 1574 qla_printk(KERN_INFO, ha, "RISC paused -- HCCR=%x, "
1528 "Dumping firmware!\n", hccr); 1575 "Dumping firmware!\n", hccr);
1576
1577 qla2xxx_check_risc_status(ha);
1578
1529 ha->isp_ops->fw_dump(ha, 1); 1579 ha->isp_ops->fw_dump(ha, 1);
1530 set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); 1580 set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
1531 break; 1581 break;
@@ -1663,6 +1713,9 @@ qla24xx_msix_default(int irq, void *dev_id)
1663 1713
1664 qla_printk(KERN_INFO, ha, "RISC paused -- HCCR=%x, " 1714 qla_printk(KERN_INFO, ha, "RISC paused -- HCCR=%x, "
1665 "Dumping firmware!\n", hccr); 1715 "Dumping firmware!\n", hccr);
1716
1717 qla2xxx_check_risc_status(ha);
1718
1666 ha->isp_ops->fw_dump(ha, 1); 1719 ha->isp_ops->fw_dump(ha, 1);
1667 set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags); 1720 set_bit(ISP_ABORT_NEEDED, &ha->dpc_flags);
1668 break; 1721 break;