bool if_running = netif_running(netdev);
 
        set_bit(__E1000_TESTING, &adapter->state);
+
+       if (!if_running) {
+               /* Get control of and reset hardware */
+               if (adapter->flags & FLAG_HAS_AMT)
+                       e1000e_get_hw_control(adapter);
+
+               e1000e_power_up_phy(adapter);
+
+               adapter->hw.phy.autoneg_wait_to_complete = 1;
+               e1000e_reset(adapter);
+               adapter->hw.phy.autoneg_wait_to_complete = 0;
+       }
+
        if (eth_test->flags == ETH_TEST_FL_OFFLINE) {
                /* Offline tests */
 
                if (if_running)
                        /* indicate we're in test mode */
                        dev_close(netdev);
-               else
-                       e1000e_reset(adapter);
 
                if (e1000_reg_test(adapter, &data[0]))
                        eth_test->flags |= ETH_TEST_FL_FAILED;
                        eth_test->flags |= ETH_TEST_FL_FAILED;
 
                e1000e_reset(adapter);
-               /* make sure the phy is powered up */
-               e1000e_power_up_phy(adapter);
                if (e1000_loopback_test(adapter, &data[3]))
                        eth_test->flags |= ETH_TEST_FL_FAILED;
 
                if (if_running)
                        dev_open(netdev);
        } else {
-               if (!if_running && (adapter->flags & FLAG_HAS_AMT)) {
-                       clear_bit(__E1000_TESTING, &adapter->state);
-                       dev_open(netdev);
-                       set_bit(__E1000_TESTING, &adapter->state);
-               }
+               /* Online tests */
 
                e_info("online testing starting\n");
-               /* Online tests */
-               if (e1000_link_test(adapter, &data[4]))
-                       eth_test->flags |= ETH_TEST_FL_FAILED;
 
-               /* Online tests aren't run; pass by default */
+               /* register, eeprom, intr and loopback tests not run online */
                data[0] = 0;
                data[1] = 0;
                data[2] = 0;
                data[3] = 0;
 
-               if (!if_running && (adapter->flags & FLAG_HAS_AMT))
-                       dev_close(netdev);
+               if (e1000_link_test(adapter, &data[4]))
+                       eth_test->flags |= ETH_TEST_FL_FAILED;
 
                clear_bit(__E1000_TESTING, &adapter->state);
        }
+
+       if (!if_running) {
+               e1000e_reset(adapter);
+
+               if (adapter->flags & FLAG_HAS_AMT)
+                       e1000e_release_hw_control(adapter);
+       }
+
        msleep_interruptible(4 * 1000);
 }
 
 
 }
 
 /**
- * e1000_get_hw_control - get control of the h/w from f/w
+ * e1000e_get_hw_control - get control of the h/w from f/w
  * @adapter: address of board private structure
  *
- * e1000_get_hw_control sets {CTRL_EXT|SWSM}:DRV_LOAD bit.
+ * e1000e_get_hw_control sets {CTRL_EXT|SWSM}:DRV_LOAD bit.
  * For ASF and Pass Through versions of f/w this means that
  * the driver is loaded. For AMT version (only with 82573)
  * of the f/w this means that the network i/f is open.
  **/
-static void e1000_get_hw_control(struct e1000_adapter *adapter)
+void e1000e_get_hw_control(struct e1000_adapter *adapter)
 {
        struct e1000_hw *hw = &adapter->hw;
        u32 ctrl_ext;
 }
 
 /**
- * e1000_release_hw_control - release control of the h/w to f/w
+ * e1000e_release_hw_control - release control of the h/w to f/w
  * @adapter: address of board private structure
  *
- * e1000_release_hw_control resets {CTRL_EXT|SWSM}:DRV_LOAD bit.
+ * e1000e_release_hw_control resets {CTRL_EXT|SWSM}:DRV_LOAD bit.
  * For ASF and Pass Through versions of f/w this means that the
  * driver is no longer loaded. For AMT version (only with 82573) i
  * of the f/w this means that the network i/f is closed.
  *
  **/
