📄 rtfast.c
字号:
{
#if DBG
DbgPrint("===>RTFast_DisableInterrupt\n");
#endif
Adapter->sysInterruptStatus = 0;
WritePortUSHORT(IMR, 0);
#if DBG
DbgPrint("<===RTFast_DisableInterrupt\n");
#endif
}
VOID ClearConfigBit (
IN PRTFAST_ADAPTER Adapter,
IN UCHAR portoffset,
IN UCHAR bit
)
{
#if DBG
DbgPrint("===>SetConfigBit %02x %02x\n", portoffset, bit);
#endif
WritePortUCHAR(CR9346, 0xC0);
WritePortUCHAR(portoffset, (~bit) & ReadPortUCHAR(portoffset));
WritePortUCHAR(CR9346, 0);
#if DBG
DbgPrint("<===ClearConfigBit\n");
#endif
}
VOID SetConfigBit (
IN PRTFAST_ADAPTER Adapter,
IN UCHAR portoffset,
IN UCHAR bit
)
{
#if DBG
DbgPrint("===>SetConfigBit %02x %02x\n", portoffset, bit);
#endif
WritePortUCHAR(CR9346, 0xC0);
WritePortUCHAR(portoffset, bit | ReadPortUCHAR(portoffset));
WritePortUCHAR(CR9346, 0);
#if DBG
DbgPrint("<===SetConfigBit\n");
#endif
}
VOID ResetCounters (
IN PRTFAST_ADAPTER Adapter
)
{
#if DBG
DbgPrint("===>ResetCounters\n");
#endif
Adapter->FramesXmitGood = 0;
Adapter->FramesRcvGood = 0;
Adapter->FramesXmitBad = 0;
Adapter->FramesXmitOneCollision = 0;
Adapter->FramesXmitManyCollisions = 0;
Adapter->FrameAlignmentErrors = 0;
Adapter->CrcErrors = 0;
Adapter->MissedPackets = 0;
#if DBG
DbgPrint("<===ResetCounters\n");
#endif
}
BOOLEAN SyncCardStop (
IN PRTFAST_ADAPTER Adapter
)
{
#if DBG
DbgPrint("===>SyncCardStop\n");
#endif
WritePortUCHAR(CONFIG5, ~0x10 & ReadPortUCHAR(CONFIG5) );
WritePortUCHAR(CR, 0);
#if DBG
DbgPrint("<===SyncCardStop\n");
#endif
return(FALSE);
}
BOOLEAN CardStart (
IN PRTFAST_ADAPTER Adapter
)
{
#if DBG
DbgPrint("===>CardStart\n");
#endif
WritePortULONG(TCR, Adapter->TxConfig);
#if DBG
DbgPrint("<===CardStart\n");
#endif
return(TRUE);
}
BOOLEAN CardReset (
IN PRTFAST_ADAPTER Adapter
)
{
#if DBG
DbgPrint("===>CardReset\n");
#endif
if(!CardSetup(Adapter))
{
NdisWriteErrorLogEntry(Adapter->MiniportHandle, EVENT_NDIS_HARDWARE_FAILURE, 2, 0, 1);
#if DBG
DbgPrint("<===CardReset:error\n");
#endif
return(FALSE);
}
#if DBG
DbgPrint("<===CardReset\n");
#endif
return CardStart(Adapter);
}
BOOLEAN ResetAdapter (
IN PRTFAST_ADAPTER Adapter
)
{
#if DBG
DbgPrint("===>ResetAdapter\n");
#endif
RTFast_DisableInterrupt(Adapter);
SyncCardStop(Adapter);
CleanupSendedPackets(Adapter);
ResetCounters(Adapter);
Adapter->FirstPacket = 0; // dw
Adapter->LastPacket = 0; // dw
Adapter->HwFinishTxPacket = 0;
Adapter->HwUnFinTxPackets = 0x10;
Adapter->CurTxDesc = 4;
Adapter->CurrentTxPacket = 0;
Adapter->NextTxPacket = 0;
#if DBG
DbgPrint("<===ResetAdapter\n");
#endif
return CardReset(Adapter);
}
VOID SetLDPS (
IN PRTFAST_ADAPTER Adapter,
IN UCHAR state
)
{
UCHAR x;
#if DBG
DbgPrint("===>SetLDPS\n");
#endif
x = ReadPortUCHAR(CONFIG5);
if(state == 4) {
if(4 & x) // already disabled
return;
x |= 4;
WritePortUCHAR(CONFIG5, x); // disable LDPS
} else {
if((4 & x) == 0) // already enabled
return;
x &= ~4;
WritePortUCHAR(CONFIG5,x); //
}
#if DBG
DbgPrint("<===SetLDPS\n");
#endif
return;
}
VOID RTFast_Delay (
IN ULONG MicroSeconds,
IN BOOLEAN bwhat
)
{
ULONG dms = MicroSeconds/32;
#if DBG
DbgPrint("===>RTFast_Delay\n");
#endif
while(dms>0) {
KeStallExecutionProcessor(0x32);
dms--;
}
#if DBG
DbgPrint("<===RTFast_Delay\n");
#endif
}
VOID WriteLinkParam (
IN PRTFAST_ADAPTER Adapter
)
{
#if DBG
DbgPrint("===>WriteLinkParam\n");
#endif
RTFast_Delay(0x186A0, 1);
switch( 7 & (ReadPortUSHORT(CSCR)>>0xC) ) {
case 0:
Rtl8139set_param(Adapter, 0, 1);
#if DBG
DbgPrint("<===WriteLinkPara:abort : 0 \n");
#endif
return;
case 1:
Rtl8139set_param(Adapter, 1, 1);
#if DBG
DbgPrint("<===WriteLinkPara:abort : 1 \n");
#endif
return;
case 3:
Rtl8139set_param(Adapter, 2, 1);
#if DBG
DbgPrint("<===WriteLinkPara:abort : 3 \n");
#endif
return;
case 7:
Rtl8139set_param(Adapter, 3, 1);
RTFast_Delay(0x186A0, 1);
if(0x7000 == ReadPortUSHORT(CSCR) )
{
#if DBG
DbgPrint("<===WriteLinkPara:abort : 7\n");
#endif
return;
}
Rtl8139set_param(Adapter, 5, 1);
RTFast_Delay(0x186A0, 1);
Rtl8139set_param(Adapter, 0, 1);
}
#if DBG
DbgPrint("<===WriteLinkParam\n");
#endif
return;
}
VOID Setup2ndNway (
IN PRTFAST_ADAPTER Adapter
)
{
ULONG x;
#if DBG
DbgPrint("===>Setup2ndNway\n");
#endif
if(4 & ReadPortUCHAR(MSR) )
{
WritePortUSHORT(BMCR, 0x1000);
WritePortUSHORT(ISR, 0x20);
#if DBG
DbgPrint("<===Setup2ndNway: abort\n");
#endif
return;
}
if(!(1 & ReadPortUSHORT(ANER)))
{
RestartNway(Adapter);
WritePortUSHORT(ISR, 0x20);
return;
}
switch(Adapter->DuplexMode)
{
case 1:
x = 0x1000;
break;
case 2:
x = 0;
break;
case 3:
x = 0x100;
break;
case 4:
x = 0x2000;
break;
case 5:
x = 0x2100;
break;
default:
x = (USHORT)Adapter->MiniportHandle; // recycled stuff?
}
WritePortUSHORT(BMCR, x);
Adapter->bInReseting = 0;
WritePortUSHORT(ISR, 0x20); // underrun or linkchange
#if DBG
DbgPrint("<===Setup2ndNway\n");
#endif
return;
}
VOID InitialNwayCheckingTimerProc (
IN PVOID SystemSpecific1,
IN PRTFAST_ADAPTER Adapter,
IN PVOID SystemSpecific2,
IN PVOID SystemSpecific3
)
{
#if DBG
DbgPrint("===>InitialNwayCheckingTimerProc\n");
#endif
if( 4 & ReadPortUCHAR(MSR)) //link failed
{
WritePortUSHORT(ISR, 0x20); // underrun or linkchange
Setup2ndNway(Adapter);
} else {
Adapter->TimeRem2InitNWay += 0x32;
if(Adapter->TimeRem2InitNWay < 0x0BB8 )
{
NdisSetTimer((PNDIS_TIMER)&Adapter->InitNwayChkingTimer, 0x32);
} else {
Adapter->bInReseting = 0;
Adapter->connectStatus = NDIS_STATUS_MEDIA_DISCONNECT;
}
}
#if DBG
DbgPrint("<===InitialNwayCheckingTimerProc\n");
#endif
}
VOID SetupLink (
IN PRTFAST_ADAPTER Adapter
)
{
USHORT x;
#if DBG
DbgPrint("===>SetupLink\n");
#endif
if( Adapter->ChipVersion == 0 || Adapter->ChipVersion == 1)
{
RTFast_Delay(0x186A0, 0);
x = ReadPortUSHORT(CSCR);
if (4 & (x>>8))
{
WritePortUSHORT(CSCR, 0x3C0);
WriteLinkParam(Adapter);
}
}
NdisMInitializeTimer((PNDIS_MINIPORT_TIMER)&Adapter->LnkChgReNwayTimer,
Adapter->MiniportHandle,
(PNDIS_TIMER_FUNCTION)LinkChangeReNwayTimerProc, Adapter);
NdisMInitializeTimer((PNDIS_MINIPORT_TIMER)&Adapter->NwayCheckingTimer,
Adapter->MiniportHandle,
(PNDIS_TIMER_FUNCTION)NwayCheckingTimerProc, Adapter);
NdisMInitializeTimer((PNDIS_MINIPORT_TIMER)&Adapter->InitNwayChkingTimer,
Adapter->MiniportHandle,
(PNDIS_TIMER_FUNCTION)InitialNwayCheckingTimerProc, Adapter);
if((Adapter->DuplexMode == 1)
&& (0x1000 & ReadPortUSHORT(BMCR))
&& (0x1E1 == (0x1E1 & ReadPortUSHORT(ANAR))))
{
#if DBG
DbgPrint("<===SetupLink, aborted\n");
#endif
return;
}
WriteOurCapability(Adapter);
if(Adapter->ChipOnCardbus != 0)
{
NdisSetTimer((PNDIS_TIMER)&Adapter->InitNwayChkingTimer, 0x32);
Adapter->bInReseting = 1;
#if DBG
DbgPrint("<===SetupLink, not on cardbus\n");
#endif
return;
}
Setup2ndNway(Adapter);
return;
}
NDIS_STATUS RTFast_TransferData (
OUT PNDIS_PACKET Packet, // +8
OUT PUINT BytesTransferred, // +C
IN PRTFAST_ADAPTER MiniportAdapterContext, // +10
IN PRTFAST_ADAPTER Adapter, // +14 receivecontext
IN UINT ByteOffset, // +18 14
IN UINT BytesToTransfer // +1C d1
)
{
UINT CurBufLen; //ebp-4
ULONG BytesWanted; //ebp-8
PUCHAR CurBufAddress; //ebp-0Ch
PNDIS_BUFFER CurBuffer; //ebp+8
PUCHAR tempbuf;
UINT totalLen2Transfer, byteoffset, len;
#if DBG
DbgPrint("<===>RTFast_TransferData\n");
#endif
totalLen2Transfer = Adapter->PacketxLen - 4; // don't copy 4 bytes CRC
tempbuf = Adapter->RxPktDMAStart + ByteOffset;
if(BytesToTransfer + ByteOffset > totalLen2Transfer)
{
if(totalLen2Transfer <= ByteOffset + 0xE)
{
*BytesTransferred = 0;
return 0xC0000001;
}
totalLen2Transfer = Adapter->PacketxLen - ByteOffset - 0x12;
BytesWanted = totalLen2Transfer;
} else {
BytesWanted = BytesToTransfer;
totalLen2Transfer = BytesToTransfer;
}
NdisDprAcquireSpinLock(&Adapter->SpinLock);
NdisQueryPacket(Packet, NULL, NULL, &CurBuffer, NULL);
BytesToTransfer = totalLen2Transfer;
NdisQueryBufferSafe(CurBuffer, &CurBufAddress, &CurBufLen, NormalPagePriority);
byteoffset = 0;
if(totalLen2Transfer > 0)
{
do {
len = min(CurBufLen - byteoffset, BytesToTransfer);
NdisMoveMemory(CurBufAddress + byteoffset, tempbuf, len);
tempbuf += len;
BytesToTransfer -= len;
if(BytesToTransfer == 0)
break;
byteoffset += len;
if(byteoffset != CurBufLen)
continue;
NdisGetNextBuffer(CurBuffer, &CurBuffer);
if(CurBuffer == NULL)
break;
NdisQueryBufferSafe(CurBuffer,&CurBufAddress, &CurBufLen, NormalPagePriority);
byteoffset = 0;
} while(BytesToTransfer > 0);
totalLen2Transfer = BytesWanted;
}
NdisDprReleaseSpinLock(&Adapter->SpinLock);
*BytesTransferred = totalLen2Transfer - BytesToTransfer;
return NDIS_STATUS_SUCCESS;
}
/**/
VOID SyncCardStartXmit0 (
IN PRTFAST_ADAPTER Adapter
)
{
UCHAR NCC;
NCC = (UCHAR)(0x0F & (ReadPortULONG(TSD0) >> 0x18));
if(!NCC){
if(NCC == 1)
Adapter->FramesXmitOneCollision += 1;
else
Adapter->FramesXmitManyCollisions += 1;
}
WritePortULONG(TSAD0, Adapter->TxBufReadPtr[Adapter->CurrentTxPacket]);
WritePortULONG(TSD0, Adapter->PacketTxStatus[Adapter->CurrentTxPacket] | Adapter->EarlyTxThreshold);
return;
}
/**/
VOID SyncCardStartXmit1 (
IN PRTFAST_ADAPTER Adapter
)
{
UCHAR NCC;
NCC = (UCHAR)(0x0F & (ReadPortULONG(TSD1) >> 0x18));
if(!NCC){
if(NCC == 1)
Adapter->FramesXmitOneCollision += 1;
else
Adapter->FramesXmitManyCollisions += 1;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -