uint32_t intr_status)
 {
        /* Process response queue interrupt. */
-       if (intr_status & HSRX_RISC_IOCB_INT)
+       if ((intr_status & HSRX_RISC_IOCB_INT) &&
+           test_bit(AF_INIT_DONE, &ha->flags))
                qla4xxx_process_response_queue(ha);
 
        /* Process mailbox/asynch event interrupt.*/
 {
        struct scsi_qla_host *ha = dev_id;
        unsigned long flags;
+       int intr_status;
        uint32_t ival = 0;
 
        spin_lock_irqsave(&ha->hardware_lock, flags);
                qla4xxx_process_response_queue(ha);
                writel(0, &ha->qla4_83xx_reg->iocb_int_mask);
        } else {
-               qla4xxx_process_response_queue(ha);
-               writel(0, &ha->qla4_82xx_reg->host_int);
+               intr_status = readl(&ha->qla4_82xx_reg->host_status);
+               if (intr_status & HSRX_RISC_IOCB_INT) {
+                       qla4xxx_process_response_queue(ha);
+                       writel(0, &ha->qla4_82xx_reg->host_int);
+               } else {
+                       ql4_printk(KERN_INFO, ha, "%s: spurious iocb interrupt...\n",
+                                  __func__);
+                       goto exit_msix_rsp_q;
+               }
        }
        ha->isr_count++;
 exit_msix_rsp_q:
 
                goto exit_init_fw_cb;
        }
 
-       /* Initialize request and response queues. */
-       qla4xxx_init_rings(ha);
-
        /* Fill in the request and response queue information. */
        init_fw_cb->rqq_consumer_idx = cpu_to_le16(ha->request_out);
        init_fw_cb->compq_producer_idx = cpu_to_le16(ha->response_in);
 
 
        retval = qla4_8xxx_device_state_handler(ha);
 
+       /* Initialize request and response queues. */
+       if (retval == QLA_SUCCESS)
+               qla4xxx_init_rings(ha);
+
        if (retval == QLA_SUCCESS && !test_bit(AF_IRQ_ATTACHED, &ha->flags))
                retval = qla4xxx_request_irqs(ha);