
RTL8100
2001/12/10
Rev.1.0
5
1.7 Sample Code
unsigned char
NextDesc(
unsigned char CurrentDescriptor
)
{
// (CurrentDescriptor == TX_SW_BUFFER_NUM-1) ? 0 : (1 + CurrentDescriptor);
if(CurrentDescriptor == TX_SW_BUFFER_NUM-1)
{
return 0;
}
else
{
return ( 1 + CurrentDescriptor);
}
}
unsigned char
CheckTSDStatus(
unsigned char Desc
)
{
ULONG Offset = Desc << 2;
ULONG tmpTSD;
tmpTSD=inpdw( TSD0 + Offset);
switch ( tmpTSD & (TSD_OWN | TSD_TOK) )
{
case (TSD_OWN | TSD_TOK):
return TSDSTATUS_BOTH;
case (TSD_TOK)
: return TSDSTATUS_TOK;
case (TSD_OWN)
: return TSDSTATUS_OWN;
case
0
: return
TSDSTATUS_0;
}
return 0;
}
void
IssueCMD(unsigned char descriptor)
{
unsigned long offset = descriptor << 2;
outpdw( TSAD0 + offset, TxDesc[TxHwSetupPtr].PhysicalAddress);
outpdw( TSD0 + offset , TxDesc[TxHwSetupPtr].PacketLength);
}
int
SendPacket(
PPACKET
pPacket
)
{
disable();
if( TxHwFreeDesc>0 )
{
TxDesc[TxHwSetupPtr].PacketLength=
CopyFromPacketToBuffer(
pPacket
,
TxDesc[TxHwSetupPtr].buffer);
IssueCMD(TxHwSetupPtr);
TxHwSetupPtr = NextDesc(TxHwSetupPtr);
TxHwFreeDesc--;
enable();
return
TRUE;//success
}
else
{
enable();
return FALSE;//out of resource
}
}
void
TxInterruptHandler()
{
while( (CheckTSDStatus(TxHwFinishPtr) == TSDSTATUS_BOTH ) &&
(TxHwFreeDesc < 4
) )
{
//can Release this buffer now
TxHwFinishPtr = NextDesc(TxHwFinishPtr);
TxHwF+;
}
}