
RTL8100
2001/12/10
Rev.1.0
9
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);
}
PacketRecei+;
ByteRe= 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( CR);
if (TmpCMD & CR_BUFE)
{
break;
}
do
{
RxReadPtr = Rx RxReadPtrOffset;
pPacketHeader = (PPACKETHEADER) RxReadPtr;
pIncomePacket = RxR 4;
PktLength = pPacketHeader->PacketLength;
//this length include CRC
if ( PacketOK( pPacketHeader ) )
{
if ( (RxReadPtr PktLength) > RX_BUFFER_SIZE )
{ //wrap around to end of RxBuffer
memcpy( Rx RX_BUFFER_SIZE , RxBuffer,
(RxReadPtr PktLength - RX_BUFFER_SIZE) );
}
//copy the packet out here
CopyPacket(pIncomePacket,PktLength - 4);//don't copy 4 bytes CRC
//update
Read
Pointer
RxReadPtrOffset = (RxReadPtr Pkt 4 + 3) & RX_READ_POINTER_MASK;
//4:for header length(PktLength include 4 bytes CRC)
//3:for
dword
alignment
outport( CAPR, RxReadPtrOffset - 0x10);
//-4:avoid overflow
}
else
{
// ResetRx();
break;
}
TmpCMD = inportb( CR);
} while (!(TmpCMD & CR_BUFE));
}
return (TRUE); //Done
}