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;
        .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[] = {