aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi
diff options
context:
space:
mode:
authorTej Parkash <tej.parkash@qlogic.com>2013-12-16 06:49:42 -0500
committerJames Bottomley <JBottomley@Parallels.com>2014-03-15 13:19:14 -0400
commit1b3d399cf6877c8d9abd63a2aff41b709a38fbd1 (patch)
tree4d416011a579d19e5103dbcd7d465d4ecb4ea10c /drivers/scsi
parent831805a150e936defc9b54fa069a3cdd9529eedb (diff)
[SCSI] qla4xxx: Fix processing response queue during probe
Issue: While booting with kdump kernel, driver receive IOCB interrupts for which it is not ready which results in processing them before init_firmware during driver probe Fix: Two steps solution 1. Make driver ready to process the interrupt before interupts handlers is registered. 2. Stop driver processing iocb interrupts if not generated as per firmware protocol i.e R2H bit set Signed-off-by: Tej Parkash <tej.parkash@qlogic.com> Signed-off-by: Vikas Chaudhary <vikas.chaudhary@qlogic.com> Reviewed-by: Mike Christie <michaelc@cs.wisc.edu> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r--drivers/scsi/qla4xxx/ql4_isr.c15
-rw-r--r--drivers/scsi/qla4xxx/ql4_mbx.c3
-rw-r--r--drivers/scsi/qla4xxx/ql4_nx.c4
3 files changed, 16 insertions, 6 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_isr.c b/drivers/scsi/qla4xxx/ql4_isr.c
index 49032f640da1..df3fd9b4561e 100644
--- a/drivers/scsi/qla4xxx/ql4_isr.c
+++ b/drivers/scsi/qla4xxx/ql4_isr.c
@@ -1022,7 +1022,8 @@ void qla4_82xx_interrupt_service_routine(struct scsi_qla_host *ha,
1022 uint32_t intr_status) 1022 uint32_t intr_status)
1023{ 1023{
1024 /* Process response queue interrupt. */ 1024 /* Process response queue interrupt. */
1025 if (intr_status & HSRX_RISC_IOCB_INT) 1025 if ((intr_status & HSRX_RISC_IOCB_INT) &&
1026 test_bit(AF_INIT_DONE, &ha->flags))
1026 qla4xxx_process_response_queue(ha); 1027 qla4xxx_process_response_queue(ha);
1027 1028
1028 /* Process mailbox/asynch event interrupt.*/ 1029 /* Process mailbox/asynch event interrupt.*/
@@ -1399,6 +1400,7 @@ qla4_8xxx_msix_rsp_q(int irq, void *dev_id)
1399{ 1400{
1400 struct scsi_qla_host *ha = dev_id; 1401 struct scsi_qla_host *ha = dev_id;
1401 unsigned long flags; 1402 unsigned long flags;
1403 int intr_status;
1402 uint32_t ival = 0; 1404 uint32_t ival = 0;
1403 1405
1404 spin_lock_irqsave(&ha->hardware_lock, flags); 1406 spin_lock_irqsave(&ha->hardware_lock, flags);
@@ -1412,8 +1414,15 @@ qla4_8xxx_msix_rsp_q(int irq, void *dev_id)
1412 qla4xxx_process_response_queue(ha); 1414 qla4xxx_process_response_queue(ha);
1413 writel(0, &ha->qla4_83xx_reg->iocb_int_mask); 1415 writel(0, &ha->qla4_83xx_reg->iocb_int_mask);
1414 } else { 1416 } else {
1415 qla4xxx_process_response_queue(ha); 1417 intr_status = readl(&ha->qla4_82xx_reg->host_status);
1416 writel(0, &ha->qla4_82xx_reg->host_int); 1418 if (intr_status & HSRX_RISC_IOCB_INT) {
1419 qla4xxx_process_response_queue(ha);
1420 writel(0, &ha->qla4_82xx_reg->host_int);
1421 } else {
1422 ql4_printk(KERN_INFO, ha, "%s: spurious iocb interrupt...\n",
1423 __func__);
1424 goto exit_msix_rsp_q;
1425 }
1417 } 1426 }
1418 ha->isr_count++; 1427 ha->isr_count++;
1419exit_msix_rsp_q: 1428exit_msix_rsp_q:
diff --git a/drivers/scsi/qla4xxx/ql4_mbx.c b/drivers/scsi/qla4xxx/ql4_mbx.c
index 6905bad3e15c..52c0a48ab41f 100644
--- a/drivers/scsi/qla4xxx/ql4_mbx.c
+++ b/drivers/scsi/qla4xxx/ql4_mbx.c
@@ -648,9 +648,6 @@ int qla4xxx_initialize_fw_cb(struct scsi_qla_host * ha)
648 goto exit_init_fw_cb; 648 goto exit_init_fw_cb;
649 } 649 }
650 650
651 /* Initialize request and response queues. */
652 qla4xxx_init_rings(ha);
653
654 /* Fill in the request and response queue information. */ 651 /* Fill in the request and response queue information. */
655 init_fw_cb->rqq_consumer_idx = cpu_to_le16(ha->request_out); 652 init_fw_cb->rqq_consumer_idx = cpu_to_le16(ha->request_out);
656 init_fw_cb->compq_producer_idx = cpu_to_le16(ha->response_in); 653 init_fw_cb->compq_producer_idx = cpu_to_le16(ha->response_in);
diff --git a/drivers/scsi/qla4xxx/ql4_nx.c b/drivers/scsi/qla4xxx/ql4_nx.c
index cbc68f915cc6..bcf3e43e024a 100644
--- a/drivers/scsi/qla4xxx/ql4_nx.c
+++ b/drivers/scsi/qla4xxx/ql4_nx.c
@@ -3190,6 +3190,10 @@ int qla4_8xxx_load_risc(struct scsi_qla_host *ha)
3190 3190
3191 retval = qla4_8xxx_device_state_handler(ha); 3191 retval = qla4_8xxx_device_state_handler(ha);
3192 3192
3193 /* Initialize request and response queues. */
3194 if (retval == QLA_SUCCESS)
3195 qla4xxx_init_rings(ha);
3196
3193 if (retval == QLA_SUCCESS && !test_bit(AF_IRQ_ATTACHED, &ha->flags)) 3197 if (retval == QLA_SUCCESS && !test_bit(AF_IRQ_ATTACHED, &ha->flags))
3194 retval = qla4xxx_request_irqs(ha); 3198 retval = qla4xxx_request_irqs(ha);
3195 3199