netif_carrier_off(dev);
 
-       bnx2_set_power_state(bp, PCI_D0);
        bnx2_disable_int(bp);
 
        rc = bnx2_setup_int_mode(bp, disable_msi);
        bnx2_del_napi(bp);
        bp->link_up = 0;
        netif_carrier_off(bp->dev);
-       bnx2_set_power_state(bp, PCI_D3hot);
        return 0;
 }
 
        struct bnx2 *bp = netdev_priv(dev);
        int rc;
 
-       if (!netif_running(dev))
-               return -EAGAIN;
-
        /* parameters already validated in ethtool_get_eeprom */
 
        rc = bnx2_nvram_read(bp, eeprom->offset, eebuf, eeprom->len);
        struct bnx2 *bp = netdev_priv(dev);
        int rc;
 
-       if (!netif_running(dev))
-               return -EAGAIN;
-
        /* parameters already validated in ethtool_set_eeprom */
 
        rc = bnx2_nvram_write(bp, eeprom->offset, eebuf, eeprom->len);
 {
        struct bnx2 *bp = netdev_priv(dev);
 
-       bnx2_set_power_state(bp, PCI_D0);
-
        memset(buf, 0, sizeof(u64) * BNX2_NUM_TESTS);
        if (etest->flags & ETH_TEST_FL_OFFLINE) {
                int i;
                etest->flags |= ETH_TEST_FL_FAILED;
 
        }
-       if (!netif_running(bp->dev))
-               bnx2_set_power_state(bp, PCI_D3hot);
 }
 
 static void
 
        switch (state) {
        case ETHTOOL_ID_ACTIVE:
-               bnx2_set_power_state(bp, PCI_D0);
-
                bp->leds_save = BNX2_RD(bp, BNX2_MISC_CFG);
                BNX2_WR(bp, BNX2_MISC_CFG, BNX2_MISC_CFG_LEDMODE_MAC);
                return 1;       /* cycle on/off once per second */
        case ETHTOOL_ID_INACTIVE:
                BNX2_WR(bp, BNX2_EMAC_LED, 0);
                BNX2_WR(bp, BNX2_MISC_CFG, bp->leds_save);
-
-               if (!netif_running(dev))
-                       bnx2_set_power_state(bp, PCI_D3hot);
                break;
        }
 
                goto err_out_release;
        }
 
-       bnx2_set_power_state(bp, PCI_D0);
-
        /* Configure byte swap and enable write to the reg_window registers.
         * Rely on CPU to do target byte swapping on big endian systems
         * The chip's target access swapping will not swap all accesses
                pci_restore_state(pdev);
                pci_save_state(pdev);
 
-               if (netif_running(dev)) {
-                       bnx2_set_power_state(bp, PCI_D0);
+               if (netif_running(dev))
                        err = bnx2_init_nic(bp, 1);
-               }
+
                if (!err)
                        result = PCI_ERS_RESULT_RECOVERED;
        }
        rtnl_unlock();
 }
 
+static void bnx2_shutdown(struct pci_dev *pdev)
+{
+       struct net_device *dev = pci_get_drvdata(pdev);
+       struct bnx2 *bp;
+
+       if (!dev)
+               return;
+
+       bp = netdev_priv(dev);
+       if (!bp)
+               return;
+
+       rtnl_lock();
+       if (netif_running(dev))
+               dev_close(bp->dev);
+
+       if (system_state == SYSTEM_POWER_OFF)
+               bnx2_set_power_state(bp, PCI_D3hot);
+
+       rtnl_unlock();
+}
+
 static const struct pci_error_handlers bnx2_err_handler = {
        .error_detected = bnx2_io_error_detected,
        .slot_reset     = bnx2_io_slot_reset,
        .remove         = bnx2_remove_one,
        .driver.pm      = BNX2_PM_OPS,
        .err_handler    = &bnx2_err_handler,
+       .shutdown       = bnx2_shutdown,
 };
 
 module_pci_driver(bnx2_pci_driver);