Index: /trunk/src/VBox/Devices/Network/DevE1000.cpp
===================================================================
--- /trunk/src/VBox/Devices/Network/DevE1000.cpp	(revision 64279)
+++ /trunk/src/VBox/Devices/Network/DevE1000.cpp	(revision 64280)
@@ -1096,6 +1096,6 @@
     /** All: throttle RX interrupts. */
     bool        fItrRxEnabled;
-
-    bool        Alignment2;
+    /** All: Delay TX interrupts using TIDV/TADV. */
+    bool        fTidEnabled;
     /** Link up delay (in milliseconds). */
     uint32_t    cMsLinkUpDelay;
@@ -3245,5 +3245,5 @@
 # endif /* E1K_TX_DELAY */
 
-# ifdef E1K_USE_TX_TIMERS
+//# ifdef E1K_USE_TX_TIMERS
 
 /**
@@ -3259,4 +3259,6 @@
 static DECLCALLBACK(void) e1kTxIntDelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
 {
+    RT_NOREF(pDevIns);
+    RT_NOREF(pTimer);
     PE1KSTATE pThis = (PE1KSTATE )pvUser;
 
@@ -3281,4 +3283,6 @@
 static DECLCALLBACK(void) e1kTxAbsDelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser)
 {
+    RT_NOREF(pDevIns);
+    RT_NOREF(pTimer);
     PE1KSTATE pThis = (PE1KSTATE )pvUser;
 
@@ -3289,5 +3293,5 @@
 }
 
-# endif /* E1K_USE_TX_TIMERS */
+//# endif /* E1K_USE_TX_TIMERS */
 # ifdef E1K_USE_RX_TIMERS
 
@@ -4445,6 +4449,6 @@
         if (pDesc->legacy.cmd.fEOP)
         {
-#ifdef E1K_USE_TX_TIMERS
-            if (pDesc->legacy.cmd.fIDE)
+//#ifdef E1K_USE_TX_TIMERS
+            if (pThis->fTidEnabled && pDesc->legacy.cmd.fIDE)
             {
                 E1K_INC_ISTAT_CNT(pThis->uStatTxIDE);
@@ -4467,16 +4471,20 @@
             else
             {
-                E1kLog2(("%s No IDE set, cancel TAD timer and raise interrupt\n",
-                        pThis->szPrf));
+                if (pThis->fTidEnabled)
+                {
+                    E1kLog2(("%s No IDE set, cancel TAD timer and raise interrupt\n",
+                             pThis->szPrf));
+                    /* Cancel both timers if armed and fire immediately. */
 # ifndef E1K_NO_TAD
-                /* Cancel both timers if armed and fire immediately. */
-                e1kCancelTimer(pThis, pThis->CTX_SUFF(pTADTimer));
+                    TMTimerStop(pThis->CTX_SUFF(pTADTimer));
 # endif
-#endif /* E1K_USE_TX_TIMERS */
+                    TMTimerStop(pThis->CTX_SUFF(pTIDTimer));
+                }
+//#endif /* E1K_USE_TX_TIMERS */
                 E1K_INC_ISTAT_CNT(pThis->uStatIntTx);
                 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_TXDW);
-#ifdef E1K_USE_TX_TIMERS
+//#ifdef E1K_USE_TX_TIMERS
             }
-#endif /* E1K_USE_TX_TIMERS */
+//#endif /* E1K_USE_TX_TIMERS */
         }
     }
@@ -4510,7 +4518,8 @@
     e1kPrintTDesc(pThis, pDesc, "vvv");
 
-#ifdef E1K_USE_TX_TIMERS
-    e1kCancelTimer(pThis, pThis->CTX_SUFF(pTIDTimer));
-#endif /* E1K_USE_TX_TIMERS */
+//#ifdef E1K_USE_TX_TIMERS
+    if (pThis->fTidEnabled)
+        e1kCancelTimer(pThis, pThis->CTX_SUFF(pTIDTimer));
+//#endif /* E1K_USE_TX_TIMERS */
 
     switch (e1kGetDescType(pDesc))
@@ -4770,7 +4779,8 @@
     e1kPrintTDesc(pThis, pDesc, "vvv");
 
