enum {                                 /* adapter flags */
        FULL_INIT_DONE     = (1 << 0),
-       USING_MSI          = (1 << 1),
-       USING_MSIX         = (1 << 2),
+       DEV_ENABLED        = (1 << 1),
+       USING_MSI          = (1 << 2),
+       USING_MSIX         = (1 << 3),
        FW_OK              = (1 << 4),
        RSS_TNLALLLOOKUP   = (1 << 5),
        USING_SOFT_PARAMS  = (1 << 6),
 
        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;
 }
                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);
                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");
                        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);