Commit efdb5760 authored by Sawan Chandak's avatar Sawan Chandak Committed by Martin K. Petersen

scsi: qla2xxx: Handle PCIe error for driver

Driver will perform following

- Set PFLG_DRIVER_REMOVING flag and do not disable PCIe error reporting
  during adapter shutdown.
- If PCIe device count is already zero, return correct error type from
  PCI error interface.
- When device is offline, return correct error type from PCIe error
  path.
- If there is board disable thread active during shutdown and PCIe
  device count is zero then cancel scheduling board disable thread
  during shutdown and return.
Signed-off-by: default avatarSawan Chandak <sawan.chandak@cavium.com>
Signed-off-by: default avatarHimanshu Madhani <himanshu.madhani@cavium.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent d7936a96
...@@ -3385,12 +3385,22 @@ qla2x00_shutdown(struct pci_dev *pdev) ...@@ -3385,12 +3385,22 @@ qla2x00_shutdown(struct pci_dev *pdev)
scsi_qla_host_t *vha; scsi_qla_host_t *vha;
struct qla_hw_data *ha; struct qla_hw_data *ha;
if (!atomic_read(&pdev->enable_cnt))
return;
vha = pci_get_drvdata(pdev); vha = pci_get_drvdata(pdev);
ha = vha->hw; ha = vha->hw;
ql_log(ql_log_info, vha, 0xfffa,
"Adapter shutdown\n");
/*
* Prevent future board_disable and wait
* until any pending board_disable has completed.
*/
set_bit(PFLG_DRIVER_REMOVING, &vha->pci_flags);
cancel_work_sync(&ha->board_disable);
if (!atomic_read(&pdev->enable_cnt))
return;
/* Notify ISPFX00 firmware */ /* Notify ISPFX00 firmware */
if (IS_QLAFX00(ha)) if (IS_QLAFX00(ha))
qlafx00_driver_shutdown(vha, 20); qlafx00_driver_shutdown(vha, 20);
...@@ -3421,8 +3431,9 @@ qla2x00_shutdown(struct pci_dev *pdev) ...@@ -3421,8 +3431,9 @@ qla2x00_shutdown(struct pci_dev *pdev)
qla2x00_free_fw_dump(ha); qla2x00_free_fw_dump(ha);
pci_disable_pcie_error_reporting(pdev);
pci_disable_device(pdev); pci_disable_device(pdev);
ql_log(ql_log_info, vha, 0xfffe,
"Adapter shutdown successfully.\n");
} }
/* Deletes all the virtual ports for a given ha */ /* Deletes all the virtual ports for a given ha */
...@@ -5495,6 +5506,13 @@ qla2x00_disable_board_on_pci_error(struct work_struct *work) ...@@ -5495,6 +5506,13 @@ qla2x00_disable_board_on_pci_error(struct work_struct *work)
ql_log(ql_log_warn, base_vha, 0x015b, ql_log(ql_log_warn, base_vha, 0x015b,
"Disabling adapter.\n"); "Disabling adapter.\n");
if (!atomic_read(&pdev->enable_cnt)) {
ql_log(ql_log_info, base_vha, 0xfffc,
"PCI device disabled, no action req for PCI error=%lx\n",
base_vha->pci_flags);
return;
}
qla2x00_wait_for_sess_deletion(base_vha); qla2x00_wait_for_sess_deletion(base_vha);
set_bit(UNLOADING, &base_vha->dpc_flags); set_bit(UNLOADING, &base_vha->dpc_flags);
...@@ -6197,6 +6215,12 @@ qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state) ...@@ -6197,6 +6215,12 @@ qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
ql_dbg(ql_dbg_aer, vha, 0x9000, ql_dbg(ql_dbg_aer, vha, 0x9000,
"PCI error detected, state %x.\n", state); "PCI error detected, state %x.\n", state);
if (!atomic_read(&pdev->enable_cnt)) {
ql_log(ql_log_info, vha, 0xffff,
"PCI device is disabled,state %x\n", state);
return PCI_ERS_RESULT_NEED_RESET;
}
switch (state) { switch (state) {
case pci_channel_io_normal: case pci_channel_io_normal:
ha->flags.eeh_busy = 0; ha->flags.eeh_busy = 0;
......
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