-#ifdef E1K_USE_TX_TIMERS
-    e1kCancelTimer(pThis, pThis->CTX_SUFF(pTIDTimer));
-#endif /* E1K_USE_TX_TIMERS */
+//#ifdef E1K_USE_TX_TIMERS
+    if (pThis->fTidEnabled)
+        TMTimerStop(pThis->CTX_SUFF(pTIDTimer));
+//#endif /* E1K_USE_TX_TIMERS */
 
     switch (e1kGetDescType(pDesc))
@@ -6644,10 +6654,13 @@
     e1kCancelTimer(pThis, pThis->CTX_SUFF(pTXDTimer));
 #endif /* E1K_TX_DELAY */
-#ifdef E1K_USE_TX_TIMERS
-    e1kCancelTimer(pThis, pThis->CTX_SUFF(pTIDTimer));
+//#ifdef E1K_USE_TX_TIMERS
+    if (pThis->fTidEnabled)
+    {
+        e1kCancelTimer(pThis, pThis->CTX_SUFF(pTIDTimer));
 #ifndef E1K_NO_TAD
-    e1kCancelTimer(pThis, pThis->CTX_SUFF(pTADTimer));
+        e1kCancelTimer(pThis, pThis->CTX_SUFF(pTADTimer));
 #endif /* E1K_NO_TAD */
-#endif /* E1K_USE_TX_TIMERS */
+    }
+//#endif /* E1K_USE_TX_TIMERS */
 #ifdef E1K_USE_RX_TIMERS
     e1kCancelTimer(pThis, pThis->CTX_SUFF(pRIDTimer));
@@ -7352,10 +7365,13 @@
     pThis->pRADTimerRC   = TMTimerRCPtr(pThis->pRADTimerR3);
 #endif /* E1K_USE_RX_TIMERS */
-#ifdef E1K_USE_TX_TIMERS
-    pThis->pTIDTimerRC   = TMTimerRCPtr(pThis->pTIDTimerR3);
+//#ifdef E1K_USE_TX_TIMERS
+    if (pThis->fTidEnabled)
+    {
+        pThis->pTIDTimerRC   = TMTimerRCPtr(pThis->pTIDTimerR3);
 # ifndef E1K_NO_TAD
-    pThis->pTADTimerRC   = TMTimerRCPtr(pThis->pTADTimerR3);
+        pThis->pTADTimerRC   = TMTimerRCPtr(pThis->pTADTimerR3);
 # endif /* E1K_NO_TAD */
-#endif /* E1K_USE_TX_TIMERS */
+    }
+//#endif /* E1K_USE_TX_TIMERS */
 #ifdef E1K_TX_DELAY
     pThis->pTXDTimerRC   = TMTimerRCPtr(pThis->pTXDTimerR3);
@@ -7538,11 +7554,4 @@
     /** @todo LineSpeed unused! */
 
-    pThis->fR0Enabled    = true;
-    pThis->fRCEnabled    = true;
-    pThis->fEthernetCRC  = true;
-    pThis->fGSOEnabled   = true;
-    pThis->fItrEnabled   = true;
-    pThis->fItrRxEnabled = true;
-
     /* Get config params */
     rc = CFGMR3QueryBytes(pCfg, "MAC", pThis->macConfigured.au8, sizeof(pThis->macConfigured.au8));
@@ -7579,5 +7588,5 @@
                                 N_("Configuration error: Failed to get the value of 'GSOEnabled'"));
 
