- Timestamp:
- Feb 5, 2013 1:16:16 PM (12 years ago)
- svn:sync-xref-src-repo-rev:
- 83594
- Location:
- trunk/src/VBox/Devices/Network
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DevE1000.cpp
r44541 r44542 187 187 //#undef DEBUG 188 188 189 #define STATE_TO_DEVINS(p State) (((E1KSTATE *)pState)->CTX_SUFF(pDevIns))189 #define STATE_TO_DEVINS(pThis) (((PE1KSTATE )pThis)->CTX_SUFF(pDevIns)) 190 190 #define E1K_RELOCATE(p, o) *(RTHCUINTPTR *)&p += o 191 191 … … 327 327 #define RDTR_FPD UINT32_C(0x80000000) 328 328 329 #define PBA_st ((PBAST*)(p State->auRegs + PBA_IDX))329 #define PBA_st ((PBAST*)(pThis->auRegs + PBA_IDX)) 330 330 typedef struct 331 331 { … … 345 345 346 346 /** @name Register access macros 347 * @remarks These ASSUME alocal variable @a pThis of type PE1KSTATE. 347 348 * @{ */ 348 #define CTRL p State->auRegs[CTRL_IDX]349 #define STATUS p State->auRegs[STATUS_IDX]350 #define EECD p State->auRegs[EECD_IDX]351 #define EERD p State->auRegs[EERD_IDX]352 #define CTRL_EXT p State->auRegs[CTRL_EXT_IDX]353 #define FLA p State->auRegs[FLA_IDX]354 #define MDIC p State->auRegs[MDIC_IDX]355 #define FCAL p State->auRegs[FCAL_IDX]356 #define FCAH p State->auRegs[FCAH_IDX]357 #define FCT p State->auRegs[FCT_IDX]358 #define VET p State->auRegs[VET_IDX]359 #define ICR p State->auRegs[ICR_IDX]360 #define ITR p State->auRegs[ITR_IDX]361 #define ICS p State->auRegs[ICS_IDX]362 #define IMS p State->auRegs[IMS_IDX]363 #define IMC p State->auRegs[IMC_IDX]364 #define RCTL p State->auRegs[RCTL_IDX]365 #define FCTTV p State->auRegs[FCTTV_IDX]366 #define TXCW p State->auRegs[TXCW_IDX]367 #define RXCW p State->auRegs[RXCW_IDX]368 #define TCTL p State->auRegs[TCTL_IDX]369 #define TIPG p State->auRegs[TIPG_IDX]370 #define AIFS p State->auRegs[AIFS_IDX]371 #define LEDCTL p State->auRegs[LEDCTL_IDX]372 #define PBA p State->auRegs[PBA_IDX]373 #define FCRTL p State->auRegs[FCRTL_IDX]374 #define FCRTH p State->auRegs[FCRTH_IDX]375 #define RDFH p State->auRegs[RDFH_IDX]376 #define RDFT p State->auRegs[RDFT_IDX]377 #define RDFHS p State->auRegs[RDFHS_IDX]378 #define RDFTS p State->auRegs[RDFTS_IDX]379 #define RDFPC p State->auRegs[RDFPC_IDX]380 #define RDBAL p State->auRegs[RDBAL_IDX]381 #define RDBAH p State->auRegs[RDBAH_IDX]382 #define RDLEN p State->auRegs[RDLEN_IDX]383 #define RDH p State->auRegs[RDH_IDX]384 #define RDT p State->auRegs[RDT_IDX]385 #define RDTR p State->auRegs[RDTR_IDX]386 #define RXDCTL p State->auRegs[RXDCTL_IDX]387 #define RADV p State->auRegs[RADV_IDX]388 #define RSRPD p State->auRegs[RSRPD_IDX]389 #define TXDMAC p State->auRegs[TXDMAC_IDX]390 #define TDFH p State->auRegs[TDFH_IDX]391 #define TDFT p State->auRegs[TDFT_IDX]392 #define TDFHS p State->auRegs[TDFHS_IDX]393 #define TDFTS p State->auRegs[TDFTS_IDX]394 #define TDFPC p State->auRegs[TDFPC_IDX]395 #define TDBAL p State->auRegs[TDBAL_IDX]396 #define TDBAH p State->auRegs[TDBAH_IDX]397 #define TDLEN p State->auRegs[TDLEN_IDX]398 #define TDH p State->auRegs[TDH_IDX]399 #define TDT p State->auRegs[TDT_IDX]400 #define TIDV p State->auRegs[TIDV_IDX]401 #define TXDCTL p State->auRegs[TXDCTL_IDX]402 #define TADV p State->auRegs[TADV_IDX]403 #define TSPMT p State->auRegs[TSPMT_IDX]404 #define CRCERRS p State->auRegs[CRCERRS_IDX]405 #define ALGNERRC p State->auRegs[ALGNERRC_IDX]406 #define SYMERRS p State->auRegs[SYMERRS_IDX]407 #define RXERRC p State->auRegs[RXERRC_IDX]408 #define MPC p State->auRegs[MPC_IDX]409 #define SCC p State->auRegs[SCC_IDX]410 #define ECOL p State->auRegs[ECOL_IDX]411 #define MCC p State->auRegs[MCC_IDX]412 #define LATECOL p State->auRegs[LATECOL_IDX]413 #define COLC p State->auRegs[COLC_IDX]414 #define DC p State->auRegs[DC_IDX]415 #define TNCRS p State->auRegs[TNCRS_IDX]416 #define SEC p State->auRegs[SEC_IDX]417 #define CEXTERR p State->auRegs[CEXTERR_IDX]418 #define RLEC p State->auRegs[RLEC_IDX]419 #define XONRXC p State->auRegs[XONRXC_IDX]420 #define XONTXC p State->auRegs[XONTXC_IDX]421 #define XOFFRXC p State->auRegs[XOFFRXC_IDX]422 #define XOFFTXC p State->auRegs[XOFFTXC_IDX]423 #define FCRUC p State->auRegs[FCRUC_IDX]424 #define PRC64 p State->auRegs[PRC64_IDX]425 #define PRC127 p State->auRegs[PRC127_IDX]426 #define PRC255 p State->auRegs[PRC255_IDX]427 #define PRC511 p State->auRegs[PRC511_IDX]428 #define PRC1023 p State->auRegs[PRC1023_IDX]429 #define PRC1522 p State->auRegs[PRC1522_IDX]430 #define GPRC p State->auRegs[GPRC_IDX]431 #define BPRC p State->auRegs[BPRC_IDX]432 #define MPRC p State->auRegs[MPRC_IDX]433 #define GPTC p State->auRegs[GPTC_IDX]434 #define GORCL p State->auRegs[GORCL_IDX]435 #define GORCH p State->auRegs[GORCH_IDX]436 #define GOTCL p State->auRegs[GOTCL_IDX]437 #define GOTCH p State->auRegs[GOTCH_IDX]438 #define RNBC p State->auRegs[RNBC_IDX]439 #define RUC p State->auRegs[RUC_IDX]440 #define RFC p State->auRegs[RFC_IDX]441 #define ROC p State->auRegs[ROC_IDX]442 #define RJC p State->auRegs[RJC_IDX]443 #define MGTPRC p State->auRegs[MGTPRC_IDX]444 #define MGTPDC p State->auRegs[MGTPDC_IDX]445 #define MGTPTC p State->auRegs[MGTPTC_IDX]446 #define TORL p State->auRegs[TORL_IDX]447 #define TORH p State->auRegs[TORH_IDX]448 #define TOTL p State->auRegs[TOTL_IDX]449 #define TOTH p State->auRegs[TOTH_IDX]450 #define TPR p State->auRegs[TPR_IDX]451 #define TPT p State->auRegs[TPT_IDX]452 #define PTC64 p State->auRegs[PTC64_IDX]453 #define PTC127 p State->auRegs[PTC127_IDX]454 #define PTC255 p State->auRegs[PTC255_IDX]455 #define PTC511 p State->auRegs[PTC511_IDX]456 #define PTC1023 p State->auRegs[PTC1023_IDX]457 #define PTC1522 p State->auRegs[PTC1522_IDX]458 #define MPTC p State->auRegs[MPTC_IDX]459 #define BPTC p State->auRegs[BPTC_IDX]460 #define TSCTC p State->auRegs[TSCTC_IDX]461 #define TSCTFC p State->auRegs[TSCTFC_IDX]462 #define RXCSUM p State->auRegs[RXCSUM_IDX]463 #define WUC p State->auRegs[WUC_IDX]464 #define WUFC p State->auRegs[WUFC_IDX]465 #define WUS p State->auRegs[WUS_IDX]466 #define MANC p State->auRegs[MANC_IDX]467 #define IPAV p State->auRegs[IPAV_IDX]468 #define WUPL p State->auRegs[WUPL_IDX]349 #define CTRL pThis->auRegs[CTRL_IDX] 350 #define STATUS pThis->auRegs[STATUS_IDX] 351 #define EECD pThis->auRegs[EECD_IDX] 352 #define EERD pThis->auRegs[EERD_IDX] 353 #define CTRL_EXT pThis->auRegs[CTRL_EXT_IDX] 354 #define FLA pThis->auRegs[FLA_IDX] 355 #define MDIC pThis->auRegs[MDIC_IDX] 356 #define FCAL pThis->auRegs[FCAL_IDX] 357 #define FCAH pThis->auRegs[FCAH_IDX] 358 #define FCT pThis->auRegs[FCT_IDX] 359 #define VET pThis->auRegs[VET_IDX] 360 #define ICR pThis->auRegs[ICR_IDX] 361 #define ITR pThis->auRegs[ITR_IDX] 362 #define ICS pThis->auRegs[ICS_IDX] 363 #define IMS pThis->auRegs[IMS_IDX] 364 #define IMC pThis->auRegs[IMC_IDX] 365 #define RCTL pThis->auRegs[RCTL_IDX] 366 #define FCTTV pThis->auRegs[FCTTV_IDX] 367 #define TXCW pThis->auRegs[TXCW_IDX] 368 #define RXCW pThis->auRegs[RXCW_IDX] 369 #define TCTL pThis->auRegs[TCTL_IDX] 370 #define TIPG pThis->auRegs[TIPG_IDX] 371 #define AIFS pThis->auRegs[AIFS_IDX] 372 #define LEDCTL pThis->auRegs[LEDCTL_IDX] 373 #define PBA pThis->auRegs[PBA_IDX] 374 #define FCRTL pThis->auRegs[FCRTL_IDX] 375 #define FCRTH pThis->auRegs[FCRTH_IDX] 376 #define RDFH pThis->auRegs[RDFH_IDX] 377 #define RDFT pThis->auRegs[RDFT_IDX] 378 #define RDFHS pThis->auRegs[RDFHS_IDX] 379 #define RDFTS pThis->auRegs[RDFTS_IDX] 380 #define RDFPC pThis->auRegs[RDFPC_IDX] 381 #define RDBAL pThis->auRegs[RDBAL_IDX] 382 #define RDBAH pThis->auRegs[RDBAH_IDX] 383 #define RDLEN pThis->auRegs[RDLEN_IDX] 384 #define RDH pThis->auRegs[RDH_IDX] 385 #define RDT pThis->auRegs[RDT_IDX] 386 #define RDTR pThis->auRegs[RDTR_IDX] 387 #define RXDCTL pThis->auRegs[RXDCTL_IDX] 388 #define RADV pThis->auRegs[RADV_IDX] 389 #define RSRPD pThis->auRegs[RSRPD_IDX] 390 #define TXDMAC pThis->auRegs[TXDMAC_IDX] 391 #define TDFH pThis->auRegs[TDFH_IDX] 392 #define TDFT pThis->auRegs[TDFT_IDX] 393 #define TDFHS pThis->auRegs[TDFHS_IDX] 394 #define TDFTS pThis->auRegs[TDFTS_IDX] 395 #define TDFPC pThis->auRegs[TDFPC_IDX] 396 #define TDBAL pThis->auRegs[TDBAL_IDX] 397 #define TDBAH pThis->auRegs[TDBAH_IDX] 398 #define TDLEN pThis->auRegs[TDLEN_IDX] 399 #define TDH pThis->auRegs[TDH_IDX] 400 #define TDT pThis->auRegs[TDT_IDX] 401 #define TIDV pThis->auRegs[TIDV_IDX] 402 #define TXDCTL pThis->auRegs[TXDCTL_IDX] 403 #define TADV pThis->auRegs[TADV_IDX] 404 #define TSPMT pThis->auRegs[TSPMT_IDX] 405 #define CRCERRS pThis->auRegs[CRCERRS_IDX] 406 #define ALGNERRC pThis->auRegs[ALGNERRC_IDX] 407 #define SYMERRS pThis->auRegs[SYMERRS_IDX] 408 #define RXERRC pThis->auRegs[RXERRC_IDX] 409 #define MPC pThis->auRegs[MPC_IDX] 410 #define SCC pThis->auRegs[SCC_IDX] 411 #define ECOL pThis->auRegs[ECOL_IDX] 412 #define MCC pThis->auRegs[MCC_IDX] 413 #define LATECOL pThis->auRegs[LATECOL_IDX] 414 #define COLC pThis->auRegs[COLC_IDX] 415 #define DC pThis->auRegs[DC_IDX] 416 #define TNCRS pThis->auRegs[TNCRS_IDX] 417 #define SEC pThis->auRegs[SEC_IDX] 418 #define CEXTERR pThis->auRegs[CEXTERR_IDX] 419 #define RLEC pThis->auRegs[RLEC_IDX] 420 #define XONRXC pThis->auRegs[XONRXC_IDX] 421 #define XONTXC pThis->auRegs[XONTXC_IDX] 422 #define XOFFRXC pThis->auRegs[XOFFRXC_IDX] 423 #define XOFFTXC pThis->auRegs[XOFFTXC_IDX] 424 #define FCRUC pThis->auRegs[FCRUC_IDX] 425 #define PRC64 pThis->auRegs[PRC64_IDX] 426 #define PRC127 pThis->auRegs[PRC127_IDX] 427 #define PRC255 pThis->auRegs[PRC255_IDX] 428 #define PRC511 pThis->auRegs[PRC511_IDX] 429 #define PRC1023 pThis->auRegs[PRC1023_IDX] 430 #define PRC1522 pThis->auRegs[PRC1522_IDX] 431 #define GPRC pThis->auRegs[GPRC_IDX] 432 #define BPRC pThis->auRegs[BPRC_IDX] 433 #define MPRC pThis->auRegs[MPRC_IDX] 434 #define GPTC pThis->auRegs[GPTC_IDX] 435 #define GORCL pThis->auRegs[GORCL_IDX] 436 #define GORCH pThis->auRegs[GORCH_IDX] 437 #define GOTCL pThis->auRegs[GOTCL_IDX] 438 #define GOTCH pThis->auRegs[GOTCH_IDX] 439 #define RNBC pThis->auRegs[RNBC_IDX] 440 #define RUC pThis->auRegs[RUC_IDX] 441 #define RFC pThis->auRegs[RFC_IDX] 442 #define ROC pThis->auRegs[ROC_IDX] 443 #define RJC pThis->auRegs[RJC_IDX] 444 #define MGTPRC pThis->auRegs[MGTPRC_IDX] 445 #define MGTPDC pThis->auRegs[MGTPDC_IDX] 446 #define MGTPTC pThis->auRegs[MGTPTC_IDX] 447 #define TORL pThis->auRegs[TORL_IDX] 448 #define TORH pThis->auRegs[TORH_IDX] 449 #define TOTL pThis->auRegs[TOTL_IDX] 450 #define TOTH pThis->auRegs[TOTH_IDX] 451 #define TPR pThis->auRegs[TPR_IDX] 452 #define TPT pThis->auRegs[TPT_IDX] 453 #define PTC64 pThis->auRegs[PTC64_IDX] 454 #define PTC127 pThis->auRegs[PTC127_IDX] 455 #define PTC255 pThis->auRegs[PTC255_IDX] 456 #define PTC511 pThis->auRegs[PTC511_IDX] 457 #define PTC1023 pThis->auRegs[PTC1023_IDX] 458 #define PTC1522 pThis->auRegs[PTC1522_IDX] 459 #define MPTC pThis->auRegs[MPTC_IDX] 460 #define BPTC pThis->auRegs[BPTC_IDX] 461 #define TSCTC pThis->auRegs[TSCTC_IDX] 462 #define TSCTFC pThis->auRegs[TSCTFC_IDX] 463 #define RXCSUM pThis->auRegs[RXCSUM_IDX] 464 #define WUC pThis->auRegs[WUC_IDX] 465 #define WUFC pThis->auRegs[WUFC_IDX] 466 #define WUS pThis->auRegs[WUS_IDX] 467 #define MANC pThis->auRegs[MANC_IDX] 468 #define IPAV pThis->auRegs[IPAV_IDX] 469 #define WUPL pThis->auRegs[WUPL_IDX] 469 470 /** @} */ 470 471 … … 1278 1279 1279 1280 /* Forward declarations ******************************************************/ 1280 static int e1kXmitPending( E1KSTATE *pState, bool fOnWorkerThread);1281 1282 static int e1kRegReadUnimplemented ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value);1283 static int e1kRegWriteUnimplemented( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1284 static int e1kRegReadAutoClear ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value);1285 static int e1kRegReadDefault ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value);1286 static int e1kRegWriteDefault ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1281 static int e1kXmitPending(PE1KSTATE pThis, bool fOnWorkerThread); 1282 1283 static int e1kRegReadUnimplemented (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value); 1284 static int e1kRegWriteUnimplemented(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1285 static int e1kRegReadAutoClear (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value); 1286 static int e1kRegReadDefault (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value); 1287 static int e1kRegWriteDefault (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1287 1288 #if 0 /* unused */ 1288 static int e1kRegReadCTRL ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value);1289 static int e1kRegReadCTRL (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value); 1289 1290 #endif 1290 static int e1kRegWriteCTRL ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1291 static int e1kRegReadEECD ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value);1292 static int e1kRegWriteEECD ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1293 static int e1kRegWriteEERD ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1294 static int e1kRegWriteMDIC ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1295 static int e1kRegReadICR ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value);1296 static int e1kRegWriteICR ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1297 static int e1kRegWriteICS ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1298 static int e1kRegWriteIMS ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1299 static int e1kRegWriteIMC ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1300 static int e1kRegWriteRCTL ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1301 static int e1kRegWritePBA ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1302 static int e1kRegWriteRDT ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1303 static int e1kRegWriteRDTR ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1304 static int e1kRegWriteTDT ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1305 static int e1kRegReadMTA ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value);1306 static int e1kRegWriteMTA ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1307 static int e1kRegReadRA ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value);1308 static int e1kRegWriteRA ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1309 static int e1kRegReadVFTA ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value);1310 static int e1kRegWriteVFTA ( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1291 static int e1kRegWriteCTRL (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1292 static int e1kRegReadEECD (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value); 1293 static int e1kRegWriteEECD (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1294 static int e1kRegWriteEERD (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1295 static int e1kRegWriteMDIC (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1296 static int e1kRegReadICR (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value); 1297 static int e1kRegWriteICR (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1298 static int e1kRegWriteICS (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1299 static int e1kRegWriteIMS (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1300 static int e1kRegWriteIMC (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1301 static int e1kRegWriteRCTL (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1302 static int e1kRegWritePBA (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1303 static int e1kRegWriteRDT (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1304 static int e1kRegWriteRDTR (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1305 static int e1kRegWriteTDT (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1306 static int e1kRegReadMTA (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value); 1307 static int e1kRegWriteMTA (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1308 static int e1kRegReadRA (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value); 1309 static int e1kRegWriteRA (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1310 static int e1kRegReadVFTA (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value); 1311 static int e1kRegWriteVFTA (PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1311 1312 1312 1313 /** … … 1326 1327 uint32_t writable; 1327 1328 /** Read callback. */ 1328 int (*pfnRead)( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value);1329 int (*pfnRead)(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value); 1329 1330 /** Write callback. */ 1330 int (*pfnWrite)( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t u32Value);1331 int (*pfnWrite)(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t u32Value); 1331 1332 /** Abbreviated name. */ 1332 1333 const char *abbrev; … … 1504 1505 * @returns The timer name. 1505 1506 * 1506 * @param p StateThe device state structure.1507 * @param pThis The device state structure. 1507 1508 * @param pTimer The timer to get the name for. 1508 1509 */ 1509 DECLINLINE(const char *) e1kGetTimerName( E1KSTATE *pState, PTMTIMER pTimer)1510 { 1511 if (pTimer == p State->CTX_SUFF(pTIDTimer))1510 DECLINLINE(const char *) e1kGetTimerName(PE1KSTATE pThis, PTMTIMER pTimer) 1511 { 1512 if (pTimer == pThis->CTX_SUFF(pTIDTimer)) 1512 1513 return "TID"; 1513 if (pTimer == p State->CTX_SUFF(pTADTimer))1514 if (pTimer == pThis->CTX_SUFF(pTADTimer)) 1514 1515 return "TAD"; 1515 if (pTimer == p State->CTX_SUFF(pRIDTimer))1516 if (pTimer == pThis->CTX_SUFF(pRIDTimer)) 1516 1517 return "RID"; 1517 if (pTimer == p State->CTX_SUFF(pRADTimer))1518 if (pTimer == pThis->CTX_SUFF(pRADTimer)) 1518 1519 return "RAD"; 1519 if (pTimer == p State->CTX_SUFF(pIntTimer))1520 if (pTimer == pThis->CTX_SUFF(pIntTimer)) 1520 1521 return "Int"; 1521 if (pTimer == p State->CTX_SUFF(pTXDTimer))1522 if (pTimer == pThis->CTX_SUFF(pTXDTimer)) 1522 1523 return "TXD"; 1523 1524 return "unknown"; … … 1529 1530 * Arm a timer. 1530 1531 * 1531 * @param p StatePointer to the device state structure.1532 * @param pThis Pointer to the device state structure. 1532 1533 * @param pTimer Pointer to the timer. 1533 1534 * @param uExpireIn Expiration interval in microseconds. 1534 1535 */ 1535 DECLINLINE(void) e1kArmTimer( E1KSTATE *pState, PTMTIMER pTimer, uint32_t uExpireIn)1536 { 1537 if (p State->fLocked)1536 DECLINLINE(void) e1kArmTimer(PE1KSTATE pThis, PTMTIMER pTimer, uint32_t uExpireIn) 1537 { 1538 if (pThis->fLocked) 1538 1539 return; 1539 1540 1540 1541 E1kLog2(("%s Arming %s timer to fire in %d usec...\n", 1541 p State->szPrf, e1kGetTimerName(pState, pTimer), uExpireIn));1542 pThis->szPrf, e1kGetTimerName(pThis, pTimer), uExpireIn)); 1542 1543 TMTimerSetMicro(pTimer, uExpireIn); 1543 1544 } … … 1546 1547 * Cancel a timer. 1547 1548 * 1548 * @param p StatePointer to the device state structure.1549 * @param pThis Pointer to the device state structure. 1549 1550 * @param pTimer Pointer to the timer. 1550 1551 */ 1551 DECLINLINE(void) e1kCancelTimer( E1KSTATE *pState, PTMTIMER pTimer)1552 DECLINLINE(void) e1kCancelTimer(PE1KSTATE pThis, PTMTIMER pTimer) 1552 1553 { 1553 1554 E1kLog2(("%s Stopping %s timer...\n", 1554 p State->szPrf, e1kGetTimerName(pState, pTimer)));1555 pThis->szPrf, e1kGetTimerName(pThis, pTimer))); 1555 1556 int rc = TMTimerStop(pTimer); 1556 1557 if (RT_FAILURE(rc)) 1557 1558 { 1558 1559 E1kLog2(("%s e1kCancelTimer: TMTimerStop() failed with %Rrc\n", 1559 p State->szPrf, rc));1560 pThis->szPrf, rc)); 1560 1561 } 1561 1562 } … … 1583 1584 static void e1kWakeupReceive(PPDMDEVINS pDevIns) 1584 1585 { 1585 E1KSTATE *pState = PDMINS_2_DATA(pDevIns, E1KSTATE *);1586 if ( p State->fMaybeOutOfSpace1587 && p State->hEventMoreRxDescAvail != NIL_RTSEMEVENT)1588 { 1589 STAM_COUNTER_INC(&p State->StatRxOverflowWakeup);1590 E1kLog(("%s Waking up Out-of-RX-space semaphore\n", p State->szPrf));1591 RTSemEventSignal(p State->hEventMoreRxDescAvail);1586 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, PE1KSTATE); 1587 if ( pThis->fMaybeOutOfSpace 1588 && pThis->hEventMoreRxDescAvail != NIL_RTSEMEVENT) 1589 { 1590 STAM_COUNTER_INC(&pThis->StatRxOverflowWakeup); 1591 E1kLog(("%s Waking up Out-of-RX-space semaphore\n", pThis->szPrf)); 1592 RTSemEventSignal(pThis->hEventMoreRxDescAvail); 1592 1593 } 1593 1594 } … … 1596 1597 * Hardware reset. Revert all registers to initial values. 1597 1598 * 1598 * @param p StateThe device state structure.1599 */ 1600 static void e1kHardReset( E1KSTATE *pState)1601 { 1602 E1kLog(("%s Hard reset triggered\n", p State->szPrf));1603 memset(p State->auRegs, 0, sizeof(pState->auRegs));1604 memset(p State->aRecAddr.au32, 0, sizeof(pState->aRecAddr.au32));1599 * @param pThis The device state structure. 1600 */ 1601 static void e1kHardReset(PE1KSTATE pThis) 1602 { 1603 E1kLog(("%s Hard reset triggered\n", pThis->szPrf)); 1604 memset(pThis->auRegs, 0, sizeof(pThis->auRegs)); 1605 memset(pThis->aRecAddr.au32, 0, sizeof(pThis->aRecAddr.au32)); 1605 1606 #ifdef E1K_INIT_RA0 1606 memcpy(p State->aRecAddr.au32, pState->macConfigured.au8,1607 sizeof(p State->macConfigured.au8));1608 p State->aRecAddr.array[0].ctl |= RA_CTL_AV;1607 memcpy(pThis->aRecAddr.au32, pThis->macConfigured.au8, 1608 sizeof(pThis->macConfigured.au8)); 1609 pThis->aRecAddr.array[0].ctl |= RA_CTL_AV; 1609 1610 #endif /* E1K_INIT_RA0 */ 1610 1611 STATUS = 0x0081; /* SPEED=10b (1000 Mb/s), FD=1b (Full Duplex) */ … … 1613 1614 TSPMT = 0x01000400;/* TSMT=0400h TSPBP=0100h */ 1614 1615 Assert(GET_BITS(RCTL, BSIZE) == 0); 1615 p State->u16RxBSize = 2048;1616 pThis->u16RxBSize = 2048; 1616 1617 1617 1618 /* Reset promiscuous mode */ 1618 if (p State->pDrvR3)1619 p State->pDrvR3->pfnSetPromiscuousMode(pState->pDrvR3, false);1619 if (pThis->pDrvR3) 1620 pThis->pDrvR3->pfnSetPromiscuousMode(pThis->pDrvR3, false); 1620 1621 1621 1622 #ifdef E1K_WITH_TXD_CACHE 1622 int rc = e1kCsTxEnter(p State, VERR_SEM_BUSY);1623 int rc = e1kCsTxEnter(pThis, VERR_SEM_BUSY); 1623 1624 if (RT_LIKELY(rc == VINF_SUCCESS)) 1624 1625 { 1625 p State->nTxDFetched = 0;1626 p State->iTxDCurrent = 0;1627 p State->fGSO = false;1628 p State->cbTxAlloc = 0;1629 e1kCsTxLeave(p State);1626 pThis->nTxDFetched = 0; 1627 pThis->iTxDCurrent = 0; 1628 pThis->fGSO = false; 1629 pThis->cbTxAlloc = 0; 1630 e1kCsTxLeave(pThis); 1630 1631 } 1631 1632 #endif /* E1K_WITH_TXD_CACHE */ 1632 1633 #ifdef E1K_WITH_RXD_CACHE 1633 if (RT_LIKELY(e1kCsRxEnter(p State, VERR_SEM_BUSY) == VINF_SUCCESS))1634 { 1635 p State->iRxDCurrent = pState->nRxDFetched = 0;1636 e1kCsRxLeave(p State);1634 if (RT_LIKELY(e1kCsRxEnter(pThis, VERR_SEM_BUSY) == VINF_SUCCESS)) 1635 { 1636 pThis->iRxDCurrent = pThis->nRxDFetched = 0; 1637 e1kCsRxLeave(pThis); 1637 1638 } 1638 1639 #endif /* E1K_WITH_RXD_CACHE */ … … 1646 1647 * @remarks Refer to http://www.netfor2.com/checksum.html for short intro. 1647 1648 * 1648 * @param p StateThe device state structure.1649 * @param pThis The device state structure. 1649 1650 * @param cpPacket The packet. 1650 1651 * @param cb The size of the packet. … … 1675 1676 * Dump a packet to debug log. 1676 1677 * 1677 * @param p StateThe device state structure.1678 * @param pThis The device state structure. 1678 1679 * @param cpPacket The packet. 1679 1680 * @param cb The size of the packet. … … 1681 1682 * @thread E1000_TX 1682 1683 */ 1683 DECLINLINE(void) e1kPacketDump( E1KSTATE* pState, const uint8_t *cpPacket, size_t cb, const char *cszText)1684 DECLINLINE(void) e1kPacketDump(PE1KSTATE pThis, const uint8_t *cpPacket, size_t cb, const char *cszText) 1684 1685 { 1685 1686 #ifdef DEBUG 1686 if (RT_LIKELY(e1kCsEnter(p State, VERR_SEM_BUSY) == VINF_SUCCESS))1687 if (RT_LIKELY(e1kCsEnter(pThis, VERR_SEM_BUSY) == VINF_SUCCESS)) 1687 1688 { 1688 1689 E1kLog(("%s --- %s packet #%d: ---\n", 1689 p State->szPrf, cszText, ++pState->u32PktNo));1690 pThis->szPrf, cszText, ++pThis->u32PktNo)); 1690 1691 E1kLog3(("%.*Rhxd\n", cb, cpPacket)); 1691 e1kCsLeave(p State);1692 e1kCsLeave(pThis); 1692 1693 } 1693 1694 #else 1694 if (RT_LIKELY(e1kCsEnter(p State, VERR_SEM_BUSY) == VINF_SUCCESS))1695 { 1696 E1kLogRel(("E1000: %s packet #%d, seq=%x ack=%x\n", cszText, p State->u32PktNo++, ntohl(*(uint32_t*)(cpPacket+0x26)), ntohl(*(uint32_t*)(cpPacket+0x2A))));1697 e1kCsLeave(p State);1695 if (RT_LIKELY(e1kCsEnter(pThis, VERR_SEM_BUSY) == VINF_SUCCESS)) 1696 { 1697 E1kLogRel(("E1000: %s packet #%d, seq=%x ack=%x\n", cszText, pThis->u32PktNo++, ntohl(*(uint32_t*)(cpPacket+0x26)), ntohl(*(uint32_t*)(cpPacket+0x2A)))); 1698 e1kCsLeave(pThis); 1698 1699 } 1699 1700 #endif … … 1718 1719 * Dump receive descriptor to debug log. 1719 1720 * 1720 * @param p StateThe device state structure.1721 * @param pThis The device state structure. 1721 1722 * @param pDesc Pointer to the descriptor. 1722 1723 * @thread E1000_RX 1723 1724 */ 1724 static void e1kPrintRDesc( E1KSTATE* pState, E1KRXDESC* pDesc)1725 { 1726 E1kLog2(("%s <-- Receive Descriptor (%d bytes):\n", p State->szPrf, pDesc->u16Length));1725 static void e1kPrintRDesc(PE1KSTATE pThis, E1KRXDESC* pDesc) 1726 { 1727 E1kLog2(("%s <-- Receive Descriptor (%d bytes):\n", pThis->szPrf, pDesc->u16Length)); 1727 1728 E1kLog2((" Address=%16LX Length=%04X Csum=%04X\n", 1728 1729 pDesc->u64BufAddr, pDesc->u16Length, pDesc->u16Checksum)); … … 1747 1748 * Dump transmit descriptor to debug log. 1748 1749 * 1749 * @param p StateThe device state structure.1750 * @param pThis The device state structure. 1750 1751 * @param pDesc Pointer to descriptor union. 1751 1752 * @param cszDir A string denoting direction of descriptor transfer 1752 1753 * @thread E1000_TX 1753 1754 */ 1754 static void e1kPrintTDesc( E1KSTATE* pState, E1KTXDESC* pDesc, const char* cszDir,1755 static void e1kPrintTDesc(PE1KSTATE pThis, E1KTXDESC* pDesc, const char* cszDir, 1755 1756 unsigned uLevel = RTLOGGRPFLAGS_LEVEL_2) 1756 1757 { … … 1763 1764 case E1K_DTYP_CONTEXT: 1764 1765 E1kLogX(uLevel, ("%s %s Context Transmit Descriptor %s\n", 1765 p State->szPrf, cszDir, cszDir));1766 pThis->szPrf, cszDir, cszDir)); 1766 1767 E1kLogX(uLevel, (" IPCSS=%02X IPCSO=%02X IPCSE=%04X TUCSS=%02X TUCSO=%02X TUCSE=%04X\n", 1767 1768 pDesc->context.ip.u8CSS, pDesc->context.ip.u8CSO, pDesc->context.ip.u16CSE, … … 1780 1781 case E1K_DTYP_DATA: 1781 1782 E1kLogX(uLevel, ("%s %s Data Transmit Descriptor (%d bytes) %s\n", 1782 p State->szPrf, cszDir, pDesc->data.cmd.u20DTALEN, cszDir));1783 pThis->szPrf, cszDir, pDesc->data.cmd.u20DTALEN, cszDir)); 1783 1784 E1kLogX(uLevel, (" Address=%16LX DTALEN=%05X\n", 1784 1785 pDesc->data.u64BufAddr, … … 1803 1804 case E1K_DTYP_LEGACY: 1804 1805 E1kLogX(uLevel, ("%s %s Legacy Transmit Descriptor (%d bytes) %s\n", 1805 p State->szPrf, cszDir, pDesc->legacy.cmd.u16Length, cszDir));1806 pThis->szPrf, cszDir, pDesc->legacy.cmd.u16Length, cszDir)); 1806 1807 E1kLogX(uLevel, (" Address=%16LX DTALEN=%05X\n", 1807 1808 pDesc->data.u64BufAddr, … … 1826 1827 default: 1827 1828 E1kLog(("%s %s Invalid Transmit Descriptor %s\n", 1828 p State->szPrf, cszDir, cszDir));1829 pThis->szPrf, cszDir, cszDir)); 1829 1830 break; 1830 1831 } … … 1834 1835 * Raise interrupt if not masked. 1835 1836 * 1836 * @param p StateThe device state structure.1837 */ 1838 static int e1kRaiseInterrupt( E1KSTATE *pState, int rcBusy, uint32_t u32IntCause = 0)1839 { 1840 int rc = e1kCsEnter(p State, rcBusy);1837 * @param pThis The device state structure. 1838 */ 1839 static int e1kRaiseInterrupt(PE1KSTATE pThis, int rcBusy, uint32_t u32IntCause = 0) 1840 { 1841 int rc = e1kCsEnter(pThis, rcBusy); 1841 1842 if (RT_UNLIKELY(rc != VINF_SUCCESS)) 1842 1843 return rc; 1843 1844 1844 E1K_INC_ISTAT_CNT(p State->uStatIntTry);1845 E1K_INC_ISTAT_CNT(pThis->uStatIntTry); 1845 1846 ICR |= u32IntCause; 1846 1847 if (ICR & IMS) 1847 1848 { 1848 1849 #if 0 1849 if (p State->fDelayInts)1850 { 1851 E1K_INC_ISTAT_CNT(p State->uStatIntDly);1852 p State->iStatIntLostOne = 1;1850 if (pThis->fDelayInts) 1851 { 1852 E1K_INC_ISTAT_CNT(pThis->uStatIntDly); 1853 pThis->iStatIntLostOne = 1; 1853 1854 E1kLog2(("%s e1kRaiseInterrupt: Delayed. ICR=%08x\n", 1854 p State->szPrf, ICR));1855 pThis->szPrf, ICR)); 1855 1856 #define E1K_LOST_IRQ_THRSLD 20 1856 1857 //#define E1K_LOST_IRQ_THRSLD 200000000 1857 if (p State->iStatIntLost >= E1K_LOST_IRQ_THRSLD)1858 if (pThis->iStatIntLost >= E1K_LOST_IRQ_THRSLD) 1858 1859 { 1859 1860 E1kLog2(("%s WARNING! Disabling delayed interrupt logic: delayed=%d, delivered=%d\n", 1860 p State->szPrf, pState->uStatIntDly, pState->uStatIntLate));1861 p State->fIntMaskUsed = false;1862 p State->uStatDisDly++;1861 pThis->szPrf, pThis->uStatIntDly, pThis->uStatIntLate)); 1862 pThis->fIntMaskUsed = false; 1863 pThis->uStatDisDly++; 1863 1864 } 1864 1865 } 1865 1866 else 1866 1867 #endif 1867 if (p State->fIntRaised)1868 { 1869 E1K_INC_ISTAT_CNT(p State->uStatIntSkip);1868 if (pThis->fIntRaised) 1869 { 1870 E1K_INC_ISTAT_CNT(pThis->uStatIntSkip); 1870 1871 E1kLog2(("%s e1kRaiseInterrupt: Already raised, skipped. ICR&IMS=%08x\n", 1871 p State->szPrf, ICR & IMS));1872 pThis->szPrf, ICR & IMS)); 1872 1873 } 1873 1874 else 1874 1875 { 1875 1876 #ifdef E1K_ITR_ENABLED 1876 uint64_t tstamp = TMTimerGet(p State->CTX_SUFF(pIntTimer));1877 uint64_t tstamp = TMTimerGet(pThis->CTX_SUFF(pIntTimer)); 1877 1878 /* interrupts/sec = 1 / (256 * 10E-9 * ITR) */ 1878 E1kLog2(("%s e1kRaiseInterrupt: tstamp - p State->u64AckedAt = %d, ITR * 256 = %d\n",1879 p State->szPrf, (uint32_t)(tstamp - pState->u64AckedAt), ITR * 256));1880 //if (!!ITR && p State->fIntMaskUsed && tstamp - pState->u64AckedAt < ITR * 256)1881 if (!!ITR && tstamp - p State->u64AckedAt < ITR * 256 && !(ICR & ICR_RXT0))1879 E1kLog2(("%s e1kRaiseInterrupt: tstamp - pThis->u64AckedAt = %d, ITR * 256 = %d\n", 1880 pThis->szPrf, (uint32_t)(tstamp - pThis->u64AckedAt), ITR * 256)); 1881 //if (!!ITR && pThis->fIntMaskUsed && tstamp - pThis->u64AckedAt < ITR * 256) 1882 if (!!ITR && tstamp - pThis->u64AckedAt < ITR * 256 && !(ICR & ICR_RXT0)) 1882 1883 { 1883 E1K_INC_ISTAT_CNT(p State->uStatIntEarly);1884 E1K_INC_ISTAT_CNT(pThis->uStatIntEarly); 1884 1885 E1kLog2(("%s e1kRaiseInterrupt: Too early to raise again: %d ns < %d ns.\n", 1885 p State->szPrf, (uint32_t)(tstamp - pState->u64AckedAt), ITR * 256));1886 pThis->szPrf, (uint32_t)(tstamp - pThis->u64AckedAt), ITR * 256)); 1886 1887 } 1887 1888 else … … 1892 1893 * there is no need to do it later -- stop the timer. 1893 1894 */ 1894 TMTimerStop(p State->CTX_SUFF(pIntTimer));1895 E1K_INC_ISTAT_CNT(p State->uStatInt);1896 STAM_COUNTER_INC(&p State->StatIntsRaised);1895 TMTimerStop(pThis->CTX_SUFF(pIntTimer)); 1896 E1K_INC_ISTAT_CNT(pThis->uStatInt); 1897 STAM_COUNTER_INC(&pThis->StatIntsRaised); 1897 1898 /* Got at least one unmasked interrupt cause */ 1898 p State->fIntRaised = true;1899 pThis->fIntRaised = true; 1899 1900 /* Raise(1) INTA(0) */ 1900 1901 E1kLogRel(("E1000: irq RAISED icr&mask=0x%x, icr=0x%x\n", ICR & IMS, ICR)); 1901 PDMDevHlpPCISetIrq(p State->CTX_SUFF(pDevIns), 0, 1);1902 PDMDevHlpPCISetIrq(pThis->CTX_SUFF(pDevIns), 0, 1); 1902 1903 E1kLog(("%s e1kRaiseInterrupt: Raised. ICR&IMS=%08x\n", 1903 p State->szPrf, ICR & IMS));1904 pThis->szPrf, ICR & IMS)); 1904 1905 } 1905 1906 } … … 1907 1908 else 1908 1909 { 1909 E1K_INC_ISTAT_CNT(p State->uStatIntMasked);1910 E1K_INC_ISTAT_CNT(pThis->uStatIntMasked); 1910 1911 E1kLog2(("%s e1kRaiseInterrupt: Not raising, ICR=%08x, IMS=%08x\n", 1911 p State->szPrf, ICR, IMS));1912 } 1913 e1kCsLeave(p State);1912 pThis->szPrf, ICR, IMS)); 1913 } 1914 e1kCsLeave(pThis); 1914 1915 return VINF_SUCCESS; 1915 1916 } … … 1935 1936 * @remarks RDH always points to the next available RX descriptor. 1936 1937 * 1937 * @param p StateThe device state structure.1938 */ 1939 DECLINLINE(void) e1kAdvanceRDH( E1KSTATE *pState)1940 { 1941 Assert(e1kCsRxIsOwner(p State));1942 //e1kCsEnter(p State, RT_SRC_POS);1938 * @param pThis The device state structure. 1939 */ 1940 DECLINLINE(void) e1kAdvanceRDH(PE1KSTATE pThis) 1941 { 1942 Assert(e1kCsRxIsOwner(pThis)); 1943 //e1kCsEnter(pThis, RT_SRC_POS); 1943 1944 if (++RDH * sizeof(E1KRXDESC) >= RDLEN) 1944 1945 RDH = 0; … … 1960 1961 E1kLogRel(("E1000: low on RX descriptors, RDH=%x RDT=%x len=%x threshold=%x\n", RDH, RDT, uRQueueLen, uMinRQThreshold)); 1961 1962 E1kLog2(("%s Low on RX descriptors, RDH=%x RDT=%x len=%x threshold=%x, raise an interrupt\n", 1962 p State->szPrf, RDH, RDT, uRQueueLen, uMinRQThreshold));1963 E1K_INC_ISTAT_CNT(p State->uStatIntRXDMT0);1964 e1kRaiseInterrupt(p State, VERR_SEM_BUSY, ICR_RXDMT0);1963 pThis->szPrf, RDH, RDT, uRQueueLen, uMinRQThreshold)); 1964 E1K_INC_ISTAT_CNT(pThis->uStatIntRXDMT0); 1965 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_RXDMT0); 1965 1966 } 1966 1967 E1kLog2(("%s e1kAdvanceRDH: at exit RDH=%x RDT=%x len=%x\n", 1967 p State->szPrf, RDH, RDT, uRQueueLen));1968 //e1kCsLeave(p State);1968 pThis->szPrf, RDH, RDT, uRQueueLen)); 1969 //e1kCsLeave(pThis); 1969 1970 } 1970 1971 … … 1974 1975 * 1975 1976 * @returns the number of available descriptors in RX ring. 1976 * @param p StateThe device state structure.1977 * @param pThis The device state structure. 1977 1978 * @thread ??? 1978 1979 */ 1979 DECLINLINE(uint32_t) e1kGetRxLen( E1KSTATE* pState)1980 DECLINLINE(uint32_t) e1kGetRxLen(PE1KSTATE pThis) 1980 1981 { 1981 1982 /** … … 1987 1988 } 1988 1989 1989 DECLINLINE(unsigned) e1kRxDInCache( E1KSTATE* pState)1990 { 1991 return p State->nRxDFetched > pState->iRxDCurrent ?1992 p State->nRxDFetched - pState->iRxDCurrent : 0;1993 } 1994 1995 DECLINLINE(unsigned) e1kRxDIsCacheEmpty( E1KSTATE* pState)1996 { 1997 return p State->iRxDCurrent >= pState->nRxDFetched;1990 DECLINLINE(unsigned) e1kRxDInCache(PE1KSTATE pThis) 1991 { 1992 return pThis->nRxDFetched > pThis->iRxDCurrent ? 1993 pThis->nRxDFetched - pThis->iRxDCurrent : 0; 1994 } 1995 1996 DECLINLINE(unsigned) e1kRxDIsCacheEmpty(PE1KSTATE pThis) 1997 { 1998 return pThis->iRxDCurrent >= pThis->nRxDFetched; 1998 1999 } 1999 2000 … … 2006 2007 * 2007 2008 * @returns the actual number of descriptors fetched. 2008 * @param p StateThe device state structure.2009 * @param pThis The device state structure. 2009 2010 * @param pDesc Pointer to descriptor union. 2010 2011 * @param addr Physical address in guest context. 2011 2012 * @thread EMT, RX 2012 2013 */ 2013 DECLINLINE(unsigned) e1kRxDPrefetch( E1KSTATE* pState)2014 { 2015 /* We've already loaded p State->nRxDFetched descriptors past RDH. */2016 unsigned nDescsAvailable = e1kGetRxLen(p State) - e1kRxDInCache(pState);2017 unsigned nDescsToFetch = RT_MIN(nDescsAvailable, E1K_RXD_CACHE_SIZE - p State->nRxDFetched);2014 DECLINLINE(unsigned) e1kRxDPrefetch(PE1KSTATE pThis) 2015 { 2016 /* We've already loaded pThis->nRxDFetched descriptors past RDH. */ 2017 unsigned nDescsAvailable = e1kGetRxLen(pThis) - e1kRxDInCache(pThis); 2018 unsigned nDescsToFetch = RT_MIN(nDescsAvailable, E1K_RXD_CACHE_SIZE - pThis->nRxDFetched); 2018 2019 unsigned nDescsTotal = RDLEN / sizeof(E1KRXDESC); 2019 2020 Assert(nDescsTotal != 0); 2020 2021 if (nDescsTotal == 0) 2021 2022 return 0; 2022 unsigned nFirstNotLoaded = (RDH + e1kRxDInCache(p State)) % nDescsTotal;2023 unsigned nFirstNotLoaded = (RDH + e1kRxDInCache(pThis)) % nDescsTotal; 2023 2024 unsigned nDescsInSingleRead = RT_MIN(nDescsToFetch, nDescsTotal - nFirstNotLoaded); 2024 2025 E1kLog3(("%s e1kRxDPrefetch: nDescsAvailable=%u nDescsToFetch=%u " 2025 2026 "nDescsTotal=%u nFirstNotLoaded=0x%x nDescsInSingleRead=%u\n", 2026 p State->szPrf, nDescsAvailable, nDescsToFetch, nDescsTotal,2027 pThis->szPrf, nDescsAvailable, nDescsToFetch, nDescsTotal, 2027 2028 nFirstNotLoaded, nDescsInSingleRead)); 2028 2029 if (nDescsToFetch == 0) 2029 2030 return 0; 2030 E1KRXDESC* pFirstEmptyDesc = &p State->aRxDescriptors[pState->nRxDFetched];2031 PDMDevHlpPhysRead(p State->CTX_SUFF(pDevIns),2031 E1KRXDESC* pFirstEmptyDesc = &pThis->aRxDescriptors[pThis->nRxDFetched]; 2032 PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns), 2032 2033 ((uint64_t)RDBAH << 32) + RDBAL + nFirstNotLoaded * sizeof(E1KRXDESC), 2033 2034 pFirstEmptyDesc, nDescsInSingleRead * sizeof(E1KRXDESC)); 2034 2035 // uint64_t addrBase = ((uint64_t)RDBAH << 32) + RDBAL; 2035 2036 // unsigned i, j; 2036 // for (i = p State->nRxDFetched; i < pState->nRxDFetched + nDescsInSingleRead; ++i)2037 // for (i = pThis->nRxDFetched; i < pThis->nRxDFetched + nDescsInSingleRead; ++i) 2037 2038 // { 2038 // p State->aRxDescAddr[i] = addrBase + (nFirstNotLoaded + i - pState->nRxDFetched) * sizeof(E1KRXDESC);2039 // E1kLog3(("%s aRxDescAddr[%d] = %p\n", p State->szPrf, i, pState->aRxDescAddr[i]));2039 // pThis->aRxDescAddr[i] = addrBase + (nFirstNotLoaded + i - pThis->nRxDFetched) * sizeof(E1KRXDESC); 2040 // E1kLog3(("%s aRxDescAddr[%d] = %p\n", pThis->szPrf, i, pThis->aRxDescAddr[i])); 2040 2041 // } 2041 2042 E1kLog3(("%s Fetched %u RX descriptors at %08x%08x(0x%x), RDLEN=%08x, RDH=%08x, RDT=%08x\n", 2042 p State->szPrf, nDescsInSingleRead,2043 pThis->szPrf, nDescsInSingleRead, 2043 2044 RDBAH, RDBAL + RDH * sizeof(E1KRXDESC), 2044 2045 nFirstNotLoaded, RDLEN, RDH, RDT)); 2045 2046 if (nDescsToFetch > nDescsInSingleRead) 2046 2047 { 2047 PDMDevHlpPhysRead(p State->CTX_SUFF(pDevIns),2048 PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns), 2048 2049 ((uint64_t)RDBAH << 32) + RDBAL, 2049 2050 pFirstEmptyDesc + nDescsInSingleRead, 2050 2051 (nDescsToFetch - nDescsInSingleRead) * sizeof(E1KRXDESC)); 2051 // Assert(i == p State->nRxDFetched + nDescsInSingleRead);2052 // for (j = 0; i < p State->nRxDFetched + nDescsToFetch; ++i, ++j)2052 // Assert(i == pThis->nRxDFetched + nDescsInSingleRead); 2053 // for (j = 0; i < pThis->nRxDFetched + nDescsToFetch; ++i, ++j) 2053 2054 // { 2054 // p State->aRxDescAddr[i] = addrBase + j * sizeof(E1KRXDESC);2055 // E1kLog3(("%s aRxDescAddr[%d] = %p\n", p State->szPrf, i, pState->aRxDescAddr[i]));2055 // pThis->aRxDescAddr[i] = addrBase + j * sizeof(E1KRXDESC); 2056 // E1kLog3(("%s aRxDescAddr[%d] = %p\n", pThis->szPrf, i, pThis->aRxDescAddr[i])); 2056 2057 // } 2057 2058 E1kLog3(("%s Fetched %u RX descriptors at %08x%08x\n", 2058 p State->szPrf, nDescsToFetch - nDescsInSingleRead,2059 pThis->szPrf, nDescsToFetch - nDescsInSingleRead, 2059 2060 RDBAH, RDBAL)); 2060 2061 } 2061 p State->nRxDFetched += nDescsToFetch;2062 pThis->nRxDFetched += nDescsToFetch; 2062 2063 return nDescsToFetch; 2063 2064 } … … 2071 2072 * cache is empty to do pre-fetch @bugref(6217). 2072 2073 * 2073 * @param p StateThe device state structure.2074 * @param pThis The device state structure. 2074 2075 * @thread RX 2075 2076 */ 2076 DECLINLINE(E1KRXDESC*) e1kRxDGet( E1KSTATE* pState)2077 { 2078 Assert(e1kCsRxIsOwner(p State));2077 DECLINLINE(E1KRXDESC*) e1kRxDGet(PE1KSTATE pThis) 2078 { 2079 Assert(e1kCsRxIsOwner(pThis)); 2079 2080 /* Check the cache first. */ 2080 if (p State->iRxDCurrent < pState->nRxDFetched)2081 return &p State->aRxDescriptors[pState->iRxDCurrent];2081 if (pThis->iRxDCurrent < pThis->nRxDFetched) 2082 return &pThis->aRxDescriptors[pThis->iRxDCurrent]; 2082 2083 /* Cache is empty, reset it and check if we can fetch more. */ 2083 p State->iRxDCurrent = pState->nRxDFetched = 0;2084 if (e1kRxDPrefetch(p State))2085 return &p State->aRxDescriptors[pState->iRxDCurrent];2084 pThis->iRxDCurrent = pThis->nRxDFetched = 0; 2085 if (e1kRxDPrefetch(pThis)) 2086 return &pThis->aRxDescriptors[pThis->iRxDCurrent]; 2086 2087 /* Out of Rx descriptors. */ 2087 2088 return NULL; … … 2092 2093 * pointer. The descriptor gets written back to the RXD ring. 2093 2094 * 2094 * @param p StateThe device state structure.2095 * @param pThis The device state structure. 2095 2096 * @param pDesc The descriptor being "returned" to the RX ring. 2096 2097 * @thread RX 2097 2098 */ 2098 DECLINLINE(void) e1kRxDPut( E1KSTATE* pState, E1KRXDESC* pDesc)2099 { 2100 Assert(e1kCsRxIsOwner(p State));2101 p State->iRxDCurrent++;2102 // Assert(pDesc >= p State->aRxDescriptors);2103 // Assert(pDesc < p State->aRxDescriptors + E1K_RXD_CACHE_SIZE);2099 DECLINLINE(void) e1kRxDPut(PE1KSTATE pThis, E1KRXDESC* pDesc) 2100 { 2101 Assert(e1kCsRxIsOwner(pThis)); 2102 pThis->iRxDCurrent++; 2103 // Assert(pDesc >= pThis->aRxDescriptors); 2104 // Assert(pDesc < pThis->aRxDescriptors + E1K_RXD_CACHE_SIZE); 2104 2105 // uint64_t addr = e1kDescAddr(RDBAH, RDBAL, RDH); 2105 2106 // uint32_t rdh = RDH; 2106 // Assert(p State->aRxDescAddr[pDesc - pState->aRxDescriptors] == addr);2107 PDMDevHlpPhysWrite(p State->CTX_SUFF(pDevIns),2107 // Assert(pThis->aRxDescAddr[pDesc - pThis->aRxDescriptors] == addr); 2108 PDMDevHlpPhysWrite(pThis->CTX_SUFF(pDevIns), 2108 2109 e1kDescAddr(RDBAH, RDBAL, RDH), 2109 2110 pDesc, sizeof(E1KRXDESC)); 2110 e1kAdvanceRDH(p State);2111 e1kPrintRDesc(p State, pDesc);2111 e1kAdvanceRDH(pThis); 2112 e1kPrintRDesc(pThis, pDesc); 2112 2113 } 2113 2114 … … 2115 2116 * Store a fragment of received packet at the specifed address. 2116 2117 * 2117 * @param p StateThe device state structure.2118 * @param pThis The device state structure. 2118 2119 * @param pDesc The next available RX descriptor. 2119 2120 * @param pvBuf The fragment. 2120 2121 * @param cb The size of the fragment. 2121 2122 */ 2122 static DECLCALLBACK(void) e1kStoreRxFragment( E1KSTATE *pState, E1KRXDESC *pDesc, const void *pvBuf, size_t cb)2123 { 2124 STAM_PROFILE_ADV_START(&p State->StatReceiveStore, a);2123 static DECLCALLBACK(void) e1kStoreRxFragment(PE1KSTATE pThis, E1KRXDESC *pDesc, const void *pvBuf, size_t cb) 2124 { 2125 STAM_PROFILE_ADV_START(&pThis->StatReceiveStore, a); 2125 2126 E1kLog2(("%s e1kStoreRxFragment: store fragment of %04X at %016LX, EOP=%d\n", 2126 p State->szPrf, cb, pDesc->u64BufAddr, pDesc->status.fEOP));2127 PDMDevHlpPhysWrite(p State->CTX_SUFF(pDevIns), pDesc->u64BufAddr, pvBuf, cb);2127 pThis->szPrf, cb, pDesc->u64BufAddr, pDesc->status.fEOP)); 2128 PDMDevHlpPhysWrite(pThis->CTX_SUFF(pDevIns), pDesc->u64BufAddr, pvBuf, cb); 2128 2129 pDesc->u16Length = (uint16_t)cb; Assert(pDesc->u16Length == cb); 2129 STAM_PROFILE_ADV_STOP(&p State->StatReceiveStore, a);2130 STAM_PROFILE_ADV_STOP(&pThis->StatReceiveStore, a); 2130 2131 } 2131 2132 … … 2138 2139 * @remarks Trigger the RXT0 interrupt if it is the last fragment of the packet. 2139 2140 * 2140 * @param p StateThe device state structure.2141 * @param pThis The device state structure. 2141 2142 * @param pDesc The next available RX descriptor. 2142 2143 * @param pvBuf The fragment. 2143 2144 * @param cb The size of the fragment. 2144 2145 */ 2145 static DECLCALLBACK(void) e1kStoreRxFragment( E1KSTATE *pState, E1KRXDESC *pDesc, const void *pvBuf, size_t cb)2146 { 2147 STAM_PROFILE_ADV_START(&p State->StatReceiveStore, a);2148 E1kLog2(("%s e1kStoreRxFragment: store fragment of %04X at %016LX, EOP=%d\n", p State->szPrf, cb, pDesc->u64BufAddr, pDesc->status.fEOP));2149 PDMDevHlpPhysWrite(p State->CTX_SUFF(pDevIns), pDesc->u64BufAddr, pvBuf, cb);2146 static DECLCALLBACK(void) e1kStoreRxFragment(PE1KSTATE pThis, E1KRXDESC *pDesc, const void *pvBuf, size_t cb) 2147 { 2148 STAM_PROFILE_ADV_START(&pThis->StatReceiveStore, a); 2149 E1kLog2(("%s e1kStoreRxFragment: store fragment of %04X at %016LX, EOP=%d\n", pThis->szPrf, cb, pDesc->u64BufAddr, pDesc->status.fEOP)); 2150 PDMDevHlpPhysWrite(pThis->CTX_SUFF(pDevIns), pDesc->u64BufAddr, pvBuf, cb); 2150 2151 pDesc->u16Length = (uint16_t)cb; Assert(pDesc->u16Length == cb); 2151 2152 /* Write back the descriptor */ 2152 PDMDevHlpPhysWrite(p State->CTX_SUFF(pDevIns), e1kDescAddr(RDBAH, RDBAL, RDH), pDesc, sizeof(E1KRXDESC));2153 e1kPrintRDesc(p State, pDesc);2153 PDMDevHlpPhysWrite(pThis->CTX_SUFF(pDevIns), e1kDescAddr(RDBAH, RDBAL, RDH), pDesc, sizeof(E1KRXDESC)); 2154 e1kPrintRDesc(pThis, pDesc); 2154 2155 E1kLogRel(("E1000: Wrote back RX desc, RDH=%x\n", RDH)); 2155 2156 /* Advance head */ 2156 e1kAdvanceRDH(p State);2157 //E1kLog2(("%s e1kStoreRxFragment: EOP=%d RDTR=%08X RADV=%08X\n", p State->szPrf, pDesc->fEOP, RDTR, RADV));2157 e1kAdvanceRDH(pThis); 2158 //E1kLog2(("%s e1kStoreRxFragment: EOP=%d RDTR=%08X RADV=%08X\n", pThis->szPrf, pDesc->fEOP, RDTR, RADV)); 2158 2159 if (pDesc->status.fEOP) 2159 2160 { … … 2163 2164 { 2164 2165 /* Arm the timer to fire in RDTR usec (discard .024) */ 2165 e1kArmTimer(p State, pState->CTX_SUFF(pRIDTimer), RDTR);2166 e1kArmTimer(pThis, pThis->CTX_SUFF(pRIDTimer), RDTR); 2166 2167 /* If absolute timer delay is enabled and the timer is not running yet, arm it. */ 2167 if (RADV != 0 && !TMTimerIsActive(p State->CTX_SUFF(pRADTimer)))2168 e1kArmTimer(p State, pState->CTX_SUFF(pRADTimer), RADV);2168 if (RADV != 0 && !TMTimerIsActive(pThis->CTX_SUFF(pRADTimer))) 2169 e1kArmTimer(pThis, pThis->CTX_SUFF(pRADTimer), RADV); 2169 2170 } 2170 2171 else … … 2172 2173 #endif 2173 2174 /* 0 delay means immediate interrupt */ 2174 E1K_INC_ISTAT_CNT(p State->uStatIntRx);2175 e1kRaiseInterrupt(p State, VERR_SEM_BUSY, ICR_RXT0);2175 E1K_INC_ISTAT_CNT(pThis->uStatIntRx); 2176 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_RXT0); 2176 2177 #ifdef E1K_USE_RX_TIMERS 2177 2178 } 2178 2179 #endif 2179 2180 } 2180 STAM_PROFILE_ADV_STOP(&p State->StatReceiveStore, a);2181 STAM_PROFILE_ADV_STOP(&pThis->StatReceiveStore, a); 2181 2182 } 2182 2183 #endif /* !E1K_WITH_RXD_CACHE */ … … 2212 2213 * 2213 2214 * @returns VBox status code. 2214 * @param p StateThe device state structure.2215 * @param pThis The device state structure. 2215 2216 * @param pFrame The available data. 2216 2217 * @param cb Number of bytes available in the buffer. 2217 2218 * @param status Bit fields containing status info. 2218 2219 */ 2219 static int e1kRxChecksumOffload( E1KSTATE* pState, const uint8_t *pFrame, size_t cb, E1KRXDST *pStatus)2220 static int e1kRxChecksumOffload(PE1KSTATE pThis, const uint8_t *pFrame, size_t cb, E1KRXDST *pStatus) 2220 2221 { 2221 2222 /** @todo … … 2228 2229 uint16_t uEtherType = ntohs(*(uint16_t*)(pFrame + 12)); 2229 2230 2230 E1kLog2(("%s e1kRxChecksumOffload: EtherType=%x\n", p State->szPrf, uEtherType));2231 E1kLog2(("%s e1kRxChecksumOffload: EtherType=%x\n", pThis->szPrf, uEtherType)); 2231 2232 2232 2233 switch (uEtherType) … … 2263 2264 * 2264 2265 * @returns VBox status code. 2265 * @param p StateThe device state structure.2266 * @param pThis The device state structure. 2266 2267 * @param pvBuf The available data. 2267 2268 * @param cb Number of bytes available in the buffer. 2268 2269 * @param status Bit fields containing status info. 2269 2270 */ 2270 static int e1kHandleRxPacket( E1KSTATE* pState, const void *pvBuf, size_t cb, E1KRXDST status)2271 static int e1kHandleRxPacket(PE1KSTATE pThis, const void *pvBuf, size_t cb, E1KRXDST status) 2271 2272 { 2272 2273 #if defined(IN_RING3) /** @todo Remove this extra copying, it's gonna make us run out of kernel / hypervisor stack! */ … … 2274 2275 uint8_t *ptr = rxPacket; 2275 2276 2276 int rc = e1kCsRxEnter(p State, VERR_SEM_BUSY);2277 int rc = e1kCsRxEnter(pThis, VERR_SEM_BUSY); 2277 2278 if (RT_UNLIKELY(rc != VINF_SUCCESS)) 2278 2279 return rc; 2279 2280 2280 2281 if (cb > 70) /* unqualified guess */ 2281 p State->led.Asserted.s.fReading = pState->led.Actual.s.fReading = 1;2282 pThis->led.Asserted.s.fReading = pThis->led.Actual.s.fReading = 1; 2282 2283 2283 2284 Assert(cb <= E1K_MAX_RX_PKT_SIZE); 2284 2285 Assert(cb > 16); 2285 2286 size_t cbMax = ((RCTL & RCTL_LPE) ? E1K_MAX_RX_PKT_SIZE - 4 : 1518) - (status.fVP ? 0 : 4); 2286 E1kLog3(("%s Max RX packet size is %u\n", p State->szPrf, cbMax));2287 E1kLog3(("%s Max RX packet size is %u\n", pThis->szPrf, cbMax)); 2287 2288 if (status.fVP) 2288 2289 { … … 2296 2297 cb -= 4; 2297 2298 E1kLog3(("%s Stripped tag for VLAN %u (cb=%u)\n", 2298 p State->szPrf, status.u16Special, cb));2299 pThis->szPrf, status.u16Special, cb)); 2299 2300 } 2300 2301 else … … 2311 2312 if (!(RCTL & RCTL_SECRC) && cb <= cbMax) 2312 2313 { 2313 STAM_PROFILE_ADV_START(&p State->StatReceiveCRC, a);2314 STAM_PROFILE_ADV_START(&pThis->StatReceiveCRC, a); 2314 2315 /* 2315 2316 * Add FCS if CRC stripping is not enabled. Since the value of CRC … … 2317 2318 * of calculating it (see EthernetCRC CFGM parameter). 2318 2319 */ 2319 if (p State->fEthernetCRC)2320 if (pThis->fEthernetCRC) 2320 2321 *(uint32_t*)(rxPacket + cb) = RTCrc32(rxPacket, cb); 2321 2322 cb += sizeof(uint32_t); 2322 STAM_PROFILE_ADV_STOP(&p State->StatReceiveCRC, a);2323 E1kLog3(("%s Added FCS (cb=%u)\n", p State->szPrf, cb));2323 STAM_PROFILE_ADV_STOP(&pThis->StatReceiveCRC, a); 2324 E1kLog3(("%s Added FCS (cb=%u)\n", pThis->szPrf, cb)); 2324 2325 } 2325 2326 /* Compute checksum of complete packet */ 2326 2327 uint16_t checksum = e1kCSum16(rxPacket + GET_BITS(RXCSUM, PCSS), cb); 2327 e1kRxChecksumOffload(p State, rxPacket, cb, &status);2328 e1kRxChecksumOffload(pThis, rxPacket, cb, &status); 2328 2329 2329 2330 /* Update stats */ … … 2335 2336 /* Update octet receive counter */ 2336 2337 E1K_ADD_CNT64(GORCL, GORCH, cb); 2337 STAM_REL_COUNTER_ADD(&p State->StatReceiveBytes, cb);2338 STAM_REL_COUNTER_ADD(&pThis->StatReceiveBytes, cb); 2338 2339 if (cb == 64) 2339 2340 E1K_INC_CNT32(PRC64); … … 2349 2350 E1K_INC_CNT32(PRC1522); 2350 2351 2351 E1K_INC_ISTAT_CNT(p State->uStatRxFrm);2352 E1K_INC_ISTAT_CNT(pThis->uStatRxFrm); 2352 2353 2353 2354 #ifdef E1K_WITH_RXD_CACHE 2354 2355 while (cb > 0) 2355 2356 { 2356 E1KRXDESC *pDesc = e1kRxDGet(p State);2357 E1KRXDESC *pDesc = e1kRxDGet(pThis); 2357 2358 2358 2359 if (pDesc == NULL) … … 2360 2361 E1kLog(("%s Out of receive buffers, dropping the packet " 2361 2362 "(cb=%u, in_cache=%u, RDH=%x RDT=%x)\n", 2362 p State->szPrf, cb, e1kRxDInCache(pState), RDH, RDT));2363 pThis->szPrf, cb, e1kRxDInCache(pThis), RDH, RDT)); 2363 2364 break; 2364 2365 } … … 2367 2368 { 2368 2369 E1kLog(("%s Out of receive buffers, dropping the packet\n", 2369 p State->szPrf));2370 pThis->szPrf)); 2370 2371 } 2371 2372 /* Store the packet to receive buffers */ … … 2374 2375 /* Load the descriptor pointed by head */ 2375 2376 E1KRXDESC desc, *pDesc = &desc; 2376 PDMDevHlpPhysRead(p State->CTX_SUFF(pDevIns), e1kDescAddr(RDBAH, RDBAL, RDH),2377 PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns), e1kDescAddr(RDBAH, RDBAL, RDH), 2377 2378 &desc, sizeof(desc)); 2378 2379 #endif /* !E1K_WITH_RXD_CACHE */ … … 2392 2393 * fetched RxD cache entries either. 2393 2394 */ 2394 if (cb > p State->u16RxBSize)2395 if (cb > pThis->u16RxBSize) 2395 2396 { 2396 2397 pDesc->status.fEOP = false; 2397 e1kCsRxLeave(p State);2398 e1kStoreRxFragment(p State, pDesc, ptr, pState->u16RxBSize);2399 rc = e1kCsRxEnter(p State, VERR_SEM_BUSY);2398 e1kCsRxLeave(pThis); 2399 e1kStoreRxFragment(pThis, pDesc, ptr, pThis->u16RxBSize); 2400 rc = e1kCsRxEnter(pThis, VERR_SEM_BUSY); 2400 2401 if (RT_UNLIKELY(rc != VINF_SUCCESS)) 2401 2402 return rc; 2402 ptr += p State->u16RxBSize;2403 cb -= p State->u16RxBSize;2403 ptr += pThis->u16RxBSize; 2404 cb -= pThis->u16RxBSize; 2404 2405 } 2405 2406 else 2406 2407 { 2407 2408 pDesc->status.fEOP = true; 2408 e1kCsRxLeave(p State);2409 e1kStoreRxFragment(p State, pDesc, ptr, cb);2409 e1kCsRxLeave(pThis); 2410 e1kStoreRxFragment(pThis, pDesc, ptr, cb); 2410 2411 #ifdef E1K_WITH_RXD_CACHE 2411 rc = e1kCsRxEnter(p State, VERR_SEM_BUSY);2412 rc = e1kCsRxEnter(pThis, VERR_SEM_BUSY); 2412 2413 if (RT_UNLIKELY(rc != VINF_SUCCESS)) 2413 2414 return rc; 2414 2415 cb = 0; 2415 2416 #else /* !E1K_WITH_RXD_CACHE */ 2416 p State->led.Actual.s.fReading = 0;2417 pThis->led.Actual.s.fReading = 0; 2417 2418 return VINF_SUCCESS; 2418 2419 #endif /* !E1K_WITH_RXD_CACHE */ … … 2429 2430 /* Write back the descriptor. */ 2430 2431 pDesc->status.fDD = true; 2431 e1kRxDPut(p State, pDesc);2432 e1kRxDPut(pThis, pDesc); 2432 2433 #ifndef E1K_WITH_RXD_CACHE 2433 2434 } … … 2436 2437 2437 2438 if (cb > 0) 2438 E1kLog(("%s Out of receive buffers, dropping %u bytes", p State->szPrf, cb));2439 2440 p State->led.Actual.s.fReading = 0;2441 2442 e1kCsRxLeave(p State);2439 E1kLog(("%s Out of receive buffers, dropping %u bytes", pThis->szPrf, cb)); 2440 2441 pThis->led.Actual.s.fReading = 0; 2442 2443 e1kCsRxLeave(pThis); 2443 2444 #ifdef E1K_WITH_RXD_CACHE 2444 2445 /* Complete packet has been stored -- it is time to let the guest know. */ … … 2447 2448 { 2448 2449 /* Arm the timer to fire in RDTR usec (discard .024) */ 2449 e1kArmTimer(p State, pState->CTX_SUFF(pRIDTimer), RDTR);2450 e1kArmTimer(pThis, pThis->CTX_SUFF(pRIDTimer), RDTR); 2450 2451 /* If absolute timer delay is enabled and the timer is not running yet, arm it. */ 2451 if (RADV != 0 && !TMTimerIsActive(p State->CTX_SUFF(pRADTimer)))2452 e1kArmTimer(p State, pState->CTX_SUFF(pRADTimer), RADV);2452 if (RADV != 0 && !TMTimerIsActive(pThis->CTX_SUFF(pRADTimer))) 2453 e1kArmTimer(pThis, pThis->CTX_SUFF(pRADTimer), RADV); 2453 2454 } 2454 2455 else … … 2456 2457 # endif /* E1K_USE_RX_TIMERS */ 2457 2458 /* 0 delay means immediate interrupt */ 2458 E1K_INC_ISTAT_CNT(p State->uStatIntRx);2459 e1kRaiseInterrupt(p State, VERR_SEM_BUSY, ICR_RXT0);2459 E1K_INC_ISTAT_CNT(pThis->uStatIntRx); 2460 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_RXT0); 2460 2461 # ifdef E1K_USE_RX_TIMERS 2461 2462 } … … 2473 2474 * Bring the link up after the configured delay, 5 seconds by default. 2474 2475 * 2475 * @param p StateThe device state structure.2476 * @param pThis The device state structure. 2476 2477 * @thread any 2477 2478 */ 2478 DECLINLINE(void) e1kBringLinkUpDelayed( E1KSTATE* pState)2479 DECLINLINE(void) e1kBringLinkUpDelayed(PE1KSTATE pThis) 2479 2480 { 2480 2481 E1kLog(("%s Will bring up the link in %d seconds...\n", 2481 p State->szPrf, pState->cMsLinkUpDelay / 1000));2482 e1kArmTimer(p State, pState->CTX_SUFF(pLUTimer), pState->cMsLinkUpDelay * 1000);2482 pThis->szPrf, pThis->cMsLinkUpDelay / 1000)); 2483 e1kArmTimer(pThis, pThis->CTX_SUFF(pLUTimer), pThis->cMsLinkUpDelay * 1000); 2483 2484 } 2484 2485 … … 2491 2492 * @returns VBox status code. 2492 2493 * 2493 * @param p StateThe device state structure.2494 * @param pThis The device state structure. 2494 2495 * @param offset Register offset in memory-mapped frame. 2495 2496 * @param index Register index in register array. 2496 2497 * @param mask Used to implement partial reads (8 and 16-bit). 2497 2498 */ 2498 static int e1kRegReadCTRL( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value)2499 static int e1kRegReadCTRL(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 2499 2500 { 2500 2501 E1kLog(("%s e1kRegReadCTRL: mdio dir=%s mdc dir=%s mdc=%d\n", 2501 p State->szPrf, (CTRL & CTRL_MDIO_DIR)?"OUT":"IN ",2502 pThis->szPrf, (CTRL & CTRL_MDIO_DIR)?"OUT":"IN ", 2502 2503 (CTRL & CTRL_MDC_DIR)?"OUT":"IN ", !!(CTRL & CTRL_MDC))); 2503 2504 if ((CTRL & CTRL_MDIO_DIR) == 0 && (CTRL & CTRL_MDC)) 2504 2505 { 2505 2506 /* MDC is high and MDIO pin is used for input, read MDIO pin from PHY */ 2506 if (Phy::readMDIO(&p State->phy))2507 if (Phy::readMDIO(&pThis->phy)) 2507 2508 *pu32Value = CTRL | CTRL_MDIO; 2508 2509 else 2509 2510 *pu32Value = CTRL & ~CTRL_MDIO; 2510 2511 E1kLog(("%s e1kRegReadCTRL: Phy::readMDIO(%d)\n", 2511 p State->szPrf, !!(*pu32Value & CTRL_MDIO)));2512 pThis->szPrf, !!(*pu32Value & CTRL_MDIO))); 2512 2513 } 2513 2514 else … … 2525 2526 * Handles reset. 2526 2527 * 2527 * @param p StateThe device state structure.2528 * @param pThis The device state structure. 2528 2529 * @param offset Register offset in memory-mapped frame. 2529 2530 * @param index Register index in register array. … … 2532 2533 * @thread EMT 2533 2534 */ 2534 static int e1kRegWriteCTRL( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)2535 static int e1kRegWriteCTRL(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2535 2536 { 2536 2537 int rc = VINF_SUCCESS; … … 2541 2542 return VINF_IOM_R3_IOPORT_WRITE; 2542 2543 #else 2543 e1kHardReset(p State);2544 e1kHardReset(pThis); 2544 2545 #endif 2545 2546 } … … 2547 2548 { 2548 2549 if ( (value & CTRL_SLU) 2549 && p State->fCableConnected2550 && pThis->fCableConnected 2550 2551 && !(STATUS & STATUS_LU)) 2551 2552 { 2552 2553 /* The driver indicates that we should bring up the link */ 2553 2554 /* Do so in 5 seconds (by default). */ 2554 e1kBringLinkUpDelayed(p State);2555 e1kBringLinkUpDelayed(pThis); 2555 2556 /* 2556 2557 * Change the status (but not PHY status) anyway as Windows expects … … 2561 2562 if (value & CTRL_VME) 2562 2563 { 2563 E1kLog(("%s VLAN Mode Enabled\n", p State->szPrf));2564 E1kLog(("%s VLAN Mode Enabled\n", pThis->szPrf)); 2564 2565 } 2565 2566 E1kLog(("%s e1kRegWriteCTRL: mdio dir=%s mdc dir=%s mdc=%s mdio=%d\n", 2566 p State->szPrf, (value & CTRL_MDIO_DIR)?"OUT":"IN ",2567 pThis->szPrf, (value & CTRL_MDIO_DIR)?"OUT":"IN ", 2567 2568 (value & CTRL_MDC_DIR)?"OUT":"IN ", (value & CTRL_MDC)?"HIGH":"LOW ", !!(value & CTRL_MDIO))); 2568 2569 if (value & CTRL_MDC) … … 2570 2571 if (value & CTRL_MDIO_DIR) 2571 2572 { 2572 E1kLog(("%s e1kRegWriteCTRL: Phy::writeMDIO(%d)\n", p State->szPrf, !!(value & CTRL_MDIO)));2573 E1kLog(("%s e1kRegWriteCTRL: Phy::writeMDIO(%d)\n", pThis->szPrf, !!(value & CTRL_MDIO))); 2573 2574 /* MDIO direction pin is set to output and MDC is high, write MDIO pin value to PHY */ 2574 Phy::writeMDIO(&p State->phy, !!(value & CTRL_MDIO));2575 Phy::writeMDIO(&pThis->phy, !!(value & CTRL_MDIO)); 2575 2576 } 2576 2577 else 2577 2578 { 2578 if (Phy::readMDIO(&p State->phy))2579 if (Phy::readMDIO(&pThis->phy)) 2579 2580 value |= CTRL_MDIO; 2580 2581 else 2581 2582 value &= ~CTRL_MDIO; 2582 2583 E1kLog(("%s e1kRegWriteCTRL: Phy::readMDIO(%d)\n", 2583 p State->szPrf, !!(value & CTRL_MDIO)));2584 pThis->szPrf, !!(value & CTRL_MDIO))); 2584 2585 } 2585 2586 } 2586 rc = e1kRegWriteDefault(p State, offset, index, value);2587 rc = e1kRegWriteDefault(pThis, offset, index, value); 2587 2588 } 2588 2589 … … 2595 2596 * Handles EEPROM access requests; forwards writes to EEPROM device if access has been granted. 2596 2597 * 2597 * @param p StateThe device state structure.2598 * @param pThis The device state structure. 2598 2599 * @param offset Register offset in memory-mapped frame. 2599 2600 * @param index Register index in register array. … … 2602 2603 * @thread EMT 2603 2604 */ 2604 static int e1kRegWriteEECD( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)2605 static int e1kRegWriteEECD(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2605 2606 { 2606 2607 #ifdef IN_RING3 2607 2608 /* So far we are concerned with lower byte only */ 2608 if ((EECD & EECD_EE_GNT) || p State->eChip == E1K_CHIP_82543GC)2609 if ((EECD & EECD_EE_GNT) || pThis->eChip == E1K_CHIP_82543GC) 2609 2610 { 2610 2611 /* Access to EEPROM granted -- forward 4-wire bits to EEPROM device */ 2611 2612 /* Note: 82543GC does not need to request EEPROM access */ 2612 STAM_PROFILE_ADV_START(&p State->StatEEPROMWrite, a);2613 p State->eeprom.write(value & EECD_EE_WIRES);2614 STAM_PROFILE_ADV_STOP(&p State->StatEEPROMWrite, a);2613 STAM_PROFILE_ADV_START(&pThis->StatEEPROMWrite, a); 2614 pThis->eeprom.write(value & EECD_EE_WIRES); 2615 STAM_PROFILE_ADV_STOP(&pThis->StatEEPROMWrite, a); 2615 2616 } 2616 2617 if (value & EECD_EE_REQ) … … 2618 2619 else 2619 2620 EECD &= ~EECD_EE_GNT; 2620 //e1kRegWriteDefault(p State, offset, index, value );2621 //e1kRegWriteDefault(pThis, offset, index, value ); 2621 2622 2622 2623 return VINF_SUCCESS; … … 2633 2634 * @returns VBox status code. 2634 2635 * 2635 * @param p StateThe device state structure.2636 * @param pThis The device state structure. 2636 2637 * @param offset Register offset in memory-mapped frame. 2637 2638 * @param index Register index in register array. … … 2639 2640 * @thread EMT 2640 2641 */ 2641 static int e1kRegReadEECD( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value)2642 static int e1kRegReadEECD(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 2642 2643 { 2643 2644 #ifdef IN_RING3 2644 2645 uint32_t value; 2645 int rc = e1kRegReadDefault(p State, offset, index, &value);2646 int rc = e1kRegReadDefault(pThis, offset, index, &value); 2646 2647 if (RT_SUCCESS(rc)) 2647 2648 { 2648 if ((value & EECD_EE_GNT) || p State->eChip == E1K_CHIP_82543GC)2649 if ((value & EECD_EE_GNT) || pThis->eChip == E1K_CHIP_82543GC) 2649 2650 { 2650 2651 /* Note: 82543GC does not need to request EEPROM access */ 2651 2652 /* Access to EEPROM granted -- get 4-wire bits to EEPROM device */ 2652 STAM_PROFILE_ADV_START(&p State->StatEEPROMRead, a);2653 value |= p State->eeprom.read();2654 STAM_PROFILE_ADV_STOP(&p State->StatEEPROMRead, a);2653 STAM_PROFILE_ADV_START(&pThis->StatEEPROMRead, a); 2654 value |= pThis->eeprom.read(); 2655 STAM_PROFILE_ADV_STOP(&pThis->StatEEPROMRead, a); 2655 2656 } 2656 2657 *pu32Value = value; … … 2669 2670 * into DATA field. 2670 2671 * 2671 * @param p StateThe device state structure.2672 * @param pThis The device state structure. 2672 2673 * @param offset Register offset in memory-mapped frame. 2673 2674 * @param index Register index in register array. … … 2676 2677 * @thread EMT 2677 2678 */ 2678 static int e1kRegWriteEERD( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)2679 static int e1kRegWriteEERD(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2679 2680 { 2680 2681 #ifdef IN_RING3 2681 2682 /* Make use of 'writable' and 'readable' masks. */ 2682 e1kRegWriteDefault(p State, offset, index, value);2683 e1kRegWriteDefault(pThis, offset, index, value); 2683 2684 /* DONE and DATA are set only if read was triggered by START. */ 2684 2685 if (value & EERD_START) 2685 2686 { 2686 2687 uint16_t tmp; 2687 STAM_PROFILE_ADV_START(&p State->StatEEPROMRead, a);2688 if (p State->eeprom.readWord(GET_BITS_V(value, EERD, ADDR), &tmp))2688 STAM_PROFILE_ADV_START(&pThis->StatEEPROMRead, a); 2689 if (pThis->eeprom.readWord(GET_BITS_V(value, EERD, ADDR), &tmp)) 2689 2690 SET_BITS(EERD, DATA, tmp); 2690 2691 EERD |= EERD_DONE; 2691 STAM_PROFILE_ADV_STOP(&p State->StatEEPROMRead, a);2692 STAM_PROFILE_ADV_STOP(&pThis->StatEEPROMRead, a); 2692 2693 } 2693 2694 … … 2704 2705 * Handles PHY read/write requests; forwards requests to internal PHY device. 2705 2706 * 2706 * @param p StateThe device state structure.2707 * @param pThis The device state structure. 2707 2708 * @param offset Register offset in memory-mapped frame. 2708 2709 * @param index Register index in register array. … … 2711 2712 * @thread EMT 2712 2713 */ 2713 static int e1kRegWriteMDIC( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)2714 static int e1kRegWriteMDIC(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2714 2715 { 2715 2716 if (value & MDIC_INT_EN) 2716 2717 { 2717 2718 E1kLog(("%s ERROR! Interrupt at the end of an MDI cycle is not supported yet.\n", 2718 p State->szPrf));2719 pThis->szPrf)); 2719 2720 } 2720 2721 else if (value & MDIC_READY) 2721 2722 { 2722 2723 E1kLog(("%s ERROR! Ready bit is not reset by software during write operation.\n", 2723 p State->szPrf));2724 pThis->szPrf)); 2724 2725 } 2725 2726 else if (GET_BITS_V(value, MDIC, PHY) != 1) 2726 2727 { 2727 2728 E1kLog(("%s ERROR! Access to invalid PHY detected, phy=%d.\n", 2728 p State->szPrf, GET_BITS_V(value, MDIC, PHY)));2729 pThis->szPrf, GET_BITS_V(value, MDIC, PHY))); 2729 2730 } 2730 2731 else 2731 2732 { 2732 2733 /* Store the value */ 2733 e1kRegWriteDefault(p State, offset, index, value);2734 STAM_COUNTER_INC(&p State->StatPHYAccesses);2734 e1kRegWriteDefault(pThis, offset, index, value); 2735 STAM_COUNTER_INC(&pThis->StatPHYAccesses); 2735 2736 /* Forward op to PHY */ 2736 2737 if (value & MDIC_OP_READ) 2737 SET_BITS(MDIC, DATA, Phy::readRegister(&p State->phy, GET_BITS_V(value, MDIC, REG)));2738 SET_BITS(MDIC, DATA, Phy::readRegister(&pThis->phy, GET_BITS_V(value, MDIC, REG))); 2738 2739 else 2739 Phy::writeRegister(&p State->phy, GET_BITS_V(value, MDIC, REG), value & MDIC_DATA_MASK);2740 Phy::writeRegister(&pThis->phy, GET_BITS_V(value, MDIC, REG), value & MDIC_DATA_MASK); 2740 2741 /* Let software know that we are done */ 2741 2742 MDIC |= MDIC_READY; … … 2750 2751 * Bits corresponding to 1s in 'value' will be cleared in ICR register. 2751 2752 * 2752 * @param p StateThe device state structure.2753 * @param pThis The device state structure. 2753 2754 * @param offset Register offset in memory-mapped frame. 2754 2755 * @param index Register index in register array. … … 2757 2758 * @thread EMT 2758 2759 */ 2759 static int e1kRegWriteICR( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)2760 static int e1kRegWriteICR(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2760 2761 { 2761 2762 ICR &= ~value; … … 2771 2772 * @returns VBox status code. 2772 2773 * 2773 * @param p StateThe device state structure.2774 * @param pThis The device state structure. 2774 2775 * @param offset Register offset in memory-mapped frame. 2775 2776 * @param index Register index in register array. … … 2777 2778 * @thread EMT 2778 2779 */ 2779 static int e1kRegReadICR( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value)2780 { 2781 int rc = e1kCsEnter(p State, VINF_IOM_R3_MMIO_READ);2780 static int e1kRegReadICR(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 2781 { 2782 int rc = e1kCsEnter(pThis, VINF_IOM_R3_MMIO_READ); 2782 2783 if (RT_UNLIKELY(rc != VINF_SUCCESS)) 2783 2784 return rc; 2784 2785 2785 2786 uint32_t value = 0; 2786 rc = e1kRegReadDefault(p State, offset, index, &value);2787 rc = e1kRegReadDefault(pThis, offset, index, &value); 2787 2788 if (RT_SUCCESS(rc)) 2788 2789 { … … 2801 2802 */ 2802 2803 E1kLogRel(("E1000: irq lowered, icr=0x%x\n", ICR)); 2803 E1kLog(("%s e1kRegReadICR: Lowered IRQ (%08x)\n", p State->szPrf, ICR));2804 E1kLog(("%s e1kRegReadICR: Lowered IRQ (%08x)\n", pThis->szPrf, ICR)); 2804 2805 /* Clear all pending interrupts */ 2805 2806 ICR = 0; 2806 p State->fIntRaised = false;2807 pThis->fIntRaised = false; 2807 2808 /* Lower(0) INTA(0) */ 2808 PDMDevHlpPCISetIrq(p State->CTX_SUFF(pDevIns), 0, 0);2809 2810 p State->u64AckedAt = TMTimerGet(pState->CTX_SUFF(pIntTimer));2811 if (p State->fIntMaskUsed)2812 p State->fDelayInts = true;2809 PDMDevHlpPCISetIrq(pThis->CTX_SUFF(pDevIns), 0, 0); 2810 2811 pThis->u64AckedAt = TMTimerGet(pThis->CTX_SUFF(pIntTimer)); 2812 if (pThis->fIntMaskUsed) 2813 pThis->fDelayInts = true; 2813 2814 } 2814 2815 else … … 2818 2819 * just before re-enabling interrupts 2819 2820 */ 2820 E1kLog(("%s e1kRegReadICR: Suppressing auto-clear due to disabled interrupts (%08x)\n", p State->szPrf, ICR));2821 E1kLog(("%s e1kRegReadICR: Suppressing auto-clear due to disabled interrupts (%08x)\n", pThis->szPrf, ICR)); 2821 2822 } 2822 2823 } 2823 2824 *pu32Value = value; 2824 2825 } 2825 e1kCsLeave(p State);2826 e1kCsLeave(pThis); 2826 2827 2827 2828 return rc; … … 2833 2834 * Bits corresponding to 1s in 'value' will be set in ICR register. 2834 2835 * 2835 * @param p StateThe device state structure.2836 * @param pThis The device state structure. 2836 2837 * @param offset Register offset in memory-mapped frame. 2837 2838 * @param index Register index in register array. … … 2840 2841 * @thread EMT 2841 2842 */ 2842 static int e1kRegWriteICS( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)2843 { 2844 E1K_INC_ISTAT_CNT(p State->uStatIntICS);2845 return e1kRaiseInterrupt(p State, VINF_IOM_R3_MMIO_WRITE, value & s_e1kRegMap[ICS_IDX].writable);2843 static int e1kRegWriteICS(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2844 { 2845 E1K_INC_ISTAT_CNT(pThis->uStatIntICS); 2846 return e1kRaiseInterrupt(pThis, VINF_IOM_R3_MMIO_WRITE, value & s_e1kRegMap[ICS_IDX].writable); 2846 2847 } 2847 2848 … … 2851 2852 * Will trigger pending interrupts. 2852 2853 * 2853 * @param p StateThe device state structure.2854 * @param pThis The device state structure. 2854 2855 * @param offset Register offset in memory-mapped frame. 2855 2856 * @param index Register index in register array. … … 2858 2859 * @thread EMT 2859 2860 */ 2860 static int e1kRegWriteIMS( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)2861 static int e1kRegWriteIMS(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2861 2862 { 2862 2863 IMS |= value; 2863 2864 E1kLogRel(("E1000: irq enabled, RDH=%x RDT=%x TDH=%x TDT=%x\n", RDH, RDT, TDH, TDT)); 2864 E1kLog(("%s e1kRegWriteIMS: IRQ enabled\n", p State->szPrf));2865 E1kLog(("%s e1kRegWriteIMS: IRQ enabled\n", pThis->szPrf)); 2865 2866 /* Mask changes, we need to raise pending interrupts. */ 2866 if ((ICR & IMS) && !p State->fLocked)2867 if ((ICR & IMS) && !pThis->fLocked) 2867 2868 { 2868 2869 E1kLog2(("%s e1kRegWriteIMS: IRQ pending (%08x), arming late int timer...\n", 2869 p State->szPrf, ICR));2870 pThis->szPrf, ICR)); 2870 2871 /* Raising an interrupt immediately causes win7 to hang upon NIC reconfiguration, see @bugref{5023}. */ 2871 TMTimerSet(p State->CTX_SUFF(pIntTimer), TMTimerFromNano(pState->CTX_SUFF(pIntTimer), ITR * 256) +2872 TMTimerGet(p State->CTX_SUFF(pIntTimer)));2872 TMTimerSet(pThis->CTX_SUFF(pIntTimer), TMTimerFromNano(pThis->CTX_SUFF(pIntTimer), ITR * 256) + 2873 TMTimerGet(pThis->CTX_SUFF(pIntTimer))); 2873 2874 } 2874 2875 … … 2881 2882 * Bits corresponding to 1s in 'value' will be cleared in IMS register. 2882 2883 * 2883 * @param p StateThe device state structure.2884 * @param pThis The device state structure. 2884 2885 * @param offset Register offset in memory-mapped frame. 2885 2886 * @param index Register index in register array. … … 2888 2889 * @thread EMT 2889 2890 */ 2890 static int e1kRegWriteIMC( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)2891 { 2892 int rc = e1kCsEnter(p State, VINF_IOM_R3_MMIO_WRITE);2891 static int e1kRegWriteIMC(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2892 { 2893 int rc = e1kCsEnter(pThis, VINF_IOM_R3_MMIO_WRITE); 2893 2894 if (RT_UNLIKELY(rc != VINF_SUCCESS)) 2894 2895 return rc; 2895 if (p State->fIntRaised)2896 if (pThis->fIntRaised) 2896 2897 { 2897 2898 /* … … 2900 2901 * of interrupt handler. 2901 2902 */ 2902 E1K_INC_ISTAT_CNT(p State->uStatIntLower);2903 STAM_COUNTER_INC(&p State->StatIntsPrevented);2903 E1K_INC_ISTAT_CNT(pThis->uStatIntLower); 2904 STAM_COUNTER_INC(&pThis->StatIntsPrevented); 2904 2905 E1kLogRel(("E1000: irq lowered (IMC), icr=0x%x\n", ICR)); 2905 2906 /* Lower(0) INTA(0) */ 2906 PDMDevHlpPCISetIrq(p State->CTX_SUFF(pDevIns), 0, 0);2907 p State->fIntRaised = false;2908 E1kLog(("%s e1kRegWriteIMC: Lowered IRQ: ICR=%08x\n", p State->szPrf, ICR));2907 PDMDevHlpPCISetIrq(pThis->CTX_SUFF(pDevIns), 0, 0); 2908 pThis->fIntRaised = false; 2909 E1kLog(("%s e1kRegWriteIMC: Lowered IRQ: ICR=%08x\n", pThis->szPrf, ICR)); 2909 2910 } 2910 2911 IMS &= ~value; 2911 E1kLog(("%s e1kRegWriteIMC: IRQ disabled\n", p State->szPrf));2912 e1kCsLeave(p State);2912 E1kLog(("%s e1kRegWriteIMC: IRQ disabled\n", pThis->szPrf)); 2913 e1kCsLeave(pThis); 2913 2914 2914 2915 return VINF_SUCCESS; … … 2918 2919 * Write handler for Receive Control register. 2919 2920 * 2920 * @param p StateThe device state structure.2921 * @param pThis The device state structure. 2921 2922 * @param offset Register offset in memory-mapped frame. 2922 2923 * @param index Register index in register array. … … 2925 2926 * @thread EMT 2926 2927 */ 2927 static int e1kRegWriteRCTL( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)2928 static int e1kRegWriteRCTL(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2928 2929 { 2929 2930 /* Update promiscuous mode */ … … 2935 2936 return VINF_IOM_R3_IOPORT_WRITE; 2936 2937 #else 2937 if (p State->pDrvR3)2938 p State->pDrvR3->pfnSetPromiscuousMode(pState->pDrvR3, fBecomePromiscous);2938 if (pThis->pDrvR3) 2939 pThis->pDrvR3->pfnSetPromiscuousMode(pThis->pDrvR3, fBecomePromiscous); 2939 2940 #endif 2940 2941 } … … 2944 2945 if (value & RCTL_BSEX) 2945 2946 cbRxBuf *= 16; 2946 if (cbRxBuf != p State->u16RxBSize)2947 if (cbRxBuf != pThis->u16RxBSize) 2947 2948 E1kLog2(("%s e1kRegWriteRCTL: Setting receive buffer size to %d (old %d)\n", 2948 p State->szPrf, cbRxBuf, pState->u16RxBSize));2949 p State->u16RxBSize = cbRxBuf;2949 pThis->szPrf, cbRxBuf, pThis->u16RxBSize)); 2950 pThis->u16RxBSize = cbRxBuf; 2950 2951 2951 2952 /* Update the register */ 2952 e1kRegWriteDefault(p State, offset, index, value);2953 e1kRegWriteDefault(pThis, offset, index, value); 2953 2954 2954 2955 return VINF_SUCCESS; … … 2960 2961 * TXA = 64 - RXA. 2961 2962 * 2962 * @param p StateThe device state structure.2963 * @param pThis The device state structure. 2963 2964 * @param offset Register offset in memory-mapped frame. 2964 2965 * @param index Register index in register array. … … 2967 2968 * @thread EMT 2968 2969 */ 2969 static int e1kRegWritePBA( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)2970 { 2971 e1kRegWriteDefault(p State, offset, index, value);2970 static int e1kRegWritePBA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2971 { 2972 e1kRegWriteDefault(pThis, offset, index, value); 2972 2973 PBA_st->txa = 64 - PBA_st->rxa; 2973 2974 … … 2983 2984 * @returns VBox status code. 2984 2985 * 2985 * @param p StateThe device state structure.2986 * @param pThis The device state structure. 2986 2987 * @param offset Register offset in memory-mapped frame. 2987 2988 * @param index Register index in register array. … … 2990 2991 * @thread EMT 2991 2992 */ 2992 static int e1kRegWriteRDT( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)2993 static int e1kRegWriteRDT(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 2993 2994 { 2994 2995 #ifndef IN_RING3 … … 2996 2997 // return VINF_IOM_R3_MMIO_WRITE; 2997 2998 #endif 2998 int rc = e1kCsRxEnter(p State, VINF_IOM_R3_MMIO_WRITE);2999 int rc = e1kCsRxEnter(pThis, VINF_IOM_R3_MMIO_WRITE); 2999 3000 if (RT_LIKELY(rc == VINF_SUCCESS)) 3000 3001 { 3001 E1kLog(("%s e1kRegWriteRDT\n", p State->szPrf));3002 rc = e1kRegWriteDefault(p State, offset, index, value);3002 E1kLog(("%s e1kRegWriteRDT\n", pThis->szPrf)); 3003 rc = e1kRegWriteDefault(pThis, offset, index, value); 3003 3004 #ifdef E1K_WITH_RXD_CACHE 3004 3005 /* … … 3021 3022 * a later point in e1kRxDGet(). 3022 3023 */ 3023 if (e1kRxDIsCacheEmpty(p State) && (RCTL & RCTL_EN))3024 e1kRxDPrefetch(p State);3024 if (e1kRxDIsCacheEmpty(pThis) && (RCTL & RCTL_EN)) 3025 e1kRxDPrefetch(pThis); 3025 3026 #endif /* E1K_WITH_RXD_CACHE */ 3026 e1kCsRxLeave(p State);3027 e1kCsRxLeave(pThis); 3027 3028 if (RT_SUCCESS(rc)) 3028 3029 { … … 3034 3035 #ifdef IN_RING3 3035 3036 /* Signal that we have more receive descriptors available. */ 3036 e1kWakeupReceive(p State->CTX_SUFF(pDevIns));3037 e1kWakeupReceive(pThis->CTX_SUFF(pDevIns)); 3037 3038 #else 3038 PPDMQUEUEITEMCORE pItem = PDMQueueAlloc(p State->CTX_SUFF(pCanRxQueue));3039 PPDMQUEUEITEMCORE pItem = PDMQueueAlloc(pThis->CTX_SUFF(pCanRxQueue)); 3039 3040 if (pItem) 3040 PDMQueueInsert(p State->CTX_SUFF(pCanRxQueue), pItem);3041 PDMQueueInsert(pThis->CTX_SUFF(pCanRxQueue), pItem); 3041 3042 #endif 3042 3043 } … … 3048 3049 * Write handler for Receive Delay Timer register. 3049 3050 * 3050 * @param p StateThe device state structure.3051 * @param pThis The device state structure. 3051 3052 * @param offset Register offset in memory-mapped frame. 3052 3053 * @param index Register index in register array. … … 3055 3056 * @thread EMT 3056 3057 */ 3057 static int e1kRegWriteRDTR( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)3058 { 3059 e1kRegWriteDefault(p State, offset, index, value);3058 static int e1kRegWriteRDTR(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 3059 { 3060 e1kRegWriteDefault(pThis, offset, index, value); 3060 3061 if (value & RDTR_FPD) 3061 3062 { 3062 3063 /* Flush requested, cancel both timers and raise interrupt */ 3063 3064 #ifdef E1K_USE_RX_TIMERS 3064 e1kCancelTimer(p State, pState->CTX_SUFF(pRIDTimer));3065 e1kCancelTimer(p State, pState->CTX_SUFF(pRADTimer));3065 e1kCancelTimer(pThis, pThis->CTX_SUFF(pRIDTimer)); 3066 e1kCancelTimer(pThis, pThis->CTX_SUFF(pRADTimer)); 3066 3067 #endif 3067 E1K_INC_ISTAT_CNT(p State->uStatIntRDTR);3068 return e1kRaiseInterrupt(p State, VINF_IOM_R3_MMIO_WRITE, ICR_RXT0);3068 E1K_INC_ISTAT_CNT(pThis->uStatIntRDTR); 3069 return e1kRaiseInterrupt(pThis, VINF_IOM_R3_MMIO_WRITE, ICR_RXT0); 3069 3070 } 3070 3071 … … 3072 3073 } 3073 3074 3074 DECLINLINE(uint32_t) e1kGetTxLen( E1KSTATE* pState)3075 DECLINLINE(uint32_t) e1kGetTxLen(PE1KSTATE pThis) 3075 3076 { 3076 3077 /** … … 3097 3098 static DECLCALLBACK(void) e1kTxDelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser) 3098 3099 { 3099 E1KSTATE *pState = (E1KSTATE *)pvUser;3100 Assert(PDMCritSectIsOwner(&p State->csTx));3101 3102 E1K_INC_ISTAT_CNT(p State->uStatTxDelayExp);3100 PE1KSTATE pThis = (PE1KSTATE )pvUser; 3101 Assert(PDMCritSectIsOwner(&pThis->csTx)); 3102 3103 E1K_INC_ISTAT_CNT(pThis->uStatTxDelayExp); 3103 3104 #ifdef E1K_INT_STATS 3104 uint64_t u64Elapsed = RTTimeNanoTS() - p State->u64ArmedAt;3105 if (u64Elapsed > p State->uStatMaxTxDelay)3106 p State->uStatMaxTxDelay = u64Elapsed;3105 uint64_t u64Elapsed = RTTimeNanoTS() - pThis->u64ArmedAt; 3106 if (u64Elapsed > pThis->uStatMaxTxDelay) 3107 pThis->uStatMaxTxDelay = u64Elapsed; 3107 3108 #endif 3108 int rc = e1kXmitPending(p State, false /*fOnWorkerThread*/);3109 int rc = e1kXmitPending(pThis, false /*fOnWorkerThread*/); 3109 3110 AssertMsg(RT_SUCCESS(rc) || rc == VERR_TRY_AGAIN, ("%Rrc\n", rc)); 3110 3111 } … … 3125 3126 static DECLCALLBACK(void) e1kTxIntDelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser) 3126 3127 { 3127 E1KSTATE *pState = (E1KSTATE *)pvUser;3128 3129 E1K_INC_ISTAT_CNT(p State->uStatTID);3128 PE1KSTATE pThis = (PE1KSTATE )pvUser; 3129 3130 E1K_INC_ISTAT_CNT(pThis->uStatTID); 3130 3131 /* Cancel absolute delay timer as we have already got attention */ 3131 3132 #ifndef E1K_NO_TAD 3132 e1kCancelTimer(p State, pState->CTX_SUFF(pTADTimer));3133 e1kCancelTimer(pThis, pThis->CTX_SUFF(pTADTimer)); 3133 3134 #endif /* E1K_NO_TAD */ 3134 e1kRaiseInterrupt(p State, ICR_TXDW);3135 e1kRaiseInterrupt(pThis, ICR_TXDW); 3135 3136 } 3136 3137 … … 3147 3148 static DECLCALLBACK(void) e1kTxAbsDelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser) 3148 3149 { 3149 E1KSTATE *pState = (E1KSTATE *)pvUser;3150 3151 E1K_INC_ISTAT_CNT(p State->uStatTAD);3150 PE1KSTATE pThis = (PE1KSTATE )pvUser; 3151 3152 E1K_INC_ISTAT_CNT(pThis->uStatTAD); 3152 3153 /* Cancel interrupt delay timer as we have already got attention */ 3153 e1kCancelTimer(p State, pState->CTX_SUFF(pTIDTimer));3154 e1kRaiseInterrupt(p State, ICR_TXDW);3154 e1kCancelTimer(pThis, pThis->CTX_SUFF(pTIDTimer)); 3155 e1kRaiseInterrupt(pThis, ICR_TXDW); 3155 3156 } 3156 3157 … … 3170 3171 static DECLCALLBACK(void) e1kRxIntDelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser) 3171 3172 { 3172 E1KSTATE *pState = (E1KSTATE *)pvUser;3173 3174 E1K_INC_ISTAT_CNT(p State->uStatRID);3173 PE1KSTATE pThis = (PE1KSTATE )pvUser; 3174 3175 E1K_INC_ISTAT_CNT(pThis->uStatRID); 3175 3176 /* Cancel absolute delay timer as we have already got attention */ 3176 e1kCancelTimer(p State, pState->CTX_SUFF(pRADTimer));3177 e1kRaiseInterrupt(p State, ICR_RXT0);3177 e1kCancelTimer(pThis, pThis->CTX_SUFF(pRADTimer)); 3178 e1kRaiseInterrupt(pThis, ICR_RXT0); 3178 3179 } 3179 3180 … … 3190 3191 static DECLCALLBACK(void) e1kRxAbsDelayTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser) 3191 3192 { 3192 E1KSTATE *pState = (E1KSTATE *)pvUser;3193 3194 E1K_INC_ISTAT_CNT(p State->uStatRAD);3193 PE1KSTATE pThis = (PE1KSTATE )pvUser; 3194 3195 E1K_INC_ISTAT_CNT(pThis->uStatRAD); 3195 3196 /* Cancel interrupt delay timer as we have already got attention */ 3196 e1kCancelTimer(p State, pState->CTX_SUFF(pRIDTimer));3197 e1kRaiseInterrupt(p State, ICR_RXT0);3197 e1kCancelTimer(pThis, pThis->CTX_SUFF(pRIDTimer)); 3198 e1kRaiseInterrupt(pThis, ICR_RXT0); 3198 3199 } 3199 3200 … … 3210 3211 static DECLCALLBACK(void) e1kLateIntTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser) 3211 3212 { 3212 E1KSTATE *pState = (E1KSTATE *)pvUser;3213 3214 STAM_PROFILE_ADV_START(&p State->StatLateIntTimer, a);3215 STAM_COUNTER_INC(&p State->StatLateInts);3216 E1K_INC_ISTAT_CNT(p State->uStatIntLate);3213 PE1KSTATE pThis = (PE1KSTATE )pvUser; 3214 3215 STAM_PROFILE_ADV_START(&pThis->StatLateIntTimer, a); 3216 STAM_COUNTER_INC(&pThis->StatLateInts); 3217 E1K_INC_ISTAT_CNT(pThis->uStatIntLate); 3217 3218 #if 0 3218 if (p State->iStatIntLost > -100)3219 p State->iStatIntLost--;3219 if (pThis->iStatIntLost > -100) 3220 pThis->iStatIntLost--; 3220 3221 #endif 3221 e1kRaiseInterrupt(p State, VERR_SEM_BUSY, 0);3222 STAM_PROFILE_ADV_STOP(&p State->StatLateIntTimer, a);3222 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, 0); 3223 STAM_PROFILE_ADV_STOP(&pThis->StatLateIntTimer, a); 3223 3224 } 3224 3225 … … 3233 3234 static DECLCALLBACK(void) e1kLinkUpTimer(PPDMDEVINS pDevIns, PTMTIMER pTimer, void *pvUser) 3234 3235 { 3235 E1KSTATE *pState = (E1KSTATE *)pvUser;3236 PE1KSTATE pThis = (PE1KSTATE )pvUser; 3236 3237 3237 3238 /* … … 3240 3241 * and connect+disconnect the cable very quick. 3241 3242 */ 3242 if (!p State->fCableConnected)3243 if (!pThis->fCableConnected) 3243 3244 return; 3244 3245 3245 E1kLog(("%s e1kLinkUpTimer: Link is up\n", p State->szPrf));3246 E1kLog(("%s e1kLinkUpTimer: Link is up\n", pThis->szPrf)); 3246 3247 STATUS |= STATUS_LU; 3247 Phy::setLinkStatus(&p State->phy, true);3248 e1kRaiseInterrupt(p State, VERR_SEM_BUSY, ICR_LSC);3248 Phy::setLinkStatus(&pThis->phy, true); 3249 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC); 3249 3250 } 3250 3251 … … 3358 3359 * Checks if we can use GSO processing for the current TSE frame. 3359 3360 * 3360 * @param p StateThe device state structure.3361 * @param pThis The device state structure. 3361 3362 * @param pGso The GSO context. 3362 3363 * @param pData The first data descriptor of the frame. 3363 3364 * @param pCtx The TSO context descriptor. 3364 3365 */ 3365 DECLINLINE(bool) e1kCanDoGso( E1KSTATE *pState, PCPDMNETWORKGSO pGso, E1KTXDAT const *pData, E1KTXCTX const *pCtx)3366 DECLINLINE(bool) e1kCanDoGso(PE1KSTATE pThis, PCPDMNETWORKGSO pGso, E1KTXDAT const *pData, E1KTXCTX const *pCtx) 3366 3367 { 3367 3368 if (!pData->cmd.fTSE) … … 3375 3376 return false; 3376 3377 } 3377 if (RT_UNLIKELY(!p State->fGSOEnabled))3378 if (RT_UNLIKELY(!pThis->fGSOEnabled)) 3378 3379 { 3379 3380 E1kLog3(("e1kCanDoGso: GSO disabled via CFGM\n")); … … 3425 3426 * Frees the current xmit buffer. 3426 3427 * 3427 * @param p StateThe device state structure.3428 */ 3429 static void e1kXmitFreeBuf( E1KSTATE *pState)3430 { 3431 PPDMSCATTERGATHER pSg = p State->CTX_SUFF(pTxSg);3428 * @param pThis The device state structure. 3429 */ 3430 static void e1kXmitFreeBuf(PE1KSTATE pThis) 3431 { 3432 PPDMSCATTERGATHER pSg = pThis->CTX_SUFF(pTxSg); 3432 3433 if (pSg) 3433 3434 { 3434 p State->CTX_SUFF(pTxSg) = NULL;3435 3436 if (pSg->pvAllocator != p State)3437 { 3438 PPDMINETWORKUP pDrv = p State->CTX_SUFF(pDrv);3435 pThis->CTX_SUFF(pTxSg) = NULL; 3436 3437 if (pSg->pvAllocator != pThis) 3438 { 3439 PPDMINETWORKUP pDrv = pThis->CTX_SUFF(pDrv); 3439 3440 if (pDrv) 3440 3441 pDrv->pfnFreeBuf(pDrv, pSg); … … 3456 3457 * 3457 3458 * @returns See PDMINETWORKUP::pfnAllocBuf. 3458 * @param p StateThe device state structure.3459 * @param pThis The device state structure. 3459 3460 * @param cbMin The minimum frame size. 3460 3461 * @param fExactSize Whether cbMin is exact or if we have to max it … … 3462 3463 * @param fGso Whether this is a GSO frame or not. 3463 3464 */ 3464 DECLINLINE(int) e1kXmitAllocBuf( E1KSTATE *pState, size_t cbMin, bool fExactSize, bool fGso)3465 DECLINLINE(int) e1kXmitAllocBuf(PE1KSTATE pThis, size_t cbMin, bool fExactSize, bool fGso) 3465 3466 { 3466 3467 /* Adjust cbMin if necessary. */ … … 3469 3470 3470 3471 /* Deal with existing buffer (descriptor screw up, reset, etc). */ 3471 if (RT_UNLIKELY(p State->CTX_SUFF(pTxSg)))3472 e1kXmitFreeBuf(p State);3473 Assert(p State->CTX_SUFF(pTxSg) == NULL);3472 if (RT_UNLIKELY(pThis->CTX_SUFF(pTxSg))) 3473 e1kXmitFreeBuf(pThis); 3474 Assert(pThis->CTX_SUFF(pTxSg) == NULL); 3474 3475 3475 3476 /* … … 3479 3480 if (RT_LIKELY(GET_BITS(RCTL, LBM) != RCTL_LBM_TCVR)) 3480 3481 { 3481 PPDMINETWORKUP pDrv = p State->CTX_SUFF(pDrv);3482 PPDMINETWORKUP pDrv = pThis->CTX_SUFF(pDrv); 3482 3483 if (RT_UNLIKELY(!pDrv)) 3483 3484 return VERR_NET_DOWN; 3484 int rc = pDrv->pfnAllocBuf(pDrv, cbMin, fGso ? &p State->GsoCtx : NULL, &pSg);3485 int rc = pDrv->pfnAllocBuf(pDrv, cbMin, fGso ? &pThis->GsoCtx : NULL, &pSg); 3485 3486 if (RT_FAILURE(rc)) 3486 3487 { … … 3494 3495 /* Create a loopback using the fallback buffer and preallocated SG. */ 3495 3496 AssertCompileMemberSize(E1KSTATE, uTxFallback.Sg, 8 * sizeof(size_t)); 3496 pSg = &p State->uTxFallback.Sg;3497 pSg = &pThis->uTxFallback.Sg; 3497 3498 pSg->fFlags = PDMSCATTERGATHER_FLAGS_MAGIC | PDMSCATTERGATHER_FLAGS_OWNER_3; 3498 3499 pSg->cbUsed = 0; 3499 3500 pSg->cbAvailable = 0; 3500 pSg->pvAllocator = p State;3501 pSg->pvAllocator = pThis; 3501 3502 pSg->pvUser = NULL; /* No GSO here. */ 3502 3503 pSg->cSegs = 1; 3503 pSg->aSegs[0].pvSeg = p State->aTxPacketFallback;3504 pSg->aSegs[0].cbSeg = sizeof(p State->aTxPacketFallback);3505 } 3506 3507 p State->CTX_SUFF(pTxSg) = pSg;3504 pSg->aSegs[0].pvSeg = pThis->aTxPacketFallback; 3505 pSg->aSegs[0].cbSeg = sizeof(pThis->aTxPacketFallback); 3506 } 3507 3508 pThis->CTX_SUFF(pTxSg) = pSg; 3508 3509 return VINF_SUCCESS; 3509 3510 } … … 3513 3514 * 3514 3515 * @returns See PDMINETWORKUP::pfnAllocBuf. 3515 * @param p StateThe device state structure.3516 * @param pThis The device state structure. 3516 3517 * @param cbMin The minimum frame size. 3517 3518 * @param fExactSize Whether cbMin is exact or if we have to max it … … 3519 3520 * @param fGso Whether this is a GSO frame or not. 3520 3521 */ 3521 DECLINLINE(int) e1kXmitAllocBuf( E1KSTATE *pState, bool fGso)3522 DECLINLINE(int) e1kXmitAllocBuf(PE1KSTATE pThis, bool fGso) 3522 3523 { 3523 3524 /* Deal with existing buffer (descriptor screw up, reset, etc). */ 3524 if (RT_UNLIKELY(p State->CTX_SUFF(pTxSg)))3525 e1kXmitFreeBuf(p State);3526 Assert(p State->CTX_SUFF(pTxSg) == NULL);3525 if (RT_UNLIKELY(pThis->CTX_SUFF(pTxSg))) 3526 e1kXmitFreeBuf(pThis); 3527 Assert(pThis->CTX_SUFF(pTxSg) == NULL); 3527 3528 3528 3529 /* … … 3532 3533 if (RT_LIKELY(GET_BITS(RCTL, LBM) != RCTL_LBM_TCVR)) 3533 3534 { 3534 if (p State->cbTxAlloc == 0)3535 if (pThis->cbTxAlloc == 0) 3535 3536 { 3536 3537 /* Zero packet, no need for the buffer */ … … 3538 3539 } 3539 3540 3540 PPDMINETWORKUP pDrv = p State->CTX_SUFF(pDrv);3541 PPDMINETWORKUP pDrv = pThis->CTX_SUFF(pDrv); 3541 3542 if (RT_UNLIKELY(!pDrv)) 3542 3543 return VERR_NET_DOWN; 3543 int rc = pDrv->pfnAllocBuf(pDrv, p State->cbTxAlloc, fGso ? &pState->GsoCtx : NULL, &pSg);3544 int rc = pDrv->pfnAllocBuf(pDrv, pThis->cbTxAlloc, fGso ? &pThis->GsoCtx : NULL, &pSg); 3544 3545 if (RT_FAILURE(rc)) 3545 3546 { … … 3549 3550 } 3550 3551 E1kLog3(("%s Allocated buffer for TX packet: cb=%u %s%s\n", 3551 p State->szPrf, pState->cbTxAlloc,3552 p State->fVTag ? "VLAN " : "",3553 p State->fGSO ? "GSO " : ""));3554 p State->cbTxAlloc = 0;3552 pThis->szPrf, pThis->cbTxAlloc, 3553 pThis->fVTag ? "VLAN " : "", 3554 pThis->fGSO ? "GSO " : "")); 3555 pThis->cbTxAlloc = 0; 3555 3556 } 3556 3557 else … … 3558 3559 /* Create a loopback using the fallback buffer and preallocated SG. */ 3559 3560 AssertCompileMemberSize(E1KSTATE, uTxFallback.Sg, 8 * sizeof(size_t)); 3560 pSg = &p State->uTxFallback.Sg;3561 pSg = &pThis->uTxFallback.Sg; 3561 3562 pSg->fFlags = PDMSCATTERGATHER_FLAGS_MAGIC | PDMSCATTERGATHER_FLAGS_OWNER_3; 3562 3563 pSg->cbUsed = 0; 3563 3564 pSg->cbAvailable = 0; 3564 pSg->pvAllocator = p State;3565 pSg->pvAllocator = pThis; 3565 3566 pSg->pvUser = NULL; /* No GSO here. */ 3566 3567 pSg->cSegs = 1; 3567 pSg->aSegs[0].pvSeg = p State->aTxPacketFallback;3568 pSg->aSegs[0].cbSeg = sizeof(p State->aTxPacketFallback);3569 } 3570 3571 p State->CTX_SUFF(pTxSg) = pSg;3568 pSg->aSegs[0].pvSeg = pThis->aTxPacketFallback; 3569 pSg->aSegs[0].cbSeg = sizeof(pThis->aTxPacketFallback); 3570 } 3571 3572 pThis->CTX_SUFF(pTxSg) = pSg; 3572 3573 return VINF_SUCCESS; 3573 3574 } … … 3595 3596 * Load transmit descriptor from guest memory. 3596 3597 * 3597 * @param p StateThe device state structure.3598 * @param pThis The device state structure. 3598 3599 * @param pDesc Pointer to descriptor union. 3599 3600 * @param addr Physical address in guest context. 3600 3601 * @thread E1000_TX 3601 3602 */ 3602 DECLINLINE(void) e1kLoadDesc( E1KSTATE* pState, E1KTXDESC* pDesc, RTGCPHYS addr)3603 { 3604 PDMDevHlpPhysRead(p State->CTX_SUFF(pDevIns), addr, pDesc, sizeof(E1KTXDESC));3603 DECLINLINE(void) e1kLoadDesc(PE1KSTATE pThis, E1KTXDESC* pDesc, RTGCPHYS addr) 3604 { 3605 PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns), addr, pDesc, sizeof(E1KTXDESC)); 3605 3606 } 3606 3607 #else /* E1K_WITH_TXD_CACHE */ … … 3612 3613 * 3613 3614 * @returns the actual number of descriptors fetched. 3614 * @param p StateThe device state structure.3615 * @param pThis The device state structure. 3615 3616 * @param pDesc Pointer to descriptor union. 3616 3617 * @param addr Physical address in guest context. 3617 3618 * @thread E1000_TX 3618 3619 */ 3619 DECLINLINE(unsigned) e1kTxDLoadMore( E1KSTATE* pState)3620 { 3621 Assert(p State->iTxDCurrent == 0);3622 /* We've already loaded p State->nTxDFetched descriptors past TDH. */3623 unsigned nDescsAvailable = e1kGetTxLen(p State) - pState->nTxDFetched;3624 unsigned nDescsToFetch = RT_MIN(nDescsAvailable, E1K_TXD_CACHE_SIZE - p State->nTxDFetched);3620 DECLINLINE(unsigned) e1kTxDLoadMore(PE1KSTATE pThis) 3621 { 3622 Assert(pThis->iTxDCurrent == 0); 3623 /* We've already loaded pThis->nTxDFetched descriptors past TDH. */ 3624 unsigned nDescsAvailable = e1kGetTxLen(pThis) - pThis->nTxDFetched; 3625 unsigned nDescsToFetch = RT_MIN(nDescsAvailable, E1K_TXD_CACHE_SIZE - pThis->nTxDFetched); 3625 3626 unsigned nDescsTotal = TDLEN / sizeof(E1KTXDESC); 3626 unsigned nFirstNotLoaded = (TDH + p State->nTxDFetched) % nDescsTotal;3627 unsigned nFirstNotLoaded = (TDH + pThis->nTxDFetched) % nDescsTotal; 3627 3628 unsigned nDescsInSingleRead = RT_MIN(nDescsToFetch, nDescsTotal - nFirstNotLoaded); 3628 3629 E1kLog3(("%s e1kTxDLoadMore: nDescsAvailable=%u nDescsToFetch=%u " 3629 3630 "nDescsTotal=%u nFirstNotLoaded=0x%x nDescsInSingleRead=%u\n", 3630 p State->szPrf, nDescsAvailable, nDescsToFetch, nDescsTotal,3631 pThis->szPrf, nDescsAvailable, nDescsToFetch, nDescsTotal, 3631 3632 nFirstNotLoaded, nDescsInSingleRead)); 3632 3633 if (nDescsToFetch == 0) 3633 3634 return 0; 3634 E1KTXDESC* pFirstEmptyDesc = &p State->aTxDescriptors[pState->nTxDFetched];3635 PDMDevHlpPhysRead(p State->CTX_SUFF(pDevIns),3635 E1KTXDESC* pFirstEmptyDesc = &pThis->aTxDescriptors[pThis->nTxDFetched]; 3636 PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns), 3636 3637 ((uint64_t)TDBAH << 32) + TDBAL + nFirstNotLoaded * sizeof(E1KTXDESC), 3637 3638 pFirstEmptyDesc, nDescsInSingleRead * sizeof(E1KTXDESC)); 3638 3639 E1kLog3(("%s Fetched %u TX descriptors at %08x%08x(0x%x), TDLEN=%08x, TDH=%08x, TDT=%08x\n", 3639 p State->szPrf, nDescsInSingleRead,3640 pThis->szPrf, nDescsInSingleRead, 3640 3641 TDBAH, TDBAL + TDH * sizeof(E1KTXDESC), 3641 3642 nFirstNotLoaded, TDLEN, TDH, TDT)); 3642 3643 if (nDescsToFetch > nDescsInSingleRead) 3643 3644 { 3644 PDMDevHlpPhysRead(p State->CTX_SUFF(pDevIns),3645 PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns), 3645 3646 ((uint64_t)TDBAH << 32) + TDBAL, 3646 3647 pFirstEmptyDesc + nDescsInSingleRead, 3647 3648 (nDescsToFetch - nDescsInSingleRead) * sizeof(E1KTXDESC)); 3648 3649 E1kLog3(("%s Fetched %u TX descriptors at %08x%08x\n", 3649 p State->szPrf, nDescsToFetch - nDescsInSingleRead,3650 pThis->szPrf, nDescsToFetch - nDescsInSingleRead, 3650 3651 TDBAH, TDBAL)); 3651 3652 } 3652 p State->nTxDFetched += nDescsToFetch;3653 pThis->nTxDFetched += nDescsToFetch; 3653 3654 return nDescsToFetch; 3654 3655 } … … 3659 3660 * 3660 3661 * @returns true if there are descriptors in cache. 3661 * @param p StateThe device state structure.3662 * @param pThis The device state structure. 3662 3663 * @param pDesc Pointer to descriptor union. 3663 3664 * @param addr Physical address in guest context. 3664 3665 * @thread E1000_TX 3665 3666 */ 3666 DECLINLINE(bool) e1kTxDLazyLoad( E1KSTATE* pState)3667 { 3668 if (p State->nTxDFetched == 0)3669 return e1kTxDLoadMore(p State) != 0;3667 DECLINLINE(bool) e1kTxDLazyLoad(PE1KSTATE pThis) 3668 { 3669 if (pThis->nTxDFetched == 0) 3670 return e1kTxDLoadMore(pThis) != 0; 3670 3671 return true; 3671 3672 } … … 3675 3676 * Write back transmit descriptor to guest memory. 3676 3677 * 3677 * @param p StateThe device state structure.3678 * @param pThis The device state structure. 3678 3679 * @param pDesc Pointer to descriptor union. 3679 3680 * @param addr Physical address in guest context. 3680 3681 * @thread E1000_TX 3681 3682 */ 3682 DECLINLINE(void) e1kWriteBackDesc( E1KSTATE* pState, E1KTXDESC* pDesc, RTGCPHYS addr)3683 DECLINLINE(void) e1kWriteBackDesc(PE1KSTATE pThis, E1KTXDESC* pDesc, RTGCPHYS addr) 3683 3684 { 3684 3685 /* Only the last half of the descriptor has to be written back. */ 3685 e1kPrintTDesc(p State, pDesc, "^^^");3686 PDMDevHlpPhysWrite(p State->CTX_SUFF(pDevIns), addr, pDesc, sizeof(E1KTXDESC));3686 e1kPrintTDesc(pThis, pDesc, "^^^"); 3687 PDMDevHlpPhysWrite(pThis->CTX_SUFF(pDevIns), addr, pDesc, sizeof(E1KTXDESC)); 3687 3688 } 3688 3689 … … 3693 3694 * a real ethernet wire. 3694 3695 * 3695 * @param p StateThe device state structure.3696 * @param pThis The device state structure. 3696 3697 * @param fOnWorkerThread Whether we're on a worker thread or an EMT. 3697 3698 * @thread E1000_TX 3698 3699 */ 3699 static void e1kTransmitFrame( E1KSTATE* pState, bool fOnWorkerThread)3700 { 3701 PPDMSCATTERGATHER pSg = p State->CTX_SUFF(pTxSg);3700 static void e1kTransmitFrame(PE1KSTATE pThis, bool fOnWorkerThread) 3701 { 3702 PPDMSCATTERGATHER pSg = pThis->CTX_SUFF(pTxSg); 3702 3703 uint32_t cbFrame = pSg ? (uint32_t)pSg->cbUsed : 0; 3703 3704 Assert(!pSg || pSg->cSegs == 1); 3704 3705 3705 3706 if (cbFrame > 70) /* unqualified guess */ 3706 p State->led.Asserted.s.fWriting = pState->led.Actual.s.fWriting = 1;3707 pThis->led.Asserted.s.fWriting = pThis->led.Actual.s.fWriting = 1; 3707 3708 3708 3709 #ifdef E1K_INT_STATS 3709 3710 if (cbFrame <= 1514) 3710 E1K_INC_ISTAT_CNT(p State->uStatTx1514);3711 E1K_INC_ISTAT_CNT(pThis->uStatTx1514); 3711 3712 else if (cbFrame <= 2962) 3712 E1K_INC_ISTAT_CNT(p State->uStatTx2962);3713 E1K_INC_ISTAT_CNT(pThis->uStatTx2962); 3713 3714 else if (cbFrame <= 4410) 3714 E1K_INC_ISTAT_CNT(p State->uStatTx4410);3715 E1K_INC_ISTAT_CNT(pThis->uStatTx4410); 3715 3716 else if (cbFrame <= 5858) 3716 E1K_INC_ISTAT_CNT(p State->uStatTx5858);3717 E1K_INC_ISTAT_CNT(pThis->uStatTx5858); 3717 3718 else if (cbFrame <= 7306) 3718 E1K_INC_ISTAT_CNT(p State->uStatTx7306);3719 E1K_INC_ISTAT_CNT(pThis->uStatTx7306); 3719 3720 else if (cbFrame <= 8754) 3720 E1K_INC_ISTAT_CNT(p State->uStatTx8754);3721 E1K_INC_ISTAT_CNT(pThis->uStatTx8754); 3721 3722 else if (cbFrame <= 16384) 3722 E1K_INC_ISTAT_CNT(p State->uStatTx16384);3723 E1K_INC_ISTAT_CNT(pThis->uStatTx16384); 3723 3724 else if (cbFrame <= 32768) 3724 E1K_INC_ISTAT_CNT(p State->uStatTx32768);3725 E1K_INC_ISTAT_CNT(pThis->uStatTx32768); 3725 3726 else 3726 E1K_INC_ISTAT_CNT(p State->uStatTxLarge);3727 E1K_INC_ISTAT_CNT(pThis->uStatTxLarge); 3727 3728 #endif /* E1K_INT_STATS */ 3728 3729 3729 3730 /* Add VLAN tag */ 3730 if (cbFrame > 12 && p State->fVTag)3731 if (cbFrame > 12 && pThis->fVTag) 3731 3732 { 3732 3733 E1kLog3(("%s Inserting VLAN tag %08x\n", 3733 p State->szPrf, RT_BE2H_U16(VET) | (RT_BE2H_U16(pState->u16VTagTCI) << 16)));3734 pThis->szPrf, RT_BE2H_U16(VET) | (RT_BE2H_U16(pThis->u16VTagTCI) << 16))); 3734 3735 memmove((uint8_t*)pSg->aSegs[0].pvSeg + 16, (uint8_t*)pSg->aSegs[0].pvSeg + 12, cbFrame - 12); 3735 *((uint32_t*)pSg->aSegs[0].pvSeg + 3) = RT_BE2H_U16(VET) | (RT_BE2H_U16(p State->u16VTagTCI) << 16);3736 *((uint32_t*)pSg->aSegs[0].pvSeg + 3) = RT_BE2H_U16(VET) | (RT_BE2H_U16(pThis->u16VTagTCI) << 16); 3736 3737 pSg->cbUsed += 4; 3737 3738 cbFrame += 4; … … 3742 3743 "%.*Rhxd\n" 3743 3744 "%s < < < < < < < < < < < < < End of dump > > > > > > > > > > > >\n", 3744 p State->szPrf, cbFrame, pSg->aSegs[0].pvSeg, pState->szPrf));*/3745 pThis->szPrf, cbFrame, pSg->aSegs[0].pvSeg, pThis->szPrf));*/ 3745 3746 3746 3747 /* Update the stats */ … … 3754 3755 /* Update octet transmit counter */ 3755 3756 E1K_ADD_CNT64(GOTCL, GOTCH, cbFrame); 3756 if (p State->CTX_SUFF(pDrv))3757 STAM_REL_COUNTER_ADD(&p State->StatTransmitBytes, cbFrame);3757 if (pThis->CTX_SUFF(pDrv)) 3758 STAM_REL_COUNTER_ADD(&pThis->StatTransmitBytes, cbFrame); 3758 3759 if (cbFrame == 64) 3759 3760 E1K_INC_CNT32(PTC64); … … 3769 3770 E1K_INC_CNT32(PTC1522); 3770 3771 3771 E1K_INC_ISTAT_CNT(p State->uStatTxFrm);3772 E1K_INC_ISTAT_CNT(pThis->uStatTxFrm); 3772 3773 3773 3774 /* … … 3775 3776 */ 3776 3777 int rc = VERR_NET_DOWN; 3777 if (pSg && pSg->pvAllocator != p State)3778 { 3779 e1kPacketDump(p State, (uint8_t const *)pSg->aSegs[0].pvSeg, cbFrame, "--> Outgoing");3780 3781 p State->CTX_SUFF(pTxSg) = NULL;3782 PPDMINETWORKUP pDrv = p State->CTX_SUFF(pDrv);3778 if (pSg && pSg->pvAllocator != pThis) 3779 { 3780 e1kPacketDump(pThis, (uint8_t const *)pSg->aSegs[0].pvSeg, cbFrame, "--> Outgoing"); 3781 3782 pThis->CTX_SUFF(pTxSg) = NULL; 3783 PPDMINETWORKUP pDrv = pThis->CTX_SUFF(pDrv); 3783 3784 if (pDrv) 3784 3785 { 3785 3786 /* Release critical section to avoid deadlock in CanReceive */ 3786 //e1kCsLeave(p State);3787 STAM_PROFILE_START(&p State->CTX_SUFF_Z(StatTransmitSend), a);3787 //e1kCsLeave(pThis); 3788 STAM_PROFILE_START(&pThis->CTX_SUFF_Z(StatTransmitSend), a); 3788 3789 rc = pDrv->pfnSendBuf(pDrv, pSg, fOnWorkerThread); 3789 STAM_PROFILE_STOP(&p State->CTX_SUFF_Z(StatTransmitSend), a);3790 //e1kCsEnter(p State, RT_SRC_POS);3790 STAM_PROFILE_STOP(&pThis->CTX_SUFF_Z(StatTransmitSend), a); 3791 //e1kCsEnter(pThis, RT_SRC_POS); 3791 3792 } 3792 3793 } 3793 3794 else if (pSg) 3794 3795 { 3795 Assert(pSg->aSegs[0].pvSeg == p State->aTxPacketFallback);3796 e1kPacketDump(p State, (uint8_t const *)pSg->aSegs[0].pvSeg, cbFrame, "--> Loopback");3796 Assert(pSg->aSegs[0].pvSeg == pThis->aTxPacketFallback); 3797 e1kPacketDump(pThis, (uint8_t const *)pSg->aSegs[0].pvSeg, cbFrame, "--> Loopback"); 3797 3798 3798 3799 /** @todo do we actually need to check that we're in loopback mode here? */ … … 3802 3803 RT_ZERO(status); 3803 3804 status.fPIF = true; 3804 e1kHandleRxPacket(p State, pSg->aSegs[0].pvSeg, cbFrame, status);3805 e1kHandleRxPacket(pThis, pSg->aSegs[0].pvSeg, cbFrame, status); 3805 3806 rc = VINF_SUCCESS; 3806 3807 } 3807 e1kXmitFreeBuf(p State);3808 e1kXmitFreeBuf(pThis); 3808 3809 } 3809 3810 else … … 3815 3816 } 3816 3817 3817 p State->led.Actual.s.fWriting = 0;3818 pThis->led.Actual.s.fWriting = 0; 3818 3819 } 3819 3820 … … 3821 3822 * Compute and write internet checksum (e1kCSum16) at the specified offset. 3822 3823 * 3823 * @param p StateThe device state structure.3824 * @param pThis The device state structure. 3824 3825 * @param pPkt Pointer to the packet. 3825 3826 * @param u16PktLen Total length of the packet. … … 3831 3832 * @thread E1000_TX 3832 3833 */ 3833 static void e1kInsertChecksum( E1KSTATE* pState, uint8_t *pPkt, uint16_t u16PktLen, uint8_t cso, uint8_t css, uint16_t cse)3834 static void e1kInsertChecksum(PE1KSTATE pThis, uint8_t *pPkt, uint16_t u16PktLen, uint8_t cso, uint8_t css, uint16_t cse) 3834 3835 { 3835 3836 if (css >= u16PktLen) 3836 3837 { 3837 3838 E1kLog2(("%s css(%X) is greater than packet length-1(%X), checksum is not inserted\n", 3838 p State->szPrf, cso, u16PktLen));3839 pThis->szPrf, cso, u16PktLen)); 3839 3840 return; 3840 3841 } … … 3843 3844 { 3844 3845 E1kLog2(("%s cso(%X) is greater than packet length-2(%X), checksum is not inserted\n", 3845 p State->szPrf, cso, u16PktLen));3846 pThis->szPrf, cso, u16PktLen)); 3846 3847 return; 3847 3848 } … … 3850 3851 cse = u16PktLen - 1; 3851 3852 uint16_t u16ChkSum = e1kCSum16(pPkt + css, cse - css + 1); 3852 E1kLog2(("%s Inserting csum: %04X at %02X, old value: %04X\n", p State->szPrf,3853 E1kLog2(("%s Inserting csum: %04X at %02X, old value: %04X\n", pThis->szPrf, 3853 3854 u16ChkSum, cso, *(uint16_t*)(pPkt + cso))); 3854 3855 *(uint16_t*)(pPkt + cso) = u16ChkSum; … … 3862 3863 * legacy.u64BufAddr. 3863 3864 * 3864 * @param p StateThe device state structure.3865 * @param pThis The device state structure. 3865 3866 * @param pDesc Pointer to the descriptor to transmit. 3866 3867 * @param u16Len Length of buffer to the end of segment. … … 3870 3871 */ 3871 3872 #ifndef E1K_WITH_TXD_CACHE 3872 static void e1kFallbackAddSegment( E1KSTATE* pState, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend, bool fOnWorkerThread)3873 static void e1kFallbackAddSegment(PE1KSTATE pThis, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend, bool fOnWorkerThread) 3873 3874 { 3874 3875 /* TCP header being transmitted */ 3875 3876 struct E1kTcpHeader *pTcpHdr = (struct E1kTcpHeader *) 3876 (p State->aTxPacketFallback + pState->contextTSE.tu.u8CSS);3877 (pThis->aTxPacketFallback + pThis->contextTSE.tu.u8CSS); 3877 3878 /* IP header being transmitted */ 3878 3879 struct E1kIpHeader *pIpHdr = (struct E1kIpHeader *) 3879 (p State->aTxPacketFallback + pState->contextTSE.ip.u8CSS);3880 (pThis->aTxPacketFallback + pThis->contextTSE.ip.u8CSS); 3880 3881 3881 3882 E1kLog3(("%s e1kFallbackAddSegment: Length=%x, remaining payload=%x, header=%x, send=%RTbool\n", 3882 p State->szPrf, u16Len, pState->u32PayRemain, pState->u16HdrRemain, fSend));3883 Assert(p State->u32PayRemain + pState->u16HdrRemain > 0);3884 3885 PDMDevHlpPhysRead(p State->CTX_SUFF(pDevIns), PhysAddr,3886 p State->aTxPacketFallback + pState->u16TxPktLen, u16Len);3883 pThis->szPrf, u16Len, pThis->u32PayRemain, pThis->u16HdrRemain, fSend)); 3884 Assert(pThis->u32PayRemain + pThis->u16HdrRemain > 0); 3885 3886 PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns), PhysAddr, 3887 pThis->aTxPacketFallback + pThis->u16TxPktLen, u16Len); 3887 3888 E1kLog3(("%s Dump of the segment:\n" 3888 3889 "%.*Rhxd\n" 3889 3890 "%s --- End of dump ---\n", 3890 p State->szPrf, u16Len, pState->aTxPacketFallback + pState->u16TxPktLen, pState->szPrf));3891 p State->u16TxPktLen += u16Len;3892 E1kLog3(("%s e1kFallbackAddSegment: p State->u16TxPktLen=%x\n",3893 p State->szPrf, pState->u16TxPktLen));3894 if (p State->u16HdrRemain > 0)3891 pThis->szPrf, u16Len, pThis->aTxPacketFallback + pThis->u16TxPktLen, pThis->szPrf)); 3892 pThis->u16TxPktLen += u16Len; 3893 E1kLog3(("%s e1kFallbackAddSegment: pThis->u16TxPktLen=%x\n", 3894 pThis->szPrf, pThis->u16TxPktLen)); 3895 if (pThis->u16HdrRemain > 0) 3895 3896 { 3896 3897 /* The header was not complete, check if it is now */ 3897 if (u16Len >= p State->u16HdrRemain)3898 if (u16Len >= pThis->u16HdrRemain) 3898 3899 { 3899 3900 /* The rest is payload */ 3900 u16Len -= p State->u16HdrRemain;3901 p State->u16HdrRemain = 0;3901 u16Len -= pThis->u16HdrRemain; 3902 pThis->u16HdrRemain = 0; 3902 3903 /* Save partial checksum and flags */ 3903 p State->u32SavedCsum = pTcpHdr->chksum;3904 p State->u16SavedFlags = pTcpHdr->hdrlen_flags;3904 pThis->u32SavedCsum = pTcpHdr->chksum; 3905 pThis->u16SavedFlags = pTcpHdr->hdrlen_flags; 3905 3906 /* Clear FIN and PSH flags now and set them only in the last segment */ 3906 3907 pTcpHdr->hdrlen_flags &= ~htons(E1K_TCP_FIN | E1K_TCP_PSH); … … 3909 3910 { 3910 3911 /* Still not */ 3911 p State->u16HdrRemain -= u16Len;3912 pThis->u16HdrRemain -= u16Len; 3912 3913 E1kLog3(("%s e1kFallbackAddSegment: Header is still incomplete, 0x%x bytes remain.\n", 3913 p State->szPrf, pState->u16HdrRemain));3914 pThis->szPrf, pThis->u16HdrRemain)); 3914 3915 return; 3915 3916 } 3916 3917 } 3917 3918 3918 p State->u32PayRemain -= u16Len;3919 pThis->u32PayRemain -= u16Len; 3919 3920 3920 3921 if (fSend) … … 3922 3923 /* Leave ethernet header intact */ 3923 3924 /* IP Total Length = payload + headers - ethernet header */ 3924 pIpHdr->total_len = htons(p State->u16TxPktLen - pState->contextTSE.ip.u8CSS);3925 pIpHdr->total_len = htons(pThis->u16TxPktLen - pThis->contextTSE.ip.u8CSS); 3925 3926 E1kLog3(("%s e1kFallbackAddSegment: End of packet, pIpHdr->total_len=%x\n", 3926 p State->szPrf, ntohs(pIpHdr->total_len)));3927 pThis->szPrf, ntohs(pIpHdr->total_len))); 3927 3928 /* Update IP Checksum */ 3928 3929 pIpHdr->chksum = 0; 3929 e1kInsertChecksum(p State, pState->aTxPacketFallback, pState->u16TxPktLen,3930 p State->contextTSE.ip.u8CSO,3931 p State->contextTSE.ip.u8CSS,3932 p State->contextTSE.ip.u16CSE);3930 e1kInsertChecksum(pThis, pThis->aTxPacketFallback, pThis->u16TxPktLen, 3931 pThis->contextTSE.ip.u8CSO, 3932 pThis->contextTSE.ip.u8CSS, 3933 pThis->contextTSE.ip.u16CSE); 3933 3934 3934 3935 /* Update TCP flags */ 3935 3936 /* Restore original FIN and PSH flags for the last segment */ 3936 if (p State->u32PayRemain == 0)3937 { 3938 pTcpHdr->hdrlen_flags = p State->u16SavedFlags;3937 if (pThis->u32PayRemain == 0) 3938 { 3939 pTcpHdr->hdrlen_flags = pThis->u16SavedFlags; 3939 3940 E1K_INC_CNT32(TSCTC); 3940 3941 } 3941 3942 /* Add TCP length to partial pseudo header sum */ 3942 uint32_t csum = p State->u32SavedCsum3943 + htons(p State->u16TxPktLen - pState->contextTSE.tu.u8CSS);3943 uint32_t csum = pThis->u32SavedCsum 3944 + htons(pThis->u16TxPktLen - pThis->contextTSE.tu.u8CSS); 3944 3945 while (csum >> 16) 3945 3946 csum = (csum >> 16) + (csum & 0xFFFF); 3946 3947 pTcpHdr->chksum = csum; 3947 3948 /* Compute final checksum */ 3948 e1kInsertChecksum(p State, pState->aTxPacketFallback, pState->u16TxPktLen,3949 p State->contextTSE.tu.u8CSO,3950 p State->contextTSE.tu.u8CSS,3951 p State->contextTSE.tu.u16CSE);3949 e1kInsertChecksum(pThis, pThis->aTxPacketFallback, pThis->u16TxPktLen, 3950 pThis->contextTSE.tu.u8CSO, 3951 pThis->contextTSE.tu.u8CSS, 3952 pThis->contextTSE.tu.u16CSE); 3952 3953 3953 3954 /* … … 3955 3956 * we copy of the data. 3956 3957 */ 3957 if (!p State->CTX_SUFF(pTxSg))3958 e1kXmitAllocBuf(p State, pState->u16TxPktLen + (pState->fVTag ? 4 : 0), true /*fExactSize*/, false /*fGso*/);3959 if (p State->CTX_SUFF(pTxSg))3960 { 3961 Assert(p State->u16TxPktLen <= pState->CTX_SUFF(pTxSg)->cbAvailable);3962 Assert(p State->CTX_SUFF(pTxSg)->cSegs == 1);3963 if (p State->CTX_SUFF(pTxSg)->aSegs[0].pvSeg != pState->aTxPacketFallback)3964 memcpy(p State->CTX_SUFF(pTxSg)->aSegs[0].pvSeg, pState->aTxPacketFallback, pState->u16TxPktLen);3965 p State->CTX_SUFF(pTxSg)->cbUsed = pState->u16TxPktLen;3966 p State->CTX_SUFF(pTxSg)->aSegs[0].cbSeg = pState->u16TxPktLen;3958 if (!pThis->CTX_SUFF(pTxSg)) 3959 e1kXmitAllocBuf(pThis, pThis->u16TxPktLen + (pThis->fVTag ? 4 : 0), true /*fExactSize*/, false /*fGso*/); 3960 if (pThis->CTX_SUFF(pTxSg)) 3961 { 3962 Assert(pThis->u16TxPktLen <= pThis->CTX_SUFF(pTxSg)->cbAvailable); 3963 Assert(pThis->CTX_SUFF(pTxSg)->cSegs == 1); 3964 if (pThis->CTX_SUFF(pTxSg)->aSegs[0].pvSeg != pThis->aTxPacketFallback) 3965 memcpy(pThis->CTX_SUFF(pTxSg)->aSegs[0].pvSeg, pThis->aTxPacketFallback, pThis->u16TxPktLen); 3966 pThis->CTX_SUFF(pTxSg)->cbUsed = pThis->u16TxPktLen; 3967 pThis->CTX_SUFF(pTxSg)->aSegs[0].cbSeg = pThis->u16TxPktLen; 3967 3968 } 3968 e1kTransmitFrame(p State, fOnWorkerThread);3969 e1kTransmitFrame(pThis, fOnWorkerThread); 3969 3970 3970 3971 /* Update Sequence Number */ 3971 pTcpHdr->seqno = htonl(ntohl(pTcpHdr->seqno) + p State->u16TxPktLen3972 - p State->contextTSE.dw3.u8HDRLEN);3972 pTcpHdr->seqno = htonl(ntohl(pTcpHdr->seqno) + pThis->u16TxPktLen 3973 - pThis->contextTSE.dw3.u8HDRLEN); 3973 3974 /* Increment IP identification */ 3974 3975 pIpHdr->ident = htons(ntohs(pIpHdr->ident) + 1); … … 3976 3977 } 3977 3978 #else /* E1K_WITH_TXD_CACHE */ 3978 static int e1kFallbackAddSegment( E1KSTATE* pState, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend, bool fOnWorkerThread)3979 static int e1kFallbackAddSegment(PE1KSTATE pThis, RTGCPHYS PhysAddr, uint16_t u16Len, bool fSend, bool fOnWorkerThread) 3979 3980 { 3980 3981 int rc = VINF_SUCCESS; 3981 3982 /* TCP header being transmitted */ 3982 3983 struct E1kTcpHeader *pTcpHdr = (struct E1kTcpHeader *) 3983 (p State->aTxPacketFallback + pState->contextTSE.tu.u8CSS);3984 (pThis->aTxPacketFallback + pThis->contextTSE.tu.u8CSS); 3984 3985 /* IP header being transmitted */ 3985 3986 struct E1kIpHeader *pIpHdr = (struct E1kIpHeader *) 3986 (p State->aTxPacketFallback + pState->contextTSE.ip.u8CSS);3987 (pThis->aTxPacketFallback + pThis->contextTSE.ip.u8CSS); 3987 3988 3988 3989 E1kLog3(("%s e1kFallbackAddSegment: Length=%x, remaining payload=%x, header=%x, send=%RTbool\n", 3989 p State->szPrf, u16Len, pState->u32PayRemain, pState->u16HdrRemain, fSend));3990 Assert(p State->u32PayRemain + pState->u16HdrRemain > 0);3991 3992 PDMDevHlpPhysRead(p State->CTX_SUFF(pDevIns), PhysAddr,3993 p State->aTxPacketFallback + pState->u16TxPktLen, u16Len);3990 pThis->szPrf, u16Len, pThis->u32PayRemain, pThis->u16HdrRemain, fSend)); 3991 Assert(pThis->u32PayRemain + pThis->u16HdrRemain > 0); 3992 3993 PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns), PhysAddr, 3994 pThis->aTxPacketFallback + pThis->u16TxPktLen, u16Len); 3994 3995 E1kLog3(("%s Dump of the segment:\n" 3995 3996 "%.*Rhxd\n" 3996 3997 "%s --- End of dump ---\n", 3997 p State->szPrf, u16Len, pState->aTxPacketFallback + pState->u16TxPktLen, pState->szPrf));3998 p State->u16TxPktLen += u16Len;3999 E1kLog3(("%s e1kFallbackAddSegment: p State->u16TxPktLen=%x\n",4000 p State->szPrf, pState->u16TxPktLen));4001 if (p State->u16HdrRemain > 0)3998 pThis->szPrf, u16Len, pThis->aTxPacketFallback + pThis->u16TxPktLen, pThis->szPrf)); 3999 pThis->u16TxPktLen += u16Len; 4000 E1kLog3(("%s e1kFallbackAddSegment: pThis->u16TxPktLen=%x\n", 4001 pThis->szPrf, pThis->u16TxPktLen)); 4002 if (pThis->u16HdrRemain > 0) 4002 4003 { 4003 4004 /* The header was not complete, check if it is now */ 4004 if (u16Len >= p State->u16HdrRemain)4005 if (u16Len >= pThis->u16HdrRemain) 4005 4006 { 4006 4007 /* The rest is payload */ 4007 u16Len -= p State->u16HdrRemain;4008 p State->u16HdrRemain = 0;4008 u16Len -= pThis->u16HdrRemain; 4009 pThis->u16HdrRemain = 0; 4009 4010 /* Save partial checksum and flags */ 4010 p State->u32SavedCsum = pTcpHdr->chksum;4011 p State->u16SavedFlags = pTcpHdr->hdrlen_flags;4011 pThis->u32SavedCsum = pTcpHdr->chksum; 4012 pThis->u16SavedFlags = pTcpHdr->hdrlen_flags; 4012 4013 /* Clear FIN and PSH flags now and set them only in the last segment */ 4013 4014 pTcpHdr->hdrlen_flags &= ~htons(E1K_TCP_FIN | E1K_TCP_PSH); … … 4016 4017 { 4017 4018 /* Still not */ 4018 p State->u16HdrRemain -= u16Len;4019 pThis->u16HdrRemain -= u16Len; 4019 4020 E1kLog3(("%s e1kFallbackAddSegment: Header is still incomplete, 0x%x bytes remain.\n", 4020 p State->szPrf, pState->u16HdrRemain));4021 pThis->szPrf, pThis->u16HdrRemain)); 4021 4022 return rc; 4022 4023 } 4023 4024 } 4024 4025 4025 p State->u32PayRemain -= u16Len;4026 pThis->u32PayRemain -= u16Len; 4026 4027 4027 4028 if (fSend) … … 4029 4030 /* Leave ethernet header intact */ 4030 4031 /* IP Total Length = payload + headers - ethernet header */ 4031 pIpHdr->total_len = htons(p State->u16TxPktLen - pState->contextTSE.ip.u8CSS);4032 pIpHdr->total_len = htons(pThis->u16TxPktLen - pThis->contextTSE.ip.u8CSS); 4032 4033 E1kLog3(("%s e1kFallbackAddSegment: End of packet, pIpHdr->total_len=%x\n", 4033 p State->szPrf, ntohs(pIpHdr->total_len)));4034 pThis->szPrf, ntohs(pIpHdr->total_len))); 4034 4035 /* Update IP Checksum */ 4035 4036 pIpHdr->chksum = 0; 4036 e1kInsertChecksum(p State, pState->aTxPacketFallback, pState->u16TxPktLen,4037 p State->contextTSE.ip.u8CSO,4038 p State->contextTSE.ip.u8CSS,4039 p State->contextTSE.ip.u16CSE);4037 e1kInsertChecksum(pThis, pThis->aTxPacketFallback, pThis->u16TxPktLen, 4038 pThis->contextTSE.ip.u8CSO, 4039 pThis->contextTSE.ip.u8CSS, 4040 pThis->contextTSE.ip.u16CSE); 4040 4041 4041 4042 /* Update TCP flags */ 4042 4043 /* Restore original FIN and PSH flags for the last segment */ 4043 if (p State->u32PayRemain == 0)4044 { 4045 pTcpHdr->hdrlen_flags = p State->u16SavedFlags;4044 if (pThis->u32PayRemain == 0) 4045 { 4046 pTcpHdr->hdrlen_flags = pThis->u16SavedFlags; 4046 4047 E1K_INC_CNT32(TSCTC); 4047 4048 } 4048 4049 /* Add TCP length to partial pseudo header sum */ 4049 uint32_t csum = p State->u32SavedCsum4050 + htons(p State->u16TxPktLen - pState->contextTSE.tu.u8CSS);4050 uint32_t csum = pThis->u32SavedCsum 4051 + htons(pThis->u16TxPktLen - pThis->contextTSE.tu.u8CSS); 4051 4052 while (csum >> 16) 4052 4053 csum = (csum >> 16) + (csum & 0xFFFF); 4053 4054 pTcpHdr->chksum = csum; 4054 4055 /* Compute final checksum */ 4055 e1kInsertChecksum(p State, pState->aTxPacketFallback, pState->u16TxPktLen,4056 p State->contextTSE.tu.u8CSO,4057 p State->contextTSE.tu.u8CSS,4058 p State->contextTSE.tu.u16CSE);4056 e1kInsertChecksum(pThis, pThis->aTxPacketFallback, pThis->u16TxPktLen, 4057 pThis->contextTSE.tu.u8CSO, 4058 pThis->contextTSE.tu.u8CSS, 4059 pThis->contextTSE.tu.u16CSE); 4059 4060 4060 4061 /* 4061 4062 * Transmit it. 4062 4063 */ 4063 if (p State->CTX_SUFF(pTxSg))4064 { 4065 Assert(p State->u16TxPktLen <= pState->CTX_SUFF(pTxSg)->cbAvailable);4066 Assert(p State->CTX_SUFF(pTxSg)->cSegs == 1);4067 if (p State->CTX_SUFF(pTxSg)->aSegs[0].pvSeg != pState->aTxPacketFallback)4068 memcpy(p State->CTX_SUFF(pTxSg)->aSegs[0].pvSeg, pState->aTxPacketFallback, pState->u16TxPktLen);4069 p State->CTX_SUFF(pTxSg)->cbUsed = pState->u16TxPktLen;4070 p State->CTX_SUFF(pTxSg)->aSegs[0].cbSeg = pState->u16TxPktLen;4064 if (pThis->CTX_SUFF(pTxSg)) 4065 { 4066 Assert(pThis->u16TxPktLen <= pThis->CTX_SUFF(pTxSg)->cbAvailable); 4067 Assert(pThis->CTX_SUFF(pTxSg)->cSegs == 1); 4068 if (pThis->CTX_SUFF(pTxSg)->aSegs[0].pvSeg != pThis->aTxPacketFallback) 4069 memcpy(pThis->CTX_SUFF(pTxSg)->aSegs[0].pvSeg, pThis->aTxPacketFallback, pThis->u16TxPktLen); 4070 pThis->CTX_SUFF(pTxSg)->cbUsed = pThis->u16TxPktLen; 4071 pThis->CTX_SUFF(pTxSg)->aSegs[0].cbSeg = pThis->u16TxPktLen; 4071 4072 } 4072 e1kTransmitFrame(p State, fOnWorkerThread);4073 e1kTransmitFrame(pThis, fOnWorkerThread); 4073 4074 4074 4075 /* Update Sequence Number */ 4075 pTcpHdr->seqno = htonl(ntohl(pTcpHdr->seqno) + p State->u16TxPktLen4076 - p State->contextTSE.dw3.u8HDRLEN);4076 pTcpHdr->seqno = htonl(ntohl(pTcpHdr->seqno) + pThis->u16TxPktLen 4077 - pThis->contextTSE.dw3.u8HDRLEN); 4077 4078 /* Increment IP identification */ 4078 4079 pIpHdr->ident = htons(ntohs(pIpHdr->ident) + 1); 4079 4080 4080 4081 /* Allocate new buffer for the next segment. */ 4081 if (p State->u32PayRemain)4082 { 4083 p State->cbTxAlloc = RT_MIN(pState->u32PayRemain,4084 p State->contextTSE.dw3.u16MSS)4085 + p State->contextTSE.dw3.u8HDRLEN4086 + (p State->fVTag ? 4 : 0);4087 rc = e1kXmitAllocBuf(p State, false /* fGSO */);4082 if (pThis->u32PayRemain) 4083 { 4084 pThis->cbTxAlloc = RT_MIN(pThis->u32PayRemain, 4085 pThis->contextTSE.dw3.u16MSS) 4086 + pThis->contextTSE.dw3.u8HDRLEN 4087 + (pThis->fVTag ? 4 : 0); 4088 rc = e1kXmitAllocBuf(pThis, false /* fGSO */); 4088 4089 } 4089 4090 } … … 4103 4104 * @returns true if the frame should be transmitted, false if not. 4104 4105 * 4105 * @param p StateThe device state structure.4106 * @param pThis The device state structure. 4106 4107 * @param pDesc Pointer to the descriptor to transmit. 4107 4108 * @param cbFragment Length of descriptor's buffer. … … 4109 4110 * @thread E1000_TX 4110 4111 */ 4111 static bool e1kFallbackAddToFrame( E1KSTATE* pState, E1KTXDESC* pDesc, uint32_t cbFragment, bool fOnWorkerThread)4112 { 4113 PPDMSCATTERGATHER pTxSg = p State->CTX_SUFF(pTxSg);4112 static bool e1kFallbackAddToFrame(PE1KSTATE pThis, E1KTXDESC* pDesc, uint32_t cbFragment, bool fOnWorkerThread) 4113 { 4114 PPDMSCATTERGATHER pTxSg = pThis->CTX_SUFF(pTxSg); 4114 4115 Assert(e1kGetDescType(pDesc) == E1K_DTYP_DATA); 4115 4116 Assert(pDesc->data.cmd.fTSE); 4116 4117 Assert(!e1kXmitIsGsoBuf(pTxSg)); 4117 4118 4118 uint16_t u16MaxPktLen = p State->contextTSE.dw3.u8HDRLEN + pState->contextTSE.dw3.u16MSS;4119 uint16_t u16MaxPktLen = pThis->contextTSE.dw3.u8HDRLEN + pThis->contextTSE.dw3.u16MSS; 4119 4120 Assert(u16MaxPktLen != 0); 4120 4121 Assert(u16MaxPktLen < E1K_MAX_TX_PKT_SIZE); … … 4126 4127 { 4127 4128 /* Calculate how many bytes we have left in this TCP segment */ 4128 uint32_t cb = u16MaxPktLen - p State->u16TxPktLen;4129 uint32_t cb = u16MaxPktLen - pThis->u16TxPktLen; 4129 4130 if (cb > cbFragment) 4130 4131 { 4131 4132 /* This descriptor fits completely into current segment */ 4132 4133 cb = cbFragment; 4133 e1kFallbackAddSegment(p State, pDesc->data.u64BufAddr, cb, pDesc->data.cmd.fEOP /*fSend*/, fOnWorkerThread);4134 e1kFallbackAddSegment(pThis, pDesc->data.u64BufAddr, cb, pDesc->data.cmd.fEOP /*fSend*/, fOnWorkerThread); 4134 4135 } 4135 4136 else 4136 4137 { 4137 e1kFallbackAddSegment(p State, pDesc->data.u64BufAddr, cb, true /*fSend*/, fOnWorkerThread);4138 e1kFallbackAddSegment(pThis, pDesc->data.u64BufAddr, cb, true /*fSend*/, fOnWorkerThread); 4138 4139 /* 4139 4140 * Rewind the packet tail pointer to the beginning of payload, 4140 4141 * so we continue writing right beyond the header. 4141 4142 */ 4142 p State->u16TxPktLen = pState->contextTSE.dw3.u8HDRLEN;4143 pThis->u16TxPktLen = pThis->contextTSE.dw3.u8HDRLEN; 4143 4144 } 4144 4145 … … 4150 4151 { 4151 4152 /* End of packet, next segment will contain header. */ 4152 if (p State->u32PayRemain != 0)4153 if (pThis->u32PayRemain != 0) 4153 4154 E1K_INC_CNT32(TSCTFC); 4154 p State->u16TxPktLen = 0;4155 e1kXmitFreeBuf(p State);4155 pThis->u16TxPktLen = 0; 4156 e1kXmitFreeBuf(pThis); 4156 4157 } 4157 4158 … … 4168 4169 * @returns error code 4169 4170 * 4170 * @param p StateThe device state structure.4171 * @param pThis The device state structure. 4171 4172 * @param pDesc Pointer to the descriptor to transmit. 4172 4173 * @param cbFragment Length of descriptor's buffer. … … 4174 4175 * @thread E1000_TX 4175 4176 */ 4176 static int e1kFallbackAddToFrame( E1KSTATE* pState, E1KTXDESC* pDesc, bool fOnWorkerThread)4177 static int e1kFallbackAddToFrame(PE1KSTATE pThis, E1KTXDESC* pDesc, bool fOnWorkerThread) 4177 4178 { 4178 4179 int rc = VINF_SUCCESS; 4179 PPDMSCATTERGATHER pTxSg = p State->CTX_SUFF(pTxSg);4180 PPDMSCATTERGATHER pTxSg = pThis->CTX_SUFF(pTxSg); 4180 4181 Assert(e1kGetDescType(pDesc) == E1K_DTYP_DATA); 4181 4182 Assert(pDesc->data.cmd.fTSE); 4182 4183 Assert(!e1kXmitIsGsoBuf(pTxSg)); 4183 4184 4184 uint16_t u16MaxPktLen = p State->contextTSE.dw3.u8HDRLEN + pState->contextTSE.dw3.u16MSS;4185 uint16_t u16MaxPktLen = pThis->contextTSE.dw3.u8HDRLEN + pThis->contextTSE.dw3.u16MSS; 4185 4186 Assert(u16MaxPktLen != 0); 4186 4187 Assert(u16MaxPktLen < E1K_MAX_TX_PKT_SIZE); … … 4192 4193 { 4193 4194 /* Calculate how many bytes we have left in this TCP segment */ 4194 uint32_t cb = u16MaxPktLen - p State->u16TxPktLen;4195 uint32_t cb = u16MaxPktLen - pThis->u16TxPktLen; 4195 4196 if (cb > pDesc->data.cmd.u20DTALEN) 4196 4197 { 4197 4198 /* This descriptor fits completely into current segment */ 4198 4199 cb = pDesc->data.cmd.u20DTALEN; 4199 rc = e1kFallbackAddSegment(p State, pDesc->data.u64BufAddr, cb, pDesc->data.cmd.fEOP /*fSend*/, fOnWorkerThread);4200 rc = e1kFallbackAddSegment(pThis, pDesc->data.u64BufAddr, cb, pDesc->data.cmd.fEOP /*fSend*/, fOnWorkerThread); 4200 4201 } 4201 4202 else 4202 4203 { 4203 rc = e1kFallbackAddSegment(p State, pDesc->data.u64BufAddr, cb, true /*fSend*/, fOnWorkerThread);4204 rc = e1kFallbackAddSegment(pThis, pDesc->data.u64BufAddr, cb, true /*fSend*/, fOnWorkerThread); 4204 4205 /* 4205 4206 * Rewind the packet tail pointer to the beginning of payload, 4206 4207 * so we continue writing right beyond the header. 4207 4208 */ 4208 p State->u16TxPktLen = pState->contextTSE.dw3.u8HDRLEN;4209 pThis->u16TxPktLen = pThis->contextTSE.dw3.u8HDRLEN; 4209 4210 } 4210 4211 … … 4216 4217 { 4217 4218 /* End of packet, next segment will contain header. */ 4218 if (p State->u32PayRemain != 0)4219 if (pThis->u32PayRemain != 0) 4219 4220 E1K_INC_CNT32(TSCTFC); 4220 p State->u16TxPktLen = 0;4221 e1kXmitFreeBuf(p State);4221 pThis->u16TxPktLen = 0; 4222 e1kXmitFreeBuf(pThis); 4222 4223 } 4223 4224 … … 4240 4241 * @thread E1000_TX 4241 4242 */ 4242 static bool e1kAddToFrame( E1KSTATE *pThis, RTGCPHYS PhysAddr, uint32_t cbFragment)4243 static bool e1kAddToFrame(PE1KSTATE pThis, RTGCPHYS PhysAddr, uint32_t cbFragment) 4243 4244 { 4244 4245 PPDMSCATTERGATHER pTxSg = pThis->CTX_SUFF(pTxSg); … … 4276 4277 * Write the descriptor back to guest memory and notify the guest. 4277 4278 * 4278 * @param p StateThe device state structure.4279 * @param pThis The device state structure. 4279 4280 * @param pDesc Pointer to the descriptor have been transmitted. 4280 4281 * @param addr Physical address of the descriptor in guest memory. 4281 4282 * @thread E1000_TX 4282 4283 */ 4283 static void e1kDescReport( E1KSTATE* pState, E1KTXDESC* pDesc, RTGCPHYS addr)4284 static void e1kDescReport(PE1KSTATE pThis, E1KTXDESC* pDesc, RTGCPHYS addr) 4284 4285 { 4285 4286 /* … … 4305 4306 { 4306 4307 pDesc->legacy.dw3.fDD = 1; /* Descriptor Done */ 4307 e1kWriteBackDesc(p State, pDesc, addr);4308 e1kWriteBackDesc(pThis, pDesc, addr); 4308 4309 if (pDesc->legacy.cmd.fEOP) 4309 4310 { … … 4311 4312 if (pDesc->legacy.cmd.fIDE) 4312 4313 { 4313 E1K_INC_ISTAT_CNT(p State->uStatTxIDE);4314 //if (p State->fIntRaised)4314 E1K_INC_ISTAT_CNT(pThis->uStatTxIDE); 4315 //if (pThis->fIntRaised) 4315 4316 //{ 4316 4317 // /* Interrupt is already pending, no need for timers */ … … 4319 4320 //else { 4320 4321 /* Arm the timer to fire in TIVD usec (discard .024) */ 4321 e1kArmTimer(p State, pState->CTX_SUFF(pTIDTimer), TIDV);4322 e1kArmTimer(pThis, pThis->CTX_SUFF(pTIDTimer), TIDV); 4322 4323 # ifndef E1K_NO_TAD 4323 4324 /* If absolute timer delay is enabled and the timer is not running yet, arm it. */ 4324 4325 E1kLog2(("%s Checking if TAD timer is running\n", 4325 p State->szPrf));4326 if (TADV != 0 && !TMTimerIsActive(p State->CTX_SUFF(pTADTimer)))4327 e1kArmTimer(p State, pState->CTX_SUFF(pTADTimer), TADV);4326 pThis->szPrf)); 4327 if (TADV != 0 && !TMTimerIsActive(pThis->CTX_SUFF(pTADTimer))) 4328 e1kArmTimer(pThis, pThis->CTX_SUFF(pTADTimer), TADV); 4328 4329 # endif /* E1K_NO_TAD */ 4329 4330 } … … 4331 4332 { 4332 4333 E1kLog2(("%s No IDE set, cancel TAD timer and raise interrupt\n", 4333 p State->szPrf));4334 pThis->szPrf)); 4334 4335 # ifndef E1K_NO_TAD 4335 4336 /* Cancel both timers if armed and fire immediately. */ 4336 e1kCancelTimer(p State, pState->CTX_SUFF(pTADTimer));4337 e1kCancelTimer(pThis, pThis->CTX_SUFF(pTADTimer)); 4337 4338 # endif /* E1K_NO_TAD */ 4338 4339 #endif /* E1K_USE_TX_TIMERS */ 4339 E1K_INC_ISTAT_CNT(p State->uStatIntTx);4340 e1kRaiseInterrupt(p State, VERR_SEM_BUSY, ICR_TXDW);4340 E1K_INC_ISTAT_CNT(pThis->uStatIntTx); 4341 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_TXDW); 4341 4342 #ifdef E1K_USE_TX_TIMERS 4342 4343 } … … 4346 4347 else 4347 4348 { 4348 E1K_INC_ISTAT_CNT(p State->uStatTxNoRS);4349 E1K_INC_ISTAT_CNT(pThis->uStatTxNoRS); 4349 4350 } 4350 4351 } 4351 4352 4352 4353 #ifndef E1K_WITH_TXD_CACHE 4354 4353 4355 /** 4354 4356 * Process Transmit Descriptor. … … 4359 4361 * - context sets up the context for following data descriptors. 4360 4362 * 4361 * @param p StateThe device state structure.4363 * @param pThis The device state structure. 4362 4364 * @param pDesc Pointer to descriptor union. 4363 4365 * @param addr Physical address of descriptor in guest memory. … … 4365 4367 * @thread E1000_TX 4366 4368 */ 4367 static int e1kXmitDesc( E1KSTATE* pState, E1KTXDESC* pDesc, RTGCPHYS addr, bool fOnWorkerThread)4369 static int e1kXmitDesc(PE1KSTATE pThis, E1KTXDESC* pDesc, RTGCPHYS addr, bool fOnWorkerThread) 4368 4370 { 4369 4371 int rc = VINF_SUCCESS; 4370 4372 uint32_t cbVTag = 0; 4371 4373 4372 e1kPrintTDesc(p State, pDesc, "vvv");4374 e1kPrintTDesc(pThis, pDesc, "vvv"); 4373 4375 4374 4376 #ifdef E1K_USE_TX_TIMERS 4375 e1kCancelTimer(p State, pState->CTX_SUFF(pTIDTimer));4377 e1kCancelTimer(pThis, pThis->CTX_SUFF(pTIDTimer)); 4376 4378 #endif /* E1K_USE_TX_TIMERS */ 4377 4379 … … 4381 4383 if (pDesc->context.dw2.fTSE) 4382 4384 { 4383 p State->contextTSE = pDesc->context;4384 p State->u32PayRemain = pDesc->context.dw2.u20PAYLEN;4385 p State->u16HdrRemain = pDesc->context.dw3.u8HDRLEN;4386 e1kSetupGsoCtx(&p State->GsoCtx, &pDesc->context);4387 STAM_COUNTER_INC(&p State->StatTxDescCtxTSE);4385 pThis->contextTSE = pDesc->context; 4386 pThis->u32PayRemain = pDesc->context.dw2.u20PAYLEN; 4387 pThis->u16HdrRemain = pDesc->context.dw3.u8HDRLEN; 4388 e1kSetupGsoCtx(&pThis->GsoCtx, &pDesc->context); 4389 STAM_COUNTER_INC(&pThis->StatTxDescCtxTSE); 4388 4390 } 4389 4391 else 4390 4392 { 4391 p State->contextNormal = pDesc->context;4392 STAM_COUNTER_INC(&p State->StatTxDescCtxNormal);4393 pThis->contextNormal = pDesc->context; 4394 STAM_COUNTER_INC(&pThis->StatTxDescCtxNormal); 4393 4395 } 4394 4396 E1kLog2(("%s %s context updated: IP CSS=%02X, IP CSO=%02X, IP CSE=%04X" 4395 ", TU CSS=%02X, TU CSO=%02X, TU CSE=%04X\n", p State->szPrf,4397 ", TU CSS=%02X, TU CSO=%02X, TU CSE=%04X\n", pThis->szPrf, 4396 4398 pDesc->context.dw2.fTSE ? "TSE" : "Normal", 4397 4399 pDesc->context.ip.u8CSS, … … 4401 4403 pDesc->context.tu.u8CSO, 4402 4404 pDesc->context.tu.u16CSE)); 4403 E1K_INC_ISTAT_CNT(p State->uStatDescCtx);4404 e1kDescReport(p State, pDesc, addr);4405 E1K_INC_ISTAT_CNT(pThis->uStatDescCtx); 4406 e1kDescReport(pThis, pDesc, addr); 4405 4407 break; 4406 4408 … … 4409 4411 if (pDesc->data.cmd.u20DTALEN == 0 || pDesc->data.u64BufAddr == 0) 4410 4412 { 4411 E1kLog2(("% Empty data descriptor, skipped.\n", p State->szPrf));4413 E1kLog2(("% Empty data descriptor, skipped.\n", pThis->szPrf)); 4412 4414 /** @todo Same as legacy when !TSE. See below. */ 4413 4415 break; 4414 4416 } 4415 4417 STAM_COUNTER_INC(pDesc->data.cmd.fTSE? 4416 &p State->StatTxDescTSEData:4417 &p State->StatTxDescData);4418 STAM_PROFILE_ADV_START(&p State->CTX_SUFF_Z(StatTransmit), a);4419 E1K_INC_ISTAT_CNT(p State->uStatDescDat);4418 &pThis->StatTxDescTSEData: 4419 &pThis->StatTxDescData); 4420 STAM_PROFILE_ADV_START(&pThis->CTX_SUFF_Z(StatTransmit), a); 4421 E1K_INC_ISTAT_CNT(pThis->uStatDescDat); 4420 4422 4421 4423 /* … … 4428 4430 if (pDesc->data.cmd.fEOP && !pDesc->data.cmd.fTSE) 4429 4431 { 4430 p State->fVTag = pDesc->data.cmd.fVLE;4431 p State->u16VTagTCI = pDesc->data.dw3.u16Special;4432 pThis->fVTag = pDesc->data.cmd.fVLE; 4433 pThis->u16VTagTCI = pDesc->data.dw3.u16Special; 4432 4434 } 4433 4435 /* … … 4435 4437 * packet options as these are only valid in the first fragment. 4436 4438 */ 4437 if (p State->u16TxPktLen == 0)4439 if (pThis->u16TxPktLen == 0) 4438 4440 { 4439 p State->fIPcsum = pDesc->data.dw3.fIXSM;4440 p State->fTCPcsum = pDesc->data.dw3.fTXSM;4441 E1kLog2(("%s Saving checksum flags:%s%s; \n", p State->szPrf,4442 p State->fIPcsum ? " IP" : "",4443 p State->fTCPcsum ? " TCP/UDP" : ""));4441 pThis->fIPcsum = pDesc->data.dw3.fIXSM; 4442 pThis->fTCPcsum = pDesc->data.dw3.fTXSM; 4443 E1kLog2(("%s Saving checksum flags:%s%s; \n", pThis->szPrf, 4444 pThis->fIPcsum ? " IP" : "", 4445 pThis->fTCPcsum ? " TCP/UDP" : "")); 4444 4446 if (pDesc->data.cmd.fTSE) 4445 4447 { 4446 /* 2) pDesc->data.cmd.fTSE && p State->u16TxPktLen == 0 */4447 p State->fVTag = pDesc->data.cmd.fVLE;4448 p State->u16VTagTCI = pDesc->data.dw3.u16Special;4449 cbVTag = p State->fVTag ? 4 : 0;4448 /* 2) pDesc->data.cmd.fTSE && pThis->u16TxPktLen == 0 */ 4449 pThis->fVTag = pDesc->data.cmd.fVLE; 4450 pThis->u16VTagTCI = pDesc->data.dw3.u16Special; 4451 cbVTag = pThis->fVTag ? 4 : 0; 4450 4452 } 4451 4453 else if (pDesc->data.cmd.fEOP) … … 4453 4455 else 4454 4456 cbVTag = 4; 4455 E1kLog3(("%s About to allocate TX buffer: cbVTag=%u\n", p State->szPrf, cbVTag));4456 if (e1kCanDoGso(p State, &pState->GsoCtx, &pDesc->data, &pState->contextTSE))4457 rc = e1kXmitAllocBuf(p State, pState->contextTSE.dw2.u20PAYLEN + pState->contextTSE.dw3.u8HDRLEN + cbVTag,4457 E1kLog3(("%s About to allocate TX buffer: cbVTag=%u\n", pThis->szPrf, cbVTag)); 4458 if (e1kCanDoGso(pThis, &pThis->GsoCtx, &pDesc->data, &pThis->contextTSE)) 4459 rc = e1kXmitAllocBuf(pThis, pThis->contextTSE.dw2.u20PAYLEN + pThis->contextTSE.dw3.u8HDRLEN + cbVTag, 4458 4460 true /*fExactSize*/, true /*fGso*/); 4459 4461 else if (pDesc->data.cmd.fTSE) 4460 rc = e1kXmitAllocBuf(p State, pState->contextTSE.dw3.u16MSS + pState->contextTSE.dw3.u8HDRLEN + cbVTag,4462 rc = e1kXmitAllocBuf(pThis, pThis->contextTSE.dw3.u16MSS + pThis->contextTSE.dw3.u8HDRLEN + cbVTag, 4461 4463 pDesc->data.cmd.fTSE /*fExactSize*/, false /*fGso*/); 4462 4464 else 4463 rc = e1kXmitAllocBuf(p State, pDesc->data.cmd.u20DTALEN + cbVTag,4465 rc = e1kXmitAllocBuf(pThis, pDesc->data.cmd.u20DTALEN + cbVTag, 4464 4466 pDesc->data.cmd.fEOP /*fExactSize*/, false /*fGso*/); 4465 4467 … … 4470 4472 if (RT_FAILURE(rc)) 4471 4473 { 4472 STAM_PROFILE_ADV_STOP(&p State->CTX_SUFF_Z(StatTransmit), a);4474 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatTransmit), a); 4473 4475 break; 4474 4476 } … … 4481 4483 * transmit it and reset the u16TxPktLen field. 4482 4484 */ 4483 if (e1kXmitIsGsoBuf(p State->CTX_SUFF(pTxSg)))4485 if (e1kXmitIsGsoBuf(pThis->CTX_SUFF(pTxSg))) 4484 4486 { 4485 STAM_COUNTER_INC(&p State->StatTxPathGSO);4486 bool fRc = e1kAddToFrame(p State, pDesc->data.u64BufAddr, pDesc->data.cmd.u20DTALEN);4487 STAM_COUNTER_INC(&pThis->StatTxPathGSO); 4488 bool fRc = e1kAddToFrame(pThis, pDesc->data.u64BufAddr, pDesc->data.cmd.u20DTALEN); 4487 4489 if (pDesc->data.cmd.fEOP) 4488 4490 { 4489 4491 if ( fRc 4490 && p State->CTX_SUFF(pTxSg)4491 && p State->CTX_SUFF(pTxSg)->cbUsed == (size_t)pState->contextTSE.dw3.u8HDRLEN + pState->contextTSE.dw2.u20PAYLEN)4492 && pThis->CTX_SUFF(pTxSg) 4493 && pThis->CTX_SUFF(pTxSg)->cbUsed == (size_t)pThis->contextTSE.dw3.u8HDRLEN + pThis->contextTSE.dw2.u20PAYLEN) 4492 4494 { 4493 e1kTransmitFrame(p State, fOnWorkerThread);4495 e1kTransmitFrame(pThis, fOnWorkerThread); 4494 4496 E1K_INC_CNT32(TSCTC); 4495 4497 } … … 4497 4499 { 4498 4500 if (fRc) 4499 E1kLog(("%s bad GSO/TSE %p or %u < %u\n" , p State->szPrf,4500 p State->CTX_SUFF(pTxSg), pState->CTX_SUFF(pTxSg) ? pState->CTX_SUFF(pTxSg)->cbUsed : 0,4501 p State->contextTSE.dw3.u8HDRLEN + pState->contextTSE.dw2.u20PAYLEN));4502 e1kXmitFreeBuf(p State);4501 E1kLog(("%s bad GSO/TSE %p or %u < %u\n" , pThis->szPrf, 4502 pThis->CTX_SUFF(pTxSg), pThis->CTX_SUFF(pTxSg) ? pThis->CTX_SUFF(pTxSg)->cbUsed : 0, 4503 pThis->contextTSE.dw3.u8HDRLEN + pThis->contextTSE.dw2.u20PAYLEN)); 4504 e1kXmitFreeBuf(pThis); 4503 4505 E1K_INC_CNT32(TSCTFC); 4504 4506 } 4505 p State->u16TxPktLen = 0;4507 pThis->u16TxPktLen = 0; 4506 4508 } 4507 4509 } 4508 4510 else if (!pDesc->data.cmd.fTSE) 4509 4511 { 4510 STAM_COUNTER_INC(&p State->StatTxPathRegular);4511 bool fRc = e1kAddToFrame(p State, pDesc->data.u64BufAddr, pDesc->data.cmd.u20DTALEN);4512 STAM_COUNTER_INC(&pThis->StatTxPathRegular); 4513 bool fRc = e1kAddToFrame(pThis, pDesc->data.u64BufAddr, pDesc->data.cmd.u20DTALEN); 4512 4514 if (pDesc->data.cmd.fEOP) 4513 4515 { 4514 if (fRc && p State->CTX_SUFF(pTxSg))4516 if (fRc && pThis->CTX_SUFF(pTxSg)) 4515 4517 { 4516 Assert(p State->CTX_SUFF(pTxSg)->cSegs == 1);4517 if (p State->fIPcsum)4518 e1kInsertChecksum(p State, (uint8_t *)pState->CTX_SUFF(pTxSg)->aSegs[0].pvSeg, pState->u16TxPktLen,4519 p State->contextNormal.ip.u8CSO,4520 p State->contextNormal.ip.u8CSS,4521 p State->contextNormal.ip.u16CSE);4522 if (p State->fTCPcsum)4523 e1kInsertChecksum(p State, (uint8_t *)pState->CTX_SUFF(pTxSg)->aSegs[0].pvSeg, pState->u16TxPktLen,4524 p State->contextNormal.tu.u8CSO,4525 p State->contextNormal.tu.u8CSS,4526 p State->contextNormal.tu.u16CSE);4527 e1kTransmitFrame(p State, fOnWorkerThread);4518 Assert(pThis->CTX_SUFF(pTxSg)->cSegs == 1); 4519 if (pThis->fIPcsum) 4520 e1kInsertChecksum(pThis, (uint8_t *)pThis->CTX_SUFF(pTxSg)->aSegs[0].pvSeg, pThis->u16TxPktLen, 4521 pThis->contextNormal.ip.u8CSO, 4522 pThis->contextNormal.ip.u8CSS, 4523 pThis->contextNormal.ip.u16CSE); 4524 if (pThis->fTCPcsum) 4525 e1kInsertChecksum(pThis, (uint8_t *)pThis->CTX_SUFF(pTxSg)->aSegs[0].pvSeg, pThis->u16TxPktLen, 4526 pThis->contextNormal.tu.u8CSO, 4527 pThis->contextNormal.tu.u8CSS, 4528 pThis->contextNormal.tu.u16CSE); 4529 e1kTransmitFrame(pThis, fOnWorkerThread); 4528 4530 } 4529 4531 else 4530 e1kXmitFreeBuf(p State);4531 p State->u16TxPktLen = 0;4532 e1kXmitFreeBuf(pThis); 4533 pThis->u16TxPktLen = 0; 4532 4534 } 4533 4535 } 4534 4536 else 4535 4537 { 4536 STAM_COUNTER_INC(&p State->StatTxPathFallback);4537 e1kFallbackAddToFrame(p State, pDesc, pDesc->data.cmd.u20DTALEN, fOnWorkerThread);4538 STAM_COUNTER_INC(&pThis->StatTxPathFallback); 4539 e1kFallbackAddToFrame(pThis, pDesc, pDesc->data.cmd.u20DTALEN, fOnWorkerThread); 4538 4540 } 4539 4541 4540 e1kDescReport(p State, pDesc, addr);4541 STAM_PROFILE_ADV_STOP(&p State->CTX_SUFF_Z(StatTransmit), a);4542 e1kDescReport(pThis, pDesc, addr); 4543 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatTransmit), a); 4542 4544 break; 4543 4545 } … … 4546 4548 if (pDesc->legacy.cmd.u16Length == 0 || pDesc->legacy.u64BufAddr == 0) 4547 4549 { 4548 E1kLog(("%s Empty legacy descriptor, skipped.\n", p State->szPrf));4550 E1kLog(("%s Empty legacy descriptor, skipped.\n", pThis->szPrf)); 4549 4551 /** @todo 3.3.3, Length/Buffer Address: RS set -> write DD when processing. */ 4550 4552 break; 4551 4553 } 4552 STAM_COUNTER_INC(&p State->StatTxDescLegacy);4553 STAM_PROFILE_ADV_START(&p State->CTX_SUFF_Z(StatTransmit), a);4554 STAM_COUNTER_INC(&pThis->StatTxDescLegacy); 4555 STAM_PROFILE_ADV_START(&pThis->CTX_SUFF_Z(StatTransmit), a); 4554 4556 4555 4557 /* First fragment: allocate new buffer. */ 4556 if (p State->u16TxPktLen == 0)4558 if (pThis->u16TxPktLen == 0) 4557 4559 { 4558 4560 if (pDesc->legacy.cmd.fEOP) … … 4560 4562 else 4561 4563 cbVTag = 4; 4562 E1kLog3(("%s About to allocate TX buffer: cbVTag=%u\n", p State->szPrf, cbVTag));4564 E1kLog3(("%s About to allocate TX buffer: cbVTag=%u\n", pThis->szPrf, cbVTag)); 4563 4565 /** @todo reset status bits? */ 4564 rc = e1kXmitAllocBuf(p State, pDesc->legacy.cmd.u16Length + cbVTag, pDesc->legacy.cmd.fEOP, false /*fGso*/);4566 rc = e1kXmitAllocBuf(pThis, pDesc->legacy.cmd.u16Length + cbVTag, pDesc->legacy.cmd.fEOP, false /*fGso*/); 4565 4567 if (RT_FAILURE(rc)) 4566 4568 { 4567 STAM_PROFILE_ADV_STOP(&p State->CTX_SUFF_Z(StatTransmit), a);4569 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatTransmit), a); 4568 4570 break; 4569 4571 } … … 4574 4576 4575 4577 /* Add fragment to frame. */ 4576 if (e1kAddToFrame(p State, pDesc->data.u64BufAddr, pDesc->legacy.cmd.u16Length))4578 if (e1kAddToFrame(pThis, pDesc->data.u64BufAddr, pDesc->legacy.cmd.u16Length)) 4577 4579 { 4578 E1K_INC_ISTAT_CNT(p State->uStatDescLeg);4580 E1K_INC_ISTAT_CNT(pThis->uStatDescLeg); 4579 4581 4580 4582 /* Last fragment: Transmit and reset the packet storage counter. */ 4581 4583 if (pDesc->legacy.cmd.fEOP) 4582 4584 { 4583 p State->fVTag = pDesc->legacy.cmd.fVLE;4584 p State->u16VTagTCI = pDesc->legacy.dw3.u16Special;4585 pThis->fVTag = pDesc->legacy.cmd.fVLE; 4586 pThis->u16VTagTCI = pDesc->legacy.dw3.u16Special; 4585 4587 /** @todo Offload processing goes here. */ 4586 e1kTransmitFrame(p State, fOnWorkerThread);4587 p State->u16TxPktLen = 0;4588 e1kTransmitFrame(pThis, fOnWorkerThread); 4589 pThis->u16TxPktLen = 0; 4588 4590 } 4589 4591 } … … 4591 4593 else if (pDesc->legacy.cmd.fEOP) 4592 4594 { 4593 e1kXmitFreeBuf(p State);4594 p State->u16TxPktLen = 0;4595 e1kXmitFreeBuf(pThis); 4596 pThis->u16TxPktLen = 0; 4595 4597 } 4596 4598 4597 e1kDescReport(p State, pDesc, addr);4598 STAM_PROFILE_ADV_STOP(&p State->CTX_SUFF_Z(StatTransmit), a);4599 e1kDescReport(pThis, pDesc, addr); 4600 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatTransmit), a); 4599 4601 break; 4600 4602 4601 4603 default: 4602 4604 E1kLog(("%s ERROR Unsupported transmit descriptor type: 0x%04x\n", 4603 p State->szPrf, e1kGetDescType(pDesc)));4605 pThis->szPrf, e1kGetDescType(pDesc))); 4604 4606 break; 4605 4607 } … … 4607 4609 return rc; 4608 4610 } 4611 4609 4612 #else /* E1K_WITH_TXD_CACHE */ 4613 4610 4614 /** 4611 4615 * Process Transmit Descriptor. … … 4616 4620 * - context sets up the context for following data descriptors. 4617 4621 * 4618 * @param p StateThe device state structure.4622 * @param pThis The device state structure. 4619 4623 * @param pDesc Pointer to descriptor union. 4620 4624 * @param addr Physical address of descriptor in guest memory. … … 4623 4627 * @thread E1000_TX 4624 4628 */ 4625 static int e1kXmitDesc( E1KSTATE* pState, E1KTXDESC* pDesc, RTGCPHYS addr,4629 static int e1kXmitDesc(PE1KSTATE pThis, E1KTXDESC* pDesc, RTGCPHYS addr, 4626 4630 bool fOnWorkerThread) 4627 4631 { … … 4629 4633 uint32_t cbVTag = 0; 4630 4634 4631 e1kPrintTDesc(p State, pDesc, "vvv");4635 e1kPrintTDesc(pThis, pDesc, "vvv"); 4632 4636 4633 4637 #ifdef E1K_USE_TX_TIMERS 4634 e1kCancelTimer(p State, pState->CTX_SUFF(pTIDTimer));4638 e1kCancelTimer(pThis, pThis->CTX_SUFF(pTIDTimer)); 4635 4639 #endif /* E1K_USE_TX_TIMERS */ 4636 4640 … … 4639 4643 case E1K_DTYP_CONTEXT: 4640 4644 /* The caller have already updated the context */ 4641 E1K_INC_ISTAT_CNT(p State->uStatDescCtx);4642 e1kDescReport(p State, pDesc, addr);4645 E1K_INC_ISTAT_CNT(pThis->uStatDescCtx); 4646 e1kDescReport(pThis, pDesc, addr); 4643 4647 break; 4644 4648 … … 4646 4650 { 4647 4651 STAM_COUNTER_INC(pDesc->data.cmd.fTSE? 4648 &p State->StatTxDescTSEData:4649 &p State->StatTxDescData);4650 E1K_INC_ISTAT_CNT(p State->uStatDescDat);4651 STAM_PROFILE_ADV_START(&p State->CTX_SUFF_Z(StatTransmit), a);4652 &pThis->StatTxDescTSEData: 4653 &pThis->StatTxDescData); 4654 E1K_INC_ISTAT_CNT(pThis->uStatDescDat); 4655 STAM_PROFILE_ADV_START(&pThis->CTX_SUFF_Z(StatTransmit), a); 4652 4656 if (pDesc->data.cmd.u20DTALEN == 0 || pDesc->data.u64BufAddr == 0) 4653 4657 { 4654 E1kLog2(("% Empty data descriptor, skipped.\n", p State->szPrf));4658 E1kLog2(("% Empty data descriptor, skipped.\n", pThis->szPrf)); 4655 4659 } 4656 4660 else … … 4660 4664 * transmit it and reset the u16TxPktLen field. 4661 4665 */ 4662 if (e1kXmitIsGsoBuf(p State->CTX_SUFF(pTxSg)))4666 if (e1kXmitIsGsoBuf(pThis->CTX_SUFF(pTxSg))) 4663 4667 { 4664 STAM_COUNTER_INC(&p State->StatTxPathGSO);4665 bool fRc = e1kAddToFrame(p State, pDesc->data.u64BufAddr, pDesc->data.cmd.u20DTALEN);4668 STAM_COUNTER_INC(&pThis->StatTxPathGSO); 4669 bool fRc = e1kAddToFrame(pThis, pDesc->data.u64BufAddr, pDesc->data.cmd.u20DTALEN); 4666 4670 if (pDesc->data.cmd.fEOP) 4667 4671 { 4668 4672 if ( fRc 4669 && p State->CTX_SUFF(pTxSg)4670 && p State->CTX_SUFF(pTxSg)->cbUsed == (size_t)pState->contextTSE.dw3.u8HDRLEN + pState->contextTSE.dw2.u20PAYLEN)4673 && pThis->CTX_SUFF(pTxSg) 4674 && pThis->CTX_SUFF(pTxSg)->cbUsed == (size_t)pThis->contextTSE.dw3.u8HDRLEN + pThis->contextTSE.dw2.u20PAYLEN) 4671 4675 { 4672 e1kTransmitFrame(p State, fOnWorkerThread);4676 e1kTransmitFrame(pThis, fOnWorkerThread); 4673 4677 E1K_INC_CNT32(TSCTC); 4674 4678 } … … 4676 4680 { 4677 4681 if (fRc) 4678 E1kLog(("%s bad GSO/TSE %p or %u < %u\n" , p State->szPrf,4679 p State->CTX_SUFF(pTxSg), pState->CTX_SUFF(pTxSg) ? pState->CTX_SUFF(pTxSg)->cbUsed : 0,4680 p State->contextTSE.dw3.u8HDRLEN + pState->contextTSE.dw2.u20PAYLEN));4681 e1kXmitFreeBuf(p State);4682 E1kLog(("%s bad GSO/TSE %p or %u < %u\n" , pThis->szPrf, 4683 pThis->CTX_SUFF(pTxSg), pThis->CTX_SUFF(pTxSg) ? pThis->CTX_SUFF(pTxSg)->cbUsed : 0, 4684 pThis->contextTSE.dw3.u8HDRLEN + pThis->contextTSE.dw2.u20PAYLEN)); 4685 e1kXmitFreeBuf(pThis); 4682 4686 E1K_INC_CNT32(TSCTFC); 4683 4687 } 4684 p State->u16TxPktLen = 0;4688 pThis->u16TxPktLen = 0; 4685 4689 } 4686 4690 } 4687 4691 else if (!pDesc->data.cmd.fTSE) 4688 4692 { 4689 STAM_COUNTER_INC(&p State->StatTxPathRegular);4690 bool fRc = e1kAddToFrame(p State, pDesc->data.u64BufAddr, pDesc->data.cmd.u20DTALEN);4693 STAM_COUNTER_INC(&pThis->StatTxPathRegular); 4694 bool fRc = e1kAddToFrame(pThis, pDesc->data.u64BufAddr, pDesc->data.cmd.u20DTALEN); 4691 4695 if (pDesc->data.cmd.fEOP) 4692 4696 { 4693 if (fRc && p State->CTX_SUFF(pTxSg))4697 if (fRc && pThis->CTX_SUFF(pTxSg)) 4694 4698 { 4695 Assert(p State->CTX_SUFF(pTxSg)->cSegs == 1);4696 if (p State->fIPcsum)4697 e1kInsertChecksum(p State, (uint8_t *)pState->CTX_SUFF(pTxSg)->aSegs[0].pvSeg, pState->u16TxPktLen,4698 p State->contextNormal.ip.u8CSO,4699 p State->contextNormal.ip.u8CSS,4700 p State->contextNormal.ip.u16CSE);4701 if (p State->fTCPcsum)4702 e1kInsertChecksum(p State, (uint8_t *)pState->CTX_SUFF(pTxSg)->aSegs[0].pvSeg, pState->u16TxPktLen,4703 p State->contextNormal.tu.u8CSO,4704 p State->contextNormal.tu.u8CSS,4705 p State->contextNormal.tu.u16CSE);4706 e1kTransmitFrame(p State, fOnWorkerThread);4699 Assert(pThis->CTX_SUFF(pTxSg)->cSegs == 1); 4700 if (pThis->fIPcsum) 4701 e1kInsertChecksum(pThis, (uint8_t *)pThis->CTX_SUFF(pTxSg)->aSegs[0].pvSeg, pThis->u16TxPktLen, 4702 pThis->contextNormal.ip.u8CSO, 4703 pThis->contextNormal.ip.u8CSS, 4704 pThis->contextNormal.ip.u16CSE); 4705 if (pThis->fTCPcsum) 4706 e1kInsertChecksum(pThis, (uint8_t *)pThis->CTX_SUFF(pTxSg)->aSegs[0].pvSeg, pThis->u16TxPktLen, 4707 pThis->contextNormal.tu.u8CSO, 4708 pThis->contextNormal.tu.u8CSS, 4709 pThis->contextNormal.tu.u16CSE); 4710 e1kTransmitFrame(pThis, fOnWorkerThread); 4707 4711 } 4708 4712 else 4709 e1kXmitFreeBuf(p State);4710 p State->u16TxPktLen = 0;4713 e1kXmitFreeBuf(pThis); 4714 pThis->u16TxPktLen = 0; 4711 4715 } 4712 4716 } 4713 4717 else 4714 4718 { 4715 STAM_COUNTER_INC(&p State->StatTxPathFallback);4716 rc = e1kFallbackAddToFrame(p State, pDesc, fOnWorkerThread);4719 STAM_COUNTER_INC(&pThis->StatTxPathFallback); 4720 rc = e1kFallbackAddToFrame(pThis, pDesc, fOnWorkerThread); 4717 4721 } 4718 4722 } 4719 e1kDescReport(p State, pDesc, addr);4720 STAM_PROFILE_ADV_STOP(&p State->CTX_SUFF_Z(StatTransmit), a);4723 e1kDescReport(pThis, pDesc, addr); 4724 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatTransmit), a); 4721 4725 break; 4722 4726 } 4723 4727 4724 4728 case E1K_DTYP_LEGACY: 4725 STAM_COUNTER_INC(&p State->StatTxDescLegacy);4726 STAM_PROFILE_ADV_START(&p State->CTX_SUFF_Z(StatTransmit), a);4729 STAM_COUNTER_INC(&pThis->StatTxDescLegacy); 4730 STAM_PROFILE_ADV_START(&pThis->CTX_SUFF_Z(StatTransmit), a); 4727 4731 if (pDesc->legacy.cmd.u16Length == 0 || pDesc->legacy.u64BufAddr == 0) 4728 4732 { 4729 E1kLog(("%s Empty legacy descriptor, skipped.\n", p State->szPrf));4733 E1kLog(("%s Empty legacy descriptor, skipped.\n", pThis->szPrf)); 4730 4734 } 4731 4735 else 4732 4736 { 4733 4737 /* Add fragment to frame. */ 4734 if (e1kAddToFrame(p State, pDesc->data.u64BufAddr, pDesc->legacy.cmd.u16Length))4738 if (e1kAddToFrame(pThis, pDesc->data.u64BufAddr, pDesc->legacy.cmd.u16Length)) 4735 4739 { 4736 E1K_INC_ISTAT_CNT(p State->uStatDescLeg);4740 E1K_INC_ISTAT_CNT(pThis->uStatDescLeg); 4737 4741 4738 4742 /* Last fragment: Transmit and reset the packet storage counter. */ … … 4741 4745 if (pDesc->legacy.cmd.fIC) 4742 4746 { 4743 e1kInsertChecksum(p State,4744 (uint8_t *)p State->CTX_SUFF(pTxSg)->aSegs[0].pvSeg,4745 p State->u16TxPktLen,4747 e1kInsertChecksum(pThis, 4748 (uint8_t *)pThis->CTX_SUFF(pTxSg)->aSegs[0].pvSeg, 4749 pThis->u16TxPktLen, 4746 4750 pDesc->legacy.cmd.u8CSO, 4747 4751 pDesc->legacy.dw3.u8CSS, 4748 4752 0); 4749 4753 } 4750 e1kTransmitFrame(p State, fOnWorkerThread);4751 p State->u16TxPktLen = 0;4754 e1kTransmitFrame(pThis, fOnWorkerThread); 4755 pThis->u16TxPktLen = 0; 4752 4756 } 4753 4757 } … … 4755 4759 else if (pDesc->legacy.cmd.fEOP) 4756 4760 { 4757 e1kXmitFreeBuf(p State);4758 p State->u16TxPktLen = 0;4761 e1kXmitFreeBuf(pThis); 4762 pThis->u16TxPktLen = 0; 4759 4763 } 4760 4764 } 4761 e1kDescReport(p State, pDesc, addr);4762 STAM_PROFILE_ADV_STOP(&p State->CTX_SUFF_Z(StatTransmit), a);4765 e1kDescReport(pThis, pDesc, addr); 4766 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatTransmit), a); 4763 4767 break; 4764 4768 4765 4769 default: 4766 4770 E1kLog(("%s ERROR Unsupported transmit descriptor type: 0x%04x\n", 4767 p State->szPrf, e1kGetDescType(pDesc)));4771 pThis->szPrf, e1kGetDescType(pDesc))); 4768 4772 break; 4769 4773 } … … 4772 4776 } 4773 4777 4774 4775 DECLINLINE(void) e1kUpdateTxContext(E1KSTATE* pState, E1KTXDESC* pDesc) 4778 DECLINLINE(void) e1kUpdateTxContext(PE1KSTATE pThis, E1KTXDESC* pDesc) 4776 4779 { 4777 4780 if (pDesc->context.dw2.fTSE) 4778 4781 { 4779 p State->contextTSE = pDesc->context;4780 p State->u32PayRemain = pDesc->context.dw2.u20PAYLEN;4781 p State->u16HdrRemain = pDesc->context.dw3.u8HDRLEN;4782 e1kSetupGsoCtx(&p State->GsoCtx, &pDesc->context);4783 STAM_COUNTER_INC(&p State->StatTxDescCtxTSE);4782 pThis->contextTSE = pDesc->context; 4783 pThis->u32PayRemain = pDesc->context.dw2.u20PAYLEN; 4784 pThis->u16HdrRemain = pDesc->context.dw3.u8HDRLEN; 4785 e1kSetupGsoCtx(&pThis->GsoCtx, &pDesc->context); 4786 STAM_COUNTER_INC(&pThis->StatTxDescCtxTSE); 4784 4787 } 4785 4788 else 4786 4789 { 4787 p State->contextNormal = pDesc->context;4788 STAM_COUNTER_INC(&p State->StatTxDescCtxNormal);4790 pThis->contextNormal = pDesc->context; 4791 STAM_COUNTER_INC(&pThis->StatTxDescCtxNormal); 4789 4792 } 4790 4793 E1kLog2(("%s %s context updated: IP CSS=%02X, IP CSO=%02X, IP CSE=%04X" 4791 ", TU CSS=%02X, TU CSO=%02X, TU CSE=%04X\n", p State->szPrf,4794 ", TU CSS=%02X, TU CSO=%02X, TU CSE=%04X\n", pThis->szPrf, 4792 4795 pDesc->context.dw2.fTSE ? "TSE" : "Normal", 4793 4796 pDesc->context.ip.u8CSS, … … 4799 4802 } 4800 4803 4801 4802 static bool e1kLocateTxPacket(E1KSTATE *pState) 4804 static bool e1kLocateTxPacket(PE1KSTATE pThis) 4803 4805 { 4804 4806 LogFlow(("%s e1kLocateTxPacket: ENTER cbTxAlloc=%d\n", 4805 p State->szPrf, pState->cbTxAlloc));4807 pThis->szPrf, pThis->cbTxAlloc)); 4806 4808 /* Check if we have located the packet already. */ 4807 if (p State->cbTxAlloc)4809 if (pThis->cbTxAlloc) 4808 4810 { 4809 4811 LogFlow(("%s e1kLocateTxPacket: RET true cbTxAlloc=%d\n", 4810 p State->szPrf, pState->cbTxAlloc));4812 pThis->szPrf, pThis->cbTxAlloc)); 4811 4813 return true; 4812 4814 } … … 4815 4817 uint32_t cbPacket = 0; 4816 4818 4817 for (int i = p State->iTxDCurrent; i < pState->nTxDFetched; ++i)4818 { 4819 E1KTXDESC *pDesc = &p State->aTxDescriptors[i];4819 for (int i = pThis->iTxDCurrent; i < pThis->nTxDFetched; ++i) 4820 { 4821 E1KTXDESC *pDesc = &pThis->aTxDescriptors[i]; 4820 4822 switch (e1kGetDescType(pDesc)) 4821 4823 { 4822 4824 case E1K_DTYP_CONTEXT: 4823 e1kUpdateTxContext(p State, pDesc);4825 e1kUpdateTxContext(pThis, pDesc); 4824 4826 continue; 4825 4827 case E1K_DTYP_LEGACY: … … 4828 4830 break; 4829 4831 cbPacket += pDesc->legacy.cmd.u16Length; 4830 p State->fGSO = false;4832 pThis->fGSO = false; 4831 4833 break; 4832 4834 case E1K_DTYP_DATA: … … 4840 4842 * as these are only valid in the first fragment. 4841 4843 */ 4842 p State->fIPcsum = pDesc->data.dw3.fIXSM;4843 p State->fTCPcsum = pDesc->data.dw3.fTXSM;4844 pThis->fIPcsum = pDesc->data.dw3.fIXSM; 4845 pThis->fTCPcsum = pDesc->data.dw3.fTXSM; 4844 4846 fTSE = pDesc->data.cmd.fTSE; 4845 4847 /* … … 4849 4851 if (fTSE) 4850 4852 { 4851 p State->fVTag = pDesc->data.cmd.fVLE;4852 p State->u16VTagTCI = pDesc->data.dw3.u16Special;4853 pThis->fVTag = pDesc->data.cmd.fVLE; 4854 pThis->u16VTagTCI = pDesc->data.dw3.u16Special; 4853 4855 } 4854 p State->fGSO = e1kCanDoGso(pState, &pState->GsoCtx, &pDesc->data, &pState->contextTSE);4856 pThis->fGSO = e1kCanDoGso(pThis, &pThis->GsoCtx, &pDesc->data, &pThis->contextTSE); 4855 4857 } 4856 4858 cbPacket += pDesc->data.cmd.u20DTALEN; … … 4867 4869 if (!fTSE) 4868 4870 { 4869 p State->fVTag = pDesc->data.cmd.fVLE;4870 p State->u16VTagTCI = pDesc->data.dw3.u16Special;4871 pThis->fVTag = pDesc->data.cmd.fVLE; 4872 pThis->u16VTagTCI = pDesc->data.dw3.u16Special; 4871 4873 } 4872 4874 /* … … 4874 4876 * have to do segmentation we allocate the first segment only. 4875 4877 */ 4876 p State->cbTxAlloc = (!fTSE || pState->fGSO) ?4878 pThis->cbTxAlloc = (!fTSE || pThis->fGSO) ? 4877 4879 cbPacket : 4878 RT_MIN(cbPacket, p State->contextTSE.dw3.u16MSS + pState->contextTSE.dw3.u8HDRLEN);4879 if (p State->fVTag)4880 p State->cbTxAlloc += 4;4880 RT_MIN(cbPacket, pThis->contextTSE.dw3.u16MSS + pThis->contextTSE.dw3.u8HDRLEN); 4881 if (pThis->fVTag) 4882 pThis->cbTxAlloc += 4; 4881 4883 LogFlow(("%s e1kLocateTxPacket: RET true cbTxAlloc=%d\n", 4882 p State->szPrf, pState->cbTxAlloc));4884 pThis->szPrf, pThis->cbTxAlloc)); 4883 4885 return true; 4884 4886 } 4885 4887 } 4886 4888 4887 if (cbPacket == 0 && p State->nTxDFetched - pState->iTxDCurrent > 0)4889 if (cbPacket == 0 && pThis->nTxDFetched - pThis->iTxDCurrent > 0) 4888 4890 { 4889 4891 /* All descriptors were empty, we need to process them as a dummy packet */ 4890 4892 LogFlow(("%s e1kLocateTxPacket: RET true cbTxAlloc=%d, zero packet!\n", 4891 p State->szPrf, pState->cbTxAlloc));4893 pThis->szPrf, pThis->cbTxAlloc)); 4892 4894 return true; 4893 4895 } 4894 4896 LogFlow(("%s e1kLocateTxPacket: RET false cbTxAlloc=%d\n", 4895 p State->szPrf, pState->cbTxAlloc));4897 pThis->szPrf, pThis->cbTxAlloc)); 4896 4898 return false; 4897 4899 } 4898 4900 4899 4900 static int e1kXmitPacket(E1KSTATE *pState, bool fOnWorkerThread) 4901 static int e1kXmitPacket(PE1KSTATE pThis, bool fOnWorkerThread) 4901 4902 { 4902 4903 int rc = VINF_SUCCESS; 4903 4904 4904 4905 LogFlow(("%s e1kXmitPacket: ENTER current=%d fetched=%d\n", 4905 p State->szPrf, pState->iTxDCurrent, pState->nTxDFetched));4906 4907 while (p State->iTxDCurrent < pState->nTxDFetched)4908 { 4909 E1KTXDESC *pDesc = &p State->aTxDescriptors[pState->iTxDCurrent];4906 pThis->szPrf, pThis->iTxDCurrent, pThis->nTxDFetched)); 4907 4908 while (pThis->iTxDCurrent < pThis->nTxDFetched) 4909 { 4910 E1KTXDESC *pDesc = &pThis->aTxDescriptors[pThis->iTxDCurrent]; 4910 4911 E1kLog3(("%s About to process new TX descriptor at %08x%08x, TDLEN=%08x, TDH=%08x, TDT=%08x\n", 4911 p State->szPrf, TDBAH, TDBAL + TDH * sizeof(E1KTXDESC), TDLEN, TDH, TDT));4912 rc = e1kXmitDesc(p State, pDesc, e1kDescAddr(TDBAH, TDBAL, TDH), fOnWorkerThread);4912 pThis->szPrf, TDBAH, TDBAL + TDH * sizeof(E1KTXDESC), TDLEN, TDH, TDT)); 4913 rc = e1kXmitDesc(pThis, pDesc, e1kDescAddr(TDBAH, TDBAL, TDH), fOnWorkerThread); 4913 4914 if (RT_FAILURE(rc)) 4914 4915 break; … … 4916 4917 TDH = 0; 4917 4918 uint32_t uLowThreshold = GET_BITS(TXDCTL, LWTHRESH)*8; 4918 if (uLowThreshold != 0 && e1kGetTxLen(p State) <= uLowThreshold)4919 if (uLowThreshold != 0 && e1kGetTxLen(pThis) <= uLowThreshold) 4919 4920 { 4920 4921 E1kLog2(("%s Low on transmit descriptors, raise ICR.TXD_LOW, len=%x thresh=%x\n", 4921 p State->szPrf, e1kGetTxLen(pState), GET_BITS(TXDCTL, LWTHRESH)*8));4922 e1kRaiseInterrupt(p State, VERR_SEM_BUSY, ICR_TXD_LOW);4922 pThis->szPrf, e1kGetTxLen(pThis), GET_BITS(TXDCTL, LWTHRESH)*8)); 4923 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_TXD_LOW); 4923 4924 } 4924 ++p State->iTxDCurrent;4925 ++pThis->iTxDCurrent; 4925 4926 if (e1kGetDescType(pDesc) != E1K_DTYP_CONTEXT && pDesc->legacy.cmd.fEOP) 4926 4927 break; … … 4928 4929 4929 4930 LogFlow(("%s e1kXmitPacket: RET %Rrc current=%d fetched=%d\n", 4930 p State->szPrf, rc, pState->iTxDCurrent, pState->nTxDFetched));4931 pThis->szPrf, rc, pThis->iTxDCurrent, pThis->nTxDFetched)); 4931 4932 return rc; 4932 4933 } 4934 4933 4935 #endif /* E1K_WITH_TXD_CACHE */ 4934 4935 4936 #ifndef E1K_WITH_TXD_CACHE 4937 4936 4938 /** 4937 4939 * Transmit pending descriptors. … … 4939 4941 * @returns VBox status code. VERR_TRY_AGAIN is returned if we're busy. 4940 4942 * 4941 * @param p StateThe E1000 state.4943 * @param pThis The E1000 state. 4942 4944 * @param fOnWorkerThread Whether we're on a worker thread or on an EMT. 4943 4945 */ 4944 static int e1kXmitPending( E1KSTATE *pState, bool fOnWorkerThread)4946 static int e1kXmitPending(PE1KSTATE pThis, bool fOnWorkerThread) 4945 4947 { 4946 4948 int rc = VINF_SUCCESS; … … 4952 4954 * Grab the xmit lock of the driver as well as the E1K device state. 4953 4955 */ 4954 rc = e1kCsTxEnter(p State, VERR_SEM_BUSY);4956 rc = e1kCsTxEnter(pThis, VERR_SEM_BUSY); 4955 4957 if (RT_LIKELY(rc == VINF_SUCCESS)) 4956 4958 { 4957 PPDMINETWORKUP pDrv = p State->CTX_SUFF(pDrv);4959 PPDMINETWORKUP pDrv = pThis->CTX_SUFF(pDrv); 4958 4960 if (pDrv) 4959 4961 { … … 4961 4963 if (RT_FAILURE(rc)) 4962 4964 { 4963 e1kCsTxLeave(p State);4965 e1kCsTxLeave(pThis); 4964 4966 return rc; 4965 4967 } … … 4969 4971 * Note! Do not process descriptors in locked state 4970 4972 */ 4971 while (TDH != TDT && !p State->fLocked)4973 while (TDH != TDT && !pThis->fLocked) 4972 4974 { 4973 4975 E1KTXDESC desc; 4974 4976 E1kLog3(("%s About to process new TX descriptor at %08x%08x, TDLEN=%08x, TDH=%08x, TDT=%08x\n", 4975 p State->szPrf, TDBAH, TDBAL + TDH * sizeof(desc), TDLEN, TDH, TDT));4976 4977 e1kLoadDesc(p State, &desc, ((uint64_t)TDBAH << 32) + TDBAL + TDH * sizeof(desc));4978 rc = e1kXmitDesc(p State, &desc, e1kDescAddr(TDBAH, TDBAL, TDH), fOnWorkerThread);4977 pThis->szPrf, TDBAH, TDBAL + TDH * sizeof(desc), TDLEN, TDH, TDT)); 4978 4979 e1kLoadDesc(pThis, &desc, ((uint64_t)TDBAH << 32) + TDBAL + TDH * sizeof(desc)); 4980 rc = e1kXmitDesc(pThis, &desc, e1kDescAddr(TDBAH, TDBAL, TDH), fOnWorkerThread); 4979 4981 /* If we failed to transmit descriptor we will try it again later */ 4980 4982 if (RT_FAILURE(rc)) … … 4983 4985 TDH = 0; 4984 4986 4985 if (e1kGetTxLen(p State) <= GET_BITS(TXDCTL, LWTHRESH)*8)4987 if (e1kGetTxLen(pThis) <= GET_BITS(TXDCTL, LWTHRESH)*8) 4986 4988 { 4987 4989 E1kLog2(("%s Low on transmit descriptors, raise ICR.TXD_LOW, len=%x thresh=%x\n", 4988 p State->szPrf, e1kGetTxLen(pState), GET_BITS(TXDCTL, LWTHRESH)*8));4989 e1kRaiseInterrupt(p State, VERR_SEM_BUSY, ICR_TXD_LOW);4990 pThis->szPrf, e1kGetTxLen(pThis), GET_BITS(TXDCTL, LWTHRESH)*8)); 4991 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_TXD_LOW); 4990 4992 } 4991 4993 4992 STAM_PROFILE_ADV_STOP(&p State->CTX_SUFF_Z(StatTransmit), a);4994 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatTransmit), a); 4993 4995 } 4994 4996 4995 /// @todo: uncomment: p State->uStatIntTXQE++;4996 /// @todo: uncomment: e1kRaiseInterrupt(p State, ICR_TXQE);4997 /// @todo: uncomment: pThis->uStatIntTXQE++; 4998 /// @todo: uncomment: e1kRaiseInterrupt(pThis, ICR_TXQE); 4997 4999 /* 4998 5000 * Release the lock. … … 5000 5002 if (pDrv) 5001 5003 pDrv->pfnEndXmit(pDrv); 5002 e1kCsTxLeave(p State);5004 e1kCsTxLeave(pThis); 5003 5005 } 5004 5006 5005 5007 return rc; 5006 5008 } 5009 5007 5010 #else /* E1K_WITH_TXD_CACHE */ 5008 static void e1kDumpTxDCache(E1KSTATE *pState) 5011 5012 static void e1kDumpTxDCache(PE1KSTATE pThis) 5009 5013 { 5010 5014 unsigned i, cDescs = TDLEN / sizeof(E1KTXDESC); … … 5014 5018 { 5015 5019 E1KTXDESC desc; 5016 PDMDevHlpPhysRead(p State->CTX_SUFF(pDevIns), e1kDescAddr(TDBAH, TDBAL, i),5020 PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns), e1kDescAddr(TDBAH, TDBAL, i), 5017 5021 &desc, sizeof(desc)); 5018 5022 if (i == tdh) … … 5021 5025 } 5022 5026 LogRel(("-- Transmit Descriptors in Cache (at %d (TDH %d)/ fetched %d / max %d) --\n", 5023 p State->iTxDCurrent, TDH, pState->nTxDFetched, E1K_TXD_CACHE_SIZE));5024 if (tdh > p State->iTxDCurrent)5025 tdh -= p State->iTxDCurrent;5027 pThis->iTxDCurrent, TDH, pThis->nTxDFetched, E1K_TXD_CACHE_SIZE)); 5028 if (tdh > pThis->iTxDCurrent) 5029 tdh -= pThis->iTxDCurrent; 5026 5030 else 5027 tdh = cDescs + tdh - p State->iTxDCurrent;5028 for (i = 0; i < p State->nTxDFetched; ++i)5029 { 5030 if (i == p State->iTxDCurrent)5031 tdh = cDescs + tdh - pThis->iTxDCurrent; 5032 for (i = 0; i < pThis->nTxDFetched; ++i) 5033 { 5034 if (i == pThis->iTxDCurrent) 5031 5035 LogRel((">>> ")); 5032 LogRel(("%RGp: %R[e1ktxd]\n", e1kDescAddr(TDBAH, TDBAL, tdh++ % cDescs), &p State->aTxDescriptors[i]));5036 LogRel(("%RGp: %R[e1ktxd]\n", e1kDescAddr(TDBAH, TDBAL, tdh++ % cDescs), &pThis->aTxDescriptors[i])); 5033 5037 } 5034 5038 } … … 5039 5043 * @returns VBox status code. VERR_TRY_AGAIN is returned if we're busy. 5040 5044 * 5041 * @param p StateThe E1000 state.5045 * @param pThis The E1000 state. 5042 5046 * @param fOnWorkerThread Whether we're on a worker thread or on an EMT. 5043 5047 */ 5044 static int e1kXmitPending( E1KSTATE *pState, bool fOnWorkerThread)5048 static int e1kXmitPending(PE1KSTATE pThis, bool fOnWorkerThread) 5045 5049 { 5046 5050 int rc = VINF_SUCCESS; … … 5052 5056 * Grab the xmit lock of the driver as well as the E1K device state. 5053 5057 */ 5054 PPDMINETWORKUP pDrv = p State->CTX_SUFF(pDrv);5058 PPDMINETWORKUP pDrv = pThis->CTX_SUFF(pDrv); 5055 5059 if (pDrv) 5056 5060 { … … 5064 5068 * Note! Do not process descriptors in locked state 5065 5069 */ 5066 rc = e1kCsTxEnter(p State, VERR_SEM_BUSY);5070 rc = e1kCsTxEnter(pThis, VERR_SEM_BUSY); 5067 5071 if (RT_LIKELY(rc == VINF_SUCCESS)) 5068 5072 { 5069 STAM_PROFILE_ADV_START(&p State->CTX_SUFF_Z(StatTransmit), a);5073 STAM_PROFILE_ADV_START(&pThis->CTX_SUFF_Z(StatTransmit), a); 5070 5074 /* 5071 5075 * fIncomplete is set whenever we try to fetch additional descriptors … … 5075 5079 */ 5076 5080 bool fIncomplete = false; 5077 while (!p State->fLocked && e1kTxDLazyLoad(pState))5078 { 5079 while (e1kLocateTxPacket(p State))5081 while (!pThis->fLocked && e1kTxDLazyLoad(pThis)) 5082 { 5083 while (e1kLocateTxPacket(pThis)) 5080 5084 { 5081 5085 fIncomplete = false; 5082 5086 /* Found a complete packet, allocate it. */ 5083 rc = e1kXmitAllocBuf(p State, pState->fGSO);5087 rc = e1kXmitAllocBuf(pThis, pThis->fGSO); 5084 5088 /* If we're out of bandwidth we'll come back later. */ 5085 5089 if (RT_FAILURE(rc)) 5086 5090 goto out; 5087 5091 /* Copy the packet to allocated buffer and send it. */ 5088 rc = e1kXmitPacket(p State, fOnWorkerThread);5092 rc = e1kXmitPacket(pThis, fOnWorkerThread); 5089 5093 /* If we're out of bandwidth we'll come back later. */ 5090 5094 if (RT_FAILURE(rc)) 5091 5095 goto out; 5092 5096 } 5093 uint8_t u8Remain = p State->nTxDFetched - pState->iTxDCurrent;5097 uint8_t u8Remain = pThis->nTxDFetched - pThis->iTxDCurrent; 5094 5098 if (RT_UNLIKELY(fIncomplete)) 5095 5099 { … … 5102 5106 LogRel(("%s No complete packets in%s TxD cache! " 5103 5107 "Fetched=%d, current=%d, TX len=%d.\n", 5104 p State->szPrf,5108 pThis->szPrf, 5105 5109 u8Remain == E1K_TXD_CACHE_SIZE ? " full" : "", 5106 p State->nTxDFetched, pState->iTxDCurrent,5107 e1kGetTxLen(p State)));5110 pThis->nTxDFetched, pThis->iTxDCurrent, 5111 e1kGetTxLen(pThis))); 5108 5112 if (!fTxDCacheDumped) 5109 5113 { 5110 5114 fTxDCacheDumped = true; 5111 e1kDumpTxDCache(p State);5115 e1kDumpTxDCache(pThis); 5112 5116 } 5113 p State->iTxDCurrent = pState->nTxDFetched = 0;5117 pThis->iTxDCurrent = pThis->nTxDFetched = 0; 5114 5118 /* 5115 5119 * Returning an error at this point means Guru in R0 … … 5127 5131 Log4(("%s Incomplete packet at %d. Already fetched %d, " 5128 5132 "%d more are available\n", 5129 p State->szPrf, pState->iTxDCurrent, u8Remain,5130 e1kGetTxLen(p State) - u8Remain));5133 pThis->szPrf, pThis->iTxDCurrent, u8Remain, 5134 e1kGetTxLen(pThis) - u8Remain)); 5131 5135 5132 5136 /* … … 5134 5138 * the beginning of cache buffer, then load more descriptors. 5135 5139 */ 5136 memmove(p State->aTxDescriptors,5137 &p State->aTxDescriptors[pState->iTxDCurrent],5140 memmove(pThis->aTxDescriptors, 5141 &pThis->aTxDescriptors[pThis->iTxDCurrent], 5138 5142 u8Remain * sizeof(E1KTXDESC)); 5139 p State->iTxDCurrent = 0;5140 p State->nTxDFetched = u8Remain;5141 e1kTxDLoadMore(p State);5143 pThis->iTxDCurrent = 0; 5144 pThis->nTxDFetched = u8Remain; 5145 e1kTxDLoadMore(pThis); 5142 5146 fIncomplete = true; 5143 5147 } 5144 5148 else 5145 p State->nTxDFetched = 0;5146 p State->iTxDCurrent = 0;5149 pThis->nTxDFetched = 0; 5150 pThis->iTxDCurrent = 0; 5147 5151 } 5148 if (!p State->fLocked && GET_BITS(TXDCTL, LWTHRESH) == 0)5152 if (!pThis->fLocked && GET_BITS(TXDCTL, LWTHRESH) == 0) 5149 5153 { 5150 5154 E1kLog2(("%s Out of transmit descriptors, raise ICR.TXD_LOW\n", 5151 p State->szPrf));5152 e1kRaiseInterrupt(p State, VERR_SEM_BUSY, ICR_TXD_LOW);5155 pThis->szPrf)); 5156 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_TXD_LOW); 5153 5157 } 5154 5158 out: 5155 STAM_PROFILE_ADV_STOP(&p State->CTX_SUFF_Z(StatTransmit), a);5156 5157 /// @todo: uncomment: p State->uStatIntTXQE++;5158 /// @todo: uncomment: e1kRaiseInterrupt(p State, ICR_TXQE);5159 5160 e1kCsTxLeave(p State);5159 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatTransmit), a); 5160 5161 /// @todo: uncomment: pThis->uStatIntTXQE++; 5162 /// @todo: uncomment: e1kRaiseInterrupt(pThis, ICR_TXQE); 5163 5164 e1kCsTxLeave(pThis); 5161 5165 } 5162 5166 … … 5169 5173 return rc; 5170 5174 } 5175 5171 5176 #endif /* E1K_WITH_TXD_CACHE */ 5172 5173 5177 #ifdef IN_RING3 5174 5178 … … 5178 5182 static DECLCALLBACK(void) e1kNetworkDown_XmitPending(PPDMINETWORKDOWN pInterface) 5179 5183 { 5180 E1KSTATE *pState= RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkDown);5184 PE1KSTATE pThis = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkDown); 5181 5185 /* Resume suspended transmission */ 5182 5186 STATUS &= ~STATUS_TXOFF; 5183 e1kXmitPending(p State, true /*fOnWorkerThread*/);5187 e1kXmitPending(pThis, true /*fOnWorkerThread*/); 5184 5188 } 5185 5189 … … 5196 5200 { 5197 5201 NOREF(pItem); 5198 E1KSTATE *pState = PDMINS_2_DATA(pDevIns, E1KSTATE *);5199 E1kLog2(("%s e1kTxQueueConsumer:\n", p State->szPrf));5200 5201 int rc = e1kXmitPending(p State, false /*fOnWorkerThread*/);5202 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, PE1KSTATE); 5203 E1kLog2(("%s e1kTxQueueConsumer:\n", pThis->szPrf)); 5204 5205 int rc = e1kXmitPending(pThis, false /*fOnWorkerThread*/); 5202 5206 AssertMsg(RT_SUCCESS(rc) || rc == VERR_TRY_AGAIN, ("%Rrc\n", rc)); 5203 5207 … … 5219 5223 * Write handler for Transmit Descriptor Tail register. 5220 5224 * 5221 * @param p StateThe device state structure.5225 * @param pThis The device state structure. 5222 5226 * @param offset Register offset in memory-mapped frame. 5223 5227 * @param index Register index in register array. … … 5226 5230 * @thread EMT 5227 5231 */ 5228 static int e1kRegWriteTDT( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)5229 { 5230 int rc = e1kRegWriteDefault(p State, offset, index, value);5232 static int e1kRegWriteTDT(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 5233 { 5234 int rc = e1kRegWriteDefault(pThis, offset, index, value); 5231 5235 5232 5236 /* All descriptors starting with head and not including tail belong to us. */ 5233 5237 /* Process them. */ 5234 5238 E1kLog2(("%s e1kRegWriteTDT: TDBAL=%08x, TDBAH=%08x, TDLEN=%08x, TDH=%08x, TDT=%08x\n", 5235 p State->szPrf, TDBAL, TDBAH, TDLEN, TDH, TDT));5239 pThis->szPrf, TDBAL, TDBAH, TDLEN, TDH, TDT)); 5236 5240 5237 5241 /* Ignore TDT writes when the link is down. */ 5238 5242 if (TDH != TDT && (STATUS & STATUS_LU)) 5239 5243 { 5240 E1kLogRel(("E1000: TDT write: %d descriptors to process\n", e1kGetTxLen(p State)));5244 E1kLogRel(("E1000: TDT write: %d descriptors to process\n", e1kGetTxLen(pThis))); 5241 5245 E1kLog(("%s e1kRegWriteTDT: %d descriptors to process\n", 5242 p State->szPrf, e1kGetTxLen(pState)));5246 pThis->szPrf, e1kGetTxLen(pThis))); 5243 5247 5244 5248 /* Transmit pending packets if possible, defer it if we cannot do it 5245 5249 in the current context. */ 5246 5250 #ifdef E1K_TX_DELAY 5247 rc = e1kCsTxEnter(p State, VERR_SEM_BUSY);5251 rc = e1kCsTxEnter(pThis, VERR_SEM_BUSY); 5248 5252 if (RT_LIKELY(rc == VINF_SUCCESS)) 5249 5253 { 5250 if (!TMTimerIsActive(p State->CTX_SUFF(pTXDTimer)))5254 if (!TMTimerIsActive(pThis->CTX_SUFF(pTXDTimer))) 5251 5255 { 5252 5256 #ifdef E1K_INT_STATS 5253 p State->u64ArmedAt = RTTimeNanoTS();5257 pThis->u64ArmedAt = RTTimeNanoTS(); 5254 5258 #endif 5255 e1kArmTimer(p State, pState->CTX_SUFF(pTXDTimer), E1K_TX_DELAY);5259 e1kArmTimer(pThis, pThis->CTX_SUFF(pTXDTimer), E1K_TX_DELAY); 5256 5260 } 5257 E1K_INC_ISTAT_CNT(p State->uStatTxDelayed);5258 e1kCsTxLeave(p State);5261 E1K_INC_ISTAT_CNT(pThis->uStatTxDelayed); 5262 e1kCsTxLeave(pThis); 5259 5263 return rc; 5260 5264 } … … 5262 5266 #endif /* E1K_TX_DELAY */ 5263 5267 #ifndef IN_RING3 5264 if (!p State->CTX_SUFF(pDrv))5265 { 5266 PPDMQUEUEITEMCORE pItem = PDMQueueAlloc(p State->CTX_SUFF(pTxQueue));5268 if (!pThis->CTX_SUFF(pDrv)) 5269 { 5270 PPDMQUEUEITEMCORE pItem = PDMQueueAlloc(pThis->CTX_SUFF(pTxQueue)); 5267 5271 if (RT_UNLIKELY(pItem)) 5268 PDMQueueInsert(p State->CTX_SUFF(pTxQueue), pItem);5272 PDMQueueInsert(pThis->CTX_SUFF(pTxQueue), pItem); 5269 5273 } 5270 5274 else 5271 5275 #endif 5272 5276 { 5273 rc = e1kXmitPending(p State, false /*fOnWorkerThread*/);5277 rc = e1kXmitPending(pThis, false /*fOnWorkerThread*/); 5274 5278 if (rc == VERR_TRY_AGAIN) 5275 5279 rc = VINF_SUCCESS; … … 5286 5290 * Write handler for Multicast Table Array registers. 5287 5291 * 5288 * @param p StateThe device state structure.5292 * @param pThis The device state structure. 5289 5293 * @param offset Register offset in memory-mapped frame. 5290 5294 * @param index Register index in register array. … … 5292 5296 * @thread EMT 5293 5297 */ 5294 static int e1kRegWriteMTA( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)5295 { 5296 AssertReturn(offset - s_e1kRegMap[index].offset < sizeof(p State->auMTA), VERR_DEV_IO_ERROR);5297 p State->auMTA[(offset - s_e1kRegMap[index].offset)/sizeof(pState->auMTA[0])] = value;5298 static int e1kRegWriteMTA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 5299 { 5300 AssertReturn(offset - s_e1kRegMap[index].offset < sizeof(pThis->auMTA), VERR_DEV_IO_ERROR); 5301 pThis->auMTA[(offset - s_e1kRegMap[index].offset)/sizeof(pThis->auMTA[0])] = value; 5298 5302 5299 5303 return VINF_SUCCESS; … … 5305 5309 * @returns VBox status code. 5306 5310 * 5307 * @param p StateThe device state structure.5311 * @param pThis The device state structure. 5308 5312 * @param offset Register offset in memory-mapped frame. 5309 5313 * @param index Register index in register array. 5310 5314 * @thread EMT 5311 5315 */ 5312 static int e1kRegReadMTA( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value)5313 { 5314 AssertReturn(offset - s_e1kRegMap[index].offset< sizeof(p State->auMTA), VERR_DEV_IO_ERROR);5315 *pu32Value = p State->auMTA[(offset - s_e1kRegMap[index].offset)/sizeof(pState->auMTA[0])];5316 static int e1kRegReadMTA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 5317 { 5318 AssertReturn(offset - s_e1kRegMap[index].offset< sizeof(pThis->auMTA), VERR_DEV_IO_ERROR); 5319 *pu32Value = pThis->auMTA[(offset - s_e1kRegMap[index].offset)/sizeof(pThis->auMTA[0])]; 5316 5320 5317 5321 return VINF_SUCCESS; … … 5321 5325 * Write handler for Receive Address registers. 5322 5326 * 5323 * @param p StateThe device state structure.5327 * @param pThis The device state structure. 5324 5328 * @param offset Register offset in memory-mapped frame. 5325 5329 * @param index Register index in register array. … … 5327 5331 * @thread EMT 5328 5332 */ 5329 static int e1kRegWriteRA( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)5330 { 5331 AssertReturn(offset - s_e1kRegMap[index].offset < sizeof(p State->aRecAddr.au32), VERR_DEV_IO_ERROR);5332 p State->aRecAddr.au32[(offset - s_e1kRegMap[index].offset)/sizeof(pState->aRecAddr.au32[0])] = value;5333 static int e1kRegWriteRA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 5334 { 5335 AssertReturn(offset - s_e1kRegMap[index].offset < sizeof(pThis->aRecAddr.au32), VERR_DEV_IO_ERROR); 5336 pThis->aRecAddr.au32[(offset - s_e1kRegMap[index].offset)/sizeof(pThis->aRecAddr.au32[0])] = value; 5333 5337 5334 5338 return VINF_SUCCESS; … … 5340 5344 * @returns VBox status code. 5341 5345 * 5342 * @param p StateThe device state structure.5346 * @param pThis The device state structure. 5343 5347 * @param offset Register offset in memory-mapped frame. 5344 5348 * @param index Register index in register array. 5345 5349 * @thread EMT 5346 5350 */ 5347 static int e1kRegReadRA( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value)5348 { 5349 AssertReturn(offset - s_e1kRegMap[index].offset< sizeof(p State->aRecAddr.au32), VERR_DEV_IO_ERROR);5350 *pu32Value = p State->aRecAddr.au32[(offset - s_e1kRegMap[index].offset)/sizeof(pState->aRecAddr.au32[0])];5351 static int e1kRegReadRA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 5352 { 5353 AssertReturn(offset - s_e1kRegMap[index].offset< sizeof(pThis->aRecAddr.au32), VERR_DEV_IO_ERROR); 5354 *pu32Value = pThis->aRecAddr.au32[(offset - s_e1kRegMap[index].offset)/sizeof(pThis->aRecAddr.au32[0])]; 5351 5355 5352 5356 return VINF_SUCCESS; … … 5356 5360 * Write handler for VLAN Filter Table Array registers. 5357 5361 * 5358 * @param p StateThe device state structure.5362 * @param pThis The device state structure. 5359 5363 * @param offset Register offset in memory-mapped frame. 5360 5364 * @param index Register index in register array. … … 5362 5366 * @thread EMT 5363 5367 */ 5364 static int e1kRegWriteVFTA( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)5365 { 5366 AssertReturn(offset - s_e1kRegMap[index].offset < sizeof(p State->auVFTA), VINF_SUCCESS);5367 p State->auVFTA[(offset - s_e1kRegMap[index].offset)/sizeof(pState->auVFTA[0])] = value;5368 static int e1kRegWriteVFTA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 5369 { 5370 AssertReturn(offset - s_e1kRegMap[index].offset < sizeof(pThis->auVFTA), VINF_SUCCESS); 5371 pThis->auVFTA[(offset - s_e1kRegMap[index].offset)/sizeof(pThis->auVFTA[0])] = value; 5368 5372 5369 5373 return VINF_SUCCESS; … … 5375 5379 * @returns VBox status code. 5376 5380 * 5377 * @param p StateThe device state structure.5381 * @param pThis The device state structure. 5378 5382 * @param offset Register offset in memory-mapped frame. 5379 5383 * @param index Register index in register array. 5380 5384 * @thread EMT 5381 5385 */ 5382 static int e1kRegReadVFTA( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value)5383 { 5384 AssertReturn(offset - s_e1kRegMap[index].offset< sizeof(p State->auVFTA), VERR_DEV_IO_ERROR);5385 *pu32Value = p State->auVFTA[(offset - s_e1kRegMap[index].offset)/sizeof(pState->auVFTA[0])];5386 static int e1kRegReadVFTA(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 5387 { 5388 AssertReturn(offset - s_e1kRegMap[index].offset< sizeof(pThis->auVFTA), VERR_DEV_IO_ERROR); 5389 *pu32Value = pThis->auVFTA[(offset - s_e1kRegMap[index].offset)/sizeof(pThis->auVFTA[0])]; 5386 5390 5387 5391 return VINF_SUCCESS; … … 5395 5399 * @returns VBox status code. 5396 5400 * 5397 * @param p StateThe device state structure.5401 * @param pThis The device state structure. 5398 5402 * @param offset Register offset in memory-mapped frame. 5399 5403 * @param index Register index in register array. 5400 5404 * @thread EMT 5401 5405 */ 5402 5403 static int e1kRegReadUnimplemented(E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value) 5406 static int e1kRegReadUnimplemented(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 5404 5407 { 5405 5408 E1kLog(("%s At %08X read (00000000) attempt from unimplemented register %s (%s)\n", 5406 p State->szPrf, offset, s_e1kRegMap[index].abbrev, s_e1kRegMap[index].name));5409 pThis->szPrf, offset, s_e1kRegMap[index].abbrev, s_e1kRegMap[index].name)); 5407 5410 *pu32Value = 0; 5408 5411 … … 5421 5424 * @returns VBox status code. 5422 5425 * 5423 * @param p StateThe device state structure.5426 * @param pThis The device state structure. 5424 5427 * @param offset Register offset in memory-mapped frame. 5425 5428 * @param index Register index in register array. 5426 5429 * @thread EMT 5427 5430 */ 5428 5429 static int e1kRegReadAutoClear(E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value) 5431 static int e1kRegReadAutoClear(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 5430 5432 { 5431 5433 AssertReturn(index < E1K_NUM_OF_32BIT_REGS, VERR_DEV_IO_ERROR); 5432 int rc = e1kRegReadDefault(p State, offset, index, pu32Value);5433 p State->auRegs[index] = 0;5434 int rc = e1kRegReadDefault(pThis, offset, index, pu32Value); 5435 pThis->auRegs[index] = 0; 5434 5436 5435 5437 return rc; … … 5447 5449 * @returns VBox status code. 5448 5450 * 5449 * @param p StateThe device state structure.5451 * @param pThis The device state structure. 5450 5452 * @param offset Register offset in memory-mapped frame. 5451 5453 * @param index Register index in register array. 5452 5454 * @thread EMT 5453 5455 */ 5454 5455 static int e1kRegReadDefault(E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t *pu32Value) 5456 static int e1kRegReadDefault(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t *pu32Value) 5456 5457 { 5457 5458 AssertReturn(index < E1K_NUM_OF_32BIT_REGS, VERR_DEV_IO_ERROR); 5458 *pu32Value = p State->auRegs[index] & s_e1kRegMap[index].readable;5459 *pu32Value = pThis->auRegs[index] & s_e1kRegMap[index].readable; 5459 5460 5460 5461 return VINF_SUCCESS; … … 5466 5467 * Merely reports writes to unimplemented registers. 5467 5468 * 5468 * @param p StateThe device state structure.5469 * @param pThis The device state structure. 5469 5470 * @param offset Register offset in memory-mapped frame. 5470 5471 * @param index Register index in register array. … … 5473 5474 */ 5474 5475 5475 static int e1kRegWriteUnimplemented( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)5476 static int e1kRegWriteUnimplemented(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 5476 5477 { 5477 5478 E1kLog(("%s At %08X write attempt (%08X) to unimplemented register %s (%s)\n", 5478 p State->szPrf, offset, value, s_e1kRegMap[index].abbrev, s_e1kRegMap[index].name));5479 pThis->szPrf, offset, value, s_e1kRegMap[index].abbrev, s_e1kRegMap[index].name)); 5479 5480 5480 5481 return VINF_SUCCESS; … … 5489 5490 * @returns VBox status code. 5490 5491 * 5491 * @param p StateThe device state structure.5492 * @param pThis The device state structure. 5492 5493 * @param offset Register offset in memory-mapped frame. 5493 5494 * @param index Register index in register array. … … 5497 5498 */ 5498 5499 5499 static int e1kRegWriteDefault( E1KSTATE* pState, uint32_t offset, uint32_t index, uint32_t value)5500 static int e1kRegWriteDefault(PE1KSTATE pThis, uint32_t offset, uint32_t index, uint32_t value) 5500 5501 { 5501 5502 AssertReturn(index < E1K_NUM_OF_32BIT_REGS, VERR_DEV_IO_ERROR); 5502 p State->auRegs[index] = (value & s_e1kRegMap[index].writable) |5503 (p State->auRegs[index] & ~s_e1kRegMap[index].writable);5503 pThis->auRegs[index] = (value & s_e1kRegMap[index].writable) | 5504 (pThis->auRegs[index] & ~s_e1kRegMap[index].writable); 5504 5505 5505 5506 return VINF_SUCCESS; … … 5511 5512 * @returns Index in the register table or -1 if not found. 5512 5513 * 5513 * @param p StateThe device state structure.5514 * @param uOffsetRegister offset in memory-mapped region.5514 * @param pThis The device state structure. 5515 * @param offReg Register offset in memory-mapped region. 5515 5516 * @thread EMT 5516 5517 */ 5517 static int e1kRegLookup( E1KSTATE *pState, uint32_t uOffset)5518 static int e1kRegLookup(PE1KSTATE pThis, uint32_t offReg) 5518 5519 { 5519 5520 int index; … … 5521 5522 for (index = 0; index < E1K_NUM_OF_REGS; index++) 5522 5523 { 5523 if (s_e1kRegMap[index].offset <= uOffset && uOffset< s_e1kRegMap[index].offset + s_e1kRegMap[index].size)5524 if (s_e1kRegMap[index].offset <= offReg && offReg < s_e1kRegMap[index].offset + s_e1kRegMap[index].size) 5524 5525 { 5525 5526 return index; … … 5537 5538 * @returns VBox status code. 5538 5539 * 5539 * @param p StateThe device state structure.5540 * @param uOffsetRegister offset in memory-mapped frame.5540 * @param pThis The device state structure. 5541 * @param offReg Register offset in memory-mapped frame. 5541 5542 * @param pv Where to store the result. 5542 5543 * @param cb Number of bytes to read. 5543 5544 * @thread EMT 5544 5545 */ 5545 static int e1kRegRead( E1KSTATE *pState, uint32_t uOffset, void *pv, uint32_t cb)5546 static int e1kRegRead(PE1KSTATE pThis, uint32_t offReg, void *pv, uint32_t cb) 5546 5547 { 5547 5548 uint32_t u32 = 0; … … 5549 5550 uint32_t shift; 5550 5551 int rc = VINF_SUCCESS; 5551 int index = e1kRegLookup(pState, uOffset); 5552 const char *szInst = pState->szPrf; 5552 int index = e1kRegLookup(pThis, offReg); 5553 5553 #ifdef DEBUG 5554 5554 char buf[9]; … … 5573 5573 case 4: mask = 0xFFFFFFFF; break; 5574 5574 default: 5575 return PDMDevHlpDBGFStop(p State->CTX_SUFF(pDevIns), RT_SRC_POS,5575 return PDMDevHlpDBGFStop(pThis->CTX_SUFF(pDevIns), RT_SRC_POS, 5576 5576 "%s e1kRegRead: unsupported op size: offset=%#10x cb=%#10x\n", 5577 szInst, uOffset, cb);5577 pThis->szPrf, offReg, cb); 5578 5578 } 5579 5579 if (index != -1) … … 5582 5582 { 5583 5583 /* Make the mask correspond to the bits we are about to read. */ 5584 shift = ( uOffset- s_e1kRegMap[index].offset) % sizeof(uint32_t) * 8;5584 shift = (offReg - s_e1kRegMap[index].offset) % sizeof(uint32_t) * 8; 5585 5585 mask <<= shift; 5586 5586 if (!mask) 5587 return PDMDevHlpDBGFStop(p State->CTX_SUFF(pDevIns), RT_SRC_POS,5587 return PDMDevHlpDBGFStop(pThis->CTX_SUFF(pDevIns), RT_SRC_POS, 5588 5588 "%s e1kRegRead: Zero mask: offset=%#10x cb=%#10x\n", 5589 szInst, uOffset, cb);5589 pThis->szPrf, offReg, cb); 5590 5590 /* 5591 5591 * Read it. Pass the mask so the handler knows what has to be read. 5592 5592 * Mask out irrelevant bits. 5593 5593 */ 5594 //rc = e1kCsEnter(p State, VERR_SEM_BUSY, RT_SRC_POS);5594 //rc = e1kCsEnter(pThis, VERR_SEM_BUSY, RT_SRC_POS); 5595 5595 if (RT_UNLIKELY(rc != VINF_SUCCESS)) 5596 5596 return rc; 5597 //p State->fDelayInts = false;5598 //p State->iStatIntLost += pState->iStatIntLostOne;5599 //p State->iStatIntLostOne = 0;5600 rc = s_e1kRegMap[index].pfnRead(p State, uOffset& 0xFFFFFFFC, index, &u32);5597 //pThis->fDelayInts = false; 5598 //pThis->iStatIntLost += pThis->iStatIntLostOne; 5599 //pThis->iStatIntLostOne = 0; 5600 rc = s_e1kRegMap[index].pfnRead(pThis, offReg & 0xFFFFFFFC, index, &u32); 5601 5601 u32 &= mask; 5602 //e1kCsLeave(p State);5602 //e1kCsLeave(pThis); 5603 5603 E1kLog2(("%s At %08X read %s from %s (%s)\n", 5604 szInst, uOffset, e1kU32toHex(u32, mask, buf), s_e1kRegMap[index].abbrev, s_e1kRegMap[index].name));5604 pThis->szPrf, offReg, e1kU32toHex(u32, mask, buf), s_e1kRegMap[index].abbrev, s_e1kRegMap[index].name)); 5605 5605 /* Shift back the result. */ 5606 5606 u32 >>= shift; … … 5609 5609 { 5610 5610 E1kLog(("%s At %08X read (%s) attempt from write-only register %s (%s)\n", 5611 szInst, uOffset, e1kU32toHex(u32, mask, buf), s_e1kRegMap[index].abbrev, s_e1kRegMap[index].name));5611 pThis->szPrf, offReg, e1kU32toHex(u32, mask, buf), s_e1kRegMap[index].abbrev, s_e1kRegMap[index].name)); 5612 5612 } 5613 5613 } … … 5615 5615 { 5616 5616 E1kLog(("%s At %08X read (%s) attempt from non-existing register\n", 5617 szInst, uOffset, e1kU32toHex(u32, mask, buf)));5617 pThis->szPrf, offReg, e1kU32toHex(u32, mask, buf))); 5618 5618 } 5619 5619 … … 5629 5629 * @returns VBox status code. 5630 5630 * 5631 * @param p StateThe device state structure.5631 * @param pThis The device state structure. 5632 5632 * @param offReg Register offset in memory-mapped frame. 5633 5633 * @param pv Where to fetch the value. … … 5635 5635 * @thread EMT 5636 5636 */ 5637 static int e1kRegWrite( E1KSTATE *pState, uint32_t offReg, void const *pv, unsigned cb)5637 static int e1kRegWrite(PE1KSTATE pThis, uint32_t offReg, void const *pv, unsigned cb) 5638 5638 { 5639 5639 int rc = VINF_SUCCESS; 5640 int index = e1kRegLookup(p State, offReg);5640 int index = e1kRegLookup(pThis, offReg); 5641 5641 uint32_t u32; 5642 5642 … … 5650 5650 { 5651 5651 E1kLog(("%s e1kRegWrite: Spec violation: unsupported op size: offset=%#10x cb=%#10x, ignored.\n", 5652 p State->szPrf, offReg, cb));5652 pThis->szPrf, offReg, cb)); 5653 5653 return VINF_SUCCESS; 5654 5654 } … … 5656 5656 { 5657 5657 E1kLog(("%s e1kRegWrite: Spec violation: misaligned offset: %#10x cb=%#10x, ignored.\n", 5658 p State->szPrf, offReg, cb));5658 pThis->szPrf, offReg, cb)); 5659 5659 return VINF_SUCCESS; 5660 5660 } … … 5669 5669 */ 5670 5670 E1kLog2(("%s At %08X write %08X to %s (%s)\n", 5671 p State->szPrf, offReg, u32, s_e1kRegMap[index].abbrev, s_e1kRegMap[index].name));5672 //rc = e1kCsEnter(p State, VERR_SEM_BUSY, RT_SRC_POS);5671 pThis->szPrf, offReg, u32, s_e1kRegMap[index].abbrev, s_e1kRegMap[index].name)); 5672 //rc = e1kCsEnter(pThis, VERR_SEM_BUSY, RT_SRC_POS); 5673 5673 if (RT_UNLIKELY(rc != VINF_SUCCESS)) 5674 5674 return rc; 5675 //p State->fDelayInts = false;5676 //p State->iStatIntLost += pState->iStatIntLostOne;5677 //p State->iStatIntLostOne = 0;5678 rc = s_e1kRegMap[index].pfnWrite(p State, offReg, index, u32);5679 //e1kCsLeave(p State);5675 //pThis->fDelayInts = false; 5676 //pThis->iStatIntLost += pThis->iStatIntLostOne; 5677 //pThis->iStatIntLostOne = 0; 5678 rc = s_e1kRegMap[index].pfnWrite(pThis, offReg, index, u32); 5679 //e1kCsLeave(pThis); 5680 5680 } 5681 5681 else 5682 5682 { 5683 5683 E1kLog(("%s At %08X write attempt (%08X) to read-only register %s (%s)\n", 5684 p State->szPrf, offReg, u32, s_e1kRegMap[index].abbrev, s_e1kRegMap[index].name));5684 pThis->szPrf, offReg, u32, s_e1kRegMap[index].abbrev, s_e1kRegMap[index].name)); 5685 5685 } 5686 5686 } … … 5688 5688 { 5689 5689 E1kLog(("%s At %08X write attempt (%08X) to non-existing register\n", 5690 p State->szPrf, offReg, u32));5690 pThis->szPrf, offReg, u32)); 5691 5691 } 5692 5692 return rc; … … 5711 5711 { 5712 5712 NOREF(pvUser); 5713 E1KSTATE *pState = PDMINS_2_DATA(pDevIns, E1KSTATE *);5714 uint32_t offReg = GCPhysAddr - pState->addrMMReg;5715 STAM_PROFILE_ADV_START(&p State->CTX_SUFF_Z(StatMMIORead), a);5713 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, PE1KSTATE); 5714 uint32_t offReg = GCPhysAddr - pThis->addrMMReg; 5715 STAM_PROFILE_ADV_START(&pThis->CTX_SUFF_Z(StatMMIORead), a); 5716 5716 5717 5717 Assert(offReg < E1K_MM_SIZE); 5718 5718 5719 int rc = e1kRegRead(p State, offReg, pv, cb);5720 STAM_PROFILE_ADV_STOP(&p State->CTX_SUFF_Z(StatMMIORead), a);5719 int rc = e1kRegRead(pThis, offReg, pv, cb); 5720 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatMMIORead), a); 5721 5721 return rc; 5722 5722 } … … 5737 5737 { 5738 5738 NOREF(pvUser); 5739 E1KSTATE *pState = PDMINS_2_DATA(pDevIns, E1KSTATE *);5740 uint32_t offReg = GCPhysAddr - pState->addrMMReg;5739 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, PE1KSTATE); 5740 uint32_t offReg = GCPhysAddr - pThis->addrMMReg; 5741 5741 int rc; 5742 STAM_PROFILE_ADV_START(&p State->CTX_SUFF_Z(StatMMIOWrite), a);5742 STAM_PROFILE_ADV_START(&pThis->CTX_SUFF_Z(StatMMIOWrite), a); 5743 5743 5744 5744 Assert(offReg < E1K_MM_SIZE); … … 5749 5749 } 5750 5750 else 5751 rc = e1kRegWrite(p State, offReg, pv, cb);5752 5753 STAM_PROFILE_ADV_STOP(&p State->CTX_SUFF_Z(StatMMIOWrite), a);5751 rc = e1kRegWrite(pThis, offReg, pv, cb); 5752 5753 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatMMIOWrite), a); 5754 5754 return rc; 5755 5755 } … … 5769 5769 PDMBOTHCBDECL(int) e1kIOPortIn(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT port, uint32_t *pu32, unsigned cb) 5770 5770 { 5771 E1KSTATE *pState = PDMINS_2_DATA(pDevIns, E1KSTATE *); 5772 int rc = VINF_SUCCESS; 5773 const char *szInst = pState->szPrf; 5774 STAM_PROFILE_ADV_START(&pState->CTX_SUFF_Z(StatIORead), a); 5775 5776 port -= pState->addrIOPort; 5771 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, PE1KSTATE); 5772 int rc = VINF_SUCCESS; 5773 STAM_PROFILE_ADV_START(&pThis->CTX_SUFF_Z(StatIORead), a); 5774 5775 port -= pThis->addrIOPort; 5777 5776 if (cb != 4) 5778 5777 { 5779 E1kLog(("%s e1kIOPortIn: invalid op size: port=%RTiop cb=%08x", szInst, port, cb));5780 rc = PDMDevHlpDBGFStop(pDevIns, RT_SRC_POS, "%s e1kIOPortIn: invalid op size: port=%RTiop cb=%08x\n", szInst, port, cb);5778 E1kLog(("%s e1kIOPortIn: invalid op size: port=%RTiop cb=%08x", pThis->szPrf, port, cb)); 5779 rc = PDMDevHlpDBGFStop(pDevIns, RT_SRC_POS, "%s e1kIOPortIn: invalid op size: port=%RTiop cb=%08x\n", pThis->szPrf, port, cb); 5781 5780 } 5782 5781 else … … 5784 5783 { 5785 5784 case 0x00: /* IOADDR */ 5786 *pu32 = p State->uSelectedReg;5787 E1kLog2(("%s e1kIOPortIn: IOADDR(0), selecting register %#010x, val=%#010x\n", szInst, pState->uSelectedReg, *pu32));5785 *pu32 = pThis->uSelectedReg; 5786 E1kLog2(("%s e1kIOPortIn: IOADDR(0), selecting register %#010x, val=%#010x\n", pThis->szPrf, pThis->uSelectedReg, *pu32)); 5788 5787 break; 5789 5788 case 0x04: /* IODATA */ 5790 rc = e1kRegRead(p State, pState->uSelectedReg, pu32, cb);5789 rc = e1kRegRead(pThis, pThis->uSelectedReg, pu32, cb); 5791 5790 /** @todo wrong return code triggers assertions in the debug build; fix please */ 5792 5791 if (rc == VINF_IOM_R3_MMIO_READ) 5793 5792 rc = VINF_IOM_R3_IOPORT_READ; 5794 5793 5795 E1kLog2(("%s e1kIOPortIn: IODATA(4), reading from selected register %#010x, val=%#010x\n", szInst, pState->uSelectedReg, *pu32));5794 E1kLog2(("%s e1kIOPortIn: IODATA(4), reading from selected register %#010x, val=%#010x\n", pThis->szPrf, pThis->uSelectedReg, *pu32)); 5796 5795 break; 5797 5796 default: 5798 E1kLog(("%s e1kIOPortIn: invalid port %#010x\n", szInst, port));5797 E1kLog(("%s e1kIOPortIn: invalid port %#010x\n", pThis->szPrf, port)); 5799 5798 //*pRC = VERR_IOM_IOPORT_UNUSED; 5800 5799 } 5801 5800 5802 STAM_PROFILE_ADV_STOP(&p State->CTX_SUFF_Z(StatIORead), a);5801 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatIORead), a); 5803 5802 return rc; 5804 5803 } … … 5819 5818 PDMBOTHCBDECL(int) e1kIOPortOut(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT port, uint32_t u32, unsigned cb) 5820 5819 { 5821 E1KSTATE *pState = PDMINS_2_DATA(pDevIns, E1KSTATE *); 5822 int rc = VINF_SUCCESS; 5823 const char *szInst = pState->szPrf; 5824 STAM_PROFILE_ADV_START(&pState->CTX_SUFF_Z(StatIOWrite), a); 5825 5826 E1kLog2(("%s e1kIOPortOut: port=%RTiop value=%08x\n", szInst, port, u32)); 5820 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, PE1KSTATE); 5821 int rc = VINF_SUCCESS; 5822 STAM_PROFILE_ADV_START(&pThis->CTX_SUFF_Z(StatIOWrite), a); 5823 5824 E1kLog2(("%s e1kIOPortOut: port=%RTiop value=%08x\n", pThis->szPrf, port, u32)); 5827 5825 if (cb != 4) 5828 5826 { 5829 E1kLog(("%s e1kIOPortOut: invalid op size: port=%RTiop cb=%08x\n", szInst, port, cb));5830 rc = PDMDevHlpDBGFStop(pDevIns, RT_SRC_POS, "invalid op size: port=%RTiop cb=%#x\n", szInst, port, cb);5827 E1kLog(("%s e1kIOPortOut: invalid op size: port=%RTiop cb=%08x\n", pThis->szPrf, port, cb)); 5828 rc = PDMDevHlpDBGFStop(pDevIns, RT_SRC_POS, "invalid op size: port=%RTiop cb=%#x\n", pThis->szPrf, port, cb); 5831 5829 } 5832 5830 else 5833 5831 { 5834 port -= p State->addrIOPort;5832 port -= pThis->addrIOPort; 5835 5833 switch (port) 5836 5834 { 5837 5835 case 0x00: /* IOADDR */ 5838 p State->uSelectedReg = u32;5839 E1kLog2(("%s e1kIOPortOut: IOADDR(0), selected register %08x\n", szInst, pState->uSelectedReg));5836 pThis->uSelectedReg = u32; 5837 E1kLog2(("%s e1kIOPortOut: IOADDR(0), selected register %08x\n", pThis->szPrf, pThis->uSelectedReg)); 5840 5838 break; 5841 5839 case 0x04: /* IODATA */ 5842 E1kLog2(("%s e1kIOPortOut: IODATA(4), writing to selected register %#010x, value=%#010x\n", szInst, pState->uSelectedReg, u32));5843 rc = e1kRegWrite(p State, pState->uSelectedReg, &u32, cb);5840 E1kLog2(("%s e1kIOPortOut: IODATA(4), writing to selected register %#010x, value=%#010x\n", pThis->szPrf, pThis->uSelectedReg, u32)); 5841 rc = e1kRegWrite(pThis, pThis->uSelectedReg, &u32, cb); 5844 5842 /** @todo wrong return code triggers assertions in the debug build; fix please */ 5845 5843 if (rc == VINF_IOM_R3_MMIO_WRITE) … … 5847 5845 break; 5848 5846 default: 5849 E1kLog(("%s e1kIOPortOut: invalid port %#010x\n", szInst, port));5847 E1kLog(("%s e1kIOPortOut: invalid port %#010x\n", pThis->szPrf, port)); 5850 5848 /** @todo Do we need to return an error here? 5851 5849 * bird: VINF_SUCCESS is fine for unhandled cases of an OUT handler. (If you're curious … … 5855 5853 } 5856 5854 5857 STAM_PROFILE_ADV_STOP(&p State->CTX_SUFF_Z(StatIOWrite), a);5855 STAM_PROFILE_ADV_STOP(&pThis->CTX_SUFF_Z(StatIOWrite), a); 5858 5856 return rc; 5859 5857 } … … 5864 5862 * Dump complete device state to log. 5865 5863 * 5866 * @param p StatePointer to device state.5867 */ 5868 static void e1kDumpState( E1KSTATE *pState)5864 * @param pThis Pointer to device state. 5865 */ 5866 static void e1kDumpState(PE1KSTATE pThis) 5869 5867 { 5870 5868 for (int i = 0; i < E1K_NUM_OF_32BIT_REGS; ++i) 5871 5869 { 5872 E1kLog2(("%s %8.8s = %08x\n", p State->szPrf,5873 s_e1kRegMap[i].abbrev, p State->auRegs[i]));5870 E1kLog2(("%s %8.8s = %08x\n", pThis->szPrf, 5871 s_e1kRegMap[i].abbrev, pThis->auRegs[i])); 5874 5872 } 5875 5873 # ifdef E1K_INT_STATS 5876 LogRel(("%s Interrupt attempts: %d\n", p State->szPrf, pState->uStatIntTry));5877 LogRel(("%s Interrupts raised : %d\n", p State->szPrf, pState->uStatInt));5878 LogRel(("%s Interrupts lowered: %d\n", p State->szPrf, pState->uStatIntLower));5879 LogRel(("%s Interrupts delayed: %d\n", p State->szPrf, pState->uStatIntDly));5880 LogRel(("%s Disabled delayed: %d\n", p State->szPrf, pState->uStatDisDly));5881 LogRel(("%s Interrupts skipped: %d\n", p State->szPrf, pState->uStatIntSkip));5882 LogRel(("%s Masked interrupts : %d\n", p State->szPrf, pState->uStatIntMasked));5883 LogRel(("%s Early interrupts : %d\n", p State->szPrf, pState->uStatIntEarly));5884 LogRel(("%s Late interrupts : %d\n", p State->szPrf, pState->uStatIntLate));5885 LogRel(("%s Lost interrupts : %d\n", p State->szPrf, pState->iStatIntLost));5886 LogRel(("%s Interrupts by RX : %d\n", p State->szPrf, pState->uStatIntRx));5887 LogRel(("%s Interrupts by TX : %d\n", p State->szPrf, pState->uStatIntTx));5888 LogRel(("%s Interrupts by ICS : %d\n", p State->szPrf, pState->uStatIntICS));5889 LogRel(("%s Interrupts by RDTR: %d\n", p State->szPrf, pState->uStatIntRDTR));5890 LogRel(("%s Interrupts by RDMT: %d\n", p State->szPrf, pState->uStatIntRXDMT0));5891 LogRel(("%s Interrupts by TXQE: %d\n", p State->szPrf, pState->uStatIntTXQE));5892 LogRel(("%s TX int delay asked: %d\n", p State->szPrf, pState->uStatTxIDE));5893 LogRel(("%s TX delayed: %d\n", p State->szPrf, pState->uStatTxDelayed));5894 LogRel(("%s TX delay expired: %d\n", p State->szPrf, pState->uStatTxDelayExp));5895 LogRel(("%s TX no report asked: %d\n", p State->szPrf, pState->uStatTxNoRS));5896 LogRel(("%s TX abs timer expd : %d\n", p State->szPrf, pState->uStatTAD));5897 LogRel(("%s TX int timer expd : %d\n", p State->szPrf, pState->uStatTID));5898 LogRel(("%s RX abs timer expd : %d\n", p State->szPrf, pState->uStatRAD));5899 LogRel(("%s RX int timer expd : %d\n", p State->szPrf, pState->uStatRID));5900 LogRel(("%s TX CTX descriptors: %d\n", p State->szPrf, pState->uStatDescCtx));5901 LogRel(("%s TX DAT descriptors: %d\n", p State->szPrf, pState->uStatDescDat));5902 LogRel(("%s TX LEG descriptors: %d\n", p State->szPrf, pState->uStatDescLeg));5903 LogRel(("%s Received frames : %d\n", p State->szPrf, pState->uStatRxFrm));5904 LogRel(("%s Transmitted frames: %d\n", p State->szPrf, pState->uStatTxFrm));5905 LogRel(("%s TX frames up to 1514: %d\n", p State->szPrf, pState->uStatTx1514));5906 LogRel(("%s TX frames up to 2962: %d\n", p State->szPrf, pState->uStatTx2962));5907 LogRel(("%s TX frames up to 4410: %d\n", p State->szPrf, pState->uStatTx4410));5908 LogRel(("%s TX frames up to 5858: %d\n", p State->szPrf, pState->uStatTx5858));5909 LogRel(("%s TX frames up to 7306: %d\n", p State->szPrf, pState->uStatTx7306));5910 LogRel(("%s TX frames up to 8754: %d\n", p State->szPrf, pState->uStatTx8754));5911 LogRel(("%s TX frames up to 16384: %d\n", p State->szPrf, pState->uStatTx16384));5912 LogRel(("%s TX frames up to 32768: %d\n", p State->szPrf, pState->uStatTx32768));5913 LogRel(("%s Larger TX frames : %d\n", p State->szPrf, pState->uStatTxLarge));5914 LogRel(("%s Max TX Delay : %lld\n", p State->szPrf, pState->uStatMaxTxDelay));5874 LogRel(("%s Interrupt attempts: %d\n", pThis->szPrf, pThis->uStatIntTry)); 5875 LogRel(("%s Interrupts raised : %d\n", pThis->szPrf, pThis->uStatInt)); 5876 LogRel(("%s Interrupts lowered: %d\n", pThis->szPrf, pThis->uStatIntLower)); 5877 LogRel(("%s Interrupts delayed: %d\n", pThis->szPrf, pThis->uStatIntDly)); 5878 LogRel(("%s Disabled delayed: %d\n", pThis->szPrf, pThis->uStatDisDly)); 5879 LogRel(("%s Interrupts skipped: %d\n", pThis->szPrf, pThis->uStatIntSkip)); 5880 LogRel(("%s Masked interrupts : %d\n", pThis->szPrf, pThis->uStatIntMasked)); 5881 LogRel(("%s Early interrupts : %d\n", pThis->szPrf, pThis->uStatIntEarly)); 5882 LogRel(("%s Late interrupts : %d\n", pThis->szPrf, pThis->uStatIntLate)); 5883 LogRel(("%s Lost interrupts : %d\n", pThis->szPrf, pThis->iStatIntLost)); 5884 LogRel(("%s Interrupts by RX : %d\n", pThis->szPrf, pThis->uStatIntRx)); 5885 LogRel(("%s Interrupts by TX : %d\n", pThis->szPrf, pThis->uStatIntTx)); 5886 LogRel(("%s Interrupts by ICS : %d\n", pThis->szPrf, pThis->uStatIntICS)); 5887 LogRel(("%s Interrupts by RDTR: %d\n", pThis->szPrf, pThis->uStatIntRDTR)); 5888 LogRel(("%s Interrupts by RDMT: %d\n", pThis->szPrf, pThis->uStatIntRXDMT0)); 5889 LogRel(("%s Interrupts by TXQE: %d\n", pThis->szPrf, pThis->uStatIntTXQE)); 5890 LogRel(("%s TX int delay asked: %d\n", pThis->szPrf, pThis->uStatTxIDE)); 5891 LogRel(("%s TX delayed: %d\n", pThis->szPrf, pThis->uStatTxDelayed)); 5892 LogRel(("%s TX delay expired: %d\n", pThis->szPrf, pThis->uStatTxDelayExp)); 5893 LogRel(("%s TX no report asked: %d\n", pThis->szPrf, pThis->uStatTxNoRS)); 5894 LogRel(("%s TX abs timer expd : %d\n", pThis->szPrf, pThis->uStatTAD)); 5895 LogRel(("%s TX int timer expd : %d\n", pThis->szPrf, pThis->uStatTID)); 5896 LogRel(("%s RX abs timer expd : %d\n", pThis->szPrf, pThis->uStatRAD)); 5897 LogRel(("%s RX int timer expd : %d\n", pThis->szPrf, pThis->uStatRID)); 5898 LogRel(("%s TX CTX descriptors: %d\n", pThis->szPrf, pThis->uStatDescCtx)); 5899 LogRel(("%s TX DAT descriptors: %d\n", pThis->szPrf, pThis->uStatDescDat)); 5900 LogRel(("%s TX LEG descriptors: %d\n", pThis->szPrf, pThis->uStatDescLeg)); 5901 LogRel(("%s Received frames : %d\n", pThis->szPrf, pThis->uStatRxFrm)); 5902 LogRel(("%s Transmitted frames: %d\n", pThis->szPrf, pThis->uStatTxFrm)); 5903 LogRel(("%s TX frames up to 1514: %d\n", pThis->szPrf, pThis->uStatTx1514)); 5904 LogRel(("%s TX frames up to 2962: %d\n", pThis->szPrf, pThis->uStatTx2962)); 5905 LogRel(("%s TX frames up to 4410: %d\n", pThis->szPrf, pThis->uStatTx4410)); 5906 LogRel(("%s TX frames up to 5858: %d\n", pThis->szPrf, pThis->uStatTx5858)); 5907 LogRel(("%s TX frames up to 7306: %d\n", pThis->szPrf, pThis->uStatTx7306)); 5908 LogRel(("%s TX frames up to 8754: %d\n", pThis->szPrf, pThis->uStatTx8754)); 5909 LogRel(("%s TX frames up to 16384: %d\n", pThis->szPrf, pThis->uStatTx16384)); 5910 LogRel(("%s TX frames up to 32768: %d\n", pThis->szPrf, pThis->uStatTx32768)); 5911 LogRel(("%s Larger TX frames : %d\n", pThis->szPrf, pThis->uStatTxLarge)); 5912 LogRel(("%s Max TX Delay : %lld\n", pThis->szPrf, pThis->uStatMaxTxDelay)); 5915 5913 # endif /* E1K_INT_STATS */ 5916 5914 } … … 5922 5920 { 5923 5921 int rc; 5924 E1KSTATE *pState= PDMINS_2_DATA(pPciDev->pDevIns, E1KSTATE*);5922 PE1KSTATE pThis = PDMINS_2_DATA(pPciDev->pDevIns, E1KSTATE*); 5925 5923 5926 5924 switch (enmType) 5927 5925 { 5928 5926 case PCI_ADDRESS_SPACE_IO: 5929 p State->addrIOPort = (RTIOPORT)GCPhysAddress;5930 rc = PDMDevHlpIOPortRegister(pPciDev->pDevIns, p State->addrIOPort, cb, 0,5927 pThis->addrIOPort = (RTIOPORT)GCPhysAddress; 5928 rc = PDMDevHlpIOPortRegister(pPciDev->pDevIns, pThis->addrIOPort, cb, 0, 5931 5929 e1kIOPortOut, e1kIOPortIn, NULL, NULL, "E1000"); 5932 5930 if (RT_FAILURE(rc)) 5933 5931 break; 5934 if (p State->fR0Enabled)5932 if (pThis->fR0Enabled) 5935 5933 { 5936 rc = PDMDevHlpIOPortRegisterR0(pPciDev->pDevIns, p State->addrIOPort, cb, 0,5934 rc = PDMDevHlpIOPortRegisterR0(pPciDev->pDevIns, pThis->addrIOPort, cb, 0, 5937 5935 "e1kIOPortOut", "e1kIOPortIn", NULL, NULL, "E1000"); 5938 5936 if (RT_FAILURE(rc)) 5939 5937 break; 5940 5938 } 5941 if (p State->fGCEnabled)5939 if (pThis->fGCEnabled) 5942 5940 { 5943 rc = PDMDevHlpIOPortRegisterRC(pPciDev->pDevIns, p State->addrIOPort, cb, 0,5941 rc = PDMDevHlpIOPortRegisterRC(pPciDev->pDevIns, pThis->addrIOPort, cb, 0, 5944 5942 "e1kIOPortOut", "e1kIOPortIn", NULL, NULL, "E1000"); 5945 5943 } 5946 5944 break; 5947 5945 case PCI_ADDRESS_SPACE_MEM: 5948 p State->addrMMReg = GCPhysAddress;5946 pThis->addrMMReg = GCPhysAddress; 5949 5947 rc = PDMDevHlpMMIORegister(pPciDev->pDevIns, GCPhysAddress, cb, NULL /*pvUser*/, 5950 5948 IOMMMIO_FLAGS_READ_PASSTHRU | IOMMMIO_FLAGS_WRITE_PASSTHRU, 5951 5949 e1kMMIOWrite, e1kMMIORead, "E1000"); 5952 if (p State->fR0Enabled)5950 if (pThis->fR0Enabled) 5953 5951 { 5954 5952 rc = PDMDevHlpMMIORegisterR0(pPciDev->pDevIns, GCPhysAddress, cb, NIL_RTR0PTR /*pvUser*/, … … 5957 5955 break; 5958 5956 } 5959 if (p State->fGCEnabled)5957 if (pThis->fGCEnabled) 5960 5958 { 5961 5959 rc = PDMDevHlpMMIORegisterRC(pPciDev->pDevIns, GCPhysAddress, cb, NIL_RTRCPTR /*pvUser*/, … … 5983 5981 * @thread EMT 5984 5982 */ 5985 static int e1kCanReceive( E1KSTATE *pState)5983 static int e1kCanReceive(PE1KSTATE pThis) 5986 5984 { 5987 5985 #ifndef E1K_WITH_RXD_CACHE 5988 5986 size_t cb; 5989 5987 5990 if (RT_UNLIKELY(e1kCsRxEnter(p State, VERR_SEM_BUSY) != VINF_SUCCESS))5988 if (RT_UNLIKELY(e1kCsRxEnter(pThis, VERR_SEM_BUSY) != VINF_SUCCESS)) 5991 5989 return VERR_NET_NO_BUFFER_SPACE; 5992 5990 … … 5994 5992 { 5995 5993 E1KRXDESC desc; 5996 PDMDevHlpPhysRead(p State->CTX_SUFF(pDevIns), e1kDescAddr(RDBAH, RDBAL, RDH),5994 PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns), e1kDescAddr(RDBAH, RDBAL, RDH), 5997 5995 &desc, sizeof(desc)); 5998 5996 if (desc.status.fDD) 5999 5997 cb = 0; 6000 5998 else 6001 cb = p State->u16RxBSize;5999 cb = pThis->u16RxBSize; 6002 6000 } 6003 6001 else if (RDH < RDT) 6004 cb = (RDT - RDH) * p State->u16RxBSize;6002 cb = (RDT - RDH) * pThis->u16RxBSize; 6005 6003 else if (RDH > RDT) 6006 cb = (RDLEN/sizeof(E1KRXDESC) - RDH + RDT) * p State->u16RxBSize;6004 cb = (RDLEN/sizeof(E1KRXDESC) - RDH + RDT) * pThis->u16RxBSize; 6007 6005 else 6008 6006 { … … 6011 6009 } 6012 6010 E1kLog2(("%s e1kCanReceive: at exit RDH=%d RDT=%d RDLEN=%d u16RxBSize=%d cb=%lu\n", 6013 p State->szPrf, RDH, RDT, RDLEN, pState->u16RxBSize, cb));6014 6015 e1kCsRxLeave(p State);6011 pThis->szPrf, RDH, RDT, RDLEN, pThis->u16RxBSize, cb)); 6012 6013 e1kCsRxLeave(pThis); 6016 6014 return cb > 0 ? VINF_SUCCESS : VERR_NET_NO_BUFFER_SPACE; 6017 6015 #else /* E1K_WITH_RXD_CACHE */ 6018 6016 int rc = VINF_SUCCESS; 6019 6017 6020 if (RT_UNLIKELY(e1kCsRxEnter(p State, VERR_SEM_BUSY) != VINF_SUCCESS))6018 if (RT_UNLIKELY(e1kCsRxEnter(pThis, VERR_SEM_BUSY) != VINF_SUCCESS)) 6021 6019 return VERR_NET_NO_BUFFER_SPACE; 6022 6020 … … 6024 6022 { 6025 6023 E1KRXDESC desc; 6026 PDMDevHlpPhysRead(p State->CTX_SUFF(pDevIns), e1kDescAddr(RDBAH, RDBAL, RDH),6024 PDMDevHlpPhysRead(pThis->CTX_SUFF(pDevIns), e1kDescAddr(RDBAH, RDBAL, RDH), 6027 6025 &desc, sizeof(desc)); 6028 6026 if (desc.status.fDD) 6029 6027 rc = VERR_NET_NO_BUFFER_SPACE; 6030 6028 } 6031 else if (e1kRxDIsCacheEmpty(p State) && RDH == RDT)6029 else if (e1kRxDIsCacheEmpty(pThis) && RDH == RDT) 6032 6030 { 6033 6031 /* Cache is empty, so is the RX ring. */ … … 6035 6033 } 6036 6034 E1kLog2(("%s e1kCanReceive: at exit in_cache=%d RDH=%d RDT=%d RDLEN=%d" 6037 " u16RxBSize=%d rc=%Rrc\n", p State->szPrf,6038 e1kRxDInCache(p State), RDH, RDT, RDLEN, pState->u16RxBSize, rc));6039 6040 e1kCsRxLeave(p State);6035 " u16RxBSize=%d rc=%Rrc\n", pThis->szPrf, 6036 e1kRxDInCache(pThis), RDH, RDT, RDLEN, pThis->u16RxBSize, rc)); 6037 6038 e1kCsRxLeave(pThis); 6041 6039 return rc; 6042 6040 #endif /* E1K_WITH_RXD_CACHE */ … … 6048 6046 static DECLCALLBACK(int) e1kNetworkDown_WaitReceiveAvail(PPDMINETWORKDOWN pInterface, RTMSINTERVAL cMillies) 6049 6047 { 6050 E1KSTATE *pState= RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkDown);6051 int rc = e1kCanReceive(p State);6048 PE1KSTATE pThis = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkDown); 6049 int rc = e1kCanReceive(pThis); 6052 6050 6053 6051 if (RT_SUCCESS(rc)) … … 6057 6055 6058 6056 rc = VERR_INTERRUPTED; 6059 ASMAtomicXchgBool(&p State->fMaybeOutOfSpace, true);6060 STAM_PROFILE_START(&p State->StatRxOverflow, a);6057 ASMAtomicXchgBool(&pThis->fMaybeOutOfSpace, true); 6058 STAM_PROFILE_START(&pThis->StatRxOverflow, a); 6061 6059 VMSTATE enmVMState; 6062 while (RT_LIKELY( (enmVMState = PDMDevHlpVMState(p State->CTX_SUFF(pDevIns))) == VMSTATE_RUNNING6060 while (RT_LIKELY( (enmVMState = PDMDevHlpVMState(pThis->CTX_SUFF(pDevIns))) == VMSTATE_RUNNING 6063 6061 || enmVMState == VMSTATE_RUNNING_LS)) 6064 6062 { 6065 int rc2 = e1kCanReceive(p State);6063 int rc2 = e1kCanReceive(pThis); 6066 6064 if (RT_SUCCESS(rc2)) 6067 6065 { … … 6070 6068 } 6071 6069 E1kLogRel(("E1000 e1kNetworkDown_WaitReceiveAvail: waiting cMillies=%u...\n", cMillies)); 6072 E1kLog(("%s e1kNetworkDown_WaitReceiveAvail: waiting cMillies=%u...\n", p State->szPrf, cMillies));6073 RTSemEventWait(p State->hEventMoreRxDescAvail, cMillies);6074 } 6075 STAM_PROFILE_STOP(&p State->StatRxOverflow, a);6076 ASMAtomicXchgBool(&p State->fMaybeOutOfSpace, false);6070 E1kLog(("%s e1kNetworkDown_WaitReceiveAvail: waiting cMillies=%u...\n", pThis->szPrf, cMillies)); 6071 RTSemEventWait(pThis->hEventMoreRxDescAvail, cMillies); 6072 } 6073 STAM_PROFILE_STOP(&pThis->StatRxOverflow, a); 6074 ASMAtomicXchgBool(&pThis->fMaybeOutOfSpace, false); 6077 6075 6078 6076 return rc; … … 6085 6083 * 6086 6084 * @returns true if address matches. 6087 * @param p StatePointer to the state structure.6085 * @param pThis Pointer to the state structure. 6088 6086 * @param pvBuf The ethernet packet. 6089 6087 * @param cb Number of bytes available in the packet. 6090 6088 * @thread EMT 6091 6089 */ 6092 static bool e1kPerfectMatch( E1KSTATE *pState, const void *pvBuf)6093 { 6094 for (unsigned i = 0; i < RT_ELEMENTS(p State->aRecAddr.array); i++)6095 { 6096 E1KRAELEM* ra = p State->aRecAddr.array + i;6090 static bool e1kPerfectMatch(PE1KSTATE pThis, const void *pvBuf) 6091 { 6092 for (unsigned i = 0; i < RT_ELEMENTS(pThis->aRecAddr.array); i++) 6093 { 6094 E1KRAELEM* ra = pThis->aRecAddr.array + i; 6097 6095 6098 6096 /* Valid address? */ … … 6102 6100 //unsigned char *pAddr = (unsigned char*)pvBuf + sizeof(ra->addr)*(ra->ctl & RA_CTL_AS); 6103 6101 //E1kLog3(("%s Matching %02x:%02x:%02x:%02x:%02x:%02x against %02x:%02x:%02x:%02x:%02x:%02x...\n", 6104 // p State->szPrf, pAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5],6102 // pThis->szPrf, pAddr[0], pAddr[1], pAddr[2], pAddr[3], pAddr[4], pAddr[5], 6105 6103 // ra->addr[0], ra->addr[1], ra->addr[2], ra->addr[3], ra->addr[4], ra->addr[5])); 6106 6104 /* … … 6129 6127 * 6130 6128 * @returns true if address matches. 6131 * @param p StatePointer to the state structure.6129 * @param pThis Pointer to the state structure. 6132 6130 * @param pvBuf The ethernet packet. 6133 6131 * @param cb Number of bytes available in the packet. 6134 6132 * @thread EMT 6135 6133 */ 6136 static bool e1kImperfectMatch( E1KSTATE *pState, const void *pvBuf)6134 static bool e1kImperfectMatch(PE1KSTATE pThis, const void *pvBuf) 6137 6135 { 6138 6136 /* Get bits 32..47 of destination address */ … … 6149 6147 if (offset < 3) 6150 6148 u16Bit = u16Bit >> (4 - offset); 6151 return ASMBitTest(p State->auMTA, u16Bit & 0xFFF);6149 return ASMBitTest(pThis->auMTA, u16Bit & 0xFFF); 6152 6150 } 6153 6151 … … 6162 6160 * 6163 6161 * @returns true if packet is intended for this node. 6164 * @param p StatePointer to the state structure.6162 * @param pThis Pointer to the state structure. 6165 6163 * @param pvBuf The ethernet packet. 6166 6164 * @param cb Number of bytes available in the packet. … … 6168 6166 * @thread EMT 6169 6167 */ 6170 static bool e1kAddressFilter( E1KSTATE *pState, const void *pvBuf, size_t cb, E1KRXDST *pStatus)6168 static bool e1kAddressFilter(PE1KSTATE pThis, const void *pvBuf, size_t cb, E1KRXDST *pStatus) 6171 6169 { 6172 6170 Assert(cb > 14); … … 6178 6176 { 6179 6177 E1kLog(("%s ERROR: Incoming packet is too big, cb=%d > max=%d\n", 6180 p State->szPrf, cb, E1K_MAX_RX_PKT_SIZE));6178 pThis->szPrf, cb, E1K_MAX_RX_PKT_SIZE)); 6181 6179 E1K_INC_CNT32(ROC); 6182 6180 return false; … … 6186 6184 /* When long packet reception is disabled packets over 1522 are discarded */ 6187 6185 E1kLog(("%s Discarding incoming packet (LPE=0), cb=%d\n", 6188 p State->szPrf, cb));6186 pThis->szPrf, cb)); 6189 6187 E1K_INC_CNT32(ROC); 6190 6188 return false; … … 6202 6200 if (RCTL & RCTL_CFIEN) 6203 6201 { 6204 E1kLog3(("%s VLAN filter: VLAN=%d CFI=%d RCTL_CFI=%d\n", p State->szPrf,6202 E1kLog3(("%s VLAN filter: VLAN=%d CFI=%d RCTL_CFI=%d\n", pThis->szPrf, 6205 6203 E1K_SPEC_VLAN(RT_BE2H_U16(u16Ptr[7])), 6206 6204 E1K_SPEC_CFI(RT_BE2H_U16(u16Ptr[7])), … … 6209 6207 { 6210 6208 E1kLog2(("%s Packet filter: CFIs do not match in packet and RCTL (%d!=%d)\n", 6211 p State->szPrf, E1K_SPEC_CFI(RT_BE2H_U16(u16Ptr[7])), !!(RCTL & RCTL_CFI)));6209 pThis->szPrf, E1K_SPEC_CFI(RT_BE2H_U16(u16Ptr[7])), !!(RCTL & RCTL_CFI))); 6212 6210 return false; 6213 6211 } 6214 6212 } 6215 6213 else 6216 E1kLog3(("%s VLAN filter: VLAN=%d\n", p State->szPrf,6214 E1kLog3(("%s VLAN filter: VLAN=%d\n", pThis->szPrf, 6217 6215 E1K_SPEC_VLAN(RT_BE2H_U16(u16Ptr[7])))); 6218 if (!ASMBitTest(p State->auVFTA, E1K_SPEC_VLAN(RT_BE2H_U16(u16Ptr[7]))))6216 if (!ASMBitTest(pThis->auVFTA, E1K_SPEC_VLAN(RT_BE2H_U16(u16Ptr[7])))) 6219 6217 { 6220 6218 E1kLog2(("%s Packet filter: no VLAN match (id=%d)\n", 6221 p State->szPrf, E1K_SPEC_VLAN(RT_BE2H_U16(u16Ptr[7]))));6219 pThis->szPrf, E1K_SPEC_VLAN(RT_BE2H_U16(u16Ptr[7])))); 6222 6220 return false; 6223 6221 } … … 6227 6225 if (e1kIsBroadcast(pvBuf) && (RCTL & RCTL_BAM)) 6228 6226 return true; 6229 E1kLog2(("%s Packet filter: not a broadcast\n", p State->szPrf));6227 E1kLog2(("%s Packet filter: not a broadcast\n", pThis->szPrf)); 6230 6228 if (e1kIsMulticast(pvBuf)) 6231 6229 { … … 6233 6231 if (RCTL & RCTL_MPE) 6234 6232 return true; 6235 E1kLog2(("%s Packet filter: no promiscuous multicast\n", p State->szPrf));6233 E1kLog2(("%s Packet filter: no promiscuous multicast\n", pThis->szPrf)); 6236 6234 /* Try perfect matches first */ 6237 if (e1kPerfectMatch(p State, pvBuf))6235 if (e1kPerfectMatch(pThis, pvBuf)) 6238 6236 { 6239 6237 pStatus->fPIF = true; 6240 6238 return true; 6241 6239 } 6242 E1kLog2(("%s Packet filter: no perfect match\n", p State->szPrf));6243 if (e1kImperfectMatch(p State, pvBuf))6240 E1kLog2(("%s Packet filter: no perfect match\n", pThis->szPrf)); 6241 if (e1kImperfectMatch(pThis, pvBuf)) 6244 6242 return true; 6245 E1kLog2(("%s Packet filter: no imperfect match\n", p State->szPrf));6243 E1kLog2(("%s Packet filter: no imperfect match\n", pThis->szPrf)); 6246 6244 } 6247 6245 else { … … 6249 6247 if (RCTL & RCTL_UPE) 6250 6248 return true; 6251 E1kLog2(("%s Packet filter: no promiscuous unicast\n", p State->szPrf));6252 if (e1kPerfectMatch(p State, pvBuf))6249 E1kLog2(("%s Packet filter: no promiscuous unicast\n", pThis->szPrf)); 6250 if (e1kPerfectMatch(pThis, pvBuf)) 6253 6251 { 6254 6252 pStatus->fPIF = true; 6255 6253 return true; 6256 6254 } 6257 E1kLog2(("%s Packet filter: no perfect match\n", p State->szPrf));6258 } 6259 E1kLog2(("%s Packet filter: packet discarded\n", p State->szPrf));6255 E1kLog2(("%s Packet filter: no perfect match\n", pThis->szPrf)); 6256 } 6257 E1kLog2(("%s Packet filter: packet discarded\n", pThis->szPrf)); 6260 6258 return false; 6261 6259 } … … 6266 6264 static DECLCALLBACK(int) e1kNetworkDown_Receive(PPDMINETWORKDOWN pInterface, const void *pvBuf, size_t cb) 6267 6265 { 6268 E1KSTATE *pState= RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkDown);6266 PE1KSTATE pThis = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkDown); 6269 6267 int rc = VINF_SUCCESS; 6270 6268 … … 6272 6270 * Drop packets if the VM is not running yet/anymore. 6273 6271 */ 6274 VMSTATE enmVMState = PDMDevHlpVMState(STATE_TO_DEVINS(p State));6272 VMSTATE enmVMState = PDMDevHlpVMState(STATE_TO_DEVINS(pThis)); 6275 6273 if ( enmVMState != VMSTATE_RUNNING 6276 6274 && enmVMState != VMSTATE_RUNNING_LS) 6277 6275 { 6278 E1kLog(("%s Dropping incoming packet as VM is not running.\n", p State->szPrf));6276 E1kLog(("%s Dropping incoming packet as VM is not running.\n", pThis->szPrf)); 6279 6277 return VINF_SUCCESS; 6280 6278 } 6281 6279 6282 6280 /* Discard incoming packets in locked state */ 6283 if (!(RCTL & RCTL_EN) || p State->fLocked || !(STATUS & STATUS_LU))6284 { 6285 E1kLog(("%s Dropping incoming packet as receive operation is disabled.\n", p State->szPrf));6281 if (!(RCTL & RCTL_EN) || pThis->fLocked || !(STATUS & STATUS_LU)) 6282 { 6283 E1kLog(("%s Dropping incoming packet as receive operation is disabled.\n", pThis->szPrf)); 6286 6284 return VINF_SUCCESS; 6287 6285 } 6288 6286 6289 STAM_PROFILE_ADV_START(&p State->StatReceive, a);6290 6291 //if (!e1kCsEnter(p State, RT_SRC_POS))6287 STAM_PROFILE_ADV_START(&pThis->StatReceive, a); 6288 6289 //if (!e1kCsEnter(pThis, RT_SRC_POS)) 6292 6290 // return VERR_PERMISSION_DENIED; 6293 6291 6294 e1kPacketDump(p State, (const uint8_t*)pvBuf, cb, "<-- Incoming");6292 e1kPacketDump(pThis, (const uint8_t*)pvBuf, cb, "<-- Incoming"); 6295 6293 6296 6294 /* Update stats */ 6297 if (RT_LIKELY(e1kCsEnter(p State, VERR_SEM_BUSY) == VINF_SUCCESS))6295 if (RT_LIKELY(e1kCsEnter(pThis, VERR_SEM_BUSY) == VINF_SUCCESS)) 6298 6296 { 6299 6297 E1K_INC_CNT32(TPR); 6300 6298 E1K_ADD_CNT64(TORL, TORH, cb < 64? 64 : cb); 6301 e1kCsLeave(p State);6302 } 6303 STAM_PROFILE_ADV_START(&p State->StatReceiveFilter, a);6299 e1kCsLeave(pThis); 6300 } 6301 STAM_PROFILE_ADV_START(&pThis->StatReceiveFilter, a); 6304 6302 E1KRXDST status; 6305 6303 RT_ZERO(status); 6306 bool fPassed = e1kAddressFilter(p State, pvBuf, cb, &status);6307 STAM_PROFILE_ADV_STOP(&p State->StatReceiveFilter, a);6304 bool fPassed = e1kAddressFilter(pThis, pvBuf, cb, &status); 6305 STAM_PROFILE_ADV_STOP(&pThis->StatReceiveFilter, a); 6308 6306 if (fPassed) 6309 6307 { 6310 rc = e1kHandleRxPacket(p State, pvBuf, cb, status);6311 } 6312 //e1kCsLeave(p State);6313 STAM_PROFILE_ADV_STOP(&p State->StatReceive, a);6308 rc = e1kHandleRxPacket(pThis, pvBuf, cb, status); 6309 } 6310 //e1kCsLeave(pThis); 6311 STAM_PROFILE_ADV_STOP(&pThis->StatReceive, a); 6314 6312 6315 6313 return rc; … … 6324 6322 static DECLCALLBACK(int) e1kQueryStatusLed(PPDMILEDPORTS pInterface, unsigned iLUN, PPDMLED *ppLed) 6325 6323 { 6326 E1KSTATE *pState= RT_FROM_MEMBER(pInterface, E1KSTATE, ILeds);6324 PE1KSTATE pThis = RT_FROM_MEMBER(pInterface, E1KSTATE, ILeds); 6327 6325 int rc = VERR_PDM_LUN_NOT_FOUND; 6328 6326 6329 6327 if (iLUN == 0) 6330 6328 { 6331 *ppLed = &p State->led;6329 *ppLed = &pThis->led; 6332 6330 rc = VINF_SUCCESS; 6333 6331 } … … 6343 6341 static DECLCALLBACK(int) e1kGetMac(PPDMINETWORKCONFIG pInterface, PRTMAC pMac) 6344 6342 { 6345 E1KSTATE *pState= RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkConfig);6346 p State->eeprom.getMac(pMac);6343 PE1KSTATE pThis = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkConfig); 6344 pThis->eeprom.getMac(pMac); 6347 6345 return VINF_SUCCESS; 6348 6346 } … … 6353 6351 static DECLCALLBACK(PDMNETWORKLINKSTATE) e1kGetLinkState(PPDMINETWORKCONFIG pInterface) 6354 6352 { 6355 E1KSTATE *pState= RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkConfig);6353 PE1KSTATE pThis = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkConfig); 6356 6354 if (STATUS & STATUS_LU) 6357 6355 return PDMNETWORKLINKSTATE_UP; … … 6364 6362 static DECLCALLBACK(int) e1kSetLinkState(PPDMINETWORKCONFIG pInterface, PDMNETWORKLINKSTATE enmState) 6365 6363 { 6366 E1KSTATE *pState= RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkConfig);6364 PE1KSTATE pThis = RT_FROM_MEMBER(pInterface, E1KSTATE, INetworkConfig); 6367 6365 bool fOldUp = !!(STATUS & STATUS_LU); 6368 6366 bool fNewUp = enmState == PDMNETWORKLINKSTATE_UP; 6369 6367 6370 6368 if ( fNewUp != fOldUp 6371 || (!fNewUp && p State->fCableConnected)) /* old state was connected but STATUS not6369 || (!fNewUp && pThis->fCableConnected)) /* old state was connected but STATUS not 6372 6370 * yet written by guest */ 6373 6371 { … … 6375 6373 { 6376 6374 E1kLog(("%s Link will be up in approximately %d secs\n", 6377 p State->szPrf, pState->cMsLinkUpDelay / 1000));6378 p State->fCableConnected = true;6375 pThis->szPrf, pThis->cMsLinkUpDelay / 1000)); 6376 pThis->fCableConnected = true; 6379 6377 STATUS &= ~STATUS_LU; 6380 Phy::setLinkStatus(&p State->phy, false);6381 e1kRaiseInterrupt(p State, VERR_SEM_BUSY, ICR_LSC);6378 Phy::setLinkStatus(&pThis->phy, false); 6379 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC); 6382 6380 /* Restore the link back in 5 seconds (by default). */ 6383 e1kBringLinkUpDelayed(p State);6381 e1kBringLinkUpDelayed(pThis); 6384 6382 } 6385 6383 else 6386 6384 { 6387 E1kLog(("%s Link is down\n", p State->szPrf));6388 p State->fCableConnected = false;6385 E1kLog(("%s Link is down\n", pThis->szPrf)); 6386 pThis->fCableConnected = false; 6389 6387 STATUS &= ~STATUS_LU; 6390 Phy::setLinkStatus(&p State->phy, false);6391 e1kRaiseInterrupt(p State, VERR_SEM_BUSY, ICR_LSC);6388 Phy::setLinkStatus(&pThis->phy, false); 6389 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC); 6392 6390 } 6393 if (p State->pDrvR3)6394 p State->pDrvR3->pfnNotifyLinkChanged(pState->pDrvR3, enmState);6391 if (pThis->pDrvR3) 6392 pThis->pDrvR3->pfnNotifyLinkChanged(pThis->pDrvR3, enmState); 6395 6393 } 6396 6394 return VINF_SUCCESS; … … 6405 6403 static DECLCALLBACK(void *) e1kQueryInterface(struct PDMIBASE *pInterface, const char *pszIID) 6406 6404 { 6407 E1KSTATE *pThis = RT_FROM_MEMBER(pInterface, E1KSTATE, IBase);6405 PE1KSTATE pThis = RT_FROM_MEMBER(pInterface, E1KSTATE, IBase); 6408 6406 Assert(&pThis->IBase == pInterface); 6409 6407 … … 6421 6419 * Saves the configuration. 6422 6420 * 6423 * @param p StateThe E1K state.6421 * @param pThis The E1K state. 6424 6422 * @param pSSM The handle to the saved state. 6425 6423 */ 6426 static void e1kSaveConfig( E1KSTATE *pState, PSSMHANDLE pSSM)6427 { 6428 SSMR3PutMem(pSSM, &p State->macConfigured, sizeof(pState->macConfigured));6429 SSMR3PutU32(pSSM, p State->eChip);6424 static void e1kSaveConfig(PE1KSTATE pThis, PSSMHANDLE pSSM) 6425 { 6426 SSMR3PutMem(pSSM, &pThis->macConfigured, sizeof(pThis->macConfigured)); 6427 SSMR3PutU32(pSSM, pThis->eChip); 6430 6428 } 6431 6429 … … 6435 6433 static DECLCALLBACK(int) e1kLiveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uPass) 6436 6434 { 6437 E1KSTATE *pState= PDMINS_2_DATA(pDevIns, E1KSTATE*);6438 e1kSaveConfig(p State, pSSM);6435 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*); 6436 e1kSaveConfig(pThis, pSSM); 6439 6437 return VINF_SSM_DONT_CALL_AGAIN; 6440 6438 } … … 6445 6443 static DECLCALLBACK(int) e1kSavePrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 6446 6444 { 6447 E1KSTATE* pState= PDMINS_2_DATA(pDevIns, E1KSTATE*);6448 6449 int rc = e1kCsEnter(p State, VERR_SEM_BUSY);6445 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*); 6446 6447 int rc = e1kCsEnter(pThis, VERR_SEM_BUSY); 6450 6448 if (RT_UNLIKELY(rc != VINF_SUCCESS)) 6451 6449 return rc; 6452 e1kCsLeave(p State);6450 e1kCsLeave(pThis); 6453 6451 return VINF_SUCCESS; 6454 6452 #if 0 6455 6453 /* 1) Prevent all threads from modifying the state and memory */ 6456 //p State->fLocked = true;6454 //pThis->fLocked = true; 6457 6455 /* 2) Cancel all timers */ 6458 6456 #ifdef E1K_TX_DELAY 6459 e1kCancelTimer(p State, pState->CTX_SUFF(pTXDTimer));6457 e1kCancelTimer(pThis, pThis->CTX_SUFF(pTXDTimer)); 6460 6458 #endif /* E1K_TX_DELAY */ 6461 6459 #ifdef E1K_USE_TX_TIMERS 6462 e1kCancelTimer(p State, pState->CTX_SUFF(pTIDTimer));6460 e1kCancelTimer(pThis, pThis->CTX_SUFF(pTIDTimer)); 6463 6461 #ifndef E1K_NO_TAD 6464 e1kCancelTimer(p State, pState->CTX_SUFF(pTADTimer));6462 e1kCancelTimer(pThis, pThis->CTX_SUFF(pTADTimer)); 6465 6463 #endif /* E1K_NO_TAD */ 6466 6464 #endif /* E1K_USE_TX_TIMERS */ 6467 6465 #ifdef E1K_USE_RX_TIMERS 6468 e1kCancelTimer(p State, pState->CTX_SUFF(pRIDTimer));6469 e1kCancelTimer(p State, pState->CTX_SUFF(pRADTimer));6466 e1kCancelTimer(pThis, pThis->CTX_SUFF(pRIDTimer)); 6467 e1kCancelTimer(pThis, pThis->CTX_SUFF(pRADTimer)); 6470 6468 #endif /* E1K_USE_RX_TIMERS */ 6471 e1kCancelTimer(p State, pState->CTX_SUFF(pIntTimer));6469 e1kCancelTimer(pThis, pThis->CTX_SUFF(pIntTimer)); 6472 6470 /* 3) Did I forget anything? */ 6473 E1kLog(("%s Locked\n", p State->szPrf));6471 E1kLog(("%s Locked\n", pThis->szPrf)); 6474 6472 return VINF_SUCCESS; 6475 6473 #endif … … 6481 6479 static DECLCALLBACK(int) e1kSaveExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 6482 6480 { 6483 E1KSTATE* pState= PDMINS_2_DATA(pDevIns, E1KSTATE*);6484 6485 e1kSaveConfig(p State, pSSM);6486 p State->eeprom.save(pSSM);6487 e1kDumpState(p State);6488 SSMR3PutMem(pSSM, p State->auRegs, sizeof(pState->auRegs));6489 SSMR3PutBool(pSSM, p State->fIntRaised);6490 Phy::saveState(pSSM, &p State->phy);6491 SSMR3PutU32(pSSM, p State->uSelectedReg);6492 SSMR3PutMem(pSSM, p State->auMTA, sizeof(pState->auMTA));6493 SSMR3PutMem(pSSM, &p State->aRecAddr, sizeof(pState->aRecAddr));6494 SSMR3PutMem(pSSM, p State->auVFTA, sizeof(pState->auVFTA));6495 SSMR3PutU64(pSSM, p State->u64AckedAt);6496 SSMR3PutU16(pSSM, p State->u16RxBSize);6497 //SSMR3PutBool(pSSM, p State->fDelayInts);6498 //SSMR3PutBool(pSSM, p State->fIntMaskUsed);6499 SSMR3PutU16(pSSM, p State->u16TxPktLen);6481 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*); 6482 6483 e1kSaveConfig(pThis, pSSM); 6484 pThis->eeprom.save(pSSM); 6485 e1kDumpState(pThis); 6486 SSMR3PutMem(pSSM, pThis->auRegs, sizeof(pThis->auRegs)); 6487 SSMR3PutBool(pSSM, pThis->fIntRaised); 6488 Phy::saveState(pSSM, &pThis->phy); 6489 SSMR3PutU32(pSSM, pThis->uSelectedReg); 6490 SSMR3PutMem(pSSM, pThis->auMTA, sizeof(pThis->auMTA)); 6491 SSMR3PutMem(pSSM, &pThis->aRecAddr, sizeof(pThis->aRecAddr)); 6492 SSMR3PutMem(pSSM, pThis->auVFTA, sizeof(pThis->auVFTA)); 6493 SSMR3PutU64(pSSM, pThis->u64AckedAt); 6494 SSMR3PutU16(pSSM, pThis->u16RxBSize); 6495 //SSMR3PutBool(pSSM, pThis->fDelayInts); 6496 //SSMR3PutBool(pSSM, pThis->fIntMaskUsed); 6497 SSMR3PutU16(pSSM, pThis->u16TxPktLen); 6500 6498 /** @todo State wrt to the TSE buffer is incomplete, so little point in 6501 6499 * saving this actually. */ 6502 SSMR3PutMem(pSSM, p State->aTxPacketFallback, pState->u16TxPktLen);6503 SSMR3PutBool(pSSM, p State->fIPcsum);6504 SSMR3PutBool(pSSM, p State->fTCPcsum);6505 SSMR3PutMem(pSSM, &p State->contextTSE, sizeof(pState->contextTSE));6506 SSMR3PutMem(pSSM, &p State->contextNormal, sizeof(pState->contextNormal));6507 SSMR3PutBool(pSSM, p State->fVTag);6508 SSMR3PutU16(pSSM, p State->u16VTagTCI);6500 SSMR3PutMem(pSSM, pThis->aTxPacketFallback, pThis->u16TxPktLen); 6501 SSMR3PutBool(pSSM, pThis->fIPcsum); 6502 SSMR3PutBool(pSSM, pThis->fTCPcsum); 6503 SSMR3PutMem(pSSM, &pThis->contextTSE, sizeof(pThis->contextTSE)); 6504 SSMR3PutMem(pSSM, &pThis->contextNormal, sizeof(pThis->contextNormal)); 6505 SSMR3PutBool(pSSM, pThis->fVTag); 6506 SSMR3PutU16(pSSM, pThis->u16VTagTCI); 6509 6507 #ifdef E1K_WITH_TXD_CACHE 6510 6508 #if 0 6511 SSMR3PutU8(pSSM, p State->nTxDFetched);6512 SSMR3PutMem(pSSM, p State->aTxDescriptors,6513 p State->nTxDFetched * sizeof(pState->aTxDescriptors[0]));6509 SSMR3PutU8(pSSM, pThis->nTxDFetched); 6510 SSMR3PutMem(pSSM, pThis->aTxDescriptors, 6511 pThis->nTxDFetched * sizeof(pThis->aTxDescriptors[0])); 6514 6512 #else 6515 6513 /* … … 6522 6520 #endif /* E1K_WITH_TXD_CACHE */ 6523 6521 /**@todo GSO requires some more state here. */ 6524 E1kLog(("%s State has been saved\n", p State->szPrf));6522 E1kLog(("%s State has been saved\n", pThis->szPrf)); 6525 6523 return VINF_SUCCESS; 6526 6524 } … … 6532 6530 static DECLCALLBACK(int) e1kSaveDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 6533 6531 { 6534 E1KSTATE* pState= PDMINS_2_DATA(pDevIns, E1KSTATE*);6532 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*); 6535 6533 6536 6534 /* If VM is being powered off unlocking will result in assertions in PGM */ 6537 6535 if (PDMDevHlpGetVM(pDevIns)->enmVMState == VMSTATE_RUNNING) 6538 p State->fLocked = false;6536 pThis->fLocked = false; 6539 6537 else 6540 E1kLog(("%s VM is not running -- remain locked\n", p State->szPrf));6541 E1kLog(("%s Unlocked\n", p State->szPrf));6538 E1kLog(("%s VM is not running -- remain locked\n", pThis->szPrf)); 6539 E1kLog(("%s Unlocked\n", pThis->szPrf)); 6542 6540 return VINF_SUCCESS; 6543 6541 } … … 6549 6547 static DECLCALLBACK(int) e1kLoadPrep(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 6550 6548 { 6551 E1KSTATE* pState= PDMINS_2_DATA(pDevIns, E1KSTATE*);6552 6553 int rc = e1kCsEnter(p State, VERR_SEM_BUSY);6549 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*); 6550 6551 int rc = e1kCsEnter(pThis, VERR_SEM_BUSY); 6554 6552 if (RT_UNLIKELY(rc != VINF_SUCCESS)) 6555 6553 return rc; 6556 e1kCsLeave(p State);6554 e1kCsLeave(pThis); 6557 6555 return VINF_SUCCESS; 6558 6556 } … … 6563 6561 static DECLCALLBACK(int) e1kLoadExec(PPDMDEVINS pDevIns, PSSMHANDLE pSSM, uint32_t uVersion, uint32_t uPass) 6564 6562 { 6565 E1KSTATE *pState= PDMINS_2_DATA(pDevIns, E1KSTATE*);6563 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*); 6566 6564 int rc; 6567 6565 … … 6581 6579 rc = SSMR3GetMem(pSSM, &macConfigured, sizeof(macConfigured)); 6582 6580 AssertRCReturn(rc, rc); 6583 if ( memcmp(&macConfigured, &p State->macConfigured, sizeof(macConfigured))6581 if ( memcmp(&macConfigured, &pThis->macConfigured, sizeof(macConfigured)) 6584 6582 && (uPass == 0 || !PDMDevHlpVMTeleportedAndNotFullyResumedYet(pDevIns)) ) 6585 LogRel(("%s: The mac address differs: config=%RTmac saved=%RTmac\n", p State->szPrf, &pState->macConfigured, &macConfigured));6583 LogRel(("%s: The mac address differs: config=%RTmac saved=%RTmac\n", pThis->szPrf, &pThis->macConfigured, &macConfigured)); 6586 6584 6587 6585 E1KCHIP eChip; 6588 6586 rc = SSMR3GetU32(pSSM, &eChip); 6589 6587 AssertRCReturn(rc, rc); 6590 if (eChip != p State->eChip)6591 return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("The chip type differs: config=%u saved=%u"), p State->eChip, eChip);6588 if (eChip != pThis->eChip) 6589 return SSMR3SetCfgError(pSSM, RT_SRC_POS, N_("The chip type differs: config=%u saved=%u"), pThis->eChip, eChip); 6592 6590 } 6593 6591 … … 6596 6594 if (uVersion > E1K_SAVEDSTATE_VERSION_VBOX_30) 6597 6595 { 6598 rc = p State->eeprom.load(pSSM);6596 rc = pThis->eeprom.load(pSSM); 6599 6597 AssertRCReturn(rc, rc); 6600 6598 } 6601 6599 /* the state */ 6602 SSMR3GetMem(pSSM, &p State->auRegs, sizeof(pState->auRegs));6603 SSMR3GetBool(pSSM, &p State->fIntRaised);6600 SSMR3GetMem(pSSM, &pThis->auRegs, sizeof(pThis->auRegs)); 6601 SSMR3GetBool(pSSM, &pThis->fIntRaised); 6604 6602 /** @todo: PHY could be made a separate device with its own versioning */ 6605 Phy::loadState(pSSM, &p State->phy);6606 SSMR3GetU32(pSSM, &p State->uSelectedReg);6607 SSMR3GetMem(pSSM, &p State->auMTA, sizeof(pState->auMTA));6608 SSMR3GetMem(pSSM, &p State->aRecAddr, sizeof(pState->aRecAddr));6609 SSMR3GetMem(pSSM, &p State->auVFTA, sizeof(pState->auVFTA));6610 SSMR3GetU64(pSSM, &p State->u64AckedAt);6611 SSMR3GetU16(pSSM, &p State->u16RxBSize);6612 //SSMR3GetBool(pSSM, p State->fDelayInts);6613 //SSMR3GetBool(pSSM, p State->fIntMaskUsed);6614 SSMR3GetU16(pSSM, &p State->u16TxPktLen);6615 SSMR3GetMem(pSSM, &p State->aTxPacketFallback[0], pState->u16TxPktLen);6616 SSMR3GetBool(pSSM, &p State->fIPcsum);6617 SSMR3GetBool(pSSM, &p State->fTCPcsum);6618 SSMR3GetMem(pSSM, &p State->contextTSE, sizeof(pState->contextTSE));6619 rc = SSMR3GetMem(pSSM, &p State->contextNormal, sizeof(pState->contextNormal));6603 Phy::loadState(pSSM, &pThis->phy); 6604 SSMR3GetU32(pSSM, &pThis->uSelectedReg); 6605 SSMR3GetMem(pSSM, &pThis->auMTA, sizeof(pThis->auMTA)); 6606 SSMR3GetMem(pSSM, &pThis->aRecAddr, sizeof(pThis->aRecAddr)); 6607 SSMR3GetMem(pSSM, &pThis->auVFTA, sizeof(pThis->auVFTA)); 6608 SSMR3GetU64(pSSM, &pThis->u64AckedAt); 6609 SSMR3GetU16(pSSM, &pThis->u16RxBSize); 6610 //SSMR3GetBool(pSSM, pThis->fDelayInts); 6611 //SSMR3GetBool(pSSM, pThis->fIntMaskUsed); 6612 SSMR3GetU16(pSSM, &pThis->u16TxPktLen); 6613 SSMR3GetMem(pSSM, &pThis->aTxPacketFallback[0], pThis->u16TxPktLen); 6614 SSMR3GetBool(pSSM, &pThis->fIPcsum); 6615 SSMR3GetBool(pSSM, &pThis->fTCPcsum); 6616 SSMR3GetMem(pSSM, &pThis->contextTSE, sizeof(pThis->contextTSE)); 6617 rc = SSMR3GetMem(pSSM, &pThis->contextNormal, sizeof(pThis->contextNormal)); 6620 6618 AssertRCReturn(rc, rc); 6621 6619 if (uVersion > E1K_SAVEDSTATE_VERSION_VBOX_41) 6622 6620 { 6623 SSMR3GetBool(pSSM, &p State->fVTag);6624 rc = SSMR3GetU16(pSSM, &p State->u16VTagTCI);6621 SSMR3GetBool(pSSM, &pThis->fVTag); 6622 rc = SSMR3GetU16(pSSM, &pThis->u16VTagTCI); 6625 6623 AssertRCReturn(rc, rc); 6626 6624 } 6627 6625 else 6628 6626 { 6629 p State->fVTag = false;6630 p State->u16VTagTCI = 0;6627 pThis->fVTag = false; 6628 pThis->u16VTagTCI = 0; 6631 6629 } 6632 6630 #ifdef E1K_WITH_TXD_CACHE 6633 6631 if (uVersion > E1K_SAVEDSTATE_VERSION_VBOX_42_VTAG) 6634 6632 { 6635 rc = SSMR3GetU8(pSSM, &p State->nTxDFetched);6633 rc = SSMR3GetU8(pSSM, &pThis->nTxDFetched); 6636 6634 AssertRCReturn(rc, rc); 6637 if (p State->nTxDFetched)6638 SSMR3GetMem(pSSM, p State->aTxDescriptors,6639 p State->nTxDFetched * sizeof(pState->aTxDescriptors[0]));6635 if (pThis->nTxDFetched) 6636 SSMR3GetMem(pSSM, pThis->aTxDescriptors, 6637 pThis->nTxDFetched * sizeof(pThis->aTxDescriptors[0])); 6640 6638 } 6641 6639 else 6642 p State->nTxDFetched = 0;6640 pThis->nTxDFetched = 0; 6643 6641 /* 6644 6642 * @todo: Perhaps we should not store TXD cache as the entries can be … … 6651 6649 * state, we just need to make sure it is empty. 6652 6650 */ 6653 p State->iRxDCurrent = pState->nRxDFetched = 0;6651 pThis->iRxDCurrent = pThis->nRxDFetched = 0; 6654 6652 #endif /* E1K_WITH_RXD_CACHE */ 6655 6653 /* derived state */ 6656 e1kSetupGsoCtx(&p State->GsoCtx, &pState->contextTSE);6657 6658 E1kLog(("%s State has been restored\n", p State->szPrf));6659 e1kDumpState(p State);6654 e1kSetupGsoCtx(&pThis->GsoCtx, &pThis->contextTSE); 6655 6656 E1kLog(("%s State has been restored\n", pThis->szPrf)); 6657 e1kDumpState(pThis); 6660 6658 } 6661 6659 return VINF_SUCCESS; … … 6667 6665 static DECLCALLBACK(int) e1kLoadDone(PPDMDEVINS pDevIns, PSSMHANDLE pSSM) 6668 6666 { 6669 E1KSTATE* pState= PDMINS_2_DATA(pDevIns, E1KSTATE*);6667 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*); 6670 6668 6671 6669 /* Update promiscuous mode */ 6672 if (p State->pDrvR3)6673 p State->pDrvR3->pfnSetPromiscuousMode(pState->pDrvR3,6670 if (pThis->pDrvR3) 6671 pThis->pDrvR3->pfnSetPromiscuousMode(pThis->pDrvR3, 6674 6672 !!(RCTL & (RCTL_UPE | RCTL_MPE))); 6675 6673 … … 6681 6679 if ( (STATUS & STATUS_LU) 6682 6680 && !PDMDevHlpVMTeleportedAndNotFullyResumedYet(pDevIns) 6683 && p State->cMsLinkUpDelay)6684 { 6685 E1kLog(("%s Link is down temporarily\n", p State->szPrf));6681 && pThis->cMsLinkUpDelay) 6682 { 6683 E1kLog(("%s Link is down temporarily\n", pThis->szPrf)); 6686 6684 STATUS &= ~STATUS_LU; 6687 Phy::setLinkStatus(&p State->phy, false);6688 e1kRaiseInterrupt(p State, VERR_SEM_BUSY, ICR_LSC);6685 Phy::setLinkStatus(&pThis->phy, false); 6686 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC); 6689 6687 /* Restore the link back in five seconds (default). */ 6690 e1kBringLinkUpDelayed(p State);6688 e1kBringLinkUpDelayed(pThis); 6691 6689 } 6692 6690 return VINF_SUCCESS; … … 6846 6844 static DECLCALLBACK(void) e1kInfo(PPDMDEVINS pDevIns, PCDBGFINFOHLP pHlp, const char *pszArgs) 6847 6845 { 6848 E1KSTATE* pState= PDMINS_2_DATA(pDevIns, E1KSTATE*);6846 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*); 6849 6847 unsigned i; 6850 6848 // bool fRcvRing = false; … … 6864 6862 */ 6865 6863 pHlp->pfnPrintf(pHlp, "E1000 #%d: port=%RTiop mmio=%RGp mac-cfg=%RTmac %s%s%s\n", 6866 pDevIns->iInstance, p State->addrIOPort, pState->addrMMReg,6867 &p State->macConfigured, g_Chips[pState->eChip].pcszName,6868 p State->fGCEnabled ? " GC" : "", pState->fR0Enabled ? " R0" : "");6869 6870 e1kCsEnter(p State, VERR_INTERNAL_ERROR); /* Not sure why but PCNet does it */6864 pDevIns->iInstance, pThis->addrIOPort, pThis->addrMMReg, 6865 &pThis->macConfigured, g_Chips[pThis->eChip].pcszName, 6866 pThis->fGCEnabled ? " GC" : "", pThis->fR0Enabled ? " R0" : ""); 6867 6868 e1kCsEnter(pThis, VERR_INTERNAL_ERROR); /* Not sure why but PCNet does it */ 6871 6869 6872 6870 for (i = 0; i < E1K_NUM_OF_32BIT_REGS; ++i) 6873 pHlp->pfnPrintf(pHlp, "%8.8s = %08x\n", s_e1kRegMap[i].abbrev, p State->auRegs[i]);6874 6875 for (i = 0; i < RT_ELEMENTS(p State->aRecAddr.array); i++)6876 { 6877 E1KRAELEM* ra = p State->aRecAddr.array + i;6871 pHlp->pfnPrintf(pHlp, "%8.8s = %08x\n", s_e1kRegMap[i].abbrev, pThis->auRegs[i]); 6872 6873 for (i = 0; i < RT_ELEMENTS(pThis->aRecAddr.array); i++) 6874 { 6875 E1KRAELEM* ra = pThis->aRecAddr.array + i; 6878 6876 if (ra->ctl & RA_CTL_AV) 6879 6877 { … … 6901 6899 } 6902 6900 pHlp->pfnPrintf(pHlp, "\n-- Receive Descriptors in Cache (at %d (RDH %d)/ fetched %d / max %d) --\n", 6903 p State->iRxDCurrent, RDH, pState->nRxDFetched, E1K_RXD_CACHE_SIZE);6904 if (rdh > p State->iRxDCurrent)6905 rdh -= p State->iRxDCurrent;6901 pThis->iRxDCurrent, RDH, pThis->nRxDFetched, E1K_RXD_CACHE_SIZE); 6902 if (rdh > pThis->iRxDCurrent) 6903 rdh -= pThis->iRxDCurrent; 6906 6904 else 6907 rdh = cDescs + rdh - p State->iRxDCurrent;6908 for (i = 0; i < p State->nRxDFetched; ++i)6909 { 6910 if (i == p State->iRxDCurrent)6905 rdh = cDescs + rdh - pThis->iRxDCurrent; 6906 for (i = 0; i < pThis->nRxDFetched; ++i) 6907 { 6908 if (i == pThis->iRxDCurrent) 6911 6909 pHlp->pfnPrintf(pHlp, ">>> "); 6912 6910 pHlp->pfnPrintf(pHlp, "%RGp: %R[e1krxd]\n", 6913 6911 e1kDescAddr(RDBAH, RDBAL, rdh++ % cDescs), 6914 &p State->aRxDescriptors[i]);6912 &pThis->aRxDescriptors[i]); 6915 6913 } 6916 6914 … … 6928 6926 } 6929 6927 pHlp->pfnPrintf(pHlp, "\n-- Transmit Descriptors in Cache (at %d (TDH %d)/ fetched %d / max %d) --\n", 6930 p State->iTxDCurrent, TDH, pState->nTxDFetched, E1K_TXD_CACHE_SIZE);6931 if (tdh > p State->iTxDCurrent)6932 tdh -= p State->iTxDCurrent;6928 pThis->iTxDCurrent, TDH, pThis->nTxDFetched, E1K_TXD_CACHE_SIZE); 6929 if (tdh > pThis->iTxDCurrent) 6930 tdh -= pThis->iTxDCurrent; 6933 6931 else 6934 tdh = cDescs + tdh - p State->iTxDCurrent;6935 for (i = 0; i < p State->nTxDFetched; ++i)6936 { 6937 if (i == p State->iTxDCurrent)6932 tdh = cDescs + tdh - pThis->iTxDCurrent; 6933 for (i = 0; i < pThis->nTxDFetched; ++i) 6934 { 6935 if (i == pThis->iTxDCurrent) 6938 6936 pHlp->pfnPrintf(pHlp, ">>> "); 6939 6937 pHlp->pfnPrintf(pHlp, "%RGp: %R[e1ktxd]\n", 6940 6938 e1kDescAddr(TDBAH, TDBAL, tdh++ % cDescs), 6941 &p State->aTxDescriptors[i]);6939 &pThis->aTxDescriptors[i]); 6942 6940 } 6943 6941 6944 6942 6945 6943 #ifdef E1K_INT_STATS 6946 pHlp->pfnPrintf(pHlp, "Interrupt attempts: %d\n", p State->uStatIntTry);6947 pHlp->pfnPrintf(pHlp, "Interrupts raised : %d\n", p State->uStatInt);6948 pHlp->pfnPrintf(pHlp, "Interrupts lowered: %d\n", p State->uStatIntLower);6949 pHlp->pfnPrintf(pHlp, "Interrupts delayed: %d\n", p State->uStatIntDly);6950 pHlp->pfnPrintf(pHlp, "Disabled delayed: %d\n", p State->uStatDisDly);6951 pHlp->pfnPrintf(pHlp, "Interrupts skipped: %d\n", p State->uStatIntSkip);6952 pHlp->pfnPrintf(pHlp, "Masked interrupts : %d\n", p State->uStatIntMasked);6953 pHlp->pfnPrintf(pHlp, "Early interrupts : %d\n", p State->uStatIntEarly);6954 pHlp->pfnPrintf(pHlp, "Late interrupts : %d\n", p State->uStatIntLate);6955 pHlp->pfnPrintf(pHlp, "Lost interrupts : %d\n", p State->iStatIntLost);6956 pHlp->pfnPrintf(pHlp, "Interrupts by RX : %d\n", p State->uStatIntRx);6957 pHlp->pfnPrintf(pHlp, "Interrupts by TX : %d\n", p State->uStatIntTx);6958 pHlp->pfnPrintf(pHlp, "Interrupts by ICS : %d\n", p State->uStatIntICS);6959 pHlp->pfnPrintf(pHlp, "Interrupts by RDTR: %d\n", p State->uStatIntRDTR);6960 pHlp->pfnPrintf(pHlp, "Interrupts by RDMT: %d\n", p State->uStatIntRXDMT0);6961 pHlp->pfnPrintf(pHlp, "Interrupts by TXQE: %d\n", p State->uStatIntTXQE);6962 pHlp->pfnPrintf(pHlp, "TX int delay asked: %d\n", p State->uStatTxIDE);6963 pHlp->pfnPrintf(pHlp, "TX delayed: %d\n", p State->uStatTxDelayed);6964 pHlp->pfnPrintf(pHlp, "TX delayed expired: %d\n", p State->uStatTxDelayExp);6965 pHlp->pfnPrintf(pHlp, "TX no report asked: %d\n", p State->uStatTxNoRS);6966 pHlp->pfnPrintf(pHlp, "TX abs timer expd : %d\n", p State->uStatTAD);6967 pHlp->pfnPrintf(pHlp, "TX int timer expd : %d\n", p State->uStatTID);6968 pHlp->pfnPrintf(pHlp, "RX abs timer expd : %d\n", p State->uStatRAD);6969 pHlp->pfnPrintf(pHlp, "RX int timer expd : %d\n", p State->uStatRID);6970 pHlp->pfnPrintf(pHlp, "TX CTX descriptors: %d\n", p State->uStatDescCtx);6971 pHlp->pfnPrintf(pHlp, "TX DAT descriptors: %d\n", p State->uStatDescDat);6972 pHlp->pfnPrintf(pHlp, "TX LEG descriptors: %d\n", p State->uStatDescLeg);6973 pHlp->pfnPrintf(pHlp, "Received frames : %d\n", p State->uStatRxFrm);6974 pHlp->pfnPrintf(pHlp, "Transmitted frames: %d\n", p State->uStatTxFrm);6975 pHlp->pfnPrintf(pHlp, "TX frames up to 1514: %d\n", p State->uStatTx1514);6976 pHlp->pfnPrintf(pHlp, "TX frames up to 2962: %d\n", p State->uStatTx2962);6977 pHlp->pfnPrintf(pHlp, "TX frames up to 4410: %d\n", p State->uStatTx4410);6978 pHlp->pfnPrintf(pHlp, "TX frames up to 5858: %d\n", p State->uStatTx5858);6979 pHlp->pfnPrintf(pHlp, "TX frames up to 7306: %d\n", p State->uStatTx7306);6980 pHlp->pfnPrintf(pHlp, "TX frames up to 8754: %d\n", p State->uStatTx8754);6981 pHlp->pfnPrintf(pHlp, "TX frames up to 16384: %d\n", p State->uStatTx16384);6982 pHlp->pfnPrintf(pHlp, "TX frames up to 32768: %d\n", p State->uStatTx32768);6983 pHlp->pfnPrintf(pHlp, "Larger TX frames : %d\n", p State->uStatTxLarge);6944 pHlp->pfnPrintf(pHlp, "Interrupt attempts: %d\n", pThis->uStatIntTry); 6945 pHlp->pfnPrintf(pHlp, "Interrupts raised : %d\n", pThis->uStatInt); 6946 pHlp->pfnPrintf(pHlp, "Interrupts lowered: %d\n", pThis->uStatIntLower); 6947 pHlp->pfnPrintf(pHlp, "Interrupts delayed: %d\n", pThis->uStatIntDly); 6948 pHlp->pfnPrintf(pHlp, "Disabled delayed: %d\n", pThis->uStatDisDly); 6949 pHlp->pfnPrintf(pHlp, "Interrupts skipped: %d\n", pThis->uStatIntSkip); 6950 pHlp->pfnPrintf(pHlp, "Masked interrupts : %d\n", pThis->uStatIntMasked); 6951 pHlp->pfnPrintf(pHlp, "Early interrupts : %d\n", pThis->uStatIntEarly); 6952 pHlp->pfnPrintf(pHlp, "Late interrupts : %d\n", pThis->uStatIntLate); 6953 pHlp->pfnPrintf(pHlp, "Lost interrupts : %d\n", pThis->iStatIntLost); 6954 pHlp->pfnPrintf(pHlp, "Interrupts by RX : %d\n", pThis->uStatIntRx); 6955 pHlp->pfnPrintf(pHlp, "Interrupts by TX : %d\n", pThis->uStatIntTx); 6956 pHlp->pfnPrintf(pHlp, "Interrupts by ICS : %d\n", pThis->uStatIntICS); 6957 pHlp->pfnPrintf(pHlp, "Interrupts by RDTR: %d\n", pThis->uStatIntRDTR); 6958 pHlp->pfnPrintf(pHlp, "Interrupts by RDMT: %d\n", pThis->uStatIntRXDMT0); 6959 pHlp->pfnPrintf(pHlp, "Interrupts by TXQE: %d\n", pThis->uStatIntTXQE); 6960 pHlp->pfnPrintf(pHlp, "TX int delay asked: %d\n", pThis->uStatTxIDE); 6961 pHlp->pfnPrintf(pHlp, "TX delayed: %d\n", pThis->uStatTxDelayed); 6962 pHlp->pfnPrintf(pHlp, "TX delayed expired: %d\n", pThis->uStatTxDelayExp); 6963 pHlp->pfnPrintf(pHlp, "TX no report asked: %d\n", pThis->uStatTxNoRS); 6964 pHlp->pfnPrintf(pHlp, "TX abs timer expd : %d\n", pThis->uStatTAD); 6965 pHlp->pfnPrintf(pHlp, "TX int timer expd : %d\n", pThis->uStatTID); 6966 pHlp->pfnPrintf(pHlp, "RX abs timer expd : %d\n", pThis->uStatRAD); 6967 pHlp->pfnPrintf(pHlp, "RX int timer expd : %d\n", pThis->uStatRID); 6968 pHlp->pfnPrintf(pHlp, "TX CTX descriptors: %d\n", pThis->uStatDescCtx); 6969 pHlp->pfnPrintf(pHlp, "TX DAT descriptors: %d\n", pThis->uStatDescDat); 6970 pHlp->pfnPrintf(pHlp, "TX LEG descriptors: %d\n", pThis->uStatDescLeg); 6971 pHlp->pfnPrintf(pHlp, "Received frames : %d\n", pThis->uStatRxFrm); 6972 pHlp->pfnPrintf(pHlp, "Transmitted frames: %d\n", pThis->uStatTxFrm); 6973 pHlp->pfnPrintf(pHlp, "TX frames up to 1514: %d\n", pThis->uStatTx1514); 6974 pHlp->pfnPrintf(pHlp, "TX frames up to 2962: %d\n", pThis->uStatTx2962); 6975 pHlp->pfnPrintf(pHlp, "TX frames up to 4410: %d\n", pThis->uStatTx4410); 6976 pHlp->pfnPrintf(pHlp, "TX frames up to 5858: %d\n", pThis->uStatTx5858); 6977 pHlp->pfnPrintf(pHlp, "TX frames up to 7306: %d\n", pThis->uStatTx7306); 6978 pHlp->pfnPrintf(pHlp, "TX frames up to 8754: %d\n", pThis->uStatTx8754); 6979 pHlp->pfnPrintf(pHlp, "TX frames up to 16384: %d\n", pThis->uStatTx16384); 6980 pHlp->pfnPrintf(pHlp, "TX frames up to 32768: %d\n", pThis->uStatTx32768); 6981 pHlp->pfnPrintf(pHlp, "Larger TX frames : %d\n", pThis->uStatTxLarge); 6984 6982 #endif /* E1K_INT_STATS */ 6985 6983 6986 e1kCsLeave(p State);6984 e1kCsLeave(pThis); 6987 6985 } 6988 6986 … … 7002 7000 static DECLCALLBACK(void) e1kR3Detach(PPDMDEVINS pDevIns, unsigned iLUN, uint32_t fFlags) 7003 7001 { 7004 E1KSTATE *pState= PDMINS_2_DATA(pDevIns, E1KSTATE*);7005 Log(("%s e1kR3Detach:\n", p State->szPrf));7002 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*); 7003 Log(("%s e1kR3Detach:\n", pThis->szPrf)); 7006 7004 7007 7005 AssertLogRelReturnVoid(iLUN == 0); 7008 7006 7009 PDMCritSectEnter(&p State->cs, VERR_SEM_BUSY);7007 PDMCritSectEnter(&pThis->cs, VERR_SEM_BUSY); 7010 7008 7011 7009 /** @todo: r=pritesh still need to check if i missed … … 7016 7014 * Zero some important members. 7017 7015 */ 7018 p State->pDrvBase = NULL;7019 p State->pDrvR3 = NULL;7020 p State->pDrvR0 = NIL_RTR0PTR;7021 p State->pDrvRC = NIL_RTRCPTR;7022 7023 PDMCritSectLeave(&p State->cs);7016 pThis->pDrvBase = NULL; 7017 pThis->pDrvR3 = NULL; 7018 pThis->pDrvR0 = NIL_RTR0PTR; 7019 pThis->pDrvRC = NIL_RTRCPTR; 7020 7021 PDMCritSectLeave(&pThis->cs); 7024 7022 } 7025 7023 … … 7038 7036 static DECLCALLBACK(int) e1kR3Attach(PPDMDEVINS pDevIns, unsigned iLUN, uint32_t fFlags) 7039 7037 { 7040 E1KSTATE *pState= PDMINS_2_DATA(pDevIns, E1KSTATE*);7041 LogFlow(("%s e1kR3Attach:\n", p State->szPrf));7038 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*); 7039 LogFlow(("%s e1kR3Attach:\n", pThis->szPrf)); 7042 7040 7043 7041 AssertLogRelReturn(iLUN == 0, VERR_PDM_NO_SUCH_LUN); 7044 7042 7045 PDMCritSectEnter(&p State->cs, VERR_SEM_BUSY);7043 PDMCritSectEnter(&pThis->cs, VERR_SEM_BUSY); 7046 7044 7047 7045 /* 7048 7046 * Attach the driver. 7049 7047 */ 7050 int rc = PDMDevHlpDriverAttach(pDevIns, 0, &p State->IBase, &pState->pDrvBase, "Network Port");7048 int rc = PDMDevHlpDriverAttach(pDevIns, 0, &pThis->IBase, &pThis->pDrvBase, "Network Port"); 7051 7049 if (RT_SUCCESS(rc)) 7052 7050 { … … 7061 7059 #endif 7062 7060 } 7063 p State->pDrvR3 = PDMIBASE_QUERY_INTERFACE(pState->pDrvBase, PDMINETWORKUP);7064 AssertMsgStmt(p State->pDrvR3, ("Failed to obtain the PDMINETWORKUP interface!\n"),7061 pThis->pDrvR3 = PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMINETWORKUP); 7062 AssertMsgStmt(pThis->pDrvR3, ("Failed to obtain the PDMINETWORKUP interface!\n"), 7065 7063 rc = VERR_PDM_MISSING_INTERFACE_BELOW); 7066 7064 if (RT_SUCCESS(rc)) 7067 7065 { 7068 PPDMIBASER0 pBaseR0 = PDMIBASE_QUERY_INTERFACE(p State->pDrvBase, PDMIBASER0);7069 p State->pDrvR0 = pBaseR0 ? pBaseR0->pfnQueryInterface(pBaseR0, PDMINETWORKUP_IID) : NIL_RTR0PTR;7070 7071 PPDMIBASERC pBaseRC = PDMIBASE_QUERY_INTERFACE(p State->pDrvBase, PDMIBASERC);7072 p State->pDrvRC = pBaseRC ? pBaseRC->pfnQueryInterface(pBaseRC, PDMINETWORKUP_IID) : NIL_RTR0PTR;7066 PPDMIBASER0 pBaseR0 = PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIBASER0); 7067 pThis->pDrvR0 = pBaseR0 ? pBaseR0->pfnQueryInterface(pBaseR0, PDMINETWORKUP_IID) : NIL_RTR0PTR; 7068 7069 PPDMIBASERC pBaseRC = PDMIBASE_QUERY_INTERFACE(pThis->pDrvBase, PDMIBASERC); 7070 pThis->pDrvRC = pBaseRC ? pBaseRC->pfnQueryInterface(pBaseRC, PDMINETWORKUP_IID) : NIL_RTR0PTR; 7073 7071 } 7074 7072 } … … 7078 7076 /* This should never happen because this function is not called 7079 7077 * if there is no driver to attach! */ 7080 Log(("%s No attached driver!\n", p State->szPrf));7078 Log(("%s No attached driver!\n", pThis->szPrf)); 7081 7079 } 7082 7080 … … 7089 7087 { 7090 7088 STATUS &= ~STATUS_LU; 7091 Phy::setLinkStatus(&p State->phy, false);7092 e1kRaiseInterrupt(p State, VERR_SEM_BUSY, ICR_LSC);7089 Phy::setLinkStatus(&pThis->phy, false); 7090 e1kRaiseInterrupt(pThis, VERR_SEM_BUSY, ICR_LSC); 7093 7091 /* Restore the link back in 5 seconds (default). */ 7094 e1kBringLinkUpDelayed(p State);7095 } 7096 7097 PDMCritSectLeave(&p State->cs);7092 e1kBringLinkUpDelayed(pThis); 7093 } 7094 7095 PDMCritSectLeave(&pThis->cs); 7098 7096 return rc; 7099 7097 … … 7114 7112 static DECLCALLBACK(void) e1kR3Reset(PPDMDEVINS pDevIns) 7115 7113 { 7116 E1KSTATE *pState= PDMINS_2_DATA(pDevIns, E1KSTATE*);7114 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*); 7117 7115 #ifdef E1K_TX_DELAY 7118 e1kCancelTimer(p State, pState->CTX_SUFF(pTXDTimer));7116 e1kCancelTimer(pThis, pThis->CTX_SUFF(pTXDTimer)); 7119 7117 #endif /* E1K_TX_DELAY */ 7120 e1kCancelTimer(p State, pState->CTX_SUFF(pIntTimer));7121 e1kCancelTimer(p State, pState->CTX_SUFF(pLUTimer));7122 e1kXmitFreeBuf(p State);7123 p State->u16TxPktLen = 0;7124 p State->fIPcsum = false;7125 p State->fTCPcsum = false;7126 p State->fIntMaskUsed = false;7127 p State->fDelayInts = false;7128 p State->fLocked = false;7129 p State->u64AckedAt = 0;7130 e1kHardReset(p State);7118 e1kCancelTimer(pThis, pThis->CTX_SUFF(pIntTimer)); 7119 e1kCancelTimer(pThis, pThis->CTX_SUFF(pLUTimer)); 7120 e1kXmitFreeBuf(pThis); 7121 pThis->u16TxPktLen = 0; 7122 pThis->fIPcsum = false; 7123 pThis->fTCPcsum = false; 7124 pThis->fIntMaskUsed = false; 7125 pThis->fDelayInts = false; 7126 pThis->fLocked = false; 7127 pThis->u64AckedAt = 0; 7128 e1kHardReset(pThis); 7131 7129 } 7132 7130 … … 7158 7156 static DECLCALLBACK(void) e1kR3Relocate(PPDMDEVINS pDevIns, RTGCINTPTR offDelta) 7159 7157 { 7160 E1KSTATE* pState= PDMINS_2_DATA(pDevIns, E1KSTATE*);7161 p State->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns);7162 p State->pTxQueueRC = PDMQueueRCPtr(pState->pTxQueueR3);7163 p State->pCanRxQueueRC = PDMQueueRCPtr(pState->pCanRxQueueR3);7158 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*); 7159 pThis->pDevInsRC = PDMDEVINS_2_RCPTR(pDevIns); 7160 pThis->pTxQueueRC = PDMQueueRCPtr(pThis->pTxQueueR3); 7161 pThis->pCanRxQueueRC = PDMQueueRCPtr(pThis->pCanRxQueueR3); 7164 7162 #ifdef E1K_USE_RX_TIMERS 7165 p State->pRIDTimerRC = TMTimerRCPtr(pState->pRIDTimerR3);7166 p State->pRADTimerRC = TMTimerRCPtr(pState->pRADTimerR3);7163 pThis->pRIDTimerRC = TMTimerRCPtr(pThis->pRIDTimerR3); 7164 pThis->pRADTimerRC = TMTimerRCPtr(pThis->pRADTimerR3); 7167 7165 #endif /* E1K_USE_RX_TIMERS */ 7168 7166 #ifdef E1K_USE_TX_TIMERS 7169 p State->pTIDTimerRC = TMTimerRCPtr(pState->pTIDTimerR3);7167 pThis->pTIDTimerRC = TMTimerRCPtr(pThis->pTIDTimerR3); 7170 7168 # ifndef E1K_NO_TAD 7171 p State->pTADTimerRC = TMTimerRCPtr(pState->pTADTimerR3);7169 pThis->pTADTimerRC = TMTimerRCPtr(pThis->pTADTimerR3); 7172 7170 # endif /* E1K_NO_TAD */ 7173 7171 #endif /* E1K_USE_TX_TIMERS */ 7174 7172 #ifdef E1K_TX_DELAY 7175 p State->pTXDTimerRC = TMTimerRCPtr(pState->pTXDTimerR3);7173 pThis->pTXDTimerRC = TMTimerRCPtr(pThis->pTXDTimerR3); 7176 7174 #endif /* E1K_TX_DELAY */ 7177 p State->pIntTimerRC = TMTimerRCPtr(pState->pIntTimerR3);7178 p State->pLUTimerRC = TMTimerRCPtr(pState->pLUTimerR3);7175 pThis->pIntTimerRC = TMTimerRCPtr(pThis->pIntTimerR3); 7176 pThis->pLUTimerRC = TMTimerRCPtr(pThis->pLUTimerR3); 7179 7177 } 7180 7178 … … 7190 7188 static DECLCALLBACK(int) e1kR3Destruct(PPDMDEVINS pDevIns) 7191 7189 { 7192 E1KSTATE* pState= PDMINS_2_DATA(pDevIns, E1KSTATE*);7190 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*); 7193 7191 PDMDEV_CHECK_VERSIONS_RETURN_QUIET(pDevIns); 7194 7192 7195 e1kDumpState(p State);7196 E1kLog(("%s Destroying instance\n", p State->szPrf));7197 if (PDMCritSectIsInitialized(&p State->cs))7198 { 7199 if (p State->hEventMoreRxDescAvail != NIL_RTSEMEVENT)7200 { 7201 RTSemEventSignal(p State->hEventMoreRxDescAvail);7202 RTSemEventDestroy(p State->hEventMoreRxDescAvail);7203 p State->hEventMoreRxDescAvail = NIL_RTSEMEVENT;7193 e1kDumpState(pThis); 7194 E1kLog(("%s Destroying instance\n", pThis->szPrf)); 7195 if (PDMCritSectIsInitialized(&pThis->cs)) 7196 { 7197 if (pThis->hEventMoreRxDescAvail != NIL_RTSEMEVENT) 7198 { 7199 RTSemEventSignal(pThis->hEventMoreRxDescAvail); 7200 RTSemEventDestroy(pThis->hEventMoreRxDescAvail); 7201 pThis->hEventMoreRxDescAvail = NIL_RTSEMEVENT; 7204 7202 } 7205 7203 #ifdef E1K_WITH_TX_CS 7206 PDMR3CritSectDelete(&p State->csTx);7204 PDMR3CritSectDelete(&pThis->csTx); 7207 7205 #endif /* E1K_WITH_TX_CS */ 7208 PDMR3CritSectDelete(&p State->csRx);7209 PDMR3CritSectDelete(&p State->cs);7206 PDMR3CritSectDelete(&pThis->csRx); 7207 PDMR3CritSectDelete(&pThis->cs); 7210 7208 } 7211 7209 return VINF_SUCCESS; … … 7291 7289 static DECLCALLBACK(int) e1kR3Construct(PPDMDEVINS pDevIns, int iInstance, PCFGMNODE pCfg) 7292 7290 { 7293 E1KSTATE *pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*);7291 PE1KSTATE pThis = PDMINS_2_DATA(pDevIns, E1KSTATE*); 7294 7292 int rc; 7295 7293 PDMDEV_CHECK_VERSIONS_RETURN(pDevIns); -
trunk/src/VBox/Devices/Network/DevEEPROM.h
r44529 r44542 30 30 * plain-old-data structure. 31 31 */ 32 struct EEPROM93C46 { 32 struct EEPROM93C46 33 { 33 34 /** General definitions */ 34 35 enum {
Note:
See TracChangeset
for help on using the changeset viewer.