|
@@ -5505,7 +5505,10 @@ static pci_ers_result_t eeh_err_detected(struct pci_dev *pdev,
|
|
|
if (adap->flags & FULL_INIT_DONE)
|
|
|
cxgb_down(adap);
|
|
|
rtnl_unlock();
|
|
|
- pci_disable_device(pdev);
|
|
|
+ if ((adap->flags & DEV_ENABLED)) {
|
|
|
+ pci_disable_device(pdev);
|
|
|
+ adap->flags &= ~DEV_ENABLED;
|
|
|
+ }
|
|
|
out: return state == pci_channel_io_perm_failure ?
|
|
|
PCI_ERS_RESULT_DISCONNECT : PCI_ERS_RESULT_NEED_RESET;
|
|
|
}
|
|
@@ -5522,9 +5525,13 @@ static pci_ers_result_t eeh_slot_reset(struct pci_dev *pdev)
|
|
|
return PCI_ERS_RESULT_RECOVERED;
|
|
|
}
|
|
|
|
|
|
- if (pci_enable_device(pdev)) {
|
|
|
- dev_err(&pdev->dev, "cannot reenable PCI device after reset\n");
|
|
|
- return PCI_ERS_RESULT_DISCONNECT;
|
|
|
+ if (!(adap->flags & DEV_ENABLED)) {
|
|
|
+ if (pci_enable_device(pdev)) {
|
|
|
+ dev_err(&pdev->dev, "Cannot reenable PCI "
|
|
|
+ "device after reset\n");
|
|
|
+ return PCI_ERS_RESULT_DISCONNECT;
|
|
|
+ }
|
|
|
+ adap->flags |= DEV_ENABLED;
|
|
|
}
|
|
|
|
|
|
pci_set_master(pdev);
|
|
@@ -5910,6 +5917,9 @@ static int init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
|
|
|
goto out_disable_device;
|
|
|
}
|
|
|
|
|
|
+ /* PCI device has been enabled */
|
|
|
+ adapter->flags |= DEV_ENABLED;
|
|
|
+
|
|
|
adapter->regs = pci_ioremap_bar(pdev, 0);
|
|
|
if (!adapter->regs) {
|
|
|
dev_err(&pdev->dev, "cannot map device registers\n");
|
|
@@ -6145,7 +6155,10 @@ static void remove_one(struct pci_dev *pdev)
|
|
|
iounmap(adapter->bar2);
|
|
|
kfree(adapter);
|
|
|
pci_disable_pcie_error_reporting(pdev);
|
|
|
- pci_disable_device(pdev);
|
|
|
+ if ((adapter->flags & DEV_ENABLED)) {
|
|
|
+ pci_disable_device(pdev);
|
|
|
+ adapter->flags &= ~DEV_ENABLED;
|
|
|
+ }
|
|
|
pci_release_regions(pdev);
|
|
|
} else
|
|
|
pci_release_regions(pdev);
|