From 25a49804c077d476802ed6517ded03f6ae6121e4 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Fri, 5 Jul 2013 08:11:18 +0000 Subject: [PATCH] [RTL8139] - Fix receive stalling if more than 10 packets are in the receive window - Tune configuration to use larger DMA transfers and begin DMA earlier svn path=/trunk/; revision=59429 --- reactos/drivers/network/dd/rtl8139/interrupt.c | 12 ++++++++++-- reactos/drivers/network/dd/rtl8139/nic.h | 13 ++++++------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/reactos/drivers/network/dd/rtl8139/interrupt.c b/reactos/drivers/network/dd/rtl8139/interrupt.c index 18da02596b3..659e72d4b34 100644 --- a/reactos/drivers/network/dd/rtl8139/interrupt.c +++ b/reactos/drivers/network/dd/rtl8139/interrupt.c @@ -78,7 +78,6 @@ MiniportHandleInterrupt ( ) { PRTL_ADAPTER adapter = (PRTL_ADAPTER)MiniportAdapterContext; - ULONG i; ULONG txStatus; UCHAR command; PPACKET_HEADER nicHeader; @@ -146,7 +145,7 @@ MiniportHandleInterrupt ( // if (adapter->InterruptPending & (R_I_RXOK | R_I_RXERR)) { - for (i = 0; i < MAX_RECEIVES_PER_INT; i++) + for (;;) { NdisRawReadPortUchar(adapter->IoBase + R_CMD, &command); if (command & R_CMD_RXEMPTY) @@ -200,6 +199,15 @@ MiniportHandleInterrupt ( adapter->ReceiveOffset += nicHeader->PacketLength + sizeof(PACKET_HEADER); adapter->ReceiveOffset = (adapter->ReceiveOffset + 3) & ~3; NdisRawWritePortUshort(adapter->IoBase + R_CAPR, adapter->ReceiveOffset - 0x10); + + if (adapter->InterruptPending & (R_I_RXOVRFLW | R_I_FIFOOVR)) + { + // + // We can only clear these interrupts once CAPR has been reset + // + NdisRawWritePortUshort(adapter->IoBase + R_IS, R_I_RXOVRFLW | R_I_FIFOOVR); + adapter->InterruptPending &= ~(R_I_RXOVRFLW | R_I_FIFOOVR); + } } NdisMEthIndicateReceiveComplete(adapter->MiniportAdapterHandle); diff --git a/reactos/drivers/network/dd/rtl8139/nic.h b/reactos/drivers/network/dd/rtl8139/nic.h index e04e58d1ccf..c04963dccf9 100644 --- a/reactos/drivers/network/dd/rtl8139/nic.h +++ b/reactos/drivers/network/dd/rtl8139/nic.h @@ -12,9 +12,8 @@ #define RESOURCE_LIST_TAG 'Rltr' #define MAX_RESET_ATTEMPTS 25 -#define MAX_RECEIVES_PER_INT 10 -#define RECEIVE_BUFFER_SIZE (32768) -#define FULL_RECEIVE_BUFFER_SIZE (32768 + 16 + 2048) +#define RECEIVE_BUFFER_SIZE (65536) +#define FULL_RECEIVE_BUFFER_SIZE (65536 + 16 + 2048) #define RECV_CRC_LENGTH 4 #define MINIMUM_FRAME_SIZE 60 @@ -22,11 +21,11 @@ #define DRIVER_VERSION 1 -// 32K RX buffer, 512 byte DMA bursts -#define RC_VAL (0x0001680) +// 1/2 packet early RX, 512 byte FIFO threshold, 64K RX buffer, unlimited DMA bursts, WRAP +#define RC_VAL (0x800BF80) -// 1024 byte DMA bursts -#define TC_VAL (0x600) +// 2048 byte DMA bursts +#define TC_VAL (0x700) typedef struct _RTL_ADAPTER { NDIS_HANDLE MiniportAdapterHandle;