VirtualBox

Changeset 81384 in vbox


Ignore:
Timestamp:
Oct 19, 2019 11:59:29 PM (5 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
134097
Message:

DevE1000: Converted timers from pointers to handles. bugref:9218

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Network/DevE1000.cpp

    r81380 r81384  
    10301030{
    10311031    char                    szPrf[8];                /**< Log prefix, e.g. E1000#1. */
     1032
    10321033    PDMIBASE                IBase;
    10331034    PDMINETWORKDOWN         INetworkDown;
     
    10411042    R3PTRTYPE(PPDMQUEUE)    pCanRxQueueR3;           /**< Rx wakeup signaller - R3. */
    10421043    PPDMINETWORKUPR3        pDrvR3;              /**< Attached network driver - R3. */
    1043     PTMTIMERR3              pRIDTimerR3;   /**< Receive Interrupt Delay Timer - R3. */
    1044     PTMTIMERR3              pRADTimerR3;    /**< Receive Absolute Delay Timer - R3. */
    1045     PTMTIMERR3              pTIDTimerR3;  /**< Transmit Interrupt Delay Timer - R3. */
    1046     PTMTIMERR3              pTADTimerR3;   /**< Transmit Absolute Delay Timer - R3. */
    1047     PTMTIMERR3              pTXDTimerR3;            /**< Transmit Delay Timer - R3. */
    1048     PTMTIMERR3              pIntTimerR3;            /**< Late Interrupt Timer - R3. */
    1049     PTMTIMERR3              pLUTimerR3;               /**< Link Up(/Restore) Timer. */
    10501044    /** The scatter / gather buffer used for the current outgoing packet - R3. */
    10511045    R3PTRTYPE(PPDMSCATTERGATHER) pTxSgR3;
     
    10551049    R0PTRTYPE(PPDMQUEUE)    pCanRxQueueR0;           /**< Rx wakeup signaller - R0. */
    10561050    PPDMINETWORKUPR0        pDrvR0;              /**< Attached network driver - R0. */
    1057     PTMTIMERR0              pRIDTimerR0;   /**< Receive Interrupt Delay Timer - R0. */
    1058     PTMTIMERR0              pRADTimerR0;    /**< Receive Absolute Delay Timer - R0. */
    1059     PTMTIMERR0              pTIDTimerR0;  /**< Transmit Interrupt Delay Timer - R0. */
    1060     PTMTIMERR0              pTADTimerR0;   /**< Transmit Absolute Delay Timer - R0. */
    1061     PTMTIMERR0              pTXDTimerR0;            /**< Transmit Delay Timer - R0. */
    1062     PTMTIMERR0              pIntTimerR0;            /**< Late Interrupt Timer - R0. */
    1063     PTMTIMERR0              pLUTimerR0;          /**< Link Up(/Restore) Timer - R0. */
    10641051    /** The scatter / gather buffer used for the current outgoing packet - R0. */
    10651052    R0PTRTYPE(PPDMSCATTERGATHER) pTxSgR0;
     
    10691056    RCPTRTYPE(PPDMQUEUE)    pCanRxQueueRC;           /**< Rx wakeup signaller - RC. */
    10701057    PPDMINETWORKUPRC        pDrvRC;              /**< Attached network driver - RC. */
    1071     PTMTIMERRC              pRIDTimerRC;   /**< Receive Interrupt Delay Timer - RC. */
    1072     PTMTIMERRC              pRADTimerRC;    /**< Receive Absolute Delay Timer - RC. */
    1073     PTMTIMERRC              pTIDTimerRC;  /**< Transmit Interrupt Delay Timer - RC. */
    1074     PTMTIMERRC              pTADTimerRC;   /**< Transmit Absolute Delay Timer - RC. */
    1075     PTMTIMERRC              pTXDTimerRC;            /**< Transmit Delay Timer - RC. */
    1076     PTMTIMERRC              pIntTimerRC;            /**< Late Interrupt Timer - RC. */
    1077     PTMTIMERRC              pLUTimerRC;          /**< Link Up(/Restore) Timer - RC. */
    10781058    /** The scatter / gather buffer used for the current outgoing packet - RC. */
    10791059    RCPTRTYPE(PPDMSCATTERGATHER) pTxSgRC;
     
    10881068    IOMIOPORTHANDLE         hIoPorts;
    10891069
    1090     PDMCRITSECT cs;                  /**< Critical section - what is it protecting? */
    1091     PDMCRITSECT csRx;                                     /**< RX Critical section. */
     1070    /** Receive Interrupt Delay Timer. */
     1071    TMTIMERHANDLE           hRIDTimer;
     1072    /** Receive Absolute Delay Timer. */
     1073    TMTIMERHANDLE           hRADTimer;
     1074    /** Transmit Interrupt Delay Timer. */
     1075    TMTIMERHANDLE           hTIDTimer;
     1076    /** Transmit Absolute Delay Timer. */
     1077    TMTIMERHANDLE           hTADTimer;
     1078    /** Transmit Delay Timer. */
     1079    TMTIMERHANDLE           hTXDTimer;
     1080    /** Late Interrupt Timer. */
     1081    TMTIMERHANDLE           hIntTimer;
     1082    /** Link Up(/Restore) Timer. */
     1083    TMTIMERHANDLE           hLUTimer;
     1084
     1085    /** Critical section - what is it protecting? */
     1086    PDMCRITSECT             cs;
     1087    /** RX Critical section. */
     1088    PDMCRITSECT             csRx;
    10921089#ifdef E1K_WITH_TX_CS
    1093     PDMCRITSECT csTx;                                     /**< TX Critical section. */
     1090    /** TX Critical section. */
     1091    PDMCRITSECT             csTx;
    10941092#endif /* E1K_WITH_TX_CS */
    10951093    /** Base address of memory-mapped registers. */
     
    11051103    /** EMT: false if the cable is disconnected by the GUI. */
    11061104    bool        fCableConnected;
    1107     /** EMT: */
    1108     bool        fR0Enabled;
    1109     /** EMT: */
    1110     bool        fRCEnabled;
    11111105    /** EMT: Compute Ethernet CRC for RX packets. */
    11121106    bool        fEthernetCRC;
     
    11171111    /** All: Delay TX interrupts using TIDV/TADV. */
    11181112    bool        fTidEnabled;
     1113    bool        afPadding[2];
    11191114    /** Link up delay (in milliseconds). */
    11201115    uint32_t    cMsLinkUpDelay;
     
    13171312static int e1kXmitPending(PE1KSTATE pThis, bool fOnWorkerThread);
    13181313
    1319 static int e1kRegReadUnimplemented (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value);
    1320 static int e1kRegWriteUnimplemented(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1321 static int e1kRegReadAutoClear     (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value);
    1322 static int e1kRegReadDefault       (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value);
    1323 static int e1kRegWriteDefault      (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
     1314/**
     1315 * E1000 register read handler.
     1316 */
     1317typedef int (FNE1KREGREAD)(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value);
     1318/**
     1319 * E1000 register write handler.
     1320 */
     1321typedef int (FNE1KREGWRITE)(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
     1322
     1323static FNE1KREGREAD  e1kRegReadUnimplemented;
     1324static FNE1KREGWRITE e1kRegWriteUnimplemented;
     1325static FNE1KREGREAD  e1kRegReadAutoClear;
     1326static FNE1KREGREAD  e1kRegReadDefault;
     1327static FNE1KREGWRITE e1kRegWriteDefault;
    13241328#if 0 /* unused */
    1325 static int e1kRegReadCTRL          (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value);
     1329static FNE1KREGREAD  e1kRegReadCTRL;
    13261330#endif
    1327 static int e1kRegWriteCTRL         (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1328 static int e1kRegReadEECD          (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value);
    1329 static int e1kRegWriteEECD         (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1330 static int e1kRegWriteEERD         (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1331 static int e1kRegWriteMDIC         (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1332 static int e1kRegReadICR           (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value);
    1333 static int e1kRegWriteICR          (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1334 static int e1kRegWriteICS          (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1335 static int e1kRegWriteIMS          (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1336 static int e1kRegWriteIMC          (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1337 static int e1kRegWriteRCTL         (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1338 static int e1kRegWritePBA          (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1339 static int e1kRegWriteRDT          (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1340 static int e1kRegWriteRDTR         (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1341 static int e1kRegWriteTDT          (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1342 static int e1kRegReadMTA           (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value);
    1343 static int e1kRegWriteMTA          (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1344 static int e1kRegReadRA            (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value);
    1345 static int e1kRegWriteRA           (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
    1346 static int e1kRegReadVFTA          (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value);
    1347 static int e1kRegWriteVFTA         (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
     1331static FNE1KREGWRITE e1kRegWriteCTRL;
     1332static FNE1KREGREAD  e1kRegReadEECD;
     1333static FNE1KREGWRITE e1kRegWriteEECD;
     1334static FNE1KREGWRITE e1kRegWriteEERD;
     1335static FNE1KREGWRITE e1kRegWriteMDIC;
     1336static FNE1KREGREAD  e1kRegReadICR;
     1337static FNE1KREGWRITE e1kRegWriteICR;
     1338static FNE1KREGWRITE e1kRegWriteICS;
     1339static FNE1KREGWRITE e1kRegWriteIMS;
     1340static FNE1KREGWRITE e1kRegWriteIMC;
     1341static FNE1KREGWRITE e1kRegWriteRCTL;
     1342static FNE1KREGWRITE e1kRegWritePBA;
     1343static FNE1KREGWRITE e1kRegWriteRDT;
     1344static FNE1KREGWRITE e1kRegWriteRDTR;
     1345static FNE1KREGWRITE e1kRegWriteTDT;
     1346static FNE1KREGREAD  e1kRegReadMTA;
     1347static FNE1KREGWRITE e1kRegWriteMTA;
     1348static FNE1KREGREAD  e1kRegReadRA;
     1349static FNE1KREGWRITE e1kRegWriteRA;
     1350static FNE1KREGREAD  e1kRegReadVFTA;
     1351static FNE1KREGWRITE e1kRegWriteVFTA;
    13481352
    13491353/**
     
    13631367    uint32_t   writable;
    13641368    /** Read callback. */
    1365     int       (*pfnRead)(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value);
     1369    FNE1KREGREAD *pfnRead;
    13661370    /** Write callback. */
    1367     int       (*pfnWrite)(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);
     1371    FNE1KREGWRITE *pfnWrite;
    13681372    /** Abbreviated name. */
    13691373    const char *abbrev;
     
    15151519 * Convert U32 value to hex string. Masked bytes are replaced with dots.
    15161520 *
    1517  * @remarks The mask has byte (not bit) granularity (e.g. 000000FF).
     1521 * @remarks The mask has half-byte byte (not bit) granularity (e.g. 0000000F).
    15181522 *
    15191523 * @returns The buffer.
     
    15421546 *
    15431547 * @param   pThis       The device state structure.
    1544  * @param   pTimer      The timer to get the name for.
    1545  */
    1546 DECLINLINE(const char *) e1kGetTimerName(PE1KSTATE pThis, PTMTIMER pTimer)
    1547 {
    1548     if (pTimer == pThis->CTX_SUFF(pTIDTimer))
     1548 * @param   hTimer      The timer to name.
     1549 */
     1550DECLINLINE(const char *) e1kGetTimerName(PE1KSTATE pThis, TMTIMERHANDLE hTimer)
     1551{
     1552    if (hTimer == pThis->hTIDTimer)
    15491553        return "TID";
    1550     if (pTimer == pThis->CTX_SUFF(pTADTimer))
     1554    if (hTimer == pThis->hTADTimer)
    15511555        return "TAD";
    1552     if (pTimer == pThis->CTX_SUFF(pRIDTimer))
     1556    if (hTimer == pThis->hRIDTimer)
    15531557        return "RID";
    1554     if (pTimer == pThis->CTX_SUFF(pRADTimer))
     1558    if (hTimer == pThis->hRADTimer)
    15551559        return "RAD";
    1556     if (pTimer == pThis->CTX_SUFF(pIntTimer))
     1560    if (hTimer == pThis->hIntTimer)
    15571561        return "Int";
    1558     if (pTimer == pThis->CTX_SUFF(pTXDTimer))
     1562    if (hTimer == pThis->hTXDTimer)
    15591563        return "TXD";
    1560     if (pTimer == pThis->CTX_SUFF(pLUTimer))
     1564    if (hTimer == pThis->hLUTimer)
    15611565        return "LinkUp";
    15621566    return "unknown";
    15631567}
    15641568
    1565 #endif /* DEBUG */
     1569#endif /* LOG_ENABLED */
    15661570
    15671571/**
    15681572 * Arm a timer.
    15691573 *
    1570  * @param   pThis      Pointer to the device state structure.
    1571  * @param   pTimer      Pointer to the timer.
     1574 * @param   pDevIns     The device instance.
     1575 * @param   pThis       Pointer to the device state structure.
     1576 * @param   hTimer      The timer to arm.
    15721577 * @param   uExpireIn   Expiration interval in microseconds.
    15731578 */
    1574 DECLINLINE(void) e1kArmTimer(PE1KSTATE pThis, PTMTIMER pTimer, uint32_t uExpireIn)
     1579DECLINLINE(void) e1kArmTimer(PPDMDEVINS pDevIns, PE1KSTATE pThis, TMTIMERHANDLE hTimer, uint32_t uExpireIn)
    15751580{
    15761581    if (pThis->fLocked)
     
    15781583
    15791584    E1kLog2(("%s Arming %s timer to fire in %d usec...\n",
    1580              pThis->szPrf, e1kGetTimerName(pThis, pTimer), uExpireIn));
    1581     TMTimerSetMicro(pTimer, uExpireIn);
     1585             pThis->szPrf, e1kGetTimerName(pThis, hTimer), uExpireIn));
     1586    int rc = PDMDevHlpTimerSetMicro(pDevIns, hTimer, uExpireIn);
     1587    AssertRC(rc);
    15821588}
    15831589
     
    15861592 * Cancel a timer.
    15871593 *
    1588  * @param   pThis      Pointer to the device state structure.
     1594 * @param   pDevIns     The device instance.
     1595 * @param   pThis       Pointer to the device state structure.
    15891596 * @param   pTimer      Pointer to the timer.
    15901597 */
    1591 DECLINLINE(void) e1kCancelTimer(PE1KSTATE pThis, PTMTIMER pTimer)
     1598DECLINLINE(void) e1kCancelTimer(PPDMDEVINS pDevIns, PE1KSTATE pThis, TMTIMERHANDLE hTimer)
    15921599{
    15931600    E1kLog2(("%s Stopping %s timer...\n",
    1594             pThis->szPrf, e1kGetTimerName(pThis, pTimer)));
    1595     int rc = TMTimerStop(pTimer);
     1601            pThis->szPrf, e1kGetTimerName(pThis, hTimer)));
     1602    int rc = PDMDevHlpTimerStop(pDevIns, hTimer);
    15961603    if (RT_FAILURE(rc))
    1597         E1kLog2(("%s e1kCancelTimer: TMTimerStop() failed with %Rrc\n",
    1598                 pThis->szPrf, rc));
    1599     RT_NOREF1(pThis);
     1604        E1kLog2(("%s e1kCancelTimer: TMTimerStop(%s) failed with %Rrc\n",
     1605                pThis->szPrf, e1kGetTimerName(pThis, hTimer), rc));
     1606    RT_NOREF_PV(pThis);
    16001607}
    16011608#endif /* IN_RING3 */
     
    16361643 * Hardware reset. Revert all registers to initial values.
    16371644 *
     1645 * @param   pDevIns     The device instance.
    16381646 * @param   pThis       The device state structure.
    16391647 */
    1640 static void e1kHardReset(PE1KSTATE pThis)
     1648static void e1kHardReset(PPDMDEVINS pDevIns, PE1KSTATE pThis)
    16411649{
    16421650    E1kLog(("%s Hard reset triggered\n", pThis->szPrf));
     
    16921700    E1kLog(("%s Will trigger LSC in %d seconds...\n",
    16931701            pThis->szPrf, pThis->cMsLinkUpDelay / 1000));
    1694     e1kArmTimer(pThis, pThis->CTX_SUFF(pLUTimer), pThis->cMsLinkUpDelay * 1000);
     1702    e1kArmTimer(pDevIns, pThis, pThis->hLUTimer, pThis->cMsLinkUpDelay * 1000);
    16951703#endif /* E1K_LSC_ON_RESET */
    16961704}
     
    20192027 * @param   pThis       The device state structure.
    20202028 */
    2021 inline void e1kPostponeInterrupt(PE1KSTATE pThis, uint64_t uNanoseconds)
    2022 {
    2023     if (!TMTimerIsActive(pThis->CTX_SUFF(pIntTimer)))
    2024         TMTimerSetNano(pThis->CTX_SUFF(pIntTimer), uNanoseconds);
     2029DECLINLINE(void) e1kPostponeInterrupt(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint64_t nsDeadline)
     2030{
     2031    if (!PDMDevHlpTimerIsActive(pDevIns, pThis->hIntTimer))
     2032        PDMDevHlpTimerSetNano(pDevIns, pThis->hIntTimer, nsDeadline);
    20252033}
    20262034
     
    20302038 * @param   pThis       The device state structure.
    20312039 */
    2032 static int e1kRaiseInterrupt(PE1KSTATE pThis, int rcBusy, uint32_t u32IntCause = 0)
     2040static int e1kRaiseInterrupt(PPDMDEVINS pDevIns, PE1KSTATE pThis, int rcBusy, uint32_t u32IntCause = 0)
    20332041{
    20342042    int rc = e1kCsEnter(pThis, rcBusy);
     
    20482056        else
    20492057        {
    2050             uint64_t tsNow = TMTimerGet(pThis->CTX_SUFF(pIntTimer));
     2058            uint64_t tsNow = PDMDevHlpTimerGet(pDevIns, pThis->hIntTimer);
    20512059            if (!!ITR && tsNow - pThis->u64AckedAt < ITR * 256
    20522060                     && pThis->fItrEnabled && (pThis->fItrRxEnabled || !(ICR & ICR_RXT0)))
     
    20552063                E1kLog2(("%s e1kRaiseInterrupt: Too early to raise again: %d ns < %d ns.\n",
    20562064                        pThis->szPrf, (uint32_t)(tsNow - pThis->u64AckedAt), ITR * 256));
    2057                 e1kPostponeInterrupt(pThis, ITR * 256);
     2065                e1kPostponeInterrupt(pDevIns, pThis, ITR * 256);
    20582066            }
    20592067            else
     
    20632071                 * there is no need to do it later -- stop the timer.
    20642072                 */
    2065                 TMTimerStop(pThis->CTX_SUFF(pIntTimer));
     2073                PDMDevHlpTimerStop(pDevIns, pThis->hIntTimer);
    20662074                E1K_INC_ISTAT_CNT(pThis->uStatInt);
    20672075                STAM_COUNTER_INC(&pThis->StatIntsRaised);
     
    20702078                /* Raise(1) INTA(0) */
    20712079                E1kLogRel(("E1000: irq RAISED icr&mask=0x%x, icr=0x%x\n", ICR & IMS, ICR));
    2072                 PDMDevHlpPCISetIrq(pThis->CTX_SUFF(pDevIns), 0, 1);
     2080                PDMDevHlpPCISetIrq(pDevIns, 0, 1);
    20732081                E1kLog(("%s e1kRaiseInterrupt: Raised. ICR&IMS=%08x\n",
    20742082                        pThis->szPrf, ICR & IMS));
     
    21072115 * @remarks RDH always points to the next available RX descriptor.
    21082116 *
     2117 * @param   pDevIns     The device instance.
    21092118 * @param   pThis       The device state structure.
    21102119 */
    2111 DECLINLINE(void) e1kAdvanceRDH(PE1KSTATE pThis)
     2120DECLINLINE(void) e1kAdvanceRDH(PPDMDEVINS pDevIns, PE1KSTATE pThis)
    21122121{
    21132122    Assert(e1kCsRxIsOwner(pThis));
     
    21542163                 pThis->szPrf, RDH, RDT, uRQueueLen, uMinRQThreshold));
    21552164        E1K_INC_ISTAT_CNT(pThis->uStatIntRXDMT0);
    2156         e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_RXDMT0);
     2165        e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_RXDMT0);
    21572166    }
    21582167    E1kLog2(("%s e1kAdvanceRDH: at exit RDH=%x RDT=%x len=%x\n",
     
    21962205 * pointer. The descriptor gets written back to the RXD ring.
    21972206 *
     2207 * @param   pDevIns     The device instance.
    21982208 * @param   pThis       The device state structure.
    21992209 * @param   pDesc       The descriptor being "returned" to the RX ring.
    22002210 * @thread  RX
    22012211 */
    2202 DECLINLINE(void) e1kRxDPut(PE1KSTATE pThis, E1KRXDESC* pDesc)
     2212DECLINLINE(void) e1kRxDPut(PPDMDEVINS pDevIns, PE1KSTATE pThis, E1KRXDESC* pDesc)
    22032213{
    22042214    Assert(e1kCsRxIsOwner(pThis));
     
    22172227     */
    22182228    e1kPrintRDesc(pThis, pDesc);
    2219     e1kAdvanceRDH(pThis);
     2229    e1kAdvanceRDH(pDevIns, pThis);
    22202230}
    22212231
     
    22532263 * @param   cb              The size of the fragment.
    22542264 */
    2255 static DECLCALLBACK(void) e1kStoreRxFragment(PE1KSTATE pThis, E1KRXDESC *pDesc, const void *pvBuf, size_t cb)
     2265static DECLCALLBACK(void) e1kStoreRxFragment(PPDMDEVINS pDevIns, PE1KSTATE pThis, E1KRXDESC *pDesc, const void *pvBuf, size_t cb)
    22562266{
    22572267    STAM_PROFILE_ADV_START(&pThis->StatReceiveStore, a);
     
    22642274    E1kLogRel(("E1000: Wrote back RX desc, RDH=%x\n", RDH));
    22652275    /* Advance head */
    2266     e1kAdvanceRDH(pThis);
     2276    e1kAdvanceRDH(pDevIns, pThis);
    22672277    //E1kLog2(("%s e1kStoreRxFragment: EOP=%d RDTR=%08X RADV=%08X\n", pThis->szPrf, pDesc->fEOP, RDTR, RADV));
    22682278    if (pDesc->status.fEOP)
     
    22732283        {
    22742284            /* Arm the timer to fire in RDTR usec (discard .024) */
    2275             e1kArmTimer(pThis, pThis->CTX_SUFF(pRIDTimer), RDTR);
     2285            e1kArmTimer(pDevIns, pThis, pThis->hRIDTimer, RDTR);
    22762286            /* If absolute timer delay is enabled and the timer is not running yet, arm it. */
    2277             if (RADV != 0 && !TMTimerIsActive(pThis->CTX_SUFF(pRADTimer)))
    2278                 e1kArmTimer(pThis, pThis->CTX_SUFF(pRADTimer), RADV);
     2287            if (RADV != 0 && !PDMDevHlpTimerIsActive(pDevIns, pThis->CTX_SUFF(pRADTimer)))
     2288                e1kArmTimer(pThis, pThis->hRADTimer, RADV);
    22792289        }
    22802290        else
     
    22832293            /* 0 delay means immediate interrupt */
    22842294            E1K_INC_ISTAT_CNT(pThis->uStatIntRx);
    2285             e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_RXT0);
     2295            e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_RXT0);
    22862296#ifdef E1K_USE_RX_TIMERS
    22872297        }
     
    23772387 *
    23782388 * @returns VBox status code.
     2389 * @param   pDevIns     The device instance.
    23792390 * @param   pThis          The device state structure.
    23802391 * @param   pvBuf           The available data.
     
    23822393 * @param   status          Bit fields containing status info.
    23832394 */
    2384 static int e1kHandleRxPacket(PE1KSTATE pThis, const void *pvBuf, size_t cb, E1KRXDST status)
     2395static int e1kHandleRxPacket(PPDMDEVINS pDevIns, PE1KSTATE pThis, const void *pvBuf, size_t cb, E1KRXDST status)
    23852396{
    23862397#if defined(IN_RING3) /** @todo Remove this extra copying, it's gonna make us run out of kernel / hypervisor stack! */
     
    25432554        /* Write back the descriptor. */
    25442555        pDesc->status.fDD = true;
    2545         e1kRxDPut(pThis, pDesc);
     2556        e1kRxDPut(pDevIns, pThis, pDesc);
    25462557# else /* !E1K_WITH_RXD_CACHE */
    25472558        else
     
    25522563                                  e1kDescAddr(RDBAH, RDBAL, RDH),
    25532564                                  pDesc, sizeof(E1KRXDESC));
    2554             e1kAdvanceRDH(pThis);
     2565            e1kAdvanceRDH(pDevIns, pThis);
    25552566        }
    25562567# endif /* !E1K_WITH_RXD_CACHE */
     
    25692580    {
    25702581        /* Arm the timer to fire in RDTR usec (discard .024) */
    2571         e1kArmTimer(pThis, pThis->CTX_SUFF(pRIDTimer), RDTR);
     2582        e1kArmTimer(pThis, pThis->hRIDTimer, RDTR);
    25722583        /* If absolute timer delay is enabled and the timer is not running yet, arm it. */
    2573         if (RADV != 0 && !TMTimerIsActive(pThis->CTX_SUFF(pRADTimer)))
    2574             e1kArmTimer(pThis, pThis->CTX_SUFF(pRADTimer), RADV);
     2584        if (RADV != 0 && !PDMDevHlpTimerIsActive(pDevIns, pThis->hRADTimer))
     2585            e1kArmTimer(pThis, pThis->hRADTimer, RADV);
    25752586    }
    25762587    else
     
    25792590        /* 0 delay means immediate interrupt */
    25802591        E1K_INC_ISTAT_CNT(pThis->uStatIntRx);
    2581         e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_RXT0);
     2592        e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_RXT0);
    25822593#  ifdef E1K_USE_RX_TIMERS
    25832594    }
     
    25872598    return VINF_SUCCESS;
    25882599#else  /* !IN_RING3 */
    2589     RT_NOREF_PV(pThis); RT_NOREF_PV(pvBuf); RT_NOREF_PV(cb); RT_NOREF_PV(status);
     2600    RT_NOREF(pDevIns, pThis, pvBuf, cb, status);
    25902601    return VERR_INTERNAL_ERROR_2;
    25912602#endif /* !IN_RING3 */
     
    25972608 * Bring the link up after the configured delay, 5 seconds by default.
    25982609 *
     2610 * @param   pDevIns     The device instance.
    25992611 * @param   pThis       The device state structure.
    26002612 * @thread  any
    26012613 */
    2602 DECLINLINE(void) e1kBringLinkUpDelayed(PE1KSTATE pThis)
     2614DECLINLINE(void) e1kBringLinkUpDelayed(PPDMDEVINS pDevIns, PE1KSTATE pThis)
    26032615{
    26042616    E1kLog(("%s Will bring up the link in %d seconds...\n",
    26052617            pThis->szPrf, pThis->cMsLinkUpDelay / 1000));
    2606     e1kArmTimer(pThis, pThis->CTX_SUFF(pLUTimer), pThis->cMsLinkUpDelay * 1000);
     2618    e1kArmTimer(pDevIns, pThis, pThis->hLUTimer, pThis->cMsLinkUpDelay * 1000);
    26072619}
    26082620
     
    26102622 * Bring up the link immediately.
    26112623 *
     2624 * @param   pDevIns     The device instance.
    26122625 * @param   pThis       The device state structure.
    26132626 */
    2614 DECLINLINE(void) e1kR3LinkUp(PE1KSTATE pThis)
     2627DECLINLINE(void) e1kR3LinkUp(PPDMDEVINS pDevIns, PE1KSTATE pThis)
    26152628{
    26162629    E1kLog(("%s Link is up\n", pThis->szPrf));
    26172630    STATUS |= STATUS_LU;
    26182631    Phy::setLinkStatus(&pThis->phy, true);
    2619     e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC);
     2632    e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_LSC);
    26202633    if (pThis->pDrvR3)
    26212634        pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, PDMNETWORKLINKSTATE_UP);
     
    26292642 * Bring down the link immediately.
    26302643 *
     2644 * @param   pDevIns     The device instance.
    26312645 * @param   pThis       The device state structure.
    26322646 */
    2633 DECLINLINE(void) e1kR3LinkDown(PE1KSTATE pThis)
     2647DECLINLINE(void) e1kR3LinkDown(PPDMDEVINS pDevIns, PE1KSTATE pThis)
    26342648{
    26352649    E1kLog(("%s Link is down\n", pThis->szPrf));
     
    26382652    Phy::setLinkStatus(&pThis->phy, false);
    26392653#endif /* E1K_LSC_ON_RESET */
    2640     e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC);
     2654    e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_LSC);
    26412655    if (pThis->pDrvR3)
    26422656        pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, PDMNETWORKLINKSTATE_DOWN);
     
    26462660 * Bring down the link temporarily.
    26472661 *
     2662 * @param   pDevIns     The device instance.
    26482663 * @param   pThis       The device state structure.
    26492664 */
    2650 DECLINLINE(void) e1kR3LinkDownTemp(PE1KSTATE pThis)
     2665DECLINLINE(void) e1kR3LinkDownTemp(PPDMDEVINS pDevIns, PE1KSTATE pThis)
    26512666{
    26522667    E1kLog(("%s Link is down temporarily\n", pThis->szPrf));
    26532668    STATUS &= ~STATUS_LU;
    26542669    Phy::setLinkStatus(&pThis->phy, false);
    2655     e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC);
     2670    e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_LSC);
    26562671    /*
    26572672     * Notifying the associated driver that the link went down (even temporarily)
     
    26632678    if (pThis->pDrvR3)
    26642679        pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, PDMNETWORKLINKSTATE_DOWN);
    2665     e1kBringLinkUpDelayed(pThis);
     2680    e1kBringLinkUpDelayed(pThis->pDevInsR3, pThis);
    26662681}
    26672682#endif /* IN_RING3 */
     
    27172732    /* Make sure we have cable connected and MAC can talk to PHY */
    27182733    if (pThis->fCableConnected && (CTRL & CTRL_SLU))
    2719         e1kArmTimer(pThis, pThis->CTX_SUFF(pLUTimer), E1K_INIT_LINKUP_DELAY_US);
     2734        e1kArmTimer(pThis->CTX_SUFF(pDevIns), pThis, pThis->hLUTimer, E1K_INIT_LINKUP_DELAY_US); /** @todo 9218 */
    27202735}
    27212736
     
    27322747 * @thread  EMT
    27332748 */
    2734 static int e1kRegWriteCTRL(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     2749static int e1kRegWriteCTRL(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    27352750{
    27362751    int rc = VINF_SUCCESS;
     
    27412756        return VINF_IOM_R3_MMIO_WRITE;
    27422757#else
    2743         e1kHardReset(pThis);
     2758        e1kHardReset(pDevIns, pThis);
    27442759#endif
    27452760    }
     
    27582773        {
    27592774            /* It should take about 2 seconds for the link to come up */
    2760             e1kArmTimer(pThis, pThis->CTX_SUFF(pLUTimer), E1K_INIT_LINKUP_DELAY_US);
     2775            e1kArmTimer(pDevIns, pThis, pThis->hLUTimer, E1K_INIT_LINKUP_DELAY_US);
    27612776        }
    27622777#else /* !E1K_LSC_ON_SLU */
     
    27642779            && !(CTRL & CTRL_SLU)
    27652780            && pThis->fCableConnected
    2766             && !TMTimerIsActive(pThis->CTX_SUFF(pLUTimer)))
     2781            && !PDMDevHlpTimerIsActive(pDevIns, pThis->hLUTimer))
    27672782        {
    27682783            /* PXE does not use LSC interrupts, see @bugref{9113}. */
     
    27942809            }
    27952810        }
    2796         rc = e1kRegWriteDefault(pThis, offset, index, value);
     2811        rc = e1kRegWriteDefault(pDevIns, pThis, offset, index, value);
    27972812    }
    27982813
     
    28122827 * @thread  EMT
    28132828 */
    2814 static int e1kRegWriteEECD(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    2815 {
    2816     RT_NOREF(offset, index);
     2829static int e1kRegWriteEECD(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     2830{
     2831    RT_NOREF(pDevIns, offset, index);
    28172832#ifdef IN_RING3
    28182833    /* So far we are concerned with lower byte only */
     
    28512866 * @thread  EMT
    28522867 */
    2853 static int e1kRegReadEECD(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
     2868static int e1kRegReadEECD(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
    28542869{
    28552870#ifdef IN_RING3
    28562871    uint32_t value;
    2857     int      rc = e1kRegReadDefault(pThis, offset, index, &value);
     2872    int      rc = e1kRegReadDefault(pDevIns, pThis, offset, index, &value);
    28582873    if (RT_SUCCESS(rc))
    28592874    {
     
    28712886    return rc;
    28722887#else /* !IN_RING3 */
    2873     RT_NOREF_PV(pThis); RT_NOREF_PV(offset); RT_NOREF_PV(index); RT_NOREF_PV(pu32Value);
     2888    RT_NOREF_PV(pDevIns); RT_NOREF_PV(pThis); RT_NOREF_PV(offset); RT_NOREF_PV(index); RT_NOREF_PV(pu32Value);
    28742889    return VINF_IOM_R3_MMIO_READ;
    28752890#endif /* !IN_RING3 */
     
    28892904 * @thread  EMT
    28902905 */
    2891 static int e1kRegWriteEERD(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     2906static int e1kRegWriteEERD(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    28922907{
    28932908#ifdef IN_RING3
    28942909    /* Make use of 'writable' and 'readable' masks. */
    2895     e1kRegWriteDefault(pThis, offset, index, value);
     2910    e1kRegWriteDefault(pDevIns, pThis, offset, index, value);
    28962911    /* DONE and DATA are set only if read was triggered by START. */
    28972912    if (value & EERD_START)
     
    29072922    return VINF_SUCCESS;
    29082923#else /* !IN_RING3 */
    2909     RT_NOREF_PV(pThis); RT_NOREF_PV(offset); RT_NOREF_PV(index); RT_NOREF_PV(value);
     2924    RT_NOREF_PV(pDevIns); RT_NOREF_PV(pThis); RT_NOREF_PV(offset); RT_NOREF_PV(index); RT_NOREF_PV(value);
    29102925    return VINF_IOM_R3_MMIO_WRITE;
    29112926#endif /* !IN_RING3 */
     
    29252940 * @thread  EMT
    29262941 */
    2927 static int e1kRegWriteMDIC(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     2942static int e1kRegWriteMDIC(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    29282943{
    29292944    if (value & MDIC_INT_EN)
     
    29512966    {
    29522967        /* Store the value */
    2953         e1kRegWriteDefault(pThis, offset, index, value);
     2968        e1kRegWriteDefault(pDevIns, pThis, offset, index, value);
    29542969        STAM_COUNTER_INC(&pThis->StatPHYAccesses);
    29552970        /* Forward op to PHY */
     
    29772992 * @thread  EMT
    29782993 */
    2979 static int e1kRegWriteICR(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     2994static int e1kRegWriteICR(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    29802995{
    29812996    ICR &= ~value;
    29822997
    2983     RT_NOREF_PV(pThis); RT_NOREF_PV(offset); RT_NOREF_PV(index);
     2998    RT_NOREF_PV(pDevIns); RT_NOREF_PV(pThis); RT_NOREF_PV(offset); RT_NOREF_PV(index);
    29842999    return VINF_SUCCESS;
    29853000}
     
    29983013 * @thread  EMT
    29993014 */
    3000 static int e1kRegReadICR(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
     3015static int e1kRegReadICR(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
    30013016{
    30023017    int rc = e1kCsEnter(pThis, VINF_IOM_R3_MMIO_READ);
     
    30053020
    30063021    uint32_t value = 0;
    3007     rc = e1kRegReadDefault(pThis, offset, index, &value);
     3022    rc = e1kRegReadDefault(pDevIns, pThis, offset, index, &value);
    30083023    if (RT_SUCCESS(rc))
    30093024    {
     
    30293044                pThis->fIntRaised = false;
    30303045                /* Lower(0) INTA(0) */
    3031                 PDMDevHlpPCISetIrq(pThis->CTX_SUFF(pDevIns), 0, 0);
    3032 
    3033                 pThis->u64AckedAt = TMTimerGet(pThis->CTX_SUFF(pIntTimer));
     3046                PDMDevHlpPCISetIrq(pDevIns, 0, 0);
     3047
     3048                pThis->u64AckedAt = PDMDevHlpTimerGet(pDevIns, pThis->hIntTimer);
    30343049                if (pThis->fIntMaskUsed)
    30353050                    pThis->fDelayInts = true;
     
    30633078 * @thread  EMT
    30643079 */
    3065 static int e1kRegWriteICS(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     3080static int e1kRegWriteICS(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    30663081{
    30673082    RT_NOREF_PV(offset); RT_NOREF_PV(index);
    30683083    E1K_INC_ISTAT_CNT(pThis->uStatIntICS);
    3069     return e1kRaiseInterrupt(pThis, VINF_IOM_R3_MMIO_WRITE, value & g_aE1kRegMap[ICS_IDX].writable);
     3084    return e1kRaiseInterrupt(pDevIns, pThis, VINF_IOM_R3_MMIO_WRITE, value & g_aE1kRegMap[ICS_IDX].writable);
    30703085}
    30713086
     
    30823097 * @thread  EMT
    30833098 */
    3084 static int e1kRegWriteIMS(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     3099static int e1kRegWriteIMS(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    30853100{
    30863101    RT_NOREF_PV(offset); RT_NOREF_PV(index);
     
    30963111    {
    30973112        E1K_INC_ISTAT_CNT(pThis->uStatIntIMS);
    3098         e1kPostponeInterrupt(pThis, E1K_IMS_INT_DELAY_NS);
     3113        e1kPostponeInterrupt(pDevIns, pThis, E1K_IMS_INT_DELAY_NS);
    30993114    }
    31003115
     
    31143129 * @thread  EMT
    31153130 */
    3116 static int e1kRegWriteIMC(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     3131static int e1kRegWriteIMC(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    31173132{
    31183133    RT_NOREF_PV(offset); RT_NOREF_PV(index);
     
    31323147        E1kLogRel(("E1000: irq lowered (IMC), icr=0x%x\n", ICR));
    31333148        /* Lower(0) INTA(0) */
    3134         PDMDevHlpPCISetIrq(pThis->CTX_SUFF(pDevIns), 0, 0);
     3149        PDMDevHlpPCISetIrq(pDevIns, 0, 0);
    31353150        pThis->fIntRaised = false;
    31363151        E1kLog(("%s e1kRegWriteIMC: Lowered IRQ: ICR=%08x\n", pThis->szPrf, ICR));
     
    31533168 * @thread  EMT
    31543169 */
    3155 static int e1kRegWriteRCTL(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     3170static int e1kRegWriteRCTL(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    31563171{
    31573172    /* Update promiscuous mode */
     
    31803195
    31813196    /* Update the register */
    3182     e1kRegWriteDefault(pThis, offset, index, value);
    3183 
    3184     return VINF_SUCCESS;
     3197    return e1kRegWriteDefault(pDevIns, pThis, offset, index, value);
    31853198}
    31863199
     
    31973210 * @thread  EMT
    31983211 */
    3199 static int e1kRegWritePBA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    3200 {
    3201     e1kRegWriteDefault(pThis, offset, index, value);
     3212static int e1kRegWritePBA(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     3213{
     3214    e1kRegWriteDefault(pDevIns, pThis, offset, index, value);
    32023215    PBA_st->txa = 64 - PBA_st->rxa;
    32033216
     
    32203233 * @thread  EMT
    32213234 */
    3222 static int e1kRegWriteRDT(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     3235static int e1kRegWriteRDT(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    32233236{
    32243237#ifndef IN_RING3
     
    32463259        }
    32473260#endif /* !E1K_WITH_RXD_CACHE */
    3248         rc = e1kRegWriteDefault(pThis, offset, index, value);
     3261        rc = e1kRegWriteDefault(pDevIns, pThis, offset, index, value);
    32493262#ifdef E1K_WITH_RXD_CACHE
    32503263        /*
     
    33013314 * @thread  EMT
    33023315 */
    3303 static int e1kRegWriteRDTR(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    3304 {
    3305     e1kRegWriteDefault(pThis, offset, index, value);
     3316static int e1kRegWriteRDTR(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     3317{
     3318    e1kRegWriteDefault(pDevIns, pThis, offset, index, value);
    33063319    if (value & RDTR_FPD)
    33073320    {
    33083321        /* Flush requested, cancel both timers and raise interrupt */
    33093322#ifdef E1K_USE_RX_TIMERS
    3310         e1kCancelTimer(pThis, pThis->CTX_SUFF(pRIDTimer));
    3311         e1kCancelTimer(pThis, pThis->CTX_SUFF(pRADTimer));
     3323        e1kCancelTimer(pDevIns, pThis, pThis->hRIDTimer);
     3324        e1kCancelTimer(pDevIns, pThis, pThis->hRADTimer);
    33123325#endif
    33133326        E1K_INC_ISTAT_CNT(pThis->uStatIntRDTR);
    3314         return e1kRaiseInterrupt(pThis, VINF_IOM_R3_MMIO_WRITE, ICR_RXT0);
     3327        return e1kRaiseInterrupt(pDevIns, pThis, VINF_IOM_R3_MMIO_WRITE, ICR_RXT0);
    33153328    }
    33163329
     
    33783391    /* Cancel absolute delay timer as we have already got attention */
    33793392#  ifndef E1K_NO_TAD
    3380     e1kCancelTimer(pThis, pThis->CTX_SUFF(pTADTimer));
     3393    e1kCancelTimer(pDevIns, pThis, pThis->hTADTimer);
    33813394#  endif
    3382     e1kRaiseInterrupt(pThis, ICR_TXDW);
     3395    e1kRaiseInterrupt(pDevIns, pThis, ICR_TXDW);
    33833396}
    33843397
     
    34013414    E1K_INC_ISTAT_CNT(pThis->uStatTAD);
    34023415    /* Cancel interrupt delay timer as we have already got attention */
    3403     e1kCancelTimer(pThis, pThis->CTX_SUFF(pTIDTimer));
    3404     e1kRaiseInterrupt(pThis, ICR_TXDW);
     3416    e1kCancelTimer(pDevIns, pThis, pThis->hTIDTimer);
     3417    e1kRaiseInterrupt(pDevIns, pThis, ICR_TXDW);
    34053418}
    34063419
     
    34243437    E1K_INC_ISTAT_CNT(pThis->uStatRID);
    34253438    /* Cancel absolute delay timer as we have already got attention */
    3426     e1kCancelTimer(pThis, pThis->CTX_SUFF(pRADTimer));
    3427     e1kRaiseInterrupt(pThis, ICR_RXT0);
     3439    e1kCancelTimer(pDevIns, pThis, pThis->hRADTimer);
     3440    e1kRaiseInterrupt(pDevIns, pThis, ICR_RXT0);
    34283441}
    34293442
     
    34443457    E1K_INC_ISTAT_CNT(pThis->uStatRAD);
    34453458    /* Cancel interrupt delay timer as we have already got attention */
    3446     e1kCancelTimer(pThis, pThis->CTX_SUFF(pRIDTimer));
    3447     e1kRaiseInterrupt(pThis, ICR_RXT0);
     3459    e1kCancelTimer(pDevIns, pThis, pThis->hRIDTimer);
     3460    e1kRaiseInterrupt(pDevIns, pThis, ICR_RXT0);
    34483461}
    34493462
     
    34703483        pThis->iStatIntLost--;
    34713484# endif
    3472     e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, 0);
     3485    e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, 0);
    34733486    STAM_PROFILE_ADV_STOP(&pThis->StatLateIntTimer, a);
    34743487}
     
    34973510        /* 82543GC does not have an internal PHY */
    34983511        if (pThis->eChip == E1K_CHIP_82543GC || (CTRL & CTRL_SLU))
    3499             e1kR3LinkUp(pThis);
     3512            e1kR3LinkUp(pDevIns, pThis);
    35003513    }
    35013514#ifdef E1K_LSC_ON_RESET
    35023515    else if (pThis->eChip == E1K_CHIP_82543GC)
    3503         e1kR3LinkDown(pThis);
     3516        e1kR3LinkDown(pDevIns, pThis);
    35043517#endif /* E1K_LSC_ON_RESET */
    35053518}
     
    39493962 *          a real ethernet wire.
    39503963 *
    3951  * @param   pThis              The device state structure.
    3952  * @param   fOnWorkerThread     Whether we're on a worker thread or an EMT.
     3964 * @param   pDevIns         The device instance.
     3965 * @param   pThis           The device state structure.
     3966 * @param   fOnWorkerThread Whether we're on a worker thread or an EMT.
    39533967 * @thread  E1000_TX
    39543968 */
    3955 static void e1kTransmitFrame(PE1KSTATE pThis, bool fOnWorkerThread)
     3969static void e1kTransmitFrame(PPDMDEVINS pDevIns, PE1KSTATE pThis, bool fOnWorkerThread)
    39563970{
    39573971    PPDMSCATTERGATHER   pSg     = pThis->CTX_SUFF(pTxSg);
     
    40584072            RT_ZERO(status);
    40594073            status.fPIF = true;
    4060             e1kHandleRxPacket(pThis, pSg->aSegs[0].pvSeg, cbFrame, status);
     4074            e1kHandleRxPacket(pDevIns, pThis, pSg->aSegs[0].pvSeg, cbFrame, status);
    40614075            rc = VINF_SUCCESS;
    40624076        }
     
    41274141 *          legacy.u64BufAddr.
    41284142 *
    4129  * @param   pThis          The device state structure.
     4143 * @param   pDevIns         The device instance.
     4144 * @param   pThis           The device state structure.
    41304145 * @param   pDesc           Pointer to the descriptor to transmit.
    41314146 * @param   u16Len          Length of buffer to the end of segment.
     
    41354150 */
    41364151#ifndef E1K_WITH_TXD_CACHE
    4137 static void e1kFallbackAddSegment(PE1KSTATE pThis, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend, bool fOnWorkerThread)
     4152static void e1kFallbackAddSegment(PPDMDEVINS pDevIns, PE1KSTATE pThis, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend, bool fOnWorkerThread)
    41384153{
    41394154    /* TCP header being transmitted */
     
    42314246            pThis->CTX_SUFF(pTxSg)->aSegs[0].cbSeg = pThis->u16TxPktLen;
    42324247        }
    4233         e1kTransmitFrame(pThis, fOnWorkerThread);
     4248        e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread);
    42344249
    42354250        /* Update Sequence Number */
     
    42414256}
    42424257#else /* E1K_WITH_TXD_CACHE */
    4243 static int e1kFallbackAddSegment(PE1KSTATE pThis, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend, bool fOnWorkerThread)
     4258static int e1kFallbackAddSegment(PPDMDEVINS pDevIns, PE1KSTATE pThis, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend, bool fOnWorkerThread)
    42444259{
    42454260    int rc = VINF_SUCCESS;
     
    43494364            pThis->CTX_SUFF(pTxSg)->aSegs[0].cbSeg = cbCopy;
    43504365        }
    4351         e1kTransmitFrame(pThis, fOnWorkerThread);
     4366        e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread);
    43524367
    43534368        /* Update Sequence Number */
     
    44104425            /* This descriptor fits completely into current segment */
    44114426            cb = cbFragment;
    4412             e1kFallbackAddSegment(pThis, pDesc->data.u64BufAddr, cb, pDesc->data.cmd.fEOP /*fSend*/, fOnWorkerThread);
     4427            e1kFallbackAddSegment(pDevIns, pThis, pDesc->data.u64BufAddr, cb, pDesc->data.cmd.fEOP /*fSend*/, fOnWorkerThread);
    44134428        }
    44144429        else
    44154430        {
    4416             e1kFallbackAddSegment(pThis, pDesc->data.u64BufAddr, cb, true /*fSend*/, fOnWorkerThread);
     4431            e1kFallbackAddSegment(pDevIns, pThis, pDesc->data.u64BufAddr, cb, true /*fSend*/, fOnWorkerThread);
    44174432            /*
    44184433             * Rewind the packet tail pointer to the beginning of payload,
     
    44474462 * @returns error code
    44484463 *
    4449  * @param   pThis          The device state structure.
     4464 * @param   pDevIns         The device instance.
     4465 * @param   pThis           The device state structure.
    44504466 * @param   pDesc           Pointer to the descriptor to transmit.
    44514467 * @param   cbFragment      Length of descriptor's buffer.
     
    44534469 * @thread  E1000_TX
    44544470 */
    4455 static int e1kFallbackAddToFrame(PE1KSTATE pThis, E1KTXDESC *pDesc, bool fOnWorkerThread)
     4471static int e1kFallbackAddToFrame(PPDMDEVINS pDevIns, PE1KSTATE pThis, E1KTXDESC *pDesc, bool fOnWorkerThread)
    44564472{
    44574473#ifdef VBOX_STRICT
     
    44794495            /* This descriptor fits completely into current segment */
    44804496            cb = pDesc->data.cmd.u20DTALEN;
    4481             rc = e1kFallbackAddSegment(pThis, pDesc->data.u64BufAddr, cb, pDesc->data.cmd.fEOP /*fSend*/, fOnWorkerThread);
     4497            rc = e1kFallbackAddSegment(pDevIns, pThis, pDesc->data.u64BufAddr, cb, pDesc->data.cmd.fEOP /*fSend*/, fOnWorkerThread);
    44824498        }
    44834499        else
    44844500        {
    4485             rc = e1kFallbackAddSegment(pThis, pDesc->data.u64BufAddr, cb, true /*fSend*/, fOnWorkerThread);
     4501            rc = e1kFallbackAddSegment(pDevIns, pThis, pDesc->data.u64BufAddr, cb, true /*fSend*/, fOnWorkerThread);
    44864502            /*
    44874503             * Rewind the packet tail pointer to the beginning of payload,
     
    45684584 * @thread  E1000_TX
    45694585 */
    4570 static void e1kDescReport(PE1KSTATE pThis, E1KTXDESC *pDesc, RTGCPHYS addr)
     4586static void e1kDescReport(PPDMDEVINS pDevIns, PE1KSTATE pThis, E1KTXDESC *pDesc, RTGCPHYS addr)
    45714587{
    45724588    /*
     
    46064622                //else {
    46074623                /* Arm the timer to fire in TIVD usec (discard .024) */
    4608                 e1kArmTimer(pThis, pThis->CTX_SUFF(pTIDTimer), TIDV);
     4624                e1kArmTimer(pDevIns, pThis, pThis->hTIDTimer, TIDV);
    46094625# ifndef E1K_NO_TAD
    46104626                /* If absolute timer delay is enabled and the timer is not running yet, arm it. */
    46114627                E1kLog2(("%s Checking if TAD timer is running\n",
    46124628                         pThis->szPrf));
    4613                 if (TADV != 0 && !TMTimerIsActive(pThis->CTX_SUFF(pTADTimer)))
    4614                     e1kArmTimer(pThis, pThis->CTX_SUFF(pTADTimer), TADV);
     4629                if (TADV != 0 && !PDMDevHlpTimerIsActive(pDevIns, pThis->hTADTimer))
     4630                    e1kArmTimer(pDevIns, pThis, pThis->hTADTimer, TADV);
    46154631# endif /* E1K_NO_TAD */
    46164632            }
     
    46234639                    /* Cancel both timers if armed and fire immediately. */
    46244640# ifndef E1K_NO_TAD
    4625                     TMTimerStop(pThis->CTX_SUFF(pTADTimer));
     4641                    PDMDevHlpTimerStop(pDevIns, pThis->hTADTimer);
    46264642# endif
    4627                     TMTimerStop(pThis->CTX_SUFF(pTIDTimer));
     4643                    PDMDevHlpTimerStop(pDevIns, pThis->hTIDTimer);
    46284644                }
    46294645//#endif /* E1K_USE_TX_TIMERS */
    46304646                E1K_INC_ISTAT_CNT(pThis->uStatIntTx);
    4631                 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_TXDW);
     4647                e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_TXDW);
    46324648//#ifdef E1K_USE_TX_TIMERS
    46334649            }
     
    46514667 * - context  sets up the context for following data descriptors.
    46524668 *
    4653  * @param   pThis          The device state structure.
     4669 * @param   pDevIns         The device instance.
     4670 * @param   pThis           The device state structure.
    46544671 * @param   pDesc           Pointer to descriptor union.
    46554672 * @param   addr            Physical address of descriptor in guest memory.
     
    46574674 * @thread  E1000_TX
    46584675 */
    4659 static int e1kXmitDesc(PE1KSTATE pThis, E1KTXDESC *pDesc, RTGCPHYS addr, bool fOnWorkerThread)
     4676static int e1kXmitDesc(PPDMDEVINS pDevIns, PE1KSTATE pThis, E1KTXDESC *pDesc, RTGCPHYS addr, bool fOnWorkerThread)
    46604677{
    46614678    int rc = VINF_SUCCESS;
     
    46664683//#ifdef E1K_USE_TX_TIMERS
    46674684    if (pThis->fTidEnabled)
    4668         e1kCancelTimer(pThis, pThis->CTX_SUFF(pTIDTimer));
     4685        e1kCancelTimer(pDevIns, pThis, pThis->hTIDTimer);
    46694686//#endif /* E1K_USE_TX_TIMERS */
    46704687
     
    47844801                        && pThis->CTX_SUFF(pTxSg)->cbUsed == (size_t)pThis->contextTSE.dw3.u8HDRLEN + pThis->contextTSE.dw2.u20PAYLEN)
    47854802                    {
    4786                         e1kTransmitFrame(pThis, fOnWorkerThread);
     4803                        e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread);
    47874804                        E1K_INC_CNT32(TSCTC);
    47884805                    }
     
    48184835                                              pThis->contextNormal.tu.u8CSS,
    48194836                                              pThis->contextNormal.tu.u16CSE);
    4820                         e1kTransmitFrame(pThis, fOnWorkerThread);
     4837                        e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread);
    48214838                    }
    48224839                    else
     
    48284845            {
    48294846                STAM_COUNTER_INC(&pThis->StatTxPathFallback);
    4830                 e1kFallbackAddToFrame(pThis, pDesc, pDesc->data.cmd.u20DTALEN, fOnWorkerThread);
     4847                e1kFallbackAddToFrame(pDevIns, pThis, pDesc, pDesc->data.cmd.u20DTALEN, fOnWorkerThread);
    48314848            }
    48324849
     
    48774894                    pThis->u16VTagTCI  = pDesc->legacy.dw3.u16Special;
    48784895                    /** @todo Offload processing goes here. */
    4879                     e1kTransmitFrame(pThis, fOnWorkerThread);
     4896                    e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread);
    48804897                    pThis->u16TxPktLen = 0;
    48814898                }
     
    49114928 * - context  sets up the context for following data descriptors.
    49124929 *
    4913  * @param   pThis          The device state structure.
     4930 * @param   pDevIns         The device instance.
     4931 * @param   pThis           The device state structure.
    49144932 * @param   pDesc           Pointer to descriptor union.
    49154933 * @param   addr            Physical address of descriptor in guest memory.
     
    49184936 * @thread  E1000_TX
    49194937 */
    4920 static int e1kXmitDesc(PE1KSTATE pThis, E1KTXDESC *pDesc, RTGCPHYS addr,
    4921                        bool fOnWorkerThread)
     4938static int e1kXmitDesc(PPDMDEVINS pDevIns, PE1KSTATE pThis, E1KTXDESC *pDesc, RTGCPHYS addr, bool fOnWorkerThread)
    49224939{
    49234940    int rc = VINF_SUCCESS;
     
    49284945    {
    49294946        E1kLog(("%s e1kXmitDesc: skipping bad descriptor ^^^\n", pThis->szPrf));
    4930         e1kDescReport(pThis, pDesc, addr);
     4947        e1kDescReport(pDevIns, pThis, pDesc, addr);
    49314948        return VINF_SUCCESS;
    49324949    }
     
    49344951//#ifdef E1K_USE_TX_TIMERS
    49354952    if (pThis->fTidEnabled)
    4936         TMTimerStop(pThis->CTX_SUFF(pTIDTimer));
     4953        PDMDevHlpTimerStop(pDevIns, pThis->hTIDTimer);
    49374954//#endif /* E1K_USE_TX_TIMERS */
    49384955
     
    49424959            /* The caller have already updated the context */
    49434960            E1K_INC_ISTAT_CNT(pThis->uStatDescCtx);
    4944             e1kDescReport(pThis, pDesc, addr);
     4961            e1kDescReport(pDevIns, pThis, pDesc, addr);
    49454962            break;
    49464963
     
    49574974                if (pDesc->data.cmd.fEOP)
    49584975                {
    4959                     e1kTransmitFrame(pThis, fOnWorkerThread);
     4976                    e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread);
    49604977                    pThis->u16TxPktLen = 0;
    49614978                }
     
    49774994                            && pThis->CTX_SUFF(pTxSg)->cbUsed == (size_t)pThis->contextTSE.dw3.u8HDRLEN + pThis->contextTSE.dw2.u20PAYLEN)
    49784995                        {
    4979                             e1kTransmitFrame(pThis, fOnWorkerThread);
     4996                            e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread);
    49804997                            E1K_INC_CNT32(TSCTC);
    49814998                        }
     
    50115028                                                  pThis->contextNormal.tu.u8CSS,
    50125029                                                  pThis->contextNormal.tu.u16CSE);
    5013                             e1kTransmitFrame(pThis, fOnWorkerThread);
     5030                            e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread);
    50145031                        }
    50155032                        else
     
    50215038                {
    50225039                    STAM_COUNTER_INC(&pThis->StatTxPathFallback);
    5023                     rc = e1kFallbackAddToFrame(pThis, pDesc, fOnWorkerThread);
     5040                    rc = e1kFallbackAddToFrame(pDevIns, pThis, pDesc, fOnWorkerThread);
    50245041                }
    50255042            }
    5026             e1kDescReport(pThis, pDesc, addr);
     5043            e1kDescReport(pDevIns, pThis, pDesc, addr);
    50275044            STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatTransmit), a);
    50285045            break;
     
    50555072                                              0);
    50565073                        }
    5057                         e1kTransmitFrame(pThis, fOnWorkerThread);
     5074                        e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread);
    50585075                        pThis->u16TxPktLen = 0;
    50595076                    }
     
    50665083                }
    50675084            }
    5068             e1kDescReport(pThis, pDesc, addr);
     5085            e1kDescReport(pDevIns, pThis, pDesc, addr);
    50695086            STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatTransmit), a);
    50705087            break;
     
    52305247}
    52315248
    5232 static int e1kXmitPacket(PE1KSTATE pThis, bool fOnWorkerThread)
     5249static int e1kXmitPacket(PPDMDEVINS pDevIns, PE1KSTATE pThis, bool fOnWorkerThread)
    52335250{
    52345251    int rc = VINF_SUCCESS;
     
    52425259        E1kLog3(("%s About to process new TX descriptor at %08x%08x, TDLEN=%08x, TDH=%08x, TDT=%08x\n",
    52435260                 pThis->szPrf, TDBAH, TDBAL + TDH * sizeof(E1KTXDESC), TDLEN, TDH, TDT));
    5244         rc = e1kXmitDesc(pThis, pDesc, e1kDescAddr(TDBAH, TDBAL, TDH), fOnWorkerThread);
     5261        rc = e1kXmitDesc(pDevIns, pThis, pDesc, e1kDescAddr(TDBAH, TDBAL, TDH), fOnWorkerThread);
    52455262        if (RT_FAILURE(rc))
    52465263            break;
     
    52525269            E1kLog2(("%s Low on transmit descriptors, raise ICR.TXD_LOW, len=%x thresh=%x\n",
    52535270                     pThis->szPrf, e1kGetTxLen(pThis), GET_BITS(TXDCTL, LWTHRESH)*8));
    5254             e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_TXD_LOW);
     5271            e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_TXD_LOW);
    52555272        }
    52565273        ++pThis->iTxDCurrent;
     
    53205337                E1kLog2(("%s Low on transmit descriptors, raise ICR.TXD_LOW, len=%x thresh=%x\n",
    53215338                         pThis->szPrf, e1kGetTxLen(pThis), GET_BITS(TXDCTL, LWTHRESH)*8));
    5322                 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_TXD_LOW);
     5339                e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_TXD_LOW);
    53235340            }
    53245341
     
    53275344
    53285345        /// @todo uncomment: pThis->uStatIntTXQE++;
    5329         /// @todo uncomment: e1kRaiseInterrupt(pThis, ICR_TXQE);
     5346        /// @todo uncomment: e1kRaiseInterrupt(pDevIns, pThis, ICR_TXQE);
    53305347        /*
    53315348         * Release the lock.
     
    53745391 * @returns VBox status code.  VERR_TRY_AGAIN is returned if we're busy.
    53755392 *
    5376  * @param   pThis              The E1000 state.
     5393 * @param   pDevIns             The device instance.
     5394 * @param   pThis               The E1000 state.
    53775395 * @param   fOnWorkerThread     Whether we're on a worker thread or on an EMT.
    53785396 */
    5379 static int e1kXmitPending(PE1KSTATE pThis, bool fOnWorkerThread)
     5397static int e1kXmitPending(PPDMDEVINS pDevIns, PE1KSTATE pThis, bool fOnWorkerThread)
    53805398{
    53815399    int rc = VINF_SUCCESS;
     
    54215439                    goto out;
    54225440                /* Copy the packet to allocated buffer and send it. */
    5423                 rc = e1kXmitPacket(pThis, fOnWorkerThread);
     5441                rc = e1kXmitPacket(pDevIns, pThis, fOnWorkerThread);
    54245442                /* If we're out of bandwidth we'll come back later. */
    54255443                if (RT_FAILURE(rc))
     
    54855503            E1kLog2(("%s Out of transmit descriptors, raise ICR.TXD_LOW\n",
    54865504                     pThis->szPrf));
    5487             e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_TXD_LOW);
     5505            e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_TXD_LOW);
    54885506        }
    54895507out:
     
    54915509
    54925510        /// @todo uncomment: pThis->uStatIntTXQE++;
    5493         /// @todo uncomment: e1kRaiseInterrupt(pThis, ICR_TXQE);
     5511        /// @todo uncomment: e1kRaiseInterrupt(pDevIns, pThis, ICR_TXQE);
    54945512
    54955513        e1kCsTxLeave(pThis);
     
    55165534    /* Resume suspended transmission */
    55175535    STATUS &= ~STATUS_TXOFF;
    5518     e1kXmitPending(pThis, true /*fOnWorkerThread*/);
     5536    e1kXmitPending(pThis->pDevInsR3, pThis, true /*fOnWorkerThread*/);
    55195537}
    55205538
     
    55345552    E1kLog2(("%s e1kTxQueueConsumer:\n", pThis->szPrf));
    55355553
    5536     int rc = e1kXmitPending(pThis, false /*fOnWorkerThread*/); NOREF(rc);
     5554    int rc = e1kXmitPending(pDevIns, pThis, false /*fOnWorkerThread*/); NOREF(rc);
    55375555    AssertMsg(RT_SUCCESS(rc) || rc == VERR_TRY_AGAIN || rc == VERR_NET_DOWN, ("%Rrc\n", rc));
    55385556    return true;
     
    55615579 * @thread  EMT
    55625580 */
    5563 static int e1kRegWriteTDT(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    5564 {
    5565     int rc = e1kRegWriteDefault(pThis, offset, index, value);
     5581static int e1kRegWriteTDT(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     5582{
     5583    int rc = e1kRegWriteDefault(pDevIns, pThis, offset, index, value);
    55665584
    55675585    /* All descriptors starting with head and not including tail belong to us. */
     
    55835601        if (RT_LIKELY(rc == VINF_SUCCESS))
    55845602        {
    5585             if (!TMTimerIsActive(pThis->CTX_SUFF(pTXDTimer)))
     5603            if (!PDMDevInsTimerIsActive(pDevIns, pThis->hTXDTimer))
    55865604            {
    55875605#ifdef E1K_INT_STATS
    55885606                pThis->u64ArmedAt = RTTimeNanoTS();
    55895607#endif
    5590                 e1kArmTimer(pThis, pThis->CTX_SUFF(pTXDTimer), E1K_TX_DELAY);
     5608                e1kArmTimer(pDevIns, pThis, pThis->hTXDTimer, E1K_TX_DELAY);
    55915609            }
    55925610            E1K_INC_ISTAT_CNT(pThis->uStatTxDelayed);
     
    56065624#endif
    56075625        {
    5608             rc = e1kXmitPending(pThis, false /*fOnWorkerThread*/);
     5626            rc = e1kXmitPending(pDevIns, pThis, false /*fOnWorkerThread*/);
    56095627            if (rc == VERR_TRY_AGAIN)
    56105628                rc = VINF_SUCCESS;
     
    56275645 * @thread  EMT
    56285646 */
    5629 static int e1kRegWriteMTA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    5630 {
     5647static int e1kRegWriteMTA(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     5648{
     5649    RT_NOREF_PV(pDevIns);
    56315650    AssertReturn(offset - g_aE1kRegMap[index].offset < sizeof(pThis->auMTA), VERR_DEV_IO_ERROR);
    5632     pThis->auMTA[(offset - g_aE1kRegMap[index].offset)/sizeof(pThis->auMTA[0])] = value;
     5651    pThis->auMTA[(offset - g_aE1kRegMap[index].offset) / sizeof(pThis->auMTA[0])] = value;
    56335652
    56345653    return VINF_SUCCESS;
     
    56455664 * @thread  EMT
    56465665 */
    5647 static int e1kRegReadMTA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
    5648 {
    5649     AssertReturn(offset - g_aE1kRegMap[index].offset< sizeof(pThis->auMTA), VERR_DEV_IO_ERROR);
     5666static int e1kRegReadMTA(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
     5667{
     5668    RT_NOREF_PV(pDevIns);
     5669    AssertReturn(offset - g_aE1kRegMap[index].offset < sizeof(pThis->auMTA), VERR_DEV_IO_ERROR);
    56505670    *pu32Value = pThis->auMTA[(offset - g_aE1kRegMap[index].offset)/sizeof(pThis->auMTA[0])];
    56515671
     
    56625682 * @thread  EMT
    56635683 */
    5664 static int e1kRegWriteRA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    5665 {
     5684static int e1kRegWriteRA(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     5685{
     5686    RT_NOREF_PV(pDevIns);
    56665687    AssertReturn(offset - g_aE1kRegMap[index].offset < sizeof(pThis->aRecAddr.au32), VERR_DEV_IO_ERROR);
    56675688    pThis->aRecAddr.au32[(offset - g_aE1kRegMap[index].offset)/sizeof(pThis->aRecAddr.au32[0])] = value;
     
    56805701 * @thread  EMT
    56815702 */
    5682 static int e1kRegReadRA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
    5683 {
     5703static int e1kRegReadRA(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
     5704{
     5705    RT_NOREF_PV(pDevIns);
    56845706    AssertReturn(offset - g_aE1kRegMap[index].offset< sizeof(pThis->aRecAddr.au32), VERR_DEV_IO_ERROR);
    56855707    *pu32Value = pThis->aRecAddr.au32[(offset - g_aE1kRegMap[index].offset)/sizeof(pThis->aRecAddr.au32[0])];
     
    56975719 * @thread  EMT
    56985720 */
    5699 static int e1kRegWriteVFTA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    5700 {
     5721static int e1kRegWriteVFTA(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     5722{
     5723    RT_NOREF_PV(pDevIns);
    57015724    AssertReturn(offset - g_aE1kRegMap[index].offset < sizeof(pThis->auVFTA), VINF_SUCCESS);
    57025725    pThis->auVFTA[(offset - g_aE1kRegMap[index].offset)/sizeof(pThis->auVFTA[0])] = value;
     
    57155738 * @thread  EMT
    57165739 */
    5717 static int e1kRegReadVFTA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
    5718 {
     5740static int e1kRegReadVFTA(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
     5741{
     5742    RT_NOREF_PV(pDevIns);
    57195743    AssertReturn(offset - g_aE1kRegMap[index].offset< sizeof(pThis->auVFTA), VERR_DEV_IO_ERROR);
    57205744    *pu32Value = pThis->auVFTA[(offset - g_aE1kRegMap[index].offset)/sizeof(pThis->auVFTA[0])];
     
    57355759 * @thread  EMT
    57365760 */
    5737 static int e1kRegReadUnimplemented(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
    5738 {
    5739     RT_NOREF3(pThis, offset, index);
     5761static int e1kRegReadUnimplemented(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
     5762{
     5763    RT_NOREF(pDevIns, pThis, offset, index);
    57405764    E1kLog(("%s At %08X read (00000000) attempt from unimplemented register %s (%s)\n",
    57415765            pThis->szPrf, offset, g_aE1kRegMap[index].abbrev, g_aE1kRegMap[index].name));
     
    57615785 * @thread  EMT
    57625786 */
    5763 static int e1kRegReadAutoClear(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
     5787static int e1kRegReadAutoClear(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
    57645788{
    57655789    AssertReturn(index < E1K_NUM_OF_32BIT_REGS, VERR_DEV_IO_ERROR);
    5766     int rc = e1kRegReadDefault(pThis, offset, index, pu32Value);
     5790    int rc = e1kRegReadDefault(pDevIns, pThis, offset, index, pu32Value);
    57675791    pThis->auRegs[index] = 0;
    57685792
     
    57865810 * @thread  EMT
    57875811 */
    5788 static int e1kRegReadDefault(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
    5789 {
    5790     RT_NOREF_PV(offset);
     5812static int e1kRegReadDefault(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)
     5813{
     5814    RT_NOREF_PV(pDevIns); RT_NOREF_PV(offset);
    57915815
    57925816    AssertReturn(index < E1K_NUM_OF_32BIT_REGS, VERR_DEV_IO_ERROR);
     
    58085832 */
    58095833
    5810  static int e1kRegWriteUnimplemented(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    5811 {
    5812     RT_NOREF_PV(pThis); RT_NOREF_PV(offset); RT_NOREF_PV(index); RT_NOREF_PV(value);
     5834 static int e1kRegWriteUnimplemented(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     5835{
     5836    RT_NOREF_PV(pDevIns); RT_NOREF_PV(pThis); RT_NOREF_PV(offset); RT_NOREF_PV(index); RT_NOREF_PV(value);
    58135837
    58145838    E1kLog(("%s At %08X write attempt (%08X) to  unimplemented register %s (%s)\n",
     
    58345858 */
    58355859
    5836 static int e1kRegWriteDefault(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
    5837 {
    5838     RT_NOREF_PV(offset);
     5860static int e1kRegWriteDefault(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)
     5861{
     5862    RT_NOREF(pDevIns, offset);
    58395863
    58405864    AssertReturn(index < E1K_NUM_OF_32BIT_REGS, VERR_DEV_IO_ERROR);
     
    59125936 * @returns VBox status code.
    59135937 *
     5938 * @param   pDevIns     The device instance.
    59145939 * @param   pThis       The device state structure.
    59155940 * @param   offReg      Register offset in memory-mapped frame.
     
    59205945 *          accesses we have to take care of that ourselves.
    59215946 */
    5922 static int e1kRegReadUnaligned(PE1KSTATE pThis, uint32_t offReg, void *pv, uint32_t cb)
     5947static int e1kRegReadUnaligned(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offReg, void *pv, uint32_t cb)
    59235948{
    59245949    uint32_t    u32    = 0;
     
    59715996            //pThis->iStatIntLost += pThis->iStatIntLostOne;
    59725997            //pThis->iStatIntLostOne = 0;
    5973             rc = g_aE1kRegMap[index].pfnRead(pThis, offReg & 0xFFFFFFFC, index, &u32);
     5998            rc = g_aE1kRegMap[index].pfnRead(pDevIns, pThis, offReg & 0xFFFFFFFC, index, &u32);
    59745999            u32 &= mask;
    59756000            //e1kCsLeave(pThis);
     
    60026027 * @returns VBox status code.
    60036028 *
     6029 * @param   pDevIns     The device instance.
    60046030 * @param   pThis       The device state structure.
    60056031 * @param   offReg      Register offset in memory-mapped frame.
     
    60076033 * @thread  EMT
    60086034 */
    6009 static VBOXSTRICTRC e1kRegReadAlignedU32(PE1KSTATE pThis, uint32_t offReg, uint32_t *pu32)
     6035static VBOXSTRICTRC e1kRegReadAlignedU32(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offReg, uint32_t *pu32)
    60106036{
    60116037    Assert(!(offReg & 3));
     
    60316057            //pThis->iStatIntLost += pThis->iStatIntLostOne;
    60326058            //pThis->iStatIntLostOne = 0;
    6033             rc = g_aE1kRegMap[idxReg].pfnRead(pThis, offReg & 0xFFFFFFFC, idxReg, pu32);
     6059            rc = g_aE1kRegMap[idxReg].pfnRead(pDevIns, pThis, offReg & 0xFFFFFFFC, idxReg, pu32);
    60346060            //e1kCsLeave(pThis);
    60356061            Log6(("%s At %08X read  %08X          from %s (%s)\n",
     
    60546080 * @returns VBox status code.
    60556081 *
     6082 * @param   pDevIns     The device instance.
    60566083 * @param   pThis       The device state structure.
    60576084 * @param   offReg      Register offset in memory-mapped frame.
     
    60596086 * @thread  EMT
    60606087 */
    6061 static VBOXSTRICTRC e1kRegWriteAlignedU32(PE1KSTATE pThis, uint32_t offReg, uint32_t u32Value)
     6088static VBOXSTRICTRC e1kRegWriteAlignedU32(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offReg, uint32_t u32Value)
    60626089{
    60636090    VBOXSTRICTRC rc    = VINF_SUCCESS;
     
    60806107            //pThis->iStatIntLost += pThis->iStatIntLostOne;
    60816108            //pThis->iStatIntLostOne = 0;
    6082             rc = g_aE1kRegMap[index].pfnWrite(pThis, offReg, index, u32Value);
     6109            rc = g_aE1kRegMap[index].pfnWrite(pDevIns, pThis, offReg, index, u32Value);
    60836110            //e1kCsLeave(pThis);
    60846111        }
     
    61116138    Assert(!(off & 3));
    61126139
    6113     VBOXSTRICTRC rcStrict = e1kRegReadAlignedU32(pThis, (uint32_t)off, (uint32_t *)pv);
     6140    VBOXSTRICTRC rcStrict = e1kRegReadAlignedU32(pDevIns, pThis, (uint32_t)off, (uint32_t *)pv);
    61146141
    61156142    STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatMMIORead), a);
     
    61306157    Assert(!(off & 3));
    61316158
    6132     VBOXSTRICTRC rcStrict = e1kRegWriteAlignedU32(pThis, (uint32_t)off, *(uint32_t const *)pv);
     6159    VBOXSTRICTRC rcStrict = e1kRegWriteAlignedU32(pDevIns, pThis, (uint32_t)off, *(uint32_t const *)pv);
    61336160
    61346161    STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatMMIOWrite), a);
     
    61576184            case 0x04: /* IODATA */
    61586185                if (!(pThis->uSelectedReg & 3))
    6159                     rc = e1kRegReadAlignedU32(pThis, pThis->uSelectedReg, pu32);
     6186                    rc = e1kRegReadAlignedU32(pDevIns, pThis, pThis->uSelectedReg, pu32);
    61606187                else /** @todo r=bird: I wouldn't be surprised if this unaligned branch wasn't necessary. */
    6161                     rc = e1kRegReadUnaligned(pThis, pThis->uSelectedReg, pu32, cb);
     6188                    rc = e1kRegReadUnaligned(pDevIns, pThis, pThis->uSelectedReg, pu32, cb);
    61626189                if (rc == VINF_IOM_R3_MMIO_READ)
    61636190                    rc = VINF_IOM_R3_IOPORT_READ;
     
    61676194            default:
    61686195                E1kLog(("%s e1kIOPortIn: invalid port %#010x\n", pThis->szPrf, offPort));
     6196                /** @todo r=bird: Check what real hardware returns here. */
    61696197                //rc = VERR_IOM_IOPORT_UNUSED; /* Why not? */
    6170                 rc = VINF_SUCCESS;
     6198                rc = VINF_IOM_MMIO_UNUSED_00;  /* used to return VINF_SUCCESS and not touch *pu32, which amounted to this. */
     6199                break;
    61716200        }
    61726201    else
     
    61746203        E1kLog(("%s e1kIOPortIn: invalid op size: offPort=%RTiop cb=%08x", pThis->szPrf, offPort, cb));
    61756204        rc = PDMDevHlpDBGFStop(pDevIns, RT_SRC_POS, "%s e1kIOPortIn: invalid op size: offPort=%RTiop cb=%08x\n", pThis->szPrf, offPort, cb);
     6205        *pu32 = 0; /** @todo r=bird: Check what real hardware returns here.  (Didn't used to set a value here, picked zero as that's what we'd end up in most cases.) */
    61766206    }
    61776207    STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatIORead), a);
     
    62056235                if (RT_LIKELY(!(pThis->uSelectedReg & 3)))
    62066236                {
    6207                     rc = e1kRegWriteAlignedU32(pThis, pThis->uSelectedReg, u32);
     6237                    rc = e1kRegWriteAlignedU32(pDevIns, pThis, pThis->uSelectedReg, u32);
    62086238                    if (rc == VINF_IOM_R3_MMIO_WRITE)
    62096239                        rc = VINF_IOM_R3_IOPORT_WRITE;
     
    66526682    if (fPassed)
    66536683    {
    6654         rc = e1kHandleRxPacket(pThis, pvBuf, cb, status);
     6684        rc = e1kHandleRxPacket(pThis->pDevInsR3, pThis, pvBuf, cb, status);
    66556685    }
    66566686    //e1kCsLeave(pThis);
     
    67176747            /* If link was down, bring it up after a while. */
    67186748            if (!(STATUS & STATUS_LU))
    6719                 e1kBringLinkUpDelayed(pThis);
     6749                e1kBringLinkUpDelayed(pThis->pDevInsR3, pThis);
    67206750            break;
    67216751        case PDMNETWORKLINKSTATE_DOWN:
     
    67266756            /* If link was up, bring it down. */
    67276757            if (STATUS & STATUS_LU)
    6728                 e1kR3LinkDown(pThis);
     6758                e1kR3LinkDown(pThis->pDevInsR3, pThis);
    67296759            break;
    67306760        case PDMNETWORKLINKSTATE_DOWN_RESUME:
     
    67346764             */
    67356765            if (STATUS & STATUS_LU)
    6736                 e1kR3LinkDownTemp(pThis);
     6766                e1kR3LinkDownTemp(pThis->pDevInsR3, pThis);
    67376767            break;
    67386768        default:
     
    70377067        && pThis->cMsLinkUpDelay)
    70387068    {
    7039         e1kR3LinkDownTemp(pThis);
     7069        e1kR3LinkDownTemp(pDevIns, pThis);
    70407070    }
    70417071    return VINF_SUCCESS;
     
    74457475     */
    74467476    if ((STATUS & STATUS_LU) && RT_SUCCESS(rc))
    7447         e1kR3LinkDownTemp(pThis);
     7477        e1kR3LinkDownTemp(pDevIns, pThis);
    74487478
    74497479    PDMCritSectLeave(&pThis->cs);
     
    74687498    PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*);
    74697499#ifdef E1K_TX_DELAY
    7470     e1kCancelTimer(pThis, pThis->CTX_SUFF(pTXDTimer));
     7500    e1kCancelTimer(pDevIns, pThis, pThis->hTXDTimer);
    74717501#endif /* E1K_TX_DELAY */
    7472     e1kCancelTimer(pThis, pThis->CTX_SUFF(pIntTimer));
    7473     e1kCancelTimer(pThis, pThis->CTX_SUFF(pLUTimer));
     7502    e1kCancelTimer(pDevIns, pThis, pThis->hIntTimer);
     7503    e1kCancelTimer(pDevIns, pThis, pThis->hLUTimer);
    74747504    e1kXmitFreeBuf(pThis);
    74757505    pThis->u16TxPktLen  = 0;
     
    74807510    pThis->fLocked      = false;
    74817511    pThis->u64AckedAt   = 0;
    7482     e1kHardReset(pThis);
     7512    e1kHardReset(pDevIns, pThis);
    74837513}
    74847514
     
    75157545    pThis->pTxQueueRC    = PDMQueueRCPtr(pThis->pTxQueueR3);
    75167546    pThis->pCanRxQueueRC = PDMQueueRCPtr(pThis->pCanRxQueueR3);
    7517 #ifdef E1K_USE_RX_TIMERS
    7518     pThis->pRIDTimerRC   = TMTimerRCPtr(pThis->pRIDTimerR3);
    7519     pThis->pRADTimerRC   = TMTimerRCPtr(pThis->pRADTimerR3);
    7520 #endif /* E1K_USE_RX_TIMERS */
    7521 //#ifdef E1K_USE_TX_TIMERS
    7522     if (pThis->fTidEnabled)
    7523     {
    7524         pThis->pTIDTimerRC   = TMTimerRCPtr(pThis->pTIDTimerR3);
    7525 # ifndef E1K_NO_TAD
    7526         pThis->pTADTimerRC   = TMTimerRCPtr(pThis->pTADTimerR3);
    7527 # endif /* E1K_NO_TAD */
    7528     }
    7529 //#endif /* E1K_USE_TX_TIMERS */
    7530 #ifdef E1K_TX_DELAY
    7531     pThis->pTXDTimerRC   = TMTimerRCPtr(pThis->pTXDTimerR3);
    7532 #endif /* E1K_TX_DELAY */
    7533     pThis->pIntTimerRC   = TMTimerRCPtr(pThis->pIntTimerR3);
    7534     pThis->pLUTimerRC    = TMTimerRCPtr(pThis->pLUTimerR3);
    75357547}
    75367548
     
    78377849
    78387850    /* Map our registers to IO space (region 2, see e1kR3ConfigurePciDev) */
     7851    static IOMIOPORTDESC const s_aExtDescs[] =
     7852    {
     7853        { "IOADDR", "IOADDR", NULL, NULL }, { "unused", "unused", NULL, NULL }, { "unused", "unused", NULL, NULL }, { "unused", "unused", NULL, NULL },
     7854        { "IODATA", "IODATA", NULL, NULL }, { "unused", "unused", NULL, NULL }, { "unused", "unused", NULL, NULL }, { "unused", "unused", NULL, NULL },
     7855        { NULL, NULL, NULL, NULL }
     7856    };
    78397857    rc = PDMDevHlpIoPortCreate(pDevIns, E1K_IOPORT_SIZE, pDevIns->apPciDevs[0], 2 /*iPciRegion*/,
    7840                                e1kIOPortOut, e1kIOPortIn, NULL /*pvUser*/, "E1000", NULL /*paExtDescs*/, &pThis->hIoPorts);
     7858                               e1kIOPortOut, e1kIOPortIn, NULL /*pvUser*/, "E1000", s_aExtDescs, &pThis->hIoPorts);
    78417859    AssertRCReturn(rc, rc);
    78427860    rc = PDMDevHlpPCIIORegionRegisterIo(pDevIns, 2, E1K_IOPORT_SIZE, pThis->hIoPorts, e1kR3Map);
     
    78607878#ifdef E1K_TX_DELAY
    78617879    /* Create Transmit Delay Timer */
    7862     rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kTxDelayTimer, pThis,
    7863                                 TMTIMER_FLAGS_NO_CRIT_SECT,
    7864                                 "E1000 Transmit Delay Timer", &pThis->pTXDTimerR3);
     7880    rc = PDMDevHlpTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kTxDelayTimer, pThis, TMTIMER_FLAGS_NO_CRIT_SECT,
     7881                              "E1000 Transmit Delay Timer", &pThis->hTXDTimer);
    78657882    AssertRCReturn(rc, rc);
    7866     pThis->pTXDTimerR0 = TMTimerR0Ptr(pThis->pTXDTimerR3);
    7867     pThis->pTXDTimerRC = TMTimerRCPtr(pThis->pTXDTimerR3);
    7868     TMR3TimerSetCritSect(pThis->pTXDTimerR3, &pThis->csTx);
     7883    rc = PDMDevHlpTimerSetCritSect(pDevIns, pThis->hTXDTimer, &pThis->csTx);
     7884    AssertRCReturn(rc, rc);
    78697885#endif /* E1K_TX_DELAY */
    78707886
     
    78737889    {
    78747890        /* Create Transmit Interrupt Delay Timer */
    7875         rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kTxIntDelayTimer, pThis,
    7876                                     TMTIMER_FLAGS_NO_CRIT_SECT,
    7877                                     "E1000 Transmit Interrupt Delay Timer", &pThis->pTIDTimerR3);
    7878         if (RT_FAILURE(rc))
    7879             return rc;
    7880         pThis->pTIDTimerR0 = TMTimerR0Ptr(pThis->pTIDTimerR3);
    7881         pThis->pTIDTimerRC = TMTimerRCPtr(pThis->pTIDTimerR3);
     7891        rc = PDMDevHlpTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kTxIntDelayTimer, pThis, TMTIMER_FLAGS_NO_CRIT_SECT,
     7892                                  "E1000 Transmit Interrupt Delay Timer", &pThis->hTIDTimer);
     7893        AssertRCReturn(rc, rc);
    78827894
    78837895# ifndef E1K_NO_TAD
    78847896        /* Create Transmit Absolute Delay Timer */
    7885         rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kTxAbsDelayTimer, pThis,
    7886                                     TMTIMER_FLAGS_NO_CRIT_SECT,
    7887                                     "E1000 Transmit Absolute Delay Timer", &pThis->pTADTimerR3);
    7888         if (RT_FAILURE(rc))
    7889             return rc;
    7890         pThis->pTADTimerR0 = TMTimerR0Ptr(pThis->pTADTimerR3);
    7891         pThis->pTADTimerRC = TMTimerRCPtr(pThis->pTADTimerR3);
     7897        rc = PDMDevHlpTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kTxAbsDelayTimer, pThis, TMTIMER_FLAGS_NO_CRIT_SECT,
     7898                                  "E1000 Transmit Absolute Delay Timer", &pThis->hTADTimer);
     7899        AssertRCReturn(rc, rc);
    78927900# endif /* E1K_NO_TAD */
    78937901    }
     
    78967904#ifdef E1K_USE_RX_TIMERS
    78977905    /* Create Receive Interrupt Delay Timer */
    7898     rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kRxIntDelayTimer, pThis,
    7899                                 TMTIMER_FLAGS_NO_CRIT_SECT,
    7900                                 "E1000 Receive Interrupt Delay Timer", &pThis->pRIDTimerR3);
    7901     if (RT_FAILURE(rc))
    7902         return rc;
    7903     pThis->pRIDTimerR0 = TMTimerR0Ptr(pThis->pRIDTimerR3);
    7904     pThis->pRIDTimerRC = TMTimerRCPtr(pThis->pRIDTimerR3);
     7906    rc = PDMDevHlpTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kRxIntDelayTimer, pThis, TMTIMER_FLAGS_NO_CRIT_SECT,
     7907                              "E1000 Receive Interrupt Delay Timer", &pThis->hRIDTimer);
     7908    AssertRCReturn(rc, rc);
    79057909
    79067910    /* Create Receive Absolute Delay Timer */
    7907     rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kRxAbsDelayTimer, pThis,
    7908                                 TMTIMER_FLAGS_NO_CRIT_SECT,
    7909                                 "E1000 Receive Absolute Delay Timer", &pThis->pRADTimerR3);
    7910     if (RT_FAILURE(rc))
    7911         return rc;
    7912     pThis->pRADTimerR0 = TMTimerR0Ptr(pThis->pRADTimerR3);
    7913     pThis->pRADTimerRC = TMTimerRCPtr(pThis->pRADTimerR3);
     7911    rc = PDMDevHlpTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kRxAbsDelayTimer, pThis, TMTIMER_FLAGS_NO_CRIT_SECT,
     7912                              "E1000 Receive Absolute Delay Timer", &pThis->hRADTimer);
     7913    AssertRCReturn(rc, rc);
    79147914#endif /* E1K_USE_RX_TIMERS */
    79157915
    79167916    /* Create Late Interrupt Timer */
    7917     rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kLateIntTimer, pThis,
    7918                                 TMTIMER_FLAGS_NO_CRIT_SECT,
    7919                                 "E1000 Late Interrupt Timer", &pThis->pIntTimerR3);
    7920     if (RT_FAILURE(rc))
    7921         return rc;
    7922     pThis->pIntTimerR0 = TMTimerR0Ptr(pThis->pIntTimerR3);
    7923     pThis->pIntTimerRC = TMTimerRCPtr(pThis->pIntTimerR3);
     7917    rc = PDMDevHlpTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kLateIntTimer, pThis, TMTIMER_FLAGS_NO_CRIT_SECT,
     7918                              "E1000 Late Interrupt Timer", &pThis->hIntTimer);
     7919    AssertRCReturn(rc, rc);
    79247920
    79257921    /* Create Link Up Timer */
    7926     rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kLinkUpTimer, pThis,
    7927                                 TMTIMER_FLAGS_NO_CRIT_SECT,
    7928                                 "E1000 Link Up Timer", &pThis->pLUTimerR3);
    7929     if (RT_FAILURE(rc))
    7930         return rc;
    7931     pThis->pLUTimerR0 = TMTimerR0Ptr(pThis->pLUTimerR3);
    7932     pThis->pLUTimerRC = TMTimerRCPtr(pThis->pLUTimerR3);
     7922    rc = PDMDevHlpTimerCreate(pDevIns, TMCLOCK_VIRTUAL, e1kLinkUpTimer, pThis, TMTIMER_FLAGS_NO_CRIT_SECT,
     7923                              "E1000 Link Up Timer", &pThis->hLUTimer);
     7924    AssertRCReturn(rc, rc);
    79337925
    79347926    /* Register the info item */
     
    79747966        return rc;
    79757967
    7976     e1kHardReset(pThis);
     7968    e1kHardReset(pDevIns, pThis);
    79777969
    79787970    PDMDevHlpSTAMRegisterF(pDevIns, &pThis->StatReceiveBytes,       STAMTYPE_COUNTER, STAMVISIBILITY_ALWAYS, STAMUNIT_BYTES,          "Amount of data received",            "/Public/Net/E1k%u/BytesReceived", iInstance);
Note: See TracChangeset for help on using the changeset viewer.

© 2025 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette