Changeset 81384 in vbox
- Timestamp:
- Oct 19, 2019 11:59:29 PM (5 years ago)
- svn:sync-xref-src-repo-rev:
- 134097
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DevE1000.cpp
r81380 r81384 1030 1030 { 1031 1031 char szPrf[8]; /**< Log prefix, e.g. E1000#1. */ 1032 1032 1033 PDMIBASE IBase; 1033 1034 PDMINETWORKDOWN INetworkDown; … … 1041 1042 R3PTRTYPE(PPDMQUEUE) pCanRxQueueR3; /**< Rx wakeup signaller - R3. */ 1042 1043 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. */1050 1044 /** The scatter / gather buffer used for the current outgoing packet - R3. */ 1051 1045 R3PTRTYPE(PPDMSCATTERGATHER) pTxSgR3; … … 1055 1049 R0PTRTYPE(PPDMQUEUE) pCanRxQueueR0; /**< Rx wakeup signaller - R0. */ 1056 1050 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. */1064 1051 /** The scatter / gather buffer used for the current outgoing packet - R0. */ 1065 1052 R0PTRTYPE(PPDMSCATTERGATHER) pTxSgR0; … … 1069 1056 RCPTRTYPE(PPDMQUEUE) pCanRxQueueRC; /**< Rx wakeup signaller - RC. */ 1070 1057 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. */1078 1058 /** The scatter / gather buffer used for the current outgoing packet - RC. */ 1079 1059 RCPTRTYPE(PPDMSCATTERGATHER) pTxSgRC; … … 1088 1068 IOMIOPORTHANDLE hIoPorts; 1089 1069 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; 1092 1089 #ifdef E1K_WITH_TX_CS 1093 PDMCRITSECT csTx; /**< TX Critical section. */ 1090 /** TX Critical section. */ 1091 PDMCRITSECT csTx; 1094 1092 #endif /* E1K_WITH_TX_CS */ 1095 1093 /** Base address of memory-mapped registers. */ … … 1105 1103 /** EMT: false if the cable is disconnected by the GUI. */ 1106 1104 bool fCableConnected; 1107 /** EMT: */1108 bool fR0Enabled;1109 /** EMT: */1110 bool fRCEnabled;1111 1105 /** EMT: Compute Ethernet CRC for RX packets. */ 1112 1106 bool fEthernetCRC; … … 1117 1111 /** All: Delay TX interrupts using TIDV/TADV. */ 1118 1112 bool fTidEnabled; 1113 bool afPadding[2]; 1119 1114 /** Link up delay (in milliseconds). */ 1120 1115 uint32_t cMsLinkUpDelay; … … 1317 1312 static int e1kXmitPending(PE1KSTATE pThis, bool fOnWorkerThread); 1318 1313 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 */ 1317 typedef int (FNE1KREGREAD)(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value); 1318 /** 1319 * E1000 register write handler. 1320 */ 1321 typedef int (FNE1KREGWRITE)(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1322 1323 static FNE1KREGREAD e1kRegReadUnimplemented; 1324 static FNE1KREGWRITE e1kRegWriteUnimplemented; 1325 static FNE1KREGREAD e1kRegReadAutoClear; 1326 static FNE1KREGREAD e1kRegReadDefault; 1327 static FNE1KREGWRITE e1kRegWriteDefault; 1324 1328 #if 0 /* unused */ 1325 static int e1kRegReadCTRL (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value);1329 static FNE1KREGREAD e1kRegReadCTRL; 1326 1330 #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);1331 static FNE1KREGWRITE e1kRegWriteCTRL; 1332 static FNE1KREGREAD e1kRegReadEECD; 1333 static FNE1KREGWRITE e1kRegWriteEECD; 1334 static FNE1KREGWRITE e1kRegWriteEERD; 1335 static FNE1KREGWRITE e1kRegWriteMDIC; 1336 static FNE1KREGREAD e1kRegReadICR; 1337 static FNE1KREGWRITE e1kRegWriteICR; 1338 static FNE1KREGWRITE e1kRegWriteICS; 1339 static FNE1KREGWRITE e1kRegWriteIMS; 1340 static FNE1KREGWRITE e1kRegWriteIMC; 1341 static FNE1KREGWRITE e1kRegWriteRCTL; 1342 static FNE1KREGWRITE e1kRegWritePBA; 1343 static FNE1KREGWRITE e1kRegWriteRDT; 1344 static FNE1KREGWRITE e1kRegWriteRDTR; 1345 static FNE1KREGWRITE e1kRegWriteTDT; 1346 static FNE1KREGREAD e1kRegReadMTA; 1347 static FNE1KREGWRITE e1kRegWriteMTA; 1348 static FNE1KREGREAD e1kRegReadRA; 1349 static FNE1KREGWRITE e1kRegWriteRA; 1350 static FNE1KREGREAD e1kRegReadVFTA; 1351 static FNE1KREGWRITE e1kRegWriteVFTA; 1348 1352 1349 1353 /** … … 1363 1367 uint32_t writable; 1364 1368 /** Read callback. */ 1365 int (*pfnRead)(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value);1369 FNE1KREGREAD *pfnRead; 1366 1370 /** Write callback. */ 1367 int (*pfnWrite)(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value);1371 FNE1KREGWRITE *pfnWrite; 1368 1372 /** Abbreviated name. */ 1369 1373 const char *abbrev; … … 1515 1519 * Convert U32 value to hex string. Masked bytes are replaced with dots. 1516 1520 * 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). 1518 1522 * 1519 1523 * @returns The buffer. … … 1542 1546 * 1543 1547 * @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 */ 1550 DECLINLINE(const char *) e1kGetTimerName(PE1KSTATE pThis, TMTIMERHANDLE hTimer) 1551 { 1552 if (hTimer == pThis->hTIDTimer) 1549 1553 return "TID"; 1550 if ( pTimer == pThis->CTX_SUFF(pTADTimer))1554 if (hTimer == pThis->hTADTimer) 1551 1555 return "TAD"; 1552 if ( pTimer == pThis->CTX_SUFF(pRIDTimer))1556 if (hTimer == pThis->hRIDTimer) 1553 1557 return "RID"; 1554 if ( pTimer == pThis->CTX_SUFF(pRADTimer))1558 if (hTimer == pThis->hRADTimer) 1555 1559 return "RAD"; 1556 if ( pTimer == pThis->CTX_SUFF(pIntTimer))1560 if (hTimer == pThis->hIntTimer) 1557 1561 return "Int"; 1558 if ( pTimer == pThis->CTX_SUFF(pTXDTimer))1562 if (hTimer == pThis->hTXDTimer) 1559 1563 return "TXD"; 1560 if ( pTimer == pThis->CTX_SUFF(pLUTimer))1564 if (hTimer == pThis->hLUTimer) 1561 1565 return "LinkUp"; 1562 1566 return "unknown"; 1563 1567 } 1564 1568 1565 #endif /* DEBUG*/1569 #endif /* LOG_ENABLED */ 1566 1570 1567 1571 /** 1568 1572 * Arm a timer. 1569 1573 * 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. 1572 1577 * @param uExpireIn Expiration interval in microseconds. 1573 1578 */ 1574 DECLINLINE(void) e1kArmTimer(P E1KSTATE pThis, PTMTIMER pTimer, uint32_t uExpireIn)1579 DECLINLINE(void) e1kArmTimer(PPDMDEVINS pDevIns, PE1KSTATE pThis, TMTIMERHANDLE hTimer, uint32_t uExpireIn) 1575 1580 { 1576 1581 if (pThis->fLocked) … … 1578 1583 1579 1584 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); 1582 1588 } 1583 1589 … … 1586 1592 * Cancel a timer. 1587 1593 * 1588 * @param pThis Pointer to the device state structure. 1594 * @param pDevIns The device instance. 1595 * @param pThis Pointer to the device state structure. 1589 1596 * @param pTimer Pointer to the timer. 1590 1597 */ 1591 DECLINLINE(void) e1kCancelTimer(P E1KSTATE pThis, PTMTIMER pTimer)1598 DECLINLINE(void) e1kCancelTimer(PPDMDEVINS pDevIns, PE1KSTATE pThis, TMTIMERHANDLE hTimer) 1592 1599 { 1593 1600 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); 1596 1603 if (RT_FAILURE(rc)) 1597 E1kLog2(("%s e1kCancelTimer: TMTimerStop( ) failed with %Rrc\n",1598 pThis->szPrf, rc));1599 RT_NOREF 1(pThis);1604 E1kLog2(("%s e1kCancelTimer: TMTimerStop(%s) failed with %Rrc\n", 1605 pThis->szPrf, e1kGetTimerName(pThis, hTimer), rc)); 1606 RT_NOREF_PV(pThis); 1600 1607 } 1601 1608 #endif /* IN_RING3 */ … … 1636 1643 * Hardware reset. Revert all registers to initial values. 1637 1644 * 1645 * @param pDevIns The device instance. 1638 1646 * @param pThis The device state structure. 1639 1647 */ 1640 static void e1kHardReset(P E1KSTATE pThis)1648 static void e1kHardReset(PPDMDEVINS pDevIns, PE1KSTATE pThis) 1641 1649 { 1642 1650 E1kLog(("%s Hard reset triggered\n", pThis->szPrf)); … … 1692 1700 E1kLog(("%s Will trigger LSC in %d seconds...\n", 1693 1701 pThis->szPrf, pThis->cMsLinkUpDelay / 1000)); 1694 e1kArmTimer(p This, pThis->CTX_SUFF(pLUTimer), pThis->cMsLinkUpDelay * 1000);1702 e1kArmTimer(pDevIns, pThis, pThis->hLUTimer, pThis->cMsLinkUpDelay * 1000); 1695 1703 #endif /* E1K_LSC_ON_RESET */ 1696 1704 } … … 2019 2027 * @param pThis The device state structure. 2020 2028 */ 2021 inline void e1kPostponeInterrupt(PE1KSTATE pThis, uint64_t uNanoseconds)2022 { 2023 if (! TMTimerIsActive(pThis->CTX_SUFF(pIntTimer)))2024 TMTimerSetNano(pThis->CTX_SUFF(pIntTimer), uNanoseconds);2029 DECLINLINE(void) e1kPostponeInterrupt(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint64_t nsDeadline) 2030 { 2031 if (!PDMDevHlpTimerIsActive(pDevIns, pThis->hIntTimer)) 2032 PDMDevHlpTimerSetNano(pDevIns, pThis->hIntTimer, nsDeadline); 2025 2033 } 2026 2034 … … 2030 2038 * @param pThis The device state structure. 2031 2039 */ 2032 static int e1kRaiseInterrupt(P E1KSTATE pThis, int rcBusy, uint32_t u32IntCause = 0)2040 static int e1kRaiseInterrupt(PPDMDEVINS pDevIns, PE1KSTATE pThis, int rcBusy, uint32_t u32IntCause = 0) 2033 2041 { 2034 2042 int rc = e1kCsEnter(pThis, rcBusy); … … 2048 2056 else 2049 2057 { 2050 uint64_t tsNow = TMTimerGet(pThis->CTX_SUFF(pIntTimer));2058 uint64_t tsNow = PDMDevHlpTimerGet(pDevIns, pThis->hIntTimer); 2051 2059 if (!!ITR && tsNow - pThis->u64AckedAt < ITR * 256 2052 2060 && pThis->fItrEnabled && (pThis->fItrRxEnabled || !(ICR & ICR_RXT0))) … … 2055 2063 E1kLog2(("%s e1kRaiseInterrupt: Too early to raise again: %d ns < %d ns.\n", 2056 2064 pThis->szPrf, (uint32_t)(tsNow - pThis->u64AckedAt), ITR * 256)); 2057 e1kPostponeInterrupt(p This, ITR * 256);2065 e1kPostponeInterrupt(pDevIns, pThis, ITR * 256); 2058 2066 } 2059 2067 else … … 2063 2071 * there is no need to do it later -- stop the timer. 2064 2072 */ 2065 TMTimerStop(pThis->CTX_SUFF(pIntTimer));2073 PDMDevHlpTimerStop(pDevIns, pThis->hIntTimer); 2066 2074 E1K_INC_ISTAT_CNT(pThis->uStatInt); 2067 2075 STAM_COUNTER_INC(&pThis->StatIntsRaised); … … 2070 2078 /* Raise(1) INTA(0) */ 2071 2079 E1kLogRel(("E1000: irq RAISED icr&mask=0x%x, icr=0x%x\n", ICR & IMS, ICR)); 2072 PDMDevHlpPCISetIrq(p This->CTX_SUFF(pDevIns), 0, 1);2080 PDMDevHlpPCISetIrq(pDevIns, 0, 1); 2073 2081 E1kLog(("%s e1kRaiseInterrupt: Raised. ICR&IMS=%08x\n", 2074 2082 pThis->szPrf, ICR & IMS)); … … 2107 2115 * @remarks RDH always points to the next available RX descriptor. 2108 2116 * 2117 * @param pDevIns The device instance. 2109 2118 * @param pThis The device state structure. 2110 2119 */ 2111 DECLINLINE(void) e1kAdvanceRDH(P E1KSTATE pThis)2120 DECLINLINE(void) e1kAdvanceRDH(PPDMDEVINS pDevIns, PE1KSTATE pThis) 2112 2121 { 2113 2122 Assert(e1kCsRxIsOwner(pThis)); … … 2154 2163 pThis->szPrf, RDH, RDT, uRQueueLen, uMinRQThreshold)); 2155 2164 E1K_INC_ISTAT_CNT(pThis->uStatIntRXDMT0); 2156 e1kRaiseInterrupt(p This, VERR_SEM_BUSY, ICR_RXDMT0);2165 e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_RXDMT0); 2157 2166 } 2158 2167 E1kLog2(("%s e1kAdvanceRDH: at exit RDH=%x RDT=%x len=%x\n", … … 2196 2205 * pointer. The descriptor gets written back to the RXD ring. 2197 2206 * 2207 * @param pDevIns The device instance. 2198 2208 * @param pThis The device state structure. 2199 2209 * @param pDesc The descriptor being "returned" to the RX ring. 2200 2210 * @thread RX 2201 2211 */ 2202 DECLINLINE(void) e1kRxDPut(P E1KSTATE pThis, E1KRXDESC* pDesc)2212 DECLINLINE(void) e1kRxDPut(PPDMDEVINS pDevIns, PE1KSTATE pThis, E1KRXDESC* pDesc) 2203 2213 { 2204 2214 Assert(e1kCsRxIsOwner(pThis)); … … 2217 2227 */ 2218 2228 e1kPrintRDesc(pThis, pDesc); 2219 e1kAdvanceRDH(p This);2229 e1kAdvanceRDH(pDevIns, pThis); 2220 2230 } 2221 2231 … … 2253 2263 * @param cb The size of the fragment. 2254 2264 */ 2255 static DECLCALLBACK(void) e1kStoreRxFragment(P E1KSTATE pThis, E1KRXDESC *pDesc, const void *pvBuf, size_t cb)2265 static DECLCALLBACK(void) e1kStoreRxFragment(PPDMDEVINS pDevIns, PE1KSTATE pThis, E1KRXDESC *pDesc, const void *pvBuf, size_t cb) 2256 2266 { 2257 2267 STAM_PROFILE_ADV_START(&pThis->StatReceiveStore, a); … … 2264 2274 E1kLogRel(("E1000: Wrote back RX desc, RDH=%x\n", RDH)); 2265 2275 /* Advance head */ 2266 e1kAdvanceRDH(p This);2276 e1kAdvanceRDH(pDevIns, pThis); 2267 2277 //E1kLog2(("%s e1kStoreRxFragment: EOP=%d RDTR=%08X RADV=%08X\n", pThis->szPrf, pDesc->fEOP, RDTR, RADV)); 2268 2278 if (pDesc->status.fEOP) … … 2273 2283 { 2274 2284 /* Arm the timer to fire in RDTR usec (discard .024) */ 2275 e1kArmTimer(p This, pThis->CTX_SUFF(pRIDTimer), RDTR);2285 e1kArmTimer(pDevIns, pThis, pThis->hRIDTimer, RDTR); 2276 2286 /* 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); 2279 2289 } 2280 2290 else … … 2283 2293 /* 0 delay means immediate interrupt */ 2284 2294 E1K_INC_ISTAT_CNT(pThis->uStatIntRx); 2285 e1kRaiseInterrupt(p This, VERR_SEM_BUSY, ICR_RXT0);2295 e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_RXT0); 2286 2296 #ifdef E1K_USE_RX_TIMERS 2287 2297 } … … 2377 2387 * 2378 2388 * @returns VBox status code. 2389 * @param pDevIns The device instance. 2379 2390 * @param pThis The device state structure. 2380 2391 * @param pvBuf The available data. … … 2382 2393 * @param status Bit fields containing status info. 2383 2394 */ 2384 static int e1kHandleRxPacket(P E1KSTATE pThis, const void *pvBuf, size_t cb, E1KRXDST status)2395 static int e1kHandleRxPacket(PPDMDEVINS pDevIns, PE1KSTATE pThis, const void *pvBuf, size_t cb, E1KRXDST status) 2385 2396 { 2386 2397 #if defined(IN_RING3) /** @todo Remove this extra copying, it's gonna make us run out of kernel / hypervisor stack! */ … … 2543 2554 /* Write back the descriptor. */ 2544 2555 pDesc->status.fDD = true; 2545 e1kRxDPut(p This, pDesc);2556 e1kRxDPut(pDevIns, pThis, pDesc); 2546 2557 # else /* !E1K_WITH_RXD_CACHE */ 2547 2558 else … … 2552 2563 e1kDescAddr(RDBAH, RDBAL, RDH), 2553 2564 pDesc, sizeof(E1KRXDESC)); 2554 e1kAdvanceRDH(p This);2565 e1kAdvanceRDH(pDevIns, pThis); 2555 2566 } 2556 2567 # endif /* !E1K_WITH_RXD_CACHE */ … … 2569 2580 { 2570 2581 /* Arm the timer to fire in RDTR usec (discard .024) */ 2571 e1kArmTimer(pThis, pThis-> CTX_SUFF(pRIDTimer), RDTR);2582 e1kArmTimer(pThis, pThis->hRIDTimer, RDTR); 2572 2583 /* 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); 2575 2586 } 2576 2587 else … … 2579 2590 /* 0 delay means immediate interrupt */ 2580 2591 E1K_INC_ISTAT_CNT(pThis->uStatIntRx); 2581 e1kRaiseInterrupt(p This, VERR_SEM_BUSY, ICR_RXT0);2592 e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_RXT0); 2582 2593 # ifdef E1K_USE_RX_TIMERS 2583 2594 } … … 2587 2598 return VINF_SUCCESS; 2588 2599 #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); 2590 2601 return VERR_INTERNAL_ERROR_2; 2591 2602 #endif /* !IN_RING3 */ … … 2597 2608 * Bring the link up after the configured delay, 5 seconds by default. 2598 2609 * 2610 * @param pDevIns The device instance. 2599 2611 * @param pThis The device state structure. 2600 2612 * @thread any 2601 2613 */ 2602 DECLINLINE(void) e1kBringLinkUpDelayed(P E1KSTATE pThis)2614 DECLINLINE(void) e1kBringLinkUpDelayed(PPDMDEVINS pDevIns, PE1KSTATE pThis) 2603 2615 { 2604 2616 E1kLog(("%s Will bring up the link in %d seconds...\n", 2605 2617 pThis->szPrf, pThis->cMsLinkUpDelay / 1000)); 2606 e1kArmTimer(p This, pThis->CTX_SUFF(pLUTimer), pThis->cMsLinkUpDelay * 1000);2618 e1kArmTimer(pDevIns, pThis, pThis->hLUTimer, pThis->cMsLinkUpDelay * 1000); 2607 2619 } 2608 2620 … … 2610 2622 * Bring up the link immediately. 2611 2623 * 2624 * @param pDevIns The device instance. 2612 2625 * @param pThis The device state structure. 2613 2626 */ 2614 DECLINLINE(void) e1kR3LinkUp(P E1KSTATE pThis)2627 DECLINLINE(void) e1kR3LinkUp(PPDMDEVINS pDevIns, PE1KSTATE pThis) 2615 2628 { 2616 2629 E1kLog(("%s Link is up\n", pThis->szPrf)); 2617 2630 STATUS |= STATUS_LU; 2618 2631 Phy::setLinkStatus(&pThis->phy, true); 2619 e1kRaiseInterrupt(p This, VERR_SEM_BUSY, ICR_LSC);2632 e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_LSC); 2620 2633 if (pThis->pDrvR3) 2621 2634 pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, PDMNETWORKLINKSTATE_UP); … … 2629 2642 * Bring down the link immediately. 2630 2643 * 2644 * @param pDevIns The device instance. 2631 2645 * @param pThis The device state structure. 2632 2646 */ 2633 DECLINLINE(void) e1kR3LinkDown(P E1KSTATE pThis)2647 DECLINLINE(void) e1kR3LinkDown(PPDMDEVINS pDevIns, PE1KSTATE pThis) 2634 2648 { 2635 2649 E1kLog(("%s Link is down\n", pThis->szPrf)); … … 2638 2652 Phy::setLinkStatus(&pThis->phy, false); 2639 2653 #endif /* E1K_LSC_ON_RESET */ 2640 e1kRaiseInterrupt(p This, VERR_SEM_BUSY, ICR_LSC);2654 e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_LSC); 2641 2655 if (pThis->pDrvR3) 2642 2656 pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, PDMNETWORKLINKSTATE_DOWN); … … 2646 2660 * Bring down the link temporarily. 2647 2661 * 2662 * @param pDevIns The device instance. 2648 2663 * @param pThis The device state structure. 2649 2664 */ 2650 DECLINLINE(void) e1kR3LinkDownTemp(P E1KSTATE pThis)2665 DECLINLINE(void) e1kR3LinkDownTemp(PPDMDEVINS pDevIns, PE1KSTATE pThis) 2651 2666 { 2652 2667 E1kLog(("%s Link is down temporarily\n", pThis->szPrf)); 2653 2668 STATUS &= ~STATUS_LU; 2654 2669 Phy::setLinkStatus(&pThis->phy, false); 2655 e1kRaiseInterrupt(p This, VERR_SEM_BUSY, ICR_LSC);2670 e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_LSC); 2656 2671 /* 2657 2672 * Notifying the associated driver that the link went down (even temporarily) … … 2663 2678 if (pThis->pDrvR3) 2664 2679 pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, PDMNETWORKLINKSTATE_DOWN); 2665 e1kBringLinkUpDelayed(pThis );2680 e1kBringLinkUpDelayed(pThis->pDevInsR3, pThis); 2666 2681 } 2667 2682 #endif /* IN_RING3 */ … … 2717 2732 /* Make sure we have cable connected and MAC can talk to PHY */ 2718 2733 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 */ 2720 2735 } 2721 2736 … … 2732 2747 * @thread EMT 2733 2748 */ 2734 static int e1kRegWriteCTRL(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)2749 static int e1kRegWriteCTRL(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2735 2750 { 2736 2751 int rc = VINF_SUCCESS; … … 2741 2756 return VINF_IOM_R3_MMIO_WRITE; 2742 2757 #else 2743 e1kHardReset(p This);2758 e1kHardReset(pDevIns, pThis); 2744 2759 #endif 2745 2760 } … … 2758 2773 { 2759 2774 /* It should take about 2 seconds for the link to come up */ 2760 e1kArmTimer(p This, pThis->CTX_SUFF(pLUTimer), E1K_INIT_LINKUP_DELAY_US);2775 e1kArmTimer(pDevIns, pThis, pThis->hLUTimer, E1K_INIT_LINKUP_DELAY_US); 2761 2776 } 2762 2777 #else /* !E1K_LSC_ON_SLU */ … … 2764 2779 && !(CTRL & CTRL_SLU) 2765 2780 && pThis->fCableConnected 2766 && ! TMTimerIsActive(pThis->CTX_SUFF(pLUTimer)))2781 && !PDMDevHlpTimerIsActive(pDevIns, pThis->hLUTimer)) 2767 2782 { 2768 2783 /* PXE does not use LSC interrupts, see @bugref{9113}. */ … … 2794 2809 } 2795 2810 } 2796 rc = e1kRegWriteDefault(p This, offset, index, value);2811 rc = e1kRegWriteDefault(pDevIns, pThis, offset, index, value); 2797 2812 } 2798 2813 … … 2812 2827 * @thread EMT 2813 2828 */ 2814 static int e1kRegWriteEECD(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)2815 { 2816 RT_NOREF( offset, index);2829 static int e1kRegWriteEECD(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2830 { 2831 RT_NOREF(pDevIns, offset, index); 2817 2832 #ifdef IN_RING3 2818 2833 /* So far we are concerned with lower byte only */ … … 2851 2866 * @thread EMT 2852 2867 */ 2853 static int e1kRegReadEECD(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)2868 static int e1kRegReadEECD(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 2854 2869 { 2855 2870 #ifdef IN_RING3 2856 2871 uint32_t value; 2857 int rc = e1kRegReadDefault(p This, offset, index, &value);2872 int rc = e1kRegReadDefault(pDevIns, pThis, offset, index, &value); 2858 2873 if (RT_SUCCESS(rc)) 2859 2874 { … … 2871 2886 return rc; 2872 2887 #else /* !IN_RING3 */ 2873 RT_NOREF_PV(p This); 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); 2874 2889 return VINF_IOM_R3_MMIO_READ; 2875 2890 #endif /* !IN_RING3 */ … … 2889 2904 * @thread EMT 2890 2905 */ 2891 static int e1kRegWriteEERD(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)2906 static int e1kRegWriteEERD(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2892 2907 { 2893 2908 #ifdef IN_RING3 2894 2909 /* Make use of 'writable' and 'readable' masks. */ 2895 e1kRegWriteDefault(p This, offset, index, value);2910 e1kRegWriteDefault(pDevIns, pThis, offset, index, value); 2896 2911 /* DONE and DATA are set only if read was triggered by START. */ 2897 2912 if (value & EERD_START) … … 2907 2922 return VINF_SUCCESS; 2908 2923 #else /* !IN_RING3 */ 2909 RT_NOREF_PV(p This); 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); 2910 2925 return VINF_IOM_R3_MMIO_WRITE; 2911 2926 #endif /* !IN_RING3 */ … … 2925 2940 * @thread EMT 2926 2941 */ 2927 static int e1kRegWriteMDIC(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)2942 static int e1kRegWriteMDIC(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2928 2943 { 2929 2944 if (value & MDIC_INT_EN) … … 2951 2966 { 2952 2967 /* Store the value */ 2953 e1kRegWriteDefault(p This, offset, index, value);2968 e1kRegWriteDefault(pDevIns, pThis, offset, index, value); 2954 2969 STAM_COUNTER_INC(&pThis->StatPHYAccesses); 2955 2970 /* Forward op to PHY */ … … 2977 2992 * @thread EMT 2978 2993 */ 2979 static int e1kRegWriteICR(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)2994 static int e1kRegWriteICR(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2980 2995 { 2981 2996 ICR &= ~value; 2982 2997 2983 RT_NOREF_PV(p This); 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); 2984 2999 return VINF_SUCCESS; 2985 3000 } … … 2998 3013 * @thread EMT 2999 3014 */ 3000 static int e1kRegReadICR(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)3015 static int e1kRegReadICR(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 3001 3016 { 3002 3017 int rc = e1kCsEnter(pThis, VINF_IOM_R3_MMIO_READ); … … 3005 3020 3006 3021 uint32_t value = 0; 3007 rc = e1kRegReadDefault(p This, offset, index, &value);3022 rc = e1kRegReadDefault(pDevIns, pThis, offset, index, &value); 3008 3023 if (RT_SUCCESS(rc)) 3009 3024 { … … 3029 3044 pThis->fIntRaised = false; 3030 3045 /* Lower(0) INTA(0) */ 3031 PDMDevHlpPCISetIrq(p This->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); 3034 3049 if (pThis->fIntMaskUsed) 3035 3050 pThis->fDelayInts = true; … … 3063 3078 * @thread EMT 3064 3079 */ 3065 static int e1kRegWriteICS(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)3080 static int e1kRegWriteICS(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 3066 3081 { 3067 3082 RT_NOREF_PV(offset); RT_NOREF_PV(index); 3068 3083 E1K_INC_ISTAT_CNT(pThis->uStatIntICS); 3069 return e1kRaiseInterrupt(p This, 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); 3070 3085 } 3071 3086 … … 3082 3097 * @thread EMT 3083 3098 */ 3084 static int e1kRegWriteIMS(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)3099 static int e1kRegWriteIMS(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 3085 3100 { 3086 3101 RT_NOREF_PV(offset); RT_NOREF_PV(index); … … 3096 3111 { 3097 3112 E1K_INC_ISTAT_CNT(pThis->uStatIntIMS); 3098 e1kPostponeInterrupt(p This, E1K_IMS_INT_DELAY_NS);3113 e1kPostponeInterrupt(pDevIns, pThis, E1K_IMS_INT_DELAY_NS); 3099 3114 } 3100 3115 … … 3114 3129 * @thread EMT 3115 3130 */ 3116 static int e1kRegWriteIMC(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)3131 static int e1kRegWriteIMC(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 3117 3132 { 3118 3133 RT_NOREF_PV(offset); RT_NOREF_PV(index); … … 3132 3147 E1kLogRel(("E1000: irq lowered (IMC), icr=0x%x\n", ICR)); 3133 3148 /* Lower(0) INTA(0) */ 3134 PDMDevHlpPCISetIrq(p This->CTX_SUFF(pDevIns), 0, 0);3149 PDMDevHlpPCISetIrq(pDevIns, 0, 0); 3135 3150 pThis->fIntRaised = false; 3136 3151 E1kLog(("%s e1kRegWriteIMC: Lowered IRQ: ICR=%08x\n", pThis->szPrf, ICR)); … … 3153 3168 * @thread EMT 3154 3169 */ 3155 static int e1kRegWriteRCTL(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)3170 static int e1kRegWriteRCTL(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 3156 3171 { 3157 3172 /* Update promiscuous mode */ … … 3180 3195 3181 3196 /* Update the register */ 3182 e1kRegWriteDefault(pThis, offset, index, value); 3183 3184 return VINF_SUCCESS; 3197 return e1kRegWriteDefault(pDevIns, pThis, offset, index, value); 3185 3198 } 3186 3199 … … 3197 3210 * @thread EMT 3198 3211 */ 3199 static int e1kRegWritePBA(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)3200 { 3201 e1kRegWriteDefault(p This, offset, index, value);3212 static int e1kRegWritePBA(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 3213 { 3214 e1kRegWriteDefault(pDevIns, pThis, offset, index, value); 3202 3215 PBA_st->txa = 64 - PBA_st->rxa; 3203 3216 … … 3220 3233 * @thread EMT 3221 3234 */ 3222 static int e1kRegWriteRDT(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)3235 static int e1kRegWriteRDT(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 3223 3236 { 3224 3237 #ifndef IN_RING3 … … 3246 3259 } 3247 3260 #endif /* !E1K_WITH_RXD_CACHE */ 3248 rc = e1kRegWriteDefault(p This, offset, index, value);3261 rc = e1kRegWriteDefault(pDevIns, pThis, offset, index, value); 3249 3262 #ifdef E1K_WITH_RXD_CACHE 3250 3263 /* … … 3301 3314 * @thread EMT 3302 3315 */ 3303 static int e1kRegWriteRDTR(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)3304 { 3305 e1kRegWriteDefault(p This, offset, index, value);3316 static int e1kRegWriteRDTR(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 3317 { 3318 e1kRegWriteDefault(pDevIns, pThis, offset, index, value); 3306 3319 if (value & RDTR_FPD) 3307 3320 { 3308 3321 /* Flush requested, cancel both timers and raise interrupt */ 3309 3322 #ifdef E1K_USE_RX_TIMERS 3310 e1kCancelTimer(p This, pThis->CTX_SUFF(pRIDTimer));3311 e1kCancelTimer(p This, pThis->CTX_SUFF(pRADTimer));3323 e1kCancelTimer(pDevIns, pThis, pThis->hRIDTimer); 3324 e1kCancelTimer(pDevIns, pThis, pThis->hRADTimer); 3312 3325 #endif 3313 3326 E1K_INC_ISTAT_CNT(pThis->uStatIntRDTR); 3314 return e1kRaiseInterrupt(p This, VINF_IOM_R3_MMIO_WRITE, ICR_RXT0);3327 return e1kRaiseInterrupt(pDevIns, pThis, VINF_IOM_R3_MMIO_WRITE, ICR_RXT0); 3315 3328 } 3316 3329 … … 3378 3391 /* Cancel absolute delay timer as we have already got attention */ 3379 3392 # ifndef E1K_NO_TAD 3380 e1kCancelTimer(p This, pThis->CTX_SUFF(pTADTimer));3393 e1kCancelTimer(pDevIns, pThis, pThis->hTADTimer); 3381 3394 # endif 3382 e1kRaiseInterrupt(p This, ICR_TXDW);3395 e1kRaiseInterrupt(pDevIns, pThis, ICR_TXDW); 3383 3396 } 3384 3397 … … 3401 3414 E1K_INC_ISTAT_CNT(pThis->uStatTAD); 3402 3415 /* Cancel interrupt delay timer as we have already got attention */ 3403 e1kCancelTimer(p This, pThis->CTX_SUFF(pTIDTimer));3404 e1kRaiseInterrupt(p This, ICR_TXDW);3416 e1kCancelTimer(pDevIns, pThis, pThis->hTIDTimer); 3417 e1kRaiseInterrupt(pDevIns, pThis, ICR_TXDW); 3405 3418 } 3406 3419 … … 3424 3437 E1K_INC_ISTAT_CNT(pThis->uStatRID); 3425 3438 /* Cancel absolute delay timer as we have already got attention */ 3426 e1kCancelTimer(p This, pThis->CTX_SUFF(pRADTimer));3427 e1kRaiseInterrupt(p This, ICR_RXT0);3439 e1kCancelTimer(pDevIns, pThis, pThis->hRADTimer); 3440 e1kRaiseInterrupt(pDevIns, pThis, ICR_RXT0); 3428 3441 } 3429 3442 … … 3444 3457 E1K_INC_ISTAT_CNT(pThis->uStatRAD); 3445 3458 /* Cancel interrupt delay timer as we have already got attention */ 3446 e1kCancelTimer(p This, pThis->CTX_SUFF(pRIDTimer));3447 e1kRaiseInterrupt(p This, ICR_RXT0);3459 e1kCancelTimer(pDevIns, pThis, pThis->hRIDTimer); 3460 e1kRaiseInterrupt(pDevIns, pThis, ICR_RXT0); 3448 3461 } 3449 3462 … … 3470 3483 pThis->iStatIntLost--; 3471 3484 # endif 3472 e1kRaiseInterrupt(p This, VERR_SEM_BUSY, 0);3485 e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, 0); 3473 3486 STAM_PROFILE_ADV_STOP(&pThis->StatLateIntTimer, a); 3474 3487 } … … 3497 3510 /* 82543GC does not have an internal PHY */ 3498 3511 if (pThis->eChip == E1K_CHIP_82543GC || (CTRL & CTRL_SLU)) 3499 e1kR3LinkUp(p This);3512 e1kR3LinkUp(pDevIns, pThis); 3500 3513 } 3501 3514 #ifdef E1K_LSC_ON_RESET 3502 3515 else if (pThis->eChip == E1K_CHIP_82543GC) 3503 e1kR3LinkDown(p This);3516 e1kR3LinkDown(pDevIns, pThis); 3504 3517 #endif /* E1K_LSC_ON_RESET */ 3505 3518 } … … 3949 3962 * a real ethernet wire. 3950 3963 * 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. 3953 3967 * @thread E1000_TX 3954 3968 */ 3955 static void e1kTransmitFrame(P E1KSTATE pThis, bool fOnWorkerThread)3969 static void e1kTransmitFrame(PPDMDEVINS pDevIns, PE1KSTATE pThis, bool fOnWorkerThread) 3956 3970 { 3957 3971 PPDMSCATTERGATHER pSg = pThis->CTX_SUFF(pTxSg); … … 4058 4072 RT_ZERO(status); 4059 4073 status.fPIF = true; 4060 e1kHandleRxPacket(p This, pSg->aSegs[0].pvSeg, cbFrame, status);4074 e1kHandleRxPacket(pDevIns, pThis, pSg->aSegs[0].pvSeg, cbFrame, status); 4061 4075 rc = VINF_SUCCESS; 4062 4076 } … … 4127 4141 * legacy.u64BufAddr. 4128 4142 * 4129 * @param pThis The device state structure. 4143 * @param pDevIns The device instance. 4144 * @param pThis The device state structure. 4130 4145 * @param pDesc Pointer to the descriptor to transmit. 4131 4146 * @param u16Len Length of buffer to the end of segment. … … 4135 4150 */ 4136 4151 #ifndef E1K_WITH_TXD_CACHE 4137 static void e1kFallbackAddSegment(P E1KSTATE pThis, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend, bool fOnWorkerThread)4152 static void e1kFallbackAddSegment(PPDMDEVINS pDevIns, PE1KSTATE pThis, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend, bool fOnWorkerThread) 4138 4153 { 4139 4154 /* TCP header being transmitted */ … … 4231 4246 pThis->CTX_SUFF(pTxSg)->aSegs[0].cbSeg = pThis->u16TxPktLen; 4232 4247 } 4233 e1kTransmitFrame(p This, fOnWorkerThread);4248 e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread); 4234 4249 4235 4250 /* Update Sequence Number */ … … 4241 4256 } 4242 4257 #else /* E1K_WITH_TXD_CACHE */ 4243 static int e1kFallbackAddSegment(P E1KSTATE pThis, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend, bool fOnWorkerThread)4258 static int e1kFallbackAddSegment(PPDMDEVINS pDevIns, PE1KSTATE pThis, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend, bool fOnWorkerThread) 4244 4259 { 4245 4260 int rc = VINF_SUCCESS; … … 4349 4364 pThis->CTX_SUFF(pTxSg)->aSegs[0].cbSeg = cbCopy; 4350 4365 } 4351 e1kTransmitFrame(p This, fOnWorkerThread);4366 e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread); 4352 4367 4353 4368 /* Update Sequence Number */ … … 4410 4425 /* This descriptor fits completely into current segment */ 4411 4426 cb = cbFragment; 4412 e1kFallbackAddSegment(p This, pDesc->data.u64BufAddr, cb, pDesc->data.cmd.fEOP /*fSend*/, fOnWorkerThread);4427 e1kFallbackAddSegment(pDevIns, pThis, pDesc->data.u64BufAddr, cb, pDesc->data.cmd.fEOP /*fSend*/, fOnWorkerThread); 4413 4428 } 4414 4429 else 4415 4430 { 4416 e1kFallbackAddSegment(p This, pDesc->data.u64BufAddr, cb, true /*fSend*/, fOnWorkerThread);4431 e1kFallbackAddSegment(pDevIns, pThis, pDesc->data.u64BufAddr, cb, true /*fSend*/, fOnWorkerThread); 4417 4432 /* 4418 4433 * Rewind the packet tail pointer to the beginning of payload, … … 4447 4462 * @returns error code 4448 4463 * 4449 * @param pThis The device state structure. 4464 * @param pDevIns The device instance. 4465 * @param pThis The device state structure. 4450 4466 * @param pDesc Pointer to the descriptor to transmit. 4451 4467 * @param cbFragment Length of descriptor's buffer. … … 4453 4469 * @thread E1000_TX 4454 4470 */ 4455 static int e1kFallbackAddToFrame(P E1KSTATE pThis, E1KTXDESC *pDesc, bool fOnWorkerThread)4471 static int e1kFallbackAddToFrame(PPDMDEVINS pDevIns, PE1KSTATE pThis, E1KTXDESC *pDesc, bool fOnWorkerThread) 4456 4472 { 4457 4473 #ifdef VBOX_STRICT … … 4479 4495 /* This descriptor fits completely into current segment */ 4480 4496 cb = pDesc->data.cmd.u20DTALEN; 4481 rc = e1kFallbackAddSegment(p This, 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); 4482 4498 } 4483 4499 else 4484 4500 { 4485 rc = e1kFallbackAddSegment(p This, pDesc->data.u64BufAddr, cb, true /*fSend*/, fOnWorkerThread);4501 rc = e1kFallbackAddSegment(pDevIns, pThis, pDesc->data.u64BufAddr, cb, true /*fSend*/, fOnWorkerThread); 4486 4502 /* 4487 4503 * Rewind the packet tail pointer to the beginning of payload, … … 4568 4584 * @thread E1000_TX 4569 4585 */ 4570 static void e1kDescReport(P E1KSTATE pThis, E1KTXDESC *pDesc, RTGCPHYS addr)4586 static void e1kDescReport(PPDMDEVINS pDevIns, PE1KSTATE pThis, E1KTXDESC *pDesc, RTGCPHYS addr) 4571 4587 { 4572 4588 /* … … 4606 4622 //else { 4607 4623 /* Arm the timer to fire in TIVD usec (discard .024) */ 4608 e1kArmTimer(p This, pThis->CTX_SUFF(pTIDTimer), TIDV);4624 e1kArmTimer(pDevIns, pThis, pThis->hTIDTimer, TIDV); 4609 4625 # ifndef E1K_NO_TAD 4610 4626 /* If absolute timer delay is enabled and the timer is not running yet, arm it. */ 4611 4627 E1kLog2(("%s Checking if TAD timer is running\n", 4612 4628 pThis->szPrf)); 4613 if (TADV != 0 && ! TMTimerIsActive(pThis->CTX_SUFF(pTADTimer)))4614 e1kArmTimer(p This, pThis->CTX_SUFF(pTADTimer), TADV);4629 if (TADV != 0 && !PDMDevHlpTimerIsActive(pDevIns, pThis->hTADTimer)) 4630 e1kArmTimer(pDevIns, pThis, pThis->hTADTimer, TADV); 4615 4631 # endif /* E1K_NO_TAD */ 4616 4632 } … … 4623 4639 /* Cancel both timers if armed and fire immediately. */ 4624 4640 # ifndef E1K_NO_TAD 4625 TMTimerStop(pThis->CTX_SUFF(pTADTimer));4641 PDMDevHlpTimerStop(pDevIns, pThis->hTADTimer); 4626 4642 # endif 4627 TMTimerStop(pThis->CTX_SUFF(pTIDTimer));4643 PDMDevHlpTimerStop(pDevIns, pThis->hTIDTimer); 4628 4644 } 4629 4645 //#endif /* E1K_USE_TX_TIMERS */ 4630 4646 E1K_INC_ISTAT_CNT(pThis->uStatIntTx); 4631 e1kRaiseInterrupt(p This, VERR_SEM_BUSY, ICR_TXDW);4647 e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_TXDW); 4632 4648 //#ifdef E1K_USE_TX_TIMERS 4633 4649 } … … 4651 4667 * - context sets up the context for following data descriptors. 4652 4668 * 4653 * @param pThis The device state structure. 4669 * @param pDevIns The device instance. 4670 * @param pThis The device state structure. 4654 4671 * @param pDesc Pointer to descriptor union. 4655 4672 * @param addr Physical address of descriptor in guest memory. … … 4657 4674 * @thread E1000_TX 4658 4675 */ 4659 static int e1kXmitDesc(P E1KSTATE pThis, E1KTXDESC *pDesc, RTGCPHYS addr, bool fOnWorkerThread)4676 static int e1kXmitDesc(PPDMDEVINS pDevIns, PE1KSTATE pThis, E1KTXDESC *pDesc, RTGCPHYS addr, bool fOnWorkerThread) 4660 4677 { 4661 4678 int rc = VINF_SUCCESS; … … 4666 4683 //#ifdef E1K_USE_TX_TIMERS 4667 4684 if (pThis->fTidEnabled) 4668 e1kCancelTimer(p This, pThis->CTX_SUFF(pTIDTimer));4685 e1kCancelTimer(pDevIns, pThis, pThis->hTIDTimer); 4669 4686 //#endif /* E1K_USE_TX_TIMERS */ 4670 4687 … … 4784 4801 && pThis->CTX_SUFF(pTxSg)->cbUsed == (size_t)pThis->contextTSE.dw3.u8HDRLEN + pThis->contextTSE.dw2.u20PAYLEN) 4785 4802 { 4786 e1kTransmitFrame(p This, fOnWorkerThread);4803 e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread); 4787 4804 E1K_INC_CNT32(TSCTC); 4788 4805 } … … 4818 4835 pThis->contextNormal.tu.u8CSS, 4819 4836 pThis->contextNormal.tu.u16CSE); 4820 e1kTransmitFrame(p This, fOnWorkerThread);4837 e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread); 4821 4838 } 4822 4839 else … … 4828 4845 { 4829 4846 STAM_COUNTER_INC(&pThis->StatTxPathFallback); 4830 e1kFallbackAddToFrame(p This, pDesc, pDesc->data.cmd.u20DTALEN, fOnWorkerThread);4847 e1kFallbackAddToFrame(pDevIns, pThis, pDesc, pDesc->data.cmd.u20DTALEN, fOnWorkerThread); 4831 4848 } 4832 4849 … … 4877 4894 pThis->u16VTagTCI = pDesc->legacy.dw3.u16Special; 4878 4895 /** @todo Offload processing goes here. */ 4879 e1kTransmitFrame(p This, fOnWorkerThread);4896 e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread); 4880 4897 pThis->u16TxPktLen = 0; 4881 4898 } … … 4911 4928 * - context sets up the context for following data descriptors. 4912 4929 * 4913 * @param pThis The device state structure. 4930 * @param pDevIns The device instance. 4931 * @param pThis The device state structure. 4914 4932 * @param pDesc Pointer to descriptor union. 4915 4933 * @param addr Physical address of descriptor in guest memory. … … 4918 4936 * @thread E1000_TX 4919 4937 */ 4920 static int e1kXmitDesc(PE1KSTATE pThis, E1KTXDESC *pDesc, RTGCPHYS addr, 4921 bool fOnWorkerThread) 4938 static int e1kXmitDesc(PPDMDEVINS pDevIns, PE1KSTATE pThis, E1KTXDESC *pDesc, RTGCPHYS addr, bool fOnWorkerThread) 4922 4939 { 4923 4940 int rc = VINF_SUCCESS; … … 4928 4945 { 4929 4946 E1kLog(("%s e1kXmitDesc: skipping bad descriptor ^^^\n", pThis->szPrf)); 4930 e1kDescReport(p This, pDesc, addr);4947 e1kDescReport(pDevIns, pThis, pDesc, addr); 4931 4948 return VINF_SUCCESS; 4932 4949 } … … 4934 4951 //#ifdef E1K_USE_TX_TIMERS 4935 4952 if (pThis->fTidEnabled) 4936 TMTimerStop(pThis->CTX_SUFF(pTIDTimer));4953 PDMDevHlpTimerStop(pDevIns, pThis->hTIDTimer); 4937 4954 //#endif /* E1K_USE_TX_TIMERS */ 4938 4955 … … 4942 4959 /* The caller have already updated the context */ 4943 4960 E1K_INC_ISTAT_CNT(pThis->uStatDescCtx); 4944 e1kDescReport(p This, pDesc, addr);4961 e1kDescReport(pDevIns, pThis, pDesc, addr); 4945 4962 break; 4946 4963 … … 4957 4974 if (pDesc->data.cmd.fEOP) 4958 4975 { 4959 e1kTransmitFrame(p This, fOnWorkerThread);4976 e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread); 4960 4977 pThis->u16TxPktLen = 0; 4961 4978 } … … 4977 4994 && pThis->CTX_SUFF(pTxSg)->cbUsed == (size_t)pThis->contextTSE.dw3.u8HDRLEN + pThis->contextTSE.dw2.u20PAYLEN) 4978 4995 { 4979 e1kTransmitFrame(p This, fOnWorkerThread);4996 e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread); 4980 4997 E1K_INC_CNT32(TSCTC); 4981 4998 } … … 5011 5028 pThis->contextNormal.tu.u8CSS, 5012 5029 pThis->contextNormal.tu.u16CSE); 5013 e1kTransmitFrame(p This, fOnWorkerThread);5030 e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread); 5014 5031 } 5015 5032 else … … 5021 5038 { 5022 5039 STAM_COUNTER_INC(&pThis->StatTxPathFallback); 5023 rc = e1kFallbackAddToFrame(p This, pDesc, fOnWorkerThread);5040 rc = e1kFallbackAddToFrame(pDevIns, pThis, pDesc, fOnWorkerThread); 5024 5041 } 5025 5042 } 5026 e1kDescReport(p This, pDesc, addr);5043 e1kDescReport(pDevIns, pThis, pDesc, addr); 5027 5044 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatTransmit), a); 5028 5045 break; … … 5055 5072 0); 5056 5073 } 5057 e1kTransmitFrame(p This, fOnWorkerThread);5074 e1kTransmitFrame(pDevIns, pThis, fOnWorkerThread); 5058 5075 pThis->u16TxPktLen = 0; 5059 5076 } … … 5066 5083 } 5067 5084 } 5068 e1kDescReport(p This, pDesc, addr);5085 e1kDescReport(pDevIns, pThis, pDesc, addr); 5069 5086 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatTransmit), a); 5070 5087 break; … … 5230 5247 } 5231 5248 5232 static int e1kXmitPacket(P E1KSTATE pThis, bool fOnWorkerThread)5249 static int e1kXmitPacket(PPDMDEVINS pDevIns, PE1KSTATE pThis, bool fOnWorkerThread) 5233 5250 { 5234 5251 int rc = VINF_SUCCESS; … … 5242 5259 E1kLog3(("%s About to process new TX descriptor at %08x%08x, TDLEN=%08x, TDH=%08x, TDT=%08x\n", 5243 5260 pThis->szPrf, TDBAH, TDBAL + TDH * sizeof(E1KTXDESC), TDLEN, TDH, TDT)); 5244 rc = e1kXmitDesc(p This, pDesc, e1kDescAddr(TDBAH, TDBAL, TDH), fOnWorkerThread);5261 rc = e1kXmitDesc(pDevIns, pThis, pDesc, e1kDescAddr(TDBAH, TDBAL, TDH), fOnWorkerThread); 5245 5262 if (RT_FAILURE(rc)) 5246 5263 break; … … 5252 5269 E1kLog2(("%s Low on transmit descriptors, raise ICR.TXD_LOW, len=%x thresh=%x\n", 5253 5270 pThis->szPrf, e1kGetTxLen(pThis), GET_BITS(TXDCTL, LWTHRESH)*8)); 5254 e1kRaiseInterrupt(p This, VERR_SEM_BUSY, ICR_TXD_LOW);5271 e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_TXD_LOW); 5255 5272 } 5256 5273 ++pThis->iTxDCurrent; … … 5320 5337 E1kLog2(("%s Low on transmit descriptors, raise ICR.TXD_LOW, len=%x thresh=%x\n", 5321 5338 pThis->szPrf, e1kGetTxLen(pThis), GET_BITS(TXDCTL, LWTHRESH)*8)); 5322 e1kRaiseInterrupt(p This, VERR_SEM_BUSY, ICR_TXD_LOW);5339 e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_TXD_LOW); 5323 5340 } 5324 5341 … … 5327 5344 5328 5345 /// @todo uncomment: pThis->uStatIntTXQE++; 5329 /// @todo uncomment: e1kRaiseInterrupt(p This, ICR_TXQE);5346 /// @todo uncomment: e1kRaiseInterrupt(pDevIns, pThis, ICR_TXQE); 5330 5347 /* 5331 5348 * Release the lock. … … 5374 5391 * @returns VBox status code. VERR_TRY_AGAIN is returned if we're busy. 5375 5392 * 5376 * @param pThis The E1000 state. 5393 * @param pDevIns The device instance. 5394 * @param pThis The E1000 state. 5377 5395 * @param fOnWorkerThread Whether we're on a worker thread or on an EMT. 5378 5396 */ 5379 static int e1kXmitPending(P E1KSTATE pThis, bool fOnWorkerThread)5397 static int e1kXmitPending(PPDMDEVINS pDevIns, PE1KSTATE pThis, bool fOnWorkerThread) 5380 5398 { 5381 5399 int rc = VINF_SUCCESS; … … 5421 5439 goto out; 5422 5440 /* Copy the packet to allocated buffer and send it. */ 5423 rc = e1kXmitPacket(p This, fOnWorkerThread);5441 rc = e1kXmitPacket(pDevIns, pThis, fOnWorkerThread); 5424 5442 /* If we're out of bandwidth we'll come back later. */ 5425 5443 if (RT_FAILURE(rc)) … … 5485 5503 E1kLog2(("%s Out of transmit descriptors, raise ICR.TXD_LOW\n", 5486 5504 pThis->szPrf)); 5487 e1kRaiseInterrupt(p This, VERR_SEM_BUSY, ICR_TXD_LOW);5505 e1kRaiseInterrupt(pDevIns, pThis, VERR_SEM_BUSY, ICR_TXD_LOW); 5488 5506 } 5489 5507 out: … … 5491 5509 5492 5510 /// @todo uncomment: pThis->uStatIntTXQE++; 5493 /// @todo uncomment: e1kRaiseInterrupt(p This, ICR_TXQE);5511 /// @todo uncomment: e1kRaiseInterrupt(pDevIns, pThis, ICR_TXQE); 5494 5512 5495 5513 e1kCsTxLeave(pThis); … … 5516 5534 /* Resume suspended transmission */ 5517 5535 STATUS &= ~STATUS_TXOFF; 5518 e1kXmitPending(pThis , true /*fOnWorkerThread*/);5536 e1kXmitPending(pThis->pDevInsR3, pThis, true /*fOnWorkerThread*/); 5519 5537 } 5520 5538 … … 5534 5552 E1kLog2(("%s e1kTxQueueConsumer:\n", pThis->szPrf)); 5535 5553 5536 int rc = e1kXmitPending(p This, false /*fOnWorkerThread*/); NOREF(rc);5554 int rc = e1kXmitPending(pDevIns, pThis, false /*fOnWorkerThread*/); NOREF(rc); 5537 5555 AssertMsg(RT_SUCCESS(rc) || rc == VERR_TRY_AGAIN || rc == VERR_NET_DOWN, ("%Rrc\n", rc)); 5538 5556 return true; … … 5561 5579 * @thread EMT 5562 5580 */ 5563 static int e1kRegWriteTDT(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)5564 { 5565 int rc = e1kRegWriteDefault(p This, offset, index, value);5581 static 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); 5566 5584 5567 5585 /* All descriptors starting with head and not including tail belong to us. */ … … 5583 5601 if (RT_LIKELY(rc == VINF_SUCCESS)) 5584 5602 { 5585 if (! TMTimerIsActive(pThis->CTX_SUFF(pTXDTimer)))5603 if (!PDMDevInsTimerIsActive(pDevIns, pThis->hTXDTimer)) 5586 5604 { 5587 5605 #ifdef E1K_INT_STATS 5588 5606 pThis->u64ArmedAt = RTTimeNanoTS(); 5589 5607 #endif 5590 e1kArmTimer(p This, pThis->CTX_SUFF(pTXDTimer), E1K_TX_DELAY);5608 e1kArmTimer(pDevIns, pThis, pThis->hTXDTimer, E1K_TX_DELAY); 5591 5609 } 5592 5610 E1K_INC_ISTAT_CNT(pThis->uStatTxDelayed); … … 5606 5624 #endif 5607 5625 { 5608 rc = e1kXmitPending(p This, false /*fOnWorkerThread*/);5626 rc = e1kXmitPending(pDevIns, pThis, false /*fOnWorkerThread*/); 5609 5627 if (rc == VERR_TRY_AGAIN) 5610 5628 rc = VINF_SUCCESS; … … 5627 5645 * @thread EMT 5628 5646 */ 5629 static int e1kRegWriteMTA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 5630 { 5647 static int e1kRegWriteMTA(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 5648 { 5649 RT_NOREF_PV(pDevIns); 5631 5650 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; 5633 5652 5634 5653 return VINF_SUCCESS; … … 5645 5664 * @thread EMT 5646 5665 */ 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); 5666 static 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); 5650 5670 *pu32Value = pThis->auMTA[(offset - g_aE1kRegMap[index].offset)/sizeof(pThis->auMTA[0])]; 5651 5671 … … 5662 5682 * @thread EMT 5663 5683 */ 5664 static int e1kRegWriteRA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 5665 { 5684 static int e1kRegWriteRA(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 5685 { 5686 RT_NOREF_PV(pDevIns); 5666 5687 AssertReturn(offset - g_aE1kRegMap[index].offset < sizeof(pThis->aRecAddr.au32), VERR_DEV_IO_ERROR); 5667 5688 pThis->aRecAddr.au32[(offset - g_aE1kRegMap[index].offset)/sizeof(pThis->aRecAddr.au32[0])] = value; … … 5680 5701 * @thread EMT 5681 5702 */ 5682 static int e1kRegReadRA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 5683 { 5703 static int e1kRegReadRA(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 5704 { 5705 RT_NOREF_PV(pDevIns); 5684 5706 AssertReturn(offset - g_aE1kRegMap[index].offset< sizeof(pThis->aRecAddr.au32), VERR_DEV_IO_ERROR); 5685 5707 *pu32Value = pThis->aRecAddr.au32[(offset - g_aE1kRegMap[index].offset)/sizeof(pThis->aRecAddr.au32[0])]; … … 5697 5719 * @thread EMT 5698 5720 */ 5699 static int e1kRegWriteVFTA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 5700 { 5721 static int e1kRegWriteVFTA(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 5722 { 5723 RT_NOREF_PV(pDevIns); 5701 5724 AssertReturn(offset - g_aE1kRegMap[index].offset < sizeof(pThis->auVFTA), VINF_SUCCESS); 5702 5725 pThis->auVFTA[(offset - g_aE1kRegMap[index].offset)/sizeof(pThis->auVFTA[0])] = value; … … 5715 5738 * @thread EMT 5716 5739 */ 5717 static int e1kRegReadVFTA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 5718 { 5740 static int e1kRegReadVFTA(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 5741 { 5742 RT_NOREF_PV(pDevIns); 5719 5743 AssertReturn(offset - g_aE1kRegMap[index].offset< sizeof(pThis->auVFTA), VERR_DEV_IO_ERROR); 5720 5744 *pu32Value = pThis->auVFTA[(offset - g_aE1kRegMap[index].offset)/sizeof(pThis->auVFTA[0])]; … … 5735 5759 * @thread EMT 5736 5760 */ 5737 static int e1kRegReadUnimplemented(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)5738 { 5739 RT_NOREF 3(pThis, offset, index);5761 static int e1kRegReadUnimplemented(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 5762 { 5763 RT_NOREF(pDevIns, pThis, offset, index); 5740 5764 E1kLog(("%s At %08X read (00000000) attempt from unimplemented register %s (%s)\n", 5741 5765 pThis->szPrf, offset, g_aE1kRegMap[index].abbrev, g_aE1kRegMap[index].name)); … … 5761 5785 * @thread EMT 5762 5786 */ 5763 static int e1kRegReadAutoClear(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)5787 static int e1kRegReadAutoClear(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 5764 5788 { 5765 5789 AssertReturn(index < E1K_NUM_OF_32BIT_REGS, VERR_DEV_IO_ERROR); 5766 int rc = e1kRegReadDefault(p This, offset, index, pu32Value);5790 int rc = e1kRegReadDefault(pDevIns, pThis, offset, index, pu32Value); 5767 5791 pThis->auRegs[index] = 0; 5768 5792 … … 5786 5810 * @thread EMT 5787 5811 */ 5788 static int e1kRegReadDefault(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value)5789 { 5790 RT_NOREF_PV( offset);5812 static 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); 5791 5815 5792 5816 AssertReturn(index < E1K_NUM_OF_32BIT_REGS, VERR_DEV_IO_ERROR); … … 5808 5832 */ 5809 5833 5810 static int e1kRegWriteUnimplemented(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)5811 { 5812 RT_NOREF_PV(p This); 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); 5813 5837 5814 5838 E1kLog(("%s At %08X write attempt (%08X) to unimplemented register %s (%s)\n", … … 5834 5858 */ 5835 5859 5836 static int e1kRegWriteDefault(P E1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value)5837 { 5838 RT_NOREF _PV(offset);5860 static int e1kRegWriteDefault(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 5861 { 5862 RT_NOREF(pDevIns, offset); 5839 5863 5840 5864 AssertReturn(index < E1K_NUM_OF_32BIT_REGS, VERR_DEV_IO_ERROR); … … 5912 5936 * @returns VBox status code. 5913 5937 * 5938 * @param pDevIns The device instance. 5914 5939 * @param pThis The device state structure. 5915 5940 * @param offReg Register offset in memory-mapped frame. … … 5920 5945 * accesses we have to take care of that ourselves. 5921 5946 */ 5922 static int e1kRegReadUnaligned(P E1KSTATE pThis, uint32_t offReg, void *pv, uint32_t cb)5947 static int e1kRegReadUnaligned(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offReg, void *pv, uint32_t cb) 5923 5948 { 5924 5949 uint32_t u32 = 0; … … 5971 5996 //pThis->iStatIntLost += pThis->iStatIntLostOne; 5972 5997 //pThis->iStatIntLostOne = 0; 5973 rc = g_aE1kRegMap[index].pfnRead(p This, offReg & 0xFFFFFFFC, index, &u32);5998 rc = g_aE1kRegMap[index].pfnRead(pDevIns, pThis, offReg & 0xFFFFFFFC, index, &u32); 5974 5999 u32 &= mask; 5975 6000 //e1kCsLeave(pThis); … … 6002 6027 * @returns VBox status code. 6003 6028 * 6029 * @param pDevIns The device instance. 6004 6030 * @param pThis The device state structure. 6005 6031 * @param offReg Register offset in memory-mapped frame. … … 6007 6033 * @thread EMT 6008 6034 */ 6009 static VBOXSTRICTRC e1kRegReadAlignedU32(P E1KSTATE pThis, uint32_t offReg, uint32_t *pu32)6035 static VBOXSTRICTRC e1kRegReadAlignedU32(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offReg, uint32_t *pu32) 6010 6036 { 6011 6037 Assert(!(offReg & 3)); … … 6031 6057 //pThis->iStatIntLost += pThis->iStatIntLostOne; 6032 6058 //pThis->iStatIntLostOne = 0; 6033 rc = g_aE1kRegMap[idxReg].pfnRead(p This, offReg & 0xFFFFFFFC, idxReg, pu32);6059 rc = g_aE1kRegMap[idxReg].pfnRead(pDevIns, pThis, offReg & 0xFFFFFFFC, idxReg, pu32); 6034 6060 //e1kCsLeave(pThis); 6035 6061 Log6(("%s At %08X read %08X from %s (%s)\n", … … 6054 6080 * @returns VBox status code. 6055 6081 * 6082 * @param pDevIns The device instance. 6056 6083 * @param pThis The device state structure. 6057 6084 * @param offReg Register offset in memory-mapped frame. … … 6059 6086 * @thread EMT 6060 6087 */ 6061 static VBOXSTRICTRC e1kRegWriteAlignedU32(P E1KSTATE pThis, uint32_t offReg, uint32_t u32Value)6088 static VBOXSTRICTRC e1kRegWriteAlignedU32(PPDMDEVINS pDevIns, PE1KSTATE pThis, uint32_t offReg, uint32_t u32Value) 6062 6089 { 6063 6090 VBOXSTRICTRC rc = VINF_SUCCESS; … … 6080 6107 //pThis->iStatIntLost += pThis->iStatIntLostOne; 6081 6108 //pThis->iStatIntLostOne = 0; 6082 rc = g_aE1kRegMap[index].pfnWrite(p This, offReg, index, u32Value);6109 rc = g_aE1kRegMap[index].pfnWrite(pDevIns, pThis, offReg, index, u32Value); 6083 6110 //e1kCsLeave(pThis); 6084 6111 } … … 6111 6138 Assert(!(off & 3)); 6112 6139 6113 VBOXSTRICTRC rcStrict = e1kRegReadAlignedU32(p This, (uint32_t)off, (uint32_t *)pv);6140 VBOXSTRICTRC rcStrict = e1kRegReadAlignedU32(pDevIns, pThis, (uint32_t)off, (uint32_t *)pv); 6114 6141 6115 6142 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatMMIORead), a); … … 6130 6157 Assert(!(off & 3)); 6131 6158 6132 VBOXSTRICTRC rcStrict = e1kRegWriteAlignedU32(p This, (uint32_t)off, *(uint32_t const *)pv);6159 VBOXSTRICTRC rcStrict = e1kRegWriteAlignedU32(pDevIns, pThis, (uint32_t)off, *(uint32_t const *)pv); 6133 6160 6134 6161 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatMMIOWrite), a); … … 6157 6184 case 0x04: /* IODATA */ 6158 6185 if (!(pThis->uSelectedReg & 3)) 6159 rc = e1kRegReadAlignedU32(p This, pThis->uSelectedReg, pu32);6186 rc = e1kRegReadAlignedU32(pDevIns, pThis, pThis->uSelectedReg, pu32); 6160 6187 else /** @todo r=bird: I wouldn't be surprised if this unaligned branch wasn't necessary. */ 6161 rc = e1kRegReadUnaligned(p This, pThis->uSelectedReg, pu32, cb);6188 rc = e1kRegReadUnaligned(pDevIns, pThis, pThis->uSelectedReg, pu32, cb); 6162 6189 if (rc == VINF_IOM_R3_MMIO_READ) 6163 6190 rc = VINF_IOM_R3_IOPORT_READ; … … 6167 6194 default: 6168 6195 E1kLog(("%s e1kIOPortIn: invalid port %#010x\n", pThis->szPrf, offPort)); 6196 /** @todo r=bird: Check what real hardware returns here. */ 6169 6197 //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; 6171 6200 } 6172 6201 else … … 6174 6203 E1kLog(("%s e1kIOPortIn: invalid op size: offPort=%RTiop cb=%08x", pThis->szPrf, offPort, cb)); 6175 6204 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.) */ 6176 6206 } 6177 6207 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatIORead), a); … … 6205 6235 if (RT_LIKELY(!(pThis->uSelectedReg & 3))) 6206 6236 { 6207 rc = e1kRegWriteAlignedU32(p This, pThis->uSelectedReg, u32);6237 rc = e1kRegWriteAlignedU32(pDevIns, pThis, pThis->uSelectedReg, u32); 6208 6238 if (rc == VINF_IOM_R3_MMIO_WRITE) 6209 6239 rc = VINF_IOM_R3_IOPORT_WRITE; … … 6652 6682 if (fPassed) 6653 6683 { 6654 rc = e1kHandleRxPacket(pThis , pvBuf, cb, status);6684 rc = e1kHandleRxPacket(pThis->pDevInsR3, pThis, pvBuf, cb, status); 6655 6685 } 6656 6686 //e1kCsLeave(pThis); … … 6717 6747 /* If link was down, bring it up after a while. */ 6718 6748 if (!(STATUS & STATUS_LU)) 6719 e1kBringLinkUpDelayed(pThis );6749 e1kBringLinkUpDelayed(pThis->pDevInsR3, pThis); 6720 6750 break; 6721 6751 case PDMNETWORKLINKSTATE_DOWN: … … 6726 6756 /* If link was up, bring it down. */ 6727 6757 if (STATUS & STATUS_LU) 6728 e1kR3LinkDown(pThis );6758 e1kR3LinkDown(pThis->pDevInsR3, pThis); 6729 6759 break; 6730 6760 case PDMNETWORKLINKSTATE_DOWN_RESUME: … … 6734 6764 */ 6735 6765 if (STATUS & STATUS_LU) 6736 e1kR3LinkDownTemp(pThis );6766 e1kR3LinkDownTemp(pThis->pDevInsR3, pThis); 6737 6767 break; 6738 6768 default: … … 7037 7067 && pThis->cMsLinkUpDelay) 7038 7068 { 7039 e1kR3LinkDownTemp(p This);7069 e1kR3LinkDownTemp(pDevIns, pThis); 7040 7070 } 7041 7071 return VINF_SUCCESS; … … 7445 7475 */ 7446 7476 if ((STATUS & STATUS_LU) && RT_SUCCESS(rc)) 7447 e1kR3LinkDownTemp(p This);7477 e1kR3LinkDownTemp(pDevIns, pThis); 7448 7478 7449 7479 PDMCritSectLeave(&pThis->cs); … … 7468 7498 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*); 7469 7499 #ifdef E1K_TX_DELAY 7470 e1kCancelTimer(p This, pThis->CTX_SUFF(pTXDTimer));7500 e1kCancelTimer(pDevIns, pThis, pThis->hTXDTimer); 7471 7501 #endif /* E1K_TX_DELAY */ 7472 e1kCancelTimer(p This, pThis->CTX_SUFF(pIntTimer));7473 e1kCancelTimer(p This, pThis->CTX_SUFF(pLUTimer));7502 e1kCancelTimer(pDevIns, pThis, pThis->hIntTimer); 7503 e1kCancelTimer(pDevIns, pThis, pThis->hLUTimer); 7474 7504 e1kXmitFreeBuf(pThis); 7475 7505 pThis->u16TxPktLen = 0; … … 7480 7510 pThis->fLocked = false; 7481 7511 pThis->u64AckedAt = 0; 7482 e1kHardReset(p This);7512 e1kHardReset(pDevIns, pThis); 7483 7513 } 7484 7514 … … 7515 7545 pThis->pTxQueueRC = PDMQueueRCPtr(pThis->pTxQueueR3); 7516 7546 pThis->pCanRxQueueRC = PDMQueueRCPtr(pThis->pCanRxQueueR3); 7517 #ifdef E1K_USE_RX_TIMERS7518 pThis->pRIDTimerRC = TMTimerRCPtr(pThis->pRIDTimerR3);7519 pThis->pRADTimerRC = TMTimerRCPtr(pThis->pRADTimerR3);7520 #endif /* E1K_USE_RX_TIMERS */7521 //#ifdef E1K_USE_TX_TIMERS7522 if (pThis->fTidEnabled)7523 {7524 pThis->pTIDTimerRC = TMTimerRCPtr(pThis->pTIDTimerR3);7525 # ifndef E1K_NO_TAD7526 pThis->pTADTimerRC = TMTimerRCPtr(pThis->pTADTimerR3);7527 # endif /* E1K_NO_TAD */7528 }7529 //#endif /* E1K_USE_TX_TIMERS */7530 #ifdef E1K_TX_DELAY7531 pThis->pTXDTimerRC = TMTimerRCPtr(pThis->pTXDTimerR3);7532 #endif /* E1K_TX_DELAY */7533 pThis->pIntTimerRC = TMTimerRCPtr(pThis->pIntTimerR3);7534 pThis->pLUTimerRC = TMTimerRCPtr(pThis->pLUTimerR3);7535 7547 } 7536 7548 … … 7837 7849 7838 7850 /* 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 }; 7839 7857 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); 7841 7859 AssertRCReturn(rc, rc); 7842 7860 rc = PDMDevHlpPCIIORegionRegisterIo(pDevIns, 2, E1K_IOPORT_SIZE, pThis->hIoPorts, e1kR3Map); … … 7860 7878 #ifdef E1K_TX_DELAY 7861 7879 /* 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); 7865 7882 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); 7869 7885 #endif /* E1K_TX_DELAY */ 7870 7886 … … 7873 7889 { 7874 7890 /* 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); 7882 7894 7883 7895 # ifndef E1K_NO_TAD 7884 7896 /* 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); 7892 7900 # endif /* E1K_NO_TAD */ 7893 7901 } … … 7896 7904 #ifdef E1K_USE_RX_TIMERS 7897 7905 /* 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); 7905 7909 7906 7910 /* 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); 7914 7914 #endif /* E1K_USE_RX_TIMERS */ 7915 7915 7916 7916 /* 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); 7924 7920 7925 7921 /* 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); 7933 7925 7934 7926 /* Register the info item */ … … 7974 7966 return rc; 7975 7967 7976 e1kHardReset(p This);7968 e1kHardReset(pDevIns, pThis); 7977 7969 7978 7970 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.