⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rtfast.c

📁 xp sp2 rtl8139 网卡驱动程序。
💻 C
📖 第 1 页 / 共 5 页
字号:
{
#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 + -