Commit 590f806d authored by Quinn Tran's avatar Quinn Tran Committed by Martin K. Petersen

scsi: qla2xxx: Add pci function reset support.

This patch provide call back functions to stop the chip and resume the chip
if the PCI lower level driver wants to perform function level reset/FLR.
Before the FLR, the chip will be stopped to turn off all DMA activity.
After the FLR, the chip is reset to resume previous operation state.
Signed-off-by: default avatarQuinn Tran <qtran@marvell.com>
Signed-off-by: default avatarHimanshu Madhani <hmadhani@marvell.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 7f147f9b
...@@ -7115,6 +7115,57 @@ qla2xxx_pci_resume(struct pci_dev *pdev) ...@@ -7115,6 +7115,57 @@ qla2xxx_pci_resume(struct pci_dev *pdev)
ha->flags.eeh_busy = 0; ha->flags.eeh_busy = 0;
} }
static void
qla_pci_reset_prepare(struct pci_dev *pdev)
{
scsi_qla_host_t *base_vha = pci_get_drvdata(pdev);
struct qla_hw_data *ha = base_vha->hw;
struct qla_qpair *qpair;
ql_log(ql_log_warn, base_vha, 0xffff,
"%s.\n", __func__);
/*
* PCI FLR/function reset is about to reset the
* slot. Stop the chip to stop all DMA access.
* It is assumed that pci_reset_done will be called
* after FLR to resume Chip operation.
*/
ha->flags.eeh_busy = 1;
mutex_lock(&ha->mq_lock);
list_for_each_entry(qpair, &base_vha->qp_list, qp_list_elem)
qpair->online = 0;
mutex_unlock(&ha->mq_lock);
set_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags);
qla2x00_abort_isp_cleanup(base_vha);
qla2x00_abort_all_cmds(base_vha, DID_RESET << 16);
}
static void
qla_pci_reset_done(struct pci_dev *pdev)
{
scsi_qla_host_t *base_vha = pci_get_drvdata(pdev);
struct qla_hw_data *ha = base_vha->hw;
struct qla_qpair *qpair;
ql_log(ql_log_warn, base_vha, 0xffff,
"%s.\n", __func__);
/*
* FLR just completed by PCI layer. Resume adapter
*/
ha->flags.eeh_busy = 0;
mutex_lock(&ha->mq_lock);
list_for_each_entry(qpair, &base_vha->qp_list, qp_list_elem)
qpair->online = 1;
mutex_unlock(&ha->mq_lock);
base_vha->flags.online = 1;
ha->isp_ops->abort_isp(base_vha);
clear_bit(ABORT_ISP_ACTIVE, &base_vha->dpc_flags);
}
static int qla2xxx_map_queues(struct Scsi_Host *shost) static int qla2xxx_map_queues(struct Scsi_Host *shost)
{ {
int rc; int rc;
...@@ -7133,6 +7184,8 @@ static const struct pci_error_handlers qla2xxx_err_handler = { ...@@ -7133,6 +7184,8 @@ static const struct pci_error_handlers qla2xxx_err_handler = {
.mmio_enabled = qla2xxx_pci_mmio_enabled, .mmio_enabled = qla2xxx_pci_mmio_enabled,
.slot_reset = qla2xxx_pci_slot_reset, .slot_reset = qla2xxx_pci_slot_reset,
.resume = qla2xxx_pci_resume, .resume = qla2xxx_pci_resume,
.reset_prepare = qla_pci_reset_prepare,
.reset_done = qla_pci_reset_done,
}; };
static struct pci_device_id qla2xxx_pci_tbl[] = { static struct pci_device_id qla2xxx_pci_tbl[] = {
......
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