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: Quinn Tran <qtran@marvell.com>
Signed-off-by: Himanshu Madhani <hmadhani@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
Quinn Tran 2019-01-24 23:23:40 -08:00 committed by Martin K. Petersen
parent 7f147f9bfd
commit 590f806ddd
1 changed files with 53 additions and 0 deletions

View File

@ -7115,6 +7115,57 @@ qla2xxx_pci_resume(struct pci_dev *pdev)
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)
{
int rc;
@ -7133,6 +7184,8 @@ static const struct pci_error_handlers qla2xxx_err_handler = {
.mmio_enabled = qla2xxx_pci_mmio_enabled,
.slot_reset = qla2xxx_pci_slot_reset,
.resume = qla2xxx_pci_resume,
.reset_prepare = qla_pci_reset_prepare,
.reset_done = qla_pci_reset_done,
};
static struct pci_device_id qla2xxx_pci_tbl[] = {