Index: /trunk/src/VBox/Devices/Network/DevE1000.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DevE1000.cpp	(revision 64965)
+++ /trunk/src/VBox/Devices/Network/DevE1000.cpp	(revision 64966)
@@ -2643,4 +2643,20 @@
 
 /**
+ * A callback used by PHY to indicate that the link needs to be updated due to
+ * reset of PHY.
+ *
+ * @param   pPhy        A pointer to phy member of the device state structure.
+ * @thread  any
+ */
+void e1kPhyLinkResetCallback(PPHY pPhy)
+{
+    /* PHY is aggregated into e1000, get pThis from pPhy. */
+    PE1KSTATE pThis = RT_FROM_MEMBER(pPhy, E1KSTATE, phy);
+    /* Make sure we have cable connected and MAC can talk to PHY */
+    if (pThis->fCableConnected && (CTRL & CTRL_SLU))
+        e1kArmTimer(pThis, pThis->CTX_SUFF(pLUTimer), E1K_INIT_LINKUP_DELAY_US);
+}
+
+/**
  * Write handler for Device Control register.
  *
@@ -7649,5 +7665,4 @@
     /* Initialize internal PHY. */
     Phy::init(&pThis->phy, iInstance, pThis->eChip == E1K_CHIP_82543GC ? PHY_EPID_M881000 : PHY_EPID_M881011);
-    Phy::setLinkStatus(&pThis->phy, pThis->fCableConnected);
 
     /* Initialize critical sections. We do our own locking. */
Index: /trunk/src/VBox/Devices/Network/DevE1000Phy.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DevE1000Phy.cpp	(revision 64965)
+++ /trunk/src/VBox/Devices/Network/DevE1000Phy.cpp	(revision 64966)
@@ -47,4 +47,8 @@
 
 #define REG(x) pPhy->au16Regs[x##_IDX]
+
+
+/* External callback declaration */
+void e1kPhyLinkResetCallback(PPHY pPhy);
 
 
@@ -300,6 +304,4 @@
 {
     pPhy->iInstance = iNICInstance;
-    /* Make sure the link is down */
-    REG(PSTATUS)  = 0;
     /* The PHY identifier composed of bits 3 through 18 of the OUI */
     /* (Organizationally Unique Identifier). OUI is 0x05043.       */
@@ -352,4 +354,6 @@
 {
     PhyLog(("PHY#%d Soft reset\n", pPhy->iInstance));
+
+    REG(PCTRL)    = REG(PCTRL) & (PCTRL_SPDSELM | PCTRL_DUPMOD | PCTRL_ANEG | PCTRL_SPDSELL);
     /*
      * 100 and 10 FD/HD, Extended Status, MF Preamble Suppression,
@@ -357,7 +361,8 @@
      */
     REG(PSTATUS)  = 0x7949;
-    REG(PSSTAT)   = 0x0000;
+    REG(PSSTAT)  &= 0xe001;
     PhyLog(("PHY#%d PSTATUS=%04x PSSTAT=%04x\n", pPhy->iInstance, REG(PSTATUS), REG(PSSTAT)));
-    PhyLog(("PHY#%d Soft reset is not yet fully implemented!\n", pPhy->iInstance));
+
+    e1kPhyLinkResetCallback(pPhy);
 }
 
@@ -384,11 +389,11 @@
     if (fLinkIsUp)
     {
-        REG(PSSTAT)  |= PSSTAT_LINK;
-        REG(PSTATUS) |= PSTATUS_NEGCOMP;
+        REG(PSSTAT)  |= PSSTAT_LINK_ALL;
+        REG(PSTATUS) |= PSTATUS_NEGCOMP; /* PSTATUS_LNKSTAT is latched low */
     }
     else
     {
-        REG(PSSTAT)  &= ~PSSTAT_LINK;
-        REG(PSTATUS) &= ~PSTATUS_LNKSTAT;
+        REG(PSSTAT)  &= ~PSSTAT_LINK_ALL;
+        REG(PSTATUS) &= ~(PSTATUS_LNKSTAT | PSTATUS_NEGCOMP);
     }
     PhyLog(("PHY#%d setLinkStatus: PSTATUS=%04x PSSTAT=%04x\n", pPhy->iInstance, REG(PSTATUS), REG(PSSTAT)));
Index: /trunk/src/VBox/Devices/Network/DevE1000Phy.h
===================================================================
--- /trunk/src/VBox/Devices/Network/DevE1000Phy.h	(revision 64965)
+++ /trunk/src/VBox/Devices/Network/DevE1000Phy.h	(revision 64966)
@@ -38,5 +38,6 @@
  * Receive Pause Enable
  */
-#define PSSTAT_LINK     0xBC08
+#define PSSTAT_LINK_ALL 0xBC08
+#define PSSTAT_LINK     0x0400
 
 namespace Phy
