aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPoornima Vonti <poornima.vonti@qlogic.com>2013-01-20 23:51:01 -0500
committerJames Bottomley <JBottomley@Parallels.com>2013-01-29 21:50:19 -0500
commit137257da9e52c6aec9ba67aae0a2bbae235dfa3a (patch)
treec194a5565fafa63e7b1e2904f24dab6076014984
parent5b1c1bff07d579f8a7b672d4e5262d52eba5ef01 (diff)
[SCSI] qla4xxx: Re-register IRQ handler while retrying initialize of adapter
Problem: If initialization of adapter fails for some reason, then the interrupt handlers are released. The interrupt handlers are not registered again when initialization of adapter is retried. Solution: Re-register the interrupt handler when adapter initialization is retried. Signed-off-by: Poornima Vonti <poornima.vonti@qlogic.com> Signed-off-by: Vikas Chaudhary <vikas.chaudhary@qlogic.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
-rw-r--r--drivers/scsi/qla4xxx/ql4_nx.c2
-rw-r--r--drivers/scsi/qla4xxx/ql4_os.c27
2 files changed, 5 insertions, 24 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_nx.c b/drivers/scsi/qla4xxx/ql4_nx.c
index b3d6dabdc6f4..71d3d234f526 100644
--- a/drivers/scsi/qla4xxx/ql4_nx.c
+++ b/drivers/scsi/qla4xxx/ql4_nx.c
@@ -2986,7 +2986,7 @@ int qla4_8xxx_load_risc(struct scsi_qla_host *ha)
2986 2986
2987 retval = qla4_8xxx_device_state_handler(ha); 2987 retval = qla4_8xxx_device_state_handler(ha);
2988 2988
2989 if (retval == QLA_SUCCESS && !test_bit(AF_INIT_DONE, &ha->flags)) 2989 if (retval == QLA_SUCCESS && !test_bit(AF_IRQ_ATTACHED, &ha->flags))
2990 retval = qla4xxx_request_irqs(ha); 2990 retval = qla4xxx_request_irqs(ha);
2991 2991
2992 return retval; 2992 return retval;
diff --git a/drivers/scsi/qla4xxx/ql4_os.c b/drivers/scsi/qla4xxx/ql4_os.c
index 1df13872ef9d..2ccbb3bee096 100644
--- a/drivers/scsi/qla4xxx/ql4_os.c
+++ b/drivers/scsi/qla4xxx/ql4_os.c
@@ -6110,7 +6110,6 @@ qla4xxx_pci_mmio_enabled(struct pci_dev *pdev)
6110static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha) 6110static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha)
6111{ 6111{
6112 uint32_t rval = QLA_ERROR; 6112 uint32_t rval = QLA_ERROR;
6113 uint32_t ret = 0;
6114 int fn; 6113 int fn;
6115 struct pci_dev *other_pdev = NULL; 6114 struct pci_dev *other_pdev = NULL;
6116 6115
@@ -6196,16 +6195,7 @@ static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha)
6196 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DRV_STATE, 0); 6195 qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DRV_STATE, 0);
6197 qla4_8xxx_set_drv_active(ha); 6196 qla4_8xxx_set_drv_active(ha);
6198 ha->isp_ops->idc_unlock(ha); 6197 ha->isp_ops->idc_unlock(ha);
6199 ret = qla4xxx_request_irqs(ha); 6198 ha->isp_ops->enable_intrs(ha);
6200 if (ret) {
6201 ql4_printk(KERN_WARNING, ha, "Failed to "
6202 "reserve interrupt %d already in use.\n",
6203 ha->pdev->irq);
6204 rval = QLA_ERROR;
6205 } else {
6206 ha->isp_ops->enable_intrs(ha);
6207 rval = QLA_SUCCESS;
6208 }
6209 } 6199 }
6210 } else { 6200 } else {
6211 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn 0x%x is not " 6201 ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn 0x%x is not "
@@ -6215,18 +6205,9 @@ static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha)
6215 QLA8XXX_DEV_READY)) { 6205 QLA8XXX_DEV_READY)) {
6216 clear_bit(AF_FW_RECOVERY, &ha->flags); 6206 clear_bit(AF_FW_RECOVERY, &ha->flags);
6217 rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER); 6207 rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER);
6218 if (rval == QLA_SUCCESS) { 6208 if (rval == QLA_SUCCESS)
6219 ret = qla4xxx_request_irqs(ha); 6209 ha->isp_ops->enable_intrs(ha);
6220 if (ret) { 6210
6221 ql4_printk(KERN_WARNING, ha, "Failed to"
6222 " reserve interrupt %d already in"
6223 " use.\n", ha->pdev->irq);
6224 rval = QLA_ERROR;
6225 } else {
6226 ha->isp_ops->enable_intrs(ha);
6227 rval = QLA_SUCCESS;
6228 }
6229 }
6230 ha->isp_ops->idc_lock(ha); 6211 ha->isp_ops->idc_lock(ha);
6231 qla4_8xxx_set_drv_active(ha); 6212 qla4_8xxx_set_drv_active(ha);
6232 ha->isp_ops->idc_unlock(ha); 6213 ha->isp_ops->idc_unlock(ha);