diff options
| author | Poornima Vonti <poornima.vonti@qlogic.com> | 2013-01-20 23:51:01 -0500 |
|---|---|---|
| committer | James Bottomley <JBottomley@Parallels.com> | 2013-01-29 21:50:19 -0500 |
| commit | 137257da9e52c6aec9ba67aae0a2bbae235dfa3a (patch) | |
| tree | c194a5565fafa63e7b1e2904f24dab6076014984 | |
| parent | 5b1c1bff07d579f8a7b672d4e5262d52eba5ef01 (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.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_os.c | 27 |
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) | |||
| 6110 | static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha) | 6110 | static 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); |
