Sample Code - Realtek RTL8100 Programming Manual

Single chip fast ethernet controller with power management
Table of Contents

Advertisement

2.7 Sample Code

BOOLEAN
PacketOK(
PPACKETHEADER pPktHdr
)
{
BOOLEAN BadPacket = pPktHdr->RUNT ||
pPktHdr->LONG ||
pPktHdr->CRC ||
pPktHdr->FAE;
if( ( !BadPacket ) &&
( pPktHdr->ROK ) )
{
if ( (pPktHdr->PacketLength > RX_MAX_PACKET_LENGTH ) ||
(pPktHdr->PacketLength < RX_MIN_PACKET_LENGTH ) )
{
return(FALSE);
}
PacketReceivedGood++;
ByteReceived += pPktHdr->PacketLength;
return TRUE ;
}
else
{
return FALSE;
}
}
BOOLEAN
RxInterruptHandler(
)
{
unsigned char TmpCMD;
unsigned int PktLength;
unsigned char *pIncomePacket, *RxReadPtr;
PPACKETHEADER pPacketHeader;
while (TRUE)
{
TmpCMD = inportb(IOBase + CR);
if (TmpCMD & CR_BUFE)
{
break;
}
do
{
RxReadPtr
= RxBuffer + RxReadPtrOffset;
pPacketHeader = (PPACKETHEADER) RxReadPtr;
pIncomePacket = RxReadPtr + 4;
PktLength
= pPacketHeader->PacketLength;
if ( PacketOK( pPacketHeader ) )
{
if ( (RxReadPtrOffset + PktLength) > RX_BUFFER_SIZE )
{
//wrap around to end of RxBuffer
memcpy( RxBuffer + RX_BUFFER_SIZE , RxBuffer,
(RxReadPtrOffset + PktLength - RX_BUFFER_SIZE) );
}
//copy the packet out here
CopyPacket(pIncomePacket,PktLength - 4);//don't copy 4 bytes CRC
//update Read Pointer
RxReadPtrOffset = (RxReadPtrOffset + PktLength + 4 + 3) & RX_READ_POINTER_MASK;
//4:for header length(PktLength include 4 bytes CRC)
//3:for dword alignment
outport( IOBase + CAPR, RxReadPtrOffset - 0x10);
}
else
{
//
ResetRx();
break;
}
TmpCMD = inportb(IOBase + CR);
} while (!(TmpCMD & CR_BUFE));
}
return (TRUE);
//Done
}
2001/12/10
//this length include CRC
//-4:avoid overflow
9
RTL8100
Rev.1.0

Hide quick links:

Advertisement

Table of Contents
loading

Table of Contents