-    rc = CFGMR3QueryBoolDef(pCfg, "ItrEnabled", &pThis->fItrEnabled, true);
+    rc = CFGMR3QueryBoolDef(pCfg, "ItrEnabled", &pThis->fItrEnabled, false);
     if (RT_FAILURE(rc))
         return PDMDEV_SET_ERROR(pDevIns, rc,
@@ -7588,4 +7597,9 @@
         return PDMDEV_SET_ERROR(pDevIns, rc,
                                 N_("Configuration error: Failed to get the value of 'ItrRxEnabled'"));
+
+    rc = CFGMR3QueryBoolDef(pCfg, "TidEnabled", &pThis->fTidEnabled, false);
+    if (RT_FAILURE(rc))
+        return PDMDEV_SET_ERROR(pDevIns, rc,
+                                N_("Configuration error: Failed to get the value of 'TidEnabled'"));
 
     rc = CFGMR3QueryU32Def(pCfg, "LinkUpDelay", (uint32_t*)&pThis->cMsLinkUpDelay, 5000); /* ms */
@@ -7599,5 +7613,5 @@
         LogRel(("%s WARNING! Link up delay is disabled!\n", pThis->szPrf));
 
-    LogRel(("%s Chip=%s LinkUpDelay=%ums EthernetCRC=%s GSO=%s Itr=%s ItrRx=%s R0=%s GC=%s\n", pThis->szPrf,
+    LogRel(("%s Chip=%s LinkUpDelay=%ums EthernetCRC=%s GSO=%s Itr=%s ItrRx=%s TID=%s R0=%s GC=%s\n", pThis->szPrf,
             g_aChips[pThis->eChip].pcszName, pThis->cMsLinkUpDelay,
             pThis->fEthernetCRC ? "on" : "off",
@@ -7605,4 +7619,5 @@
             pThis->fItrEnabled ? "enabled" : "disabled",
             pThis->fItrRxEnabled ? "enabled" : "disabled",
+            pThis->fTidEnabled ? "enabled" : "disabled",
             pThis->fR0Enabled ? "enabled" : "disabled",
             pThis->fRCEnabled ? "enabled" : "disabled"));
@@ -7703,25 +7718,28 @@
 #endif /* E1K_TX_DELAY */
 
-#ifdef E1K_USE_TX_TIMERS
-    /* Create Transmit Interrupt Delay Timer */
-    rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kTxIntDelayTimer, pThis,
-                                TMTIMER_FLAGS_NO_CRIT_SECT,
-                                "E1000 Transmit Interrupt Delay Timer", &pThis->pTIDTimerR3);
-    if (RT_FAILURE(rc))
-        return rc;
-    pThis->pTIDTimerR0 = TMTimerR0Ptr(pThis->pTIDTimerR3);
-    pThis->pTIDTimerRC = TMTimerRCPtr(pThis->pTIDTimerR3);
+//#ifdef E1K_USE_TX_TIMERS
+    if (pThis->fTidEnabled)
+    {
+        /* Create Transmit Interrupt Delay Timer */
+        rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kTxIntDelayTimer, pThis,
+                                    TMTIMER_FLAGS_NO_CRIT_SECT,
+                                    "E1000 Transmit Interrupt Delay Timer", &pThis->pTIDTimerR3);
+        if (RT_FAILURE(rc))
+            return rc;
+        pThis->pTIDTimerR0 = TMTimerR0Ptr(pThis->pTIDTimerR3);
+        pThis->pTIDTimerRC = TMTimerRCPtr(pThis->pTIDTimerR3);
 
 # ifndef E1K_NO_TAD
-    /* Create Transmit Absolute Delay Timer */
-    rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kTxAbsDelayTimer, pThis,
-                                TMTIMER_FLAGS_NO_CRIT_SECT,
-                                "E1000 Transmit Absolute Delay Timer", &pThis->pTADTimerR3);
-    if (RT_FAILURE(rc))
-        return rc;
-    pThis->pTADTimerR0 = TMTimerR0Ptr(pThis->pTADTimerR3);
-    pThis->pTADTimerRC = TMTimerRCPtr(pThis->pTADTimerR3);
+        /* Create Transmit Absolute Delay Timer */
+        rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kTxAbsDelayTimer, pThis,
+                                    TMTIMER_FLAGS_NO_CRIT_SECT,
+                                    "E1000 Transmit Absolute Delay Timer", &pThis->pTADTimerR3);
+        if (RT_FAILURE(rc))
+            return rc;
+        pThis->pTADTimerR0 = TMTimerR0Ptr(pThis->pTADTimerR3);
+        pThis->pTADTimerRC = TMTimerRCPtr(pThis->pTADTimerR3);
 # endif /* E1K_NO_TAD */
-#endif /* E1K_USE_TX_TIMERS */
+    }
+//#endif /* E1K_USE_TX_TIMERS */
 
 #ifdef E1K_USE_RX_TIMERS