-static void e1000_release_hw_control(struct e1000_adapter *adapter)
+void e1000e_release_hw_control(struct e1000_adapter *adapter)
 {
        struct e1000_hw *hw = &adapter->hw;
        u32 ctrl_ext;
             E1000_MNG_DHCP_COOKIE_STATUS_VLAN) &&
            (vid == adapter->mng_vlan_id)) {
                /* release control to f/w */
-               e1000_release_hw_control(adapter);
+               e1000e_release_hw_control(adapter);
                return;
        }
 
                ew32(PBA, pba);
        }
 
-
        /*
         * flow control settings
         *
         * that the network interface is in control
         */
        if (adapter->flags & FLAG_HAS_AMT)
-               e1000_get_hw_control(adapter);
+               e1000e_get_hw_control(adapter);
 
        ew32(WUC, 0);
 
        ew32(VET, ETH_P_8021Q);
 
        e1000e_reset_adaptive(hw);
+
+       if (!netif_running(adapter->netdev) &&
+           !test_bit(__E1000_TESTING, &adapter->state)) {
+               e1000_power_down_phy(adapter);
+               return;
+       }
+
        e1000_get_phy_info(hw);
 
        if ((adapter->flags & FLAG_HAS_SMART_POWER_DOWN) &&
         * interface is now open and reset the part to a known state.
         */
        if (adapter->flags & FLAG_HAS_AMT) {
-               e1000_get_hw_control(adapter);
+               e1000e_get_hw_control(adapter);
                e1000e_reset(adapter);
        }
 
        return 0;
 
 err_req_irq:
-       e1000_release_hw_control(adapter);
+       e1000e_release_hw_control(adapter);
        e1000_power_down_phy(adapter);
        e1000e_free_rx_resources(adapter);
 err_setup_rx:
         * If AMT is enabled, let the firmware know that the network
         * interface is now closed
         */
-       if (adapter->flags & FLAG_HAS_AMT)
-               e1000_release_hw_control(adapter);
+       if ((adapter->flags & FLAG_HAS_AMT) &&
+           !test_bit(__E1000_TESTING, &adapter->state))
+               e1000e_release_hw_control(adapter);
 
        if ((adapter->flags & FLAG_HAS_ERT) ||
            (adapter->hw.mac.type == e1000_pch2lan))
         * Release control of h/w to f/w.  If f/w is AMT enabled, this
         * would have already happened in close and is redundant.
         */
-       e1000_release_hw_control(adapter);
+       e1000e_release_hw_control(adapter);
 
        pci_disable_device(pdev);
 
         * under the control of the driver.
         */
        if (!(adapter->flags & FLAG_HAS_AMT))
-               e1000_get_hw_control(adapter);
+               e1000e_get_hw_control(adapter);
 
        return 0;
 }
         * under the control of the driver.
         */
        if (!(adapter->flags & FLAG_HAS_AMT))
-               e1000_get_hw_control(adapter);
+               e1000e_get_hw_control(adapter);
 
 }
 
         * under the control of the driver.
         */
        if (!(adapter->flags & FLAG_HAS_AMT))
-               e1000_get_hw_control(adapter);
+               e1000e_get_hw_control(adapter);
 
        strncpy(netdev->name, "eth%d", sizeof(netdev->name) - 1);
        err = register_netdev(netdev);
 
 err_register:
        if (!(adapter->flags & FLAG_HAS_AMT))
-               e1000_release_hw_control(adapter);
+               e1000e_release_hw_control(adapter);
 err_eeprom:
        if (!e1000_check_reset_block(&adapter->hw))
                e1000_phy_hw_reset(&adapter->hw);
 err_hw_init:
-
        kfree(adapter->tx_ring);
        kfree(adapter->rx_ring);
 err_sw_init:
         * Release control of h/w to f/w.  If f/w is AMT enabled, this
         * would have already happened in close and is redundant.
         */
-       e1000_release_hw_control(adapter);
+       e1000e_release_hw_control(adapter);
 
        e1000e_reset_interrupt_capability(adapter);
        kfree(adapter->tx_ring);