Changeset 7266 in vbox
- Timestamp:
- Mar 4, 2008 10:00:24 AM (17 years ago)
- svn:sync-xref-src-repo-rev:
- 28604
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Network/DevPCNet.cpp
r7230 r7266 249 249 bool afAlignment[1]; 250 250 uint32_t u32LinkSpeed; 251 252 /* #define PCNET_QUEUE_SEND_PACKETS */ 253 #ifdef PCNET_QUEUE_SEND_PACKETS 254 #define PCNET_MAX_XMIT_SLOTS 128 255 #define PCNET_MAX_XMIT_SLOTS_MASK (PCNET_MAX_XMIT_SLOTS-1) 256 257 uint32_t ulXmitRingBufProd; 258 uint32_t ulXmitRingBufCons; 259 uint16_t cbXmitRingBuffer[PCNET_MAX_XMIT_SLOTS]; 260 R3PTRTYPE(char *) pXmitRingBuffer[PCNET_MAX_XMIT_SLOTS]; 261 #endif 251 262 252 263 STAMCOUNTER StatReceiveBytes; … … 578 589 (R)->rmd2.rcc, (R)->rmd2.rpc, (R)->rmd2.mcnt, \ 579 590 (R)->rmd2.zeros)) 591 592 #ifdef PCNET_QUEUE_SEND_PACKETS 593 static int pcnetSyncTransmit(PCNetState *pData); 594 #endif 580 595 581 596 /** … … 1830 1845 /* Clear counter .*/ 1831 1846 ASMAtomicAndU32(&pData->cPendingSends, 0); 1847 #ifdef PCNET_QUEUE_SEND_PACKETS 1848 pcnetSyncTransmit(pData); 1849 #else 1832 1850 int rc = RTSemEventSignal(pData->hSendEventSem); 1833 1851 AssertRC(rc); 1852 #endif 1834 1853 return true; 1835 1854 } … … 1892 1911 DECLINLINE(int) pcnetXmitCompleteFrame(PCNetState *pData) 1893 1912 { 1913 #ifdef PCNET_QUEUE_SEND_PACKETS 1914 Assert(!pData->cbXmitRingBuffer[pData->ulXmitRingBufProd]); 1915 memcpy(pData->pXmitRingBuffer[pData->ulXmitRingBufProd], pData->SendFrame.pvBuf, pData->SendFrame.cb); 1916 pData->cbXmitRingBuffer[pData->ulXmitRingBufProd] = (uint16_t)pData->SendFrame.cb; 1917 pData->ulXmitRingBufProd = (pData->ulXmitRingBufProd+1) & PCNET_MAX_XMIT_SLOTS_MASK; 1918 1919 int rc = RTSemEventSignal(pData->hSendEventSem); 1920 AssertRC(rc); 1921 1922 return VINF_SUCCESS; 1923 #else 1894 1924 /* Don't hold the critical section while transmitting data. */ 1895 1925 /** @note also avoids deadlocks with NAT as it can call us right back. */ … … 1899 1929 if (pData->SendFrame.cb > 70) /* unqualified guess */ 1900 1930 pData->Led.Asserted.s.fWriting = pData->Led.Actual.s.fWriting = 1; 1931 1901 1932 pData->pDrv->pfnSend(pData->pDrv, pData->SendFrame.pvBuf, pData->SendFrame.cb); 1902 1933 STAM_REL_COUNTER_ADD(&pData->StatTransmitBytes, pData->SendFrame.cb); … … 1905 1936 1906 1937 return PDMCritSectEnter(&pData->CritSect, VERR_PERMISSION_DENIED); 1938 #endif 1907 1939 } 1908 1940 … … 2012 2044 * Try to transmit frames 2013 2045 */ 2046 #ifdef PCNET_QUEUE_SEND_PACKETS 2014 2047 static int pcnetAsyncTransmit(PCNetState *pData) 2048 { 2049 Assert(PDMCritSectIsOwner(&pData->CritSect)); 2050 2051 while (pData->cbXmitRingBuffer[pData->ulXmitRingBufCons]) 2052 { 2053 /* Don't hold the critical section while transmitting data. */ 2054 /** @note also avoids deadlocks with NAT as it can call us right back. */ 2055 PDMCritSectLeave(&pData->CritSect); 2056 2057 STAM_PROFILE_ADV_START(&pData->StatTransmitSend, a); 2058 if (pData->SendFrame.cb > 70) /* unqualified guess */ 2059 pData->Led.Asserted.s.fWriting = pData->Led.Actual.s.fWriting = 1; 2060 2061 pData->pDrv->pfnSend(pData->pDrv, pData->pXmitRingBuffer[pData->ulXmitRingBufCons], pData->cbXmitRingBuffer[pData->ulXmitRingBufCons]); 2062 STAM_REL_COUNTER_ADD(&pData->StatTransmitBytes, pData->cbXmitRingBuffer[pData->ulXmitRingBufCons]); 2063 pData->Led.Actual.s.fWriting = 0; 2064 STAM_PROFILE_ADV_STOP(&pData->StatTransmitSend, a); 2065 2066 PDMCritSectEnter(&pData->CritSect, VERR_PERMISSION_DENIED); 2067 2068 pData->cbXmitRingBuffer[pData->ulXmitRingBufCons] = 0; 2069 pData->ulXmitRingBufCons = (pData->ulXmitRingBufCons+1) & PCNET_MAX_XMIT_SLOTS_MASK; 2070 } 2071 return VINF_SUCCESS; 2072 } 2073 2074 static int pcnetSyncTransmit(PCNetState *pData) 2075 #else 2076 static int pcnetAsyncTransmit(PCNetState *pData) 2077 #endif 2015 2078 { 2016 2079 unsigned cFlushIrq = 0; … … 4280 4343 PDMR3CritSectDelete(&pData->CritSect); 4281 4344 } 4345 #ifdef PCNET_QUEUE_SEND_PACKETS 4346 if (pData->pXmitRingBuffer) 4347 RTMemFree(pData->pXmitRingBuffer[0]); 4348 #endif 4282 4349 return VINF_SUCCESS; 4283 4350 } … … 4570 4637 AssertRCReturn(rc, rc); 4571 4638 4639 unsigned i; 4640 #ifdef PCNET_QUEUE_SEND_PACKETS 4641 pData->ulXmitRingBufProd = 0; 4642 pData->ulXmitRingBufCons = 0; 4643 pData->pXmitRingBuffer[0] = (char *)RTMemAlloc(PCNET_MAX_XMIT_SLOTS * 1536); 4644 pData->cbXmitRingBuffer[0] = 0; 4645 for (i=1;i<PCNET_MAX_XMIT_SLOTS;i++) 4646 { 4647 pData->pXmitRingBuffer[i] = pData->pXmitRingBuffer[i-1] + 1536; 4648 pData->cbXmitRingBuffer[i] = 0; 4649 } 4650 #endif 4651 4572 4652 #ifdef VBOX_WITH_STATISTICS 4573 4653 PDMDevHlpSTAMRegisterF(pDevIns, &pData->StatMMIOReadGC, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_TICKS_PER_CALL, "Profiling MMIO reads in GC", "/Devices/PCNet%d/MMIO/ReadGC", iInstance); … … 4599 4679 PDMDevHlpSTAMRegisterF(pDevIns, &pData->StatTmdStoreHC, STAMTYPE_PROFILE, STAMVISIBILITY_ALWAYS, STAMUNIT_TICKS_PER_CALL, "Profiling PCNet TmdStore in HC", "/Devices/PCNet%d/TmdStoreHC", iInstance); 4600 4680 4601 unsigned i;4602 4681 for (i = 0; i < ELEMENTS(pData->aStatXmitFlush) - 1; i++) 4603 4682 PDMDevHlpSTAMRegisterF(pDevIns, &pData->aStatXmitFlush[i], STAMTYPE_COUNTER, STAMVISIBILITY_USED, STAMUNIT_OCCURENCES, "", "/Devices/PCNet%d/XmitFlushIrq/%d", iInstance, i + 1);
Note:
See TracChangeset
for help on using the changeset viewer.