Commit 90a86fc0 authored by Joe Carnuccio's avatar Joe Carnuccio Committed by James Bottomley

[SCSI] qla2xxx: Enhance EEH support and enable AER support.

qla2xxx: EEH added call to pci_restore_state.
qla2xxx: EEH added delay in slot reset routine.
qla2xxx: EEH moved call to pci_save_state(), see (1).
qla2xxx: EEH additional changes for RHEL5.5.
qla2xxx: EEH added function call, removed function call, see (2).

(1) In qla2xxx_probe_one the call to pci_save_state() has been
    moved to after the call to qla2xxx_request_irqs().

(2) Add call to pci_disable_pcie_error_reporting() in remove_one.
    Delete call to pci_cleanup_aer_uncorrect_error_status() in pci_resume.
Signed-off-by: default avatarGiridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 9db0fb3a
...@@ -2252,10 +2252,11 @@ qla2x00_free_irqs(scsi_qla_host_t *vha) ...@@ -2252,10 +2252,11 @@ qla2x00_free_irqs(scsi_qla_host_t *vha)
if (ha->flags.msix_enabled) if (ha->flags.msix_enabled)
qla24xx_disable_msix(ha); qla24xx_disable_msix(ha);
else if (ha->flags.inta_enabled) { else if (ha->flags.msi_enabled) {
free_irq(ha->pdev->irq, rsp); free_irq(ha->pdev->irq, rsp);
pci_disable_msi(ha->pdev); pci_disable_msi(ha->pdev);
} } else
free_irq(ha->pdev->irq, rsp);
} }
......
...@@ -1818,7 +1818,6 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -1818,7 +1818,6 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
/* Set EEH reset type to fundamental if required by hba */ /* Set EEH reset type to fundamental if required by hba */
if ( IS_QLA24XX(ha) || IS_QLA25XX(ha) || IS_QLA81XX(ha)) { if ( IS_QLA24XX(ha) || IS_QLA25XX(ha) || IS_QLA81XX(ha)) {
pdev->needs_freset = 1; pdev->needs_freset = 1;
pci_save_state(pdev);
} }
/* Configure PCI I/O space */ /* Configure PCI I/O space */
...@@ -1975,6 +1974,9 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -1975,6 +1974,9 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
ret = qla2x00_request_irqs(ha, rsp); ret = qla2x00_request_irqs(ha, rsp);
if (ret) if (ret)
goto probe_init_failed; goto probe_init_failed;
pci_save_state(pdev);
/* Alloc arrays of request and response ring ptrs */ /* Alloc arrays of request and response ring ptrs */
que_init: que_init:
if (!qla2x00_alloc_queues(ha)) { if (!qla2x00_alloc_queues(ha)) {
...@@ -2176,6 +2178,8 @@ qla2x00_remove_one(struct pci_dev *pdev) ...@@ -2176,6 +2178,8 @@ qla2x00_remove_one(struct pci_dev *pdev)
kfree(ha); kfree(ha);
ha = NULL; ha = NULL;
pci_disable_pcie_error_reporting(pdev);
pci_disable_device(pdev); pci_disable_device(pdev);
pci_set_drvdata(pdev, NULL); pci_set_drvdata(pdev, NULL);
} }
...@@ -3310,6 +3314,7 @@ qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state) ...@@ -3310,6 +3314,7 @@ qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
return PCI_ERS_RESULT_CAN_RECOVER; return PCI_ERS_RESULT_CAN_RECOVER;
case pci_channel_io_frozen: case pci_channel_io_frozen:
ha->flags.eeh_busy = 1; ha->flags.eeh_busy = 1;
qla2x00_free_irqs(vha);
pci_disable_device(pdev); pci_disable_device(pdev);
return PCI_ERS_RESULT_NEED_RESET; return PCI_ERS_RESULT_NEED_RESET;
case pci_channel_io_perm_failure: case pci_channel_io_perm_failure:
...@@ -3363,10 +3368,19 @@ qla2xxx_pci_slot_reset(struct pci_dev *pdev) ...@@ -3363,10 +3368,19 @@ qla2xxx_pci_slot_reset(struct pci_dev *pdev)
pci_ers_result_t ret = PCI_ERS_RESULT_DISCONNECT; pci_ers_result_t ret = PCI_ERS_RESULT_DISCONNECT;
scsi_qla_host_t *base_vha = pci_get_drvdata(pdev); scsi_qla_host_t *base_vha = pci_get_drvdata(pdev);
struct qla_hw_data *ha = base_vha->hw; struct qla_hw_data *ha = base_vha->hw;
int rc; struct rsp_que *rsp;
int rc, retries = 10;
DEBUG17(qla_printk(KERN_WARNING, ha, "slot_reset\n")); DEBUG17(qla_printk(KERN_WARNING, ha, "slot_reset\n"));
/* Workaround: qla2xxx driver which access hardware earlier
* needs error state to be pci_channel_io_online.
* Otherwise mailbox command timesout.
*/
pdev->error_state = pci_channel_io_normal;
pci_restore_state(pdev);
if (ha->mem_only) if (ha->mem_only)
rc = pci_enable_device_mem(pdev); rc = pci_enable_device_mem(pdev);
else else
...@@ -3378,27 +3392,23 @@ qla2xxx_pci_slot_reset(struct pci_dev *pdev) ...@@ -3378,27 +3392,23 @@ qla2xxx_pci_slot_reset(struct pci_dev *pdev)
return ret; return ret;
} }
rsp = ha->rsp_q_map[0];
if (qla2x00_request_irqs(ha, rsp))
return ret;
if (ha->isp_ops->pci_config(base_vha)) if (ha->isp_ops->pci_config(base_vha))
return ret; return ret;
#ifdef QL_DEBUG_LEVEL_17 while (ha->flags.mbox_busy && retries--)
{ msleep(1000);
uint8_t b;
uint32_t i;
printk("slot_reset_1: ");
for (i = 0; i < 256; i++) {
pci_read_config_byte(ha->pdev, i, &b);
printk("%s%02x", (i%16) ? " " : "\n", b);
}
printk("\n");
}
#endif
set_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags); set_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags);
if (qla2x00_abort_isp(base_vha) == QLA_SUCCESS) if (qla2x00_abort_isp(base_vha) == QLA_SUCCESS)
ret = PCI_ERS_RESULT_RECOVERED; ret = PCI_ERS_RESULT_RECOVERED;
clear_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags); clear_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags);
pci_cleanup_aer_uncorrect_error_status(pdev);
DEBUG17(qla_printk(KERN_WARNING, ha, DEBUG17(qla_printk(KERN_WARNING, ha,
"slot_reset-return:ret=%x\n", ret)); "slot_reset-return:ret=%x\n", ret));
...@@ -3422,8 +3432,6 @@ qla2xxx_pci_resume(struct pci_dev *pdev) ...@@ -3422,8 +3432,6 @@ qla2xxx_pci_resume(struct pci_dev *pdev)
} }
ha->flags.eeh_busy = 0; ha->flags.eeh_busy = 0;
pci_cleanup_aer_uncorrect_error_status(pdev);
} }
static struct pci_error_handlers qla2xxx_err_handler = { static struct pci_error_handlers qla2xxx_err_handler = {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment