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);
+               }
+
                e_info("online testing starting\n");
                /* Online tests */
                if (e1000_link_test(adapter, &data[4]))
                data[2] = 0;
                data[3] = 0;
 
+               if (!if_running && (adapter->flags & FLAG_HAS_AMT))
+                       dev_close(netdev);
+
                clear_bit(__E1000_TESTING, &adapter->state);
        }
        msleep_interruptible(4 * 1000);
 
        if (err)
                goto err_setup_rx;
 
+       /*
+        * If AMT is enabled, let the firmware know that the network
+        * interface is now open and reset the part to a known state.
+        */
+       if (adapter->flags & FLAG_HAS_AMT) {
+               e1000_get_hw_control(adapter);
+               e1000e_reset(adapter);
+       }
+
        e1000e_power_up_phy(adapter);
 
        adapter->mng_vlan_id = E1000_MNG_VLAN_NONE;
             E1000_MNG_DHCP_COOKIE_STATUS_VLAN))
                e1000_update_mng_vlan(adapter);
 
-       /*
-        * If AMT is enabled, let the firmware know that the network
-        * interface is now open
-        */
-       if (adapter->flags & FLAG_HAS_AMT)
-               e1000_get_hw_control(adapter);
-
        /*
         * before we allocate an interrupt, we must be ready to handle it.
         * Setting DEBUG_SHIRQ in the kernel makes it fire an interrupt