亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? lan91c111_intr.c

?? 網絡芯片Lan91c111 驅動程序 for windows CE 4.2
?? C
?? 第 1 頁 / 共 2 頁
字號:
	while (Adapter->AllocPending.First)
	{
		RetVal = LAN91C111_AdapterAllocBuffer(Adapter, &PacketNumber);
		if (STATUS_SUCCESS == RetVal)
		{
			//So we have some EXTRA memory.. transmit the packet
			DequePacket(Adapter->AllocPending, Packet);
			pNDISPacket = CONTAINING_RECORD(Packet,NDIS_PACKET,MiniportReserved[0]);
			LAN91C111_AdapterWriteData(Adapter, pNDISPacket, PacketNumber);
		}
		else
		{
			//Well let's wait for the packet to be allocated
			Adapter->AllocIntPending = TRUE;
			AllocIntEnabler(Adapter);
			break;
		}			
	}
	PrintDebugMsg(ZONE_TX, (TEXT("LAN91C111: <== Alloc Interrupt Handler\r\n")));
	return;
}

VOID    TX_Interrupt_Handler                    (MINIPORT_ADAPTER *Adapter)
{
    ULONG           IOBase;
    UINT            PacketNumber;
    USHORT          TempWord, PacketStatus;
    NDIS_STATUS     RetStatus = NDIS_STATUS_SUCCESS;
    MINIPORT_PACKET   *LocalPkt;
    NDIS_PACKET       *NdisPacket;
    
    PrintDebugMsg(ZONE_TX, (TEXT("LAN91C111: ==> TX Interrupt Handler\r\n")));

    IOBase = Adapter->IOBase;    
#ifndef SMSC_AUTO_RELEASE   
	NdisRawWritePortUshort(IOBase + BANK_SELECT,(USHORT)2);       
    //Read TXDONE Pkt# from FIFO Port Register
    NdisRawReadPortUshort(IOBase + BANK2_FIFOS, &PacketNumber);
    PacketNumber &= 0x007F;

	//Write to Packet Number Register
    NdisRawWritePortUshort(IOBase + BANK2_PNR,(USHORT) PacketNumber);

	//Read the Status
	NdisRawWritePortUshort(IOBase + BANK2_PTR,  (USHORT) (PTR_AUTO | PTR_READ));
	NdisStallExecution(1);
	NdisRawReadPortUshort(IOBase + BANK2_DATA1, (PUSHORT)&PacketStatus);
    
    //Release the Packet
    NdisRawWritePortUshort(IOBase + BANK2_MMU_CMD,(USHORT) CMD_REL_SPEC);
	NdisRawReadPortUshort(IOBase + BANK2_MMU_CMD, (PUSHORT) &TempWord);
	while (TempWord & MMUCMD_BUSY)
		NdisRawReadPortUshort(IOBase + BANK2_MMU_CMD, (PUSHORT) &TempWord);
	
    //Check for errors
    if (PacketStatus & TFS_OKAY)
    {
        RetStatus = NDIS_STATUS_SUCCESS;
        //Update statistic counters
        Adapter->Stat_TxOK++;        
    }
    else
    {
		RetStatus = NDIS_STATUS_FAILURE;
		Adapter->Stat_TxError++;	
    } 

    //Release the packet ownership and return the status
    LocalPkt = (MINIPORT_PACKET *) 0;
    DequePacket(Adapter->AckPending, LocalPkt);
    NdisPacket = CONTAINING_RECORD(LocalPkt,NDIS_PACKET,MiniportReserved[0]);
    NdisMSendComplete(Adapter->AdapterHandle, NdisPacket, RetStatus);	
#else
	//Check for any errors here and release the packet, in case of critical TX error
	NdisRawWritePortUshort(IOBase + BANK_SELECT,(USHORT)0);    
	NdisRawReadPortUshort(IOBase + BANK0_TCR, &TempWord);
	if (!(TempWord & TCR_TX_ENA))
	{
		//Error encountered in TX Clear the packet and set the TXENA
		NdisRawWritePortUshort(IOBase + BANK_SELECT,(USHORT)2);       
		//Read TXDONE Pkt# from FIFO Port Register
		NdisRawReadPortUshort(IOBase + BANK2_FIFOS, &PacketNumber);
		PacketNumber &= 0x007F;
		//Write to Packet Number Register
		NdisRawWritePortUshort(IOBase + BANK2_PNR,(USHORT) PacketNumber);
		NdisRawWritePortUshort(IOBase + BANK2_MMU_CMD,(USHORT) CMD_REL_SPEC);
		NdisRawReadPortUshort(IOBase + BANK2_MMU_CMD, (PUSHORT) &TempWord);
		while (TempWord & MMUCMD_BUSY)
			NdisRawReadPortUshort(IOBase + BANK2_MMU_CMD, (PUSHORT) &TempWord);
		NdisRawWritePortUshort(IOBase + BANK_SELECT,(USHORT)0);    
		NdisRawWritePortUshort(IOBase + BANK0_TCR, Adapter->TCR);		
	}	
#endif
    //Acknowledge the interrupt
    NdisRawWritePortUshort(IOBase + BANK_SELECT,(USHORT)2);       
    NdisRawWritePortUshort(IOBase + BANK2_INT_STS, INT_TX_CMP);
    
    PrintDebugMsg(ZONE_TX, (TEXT("LAN91C111: <== TX Interrupt Handler #%d\r\n"), PacketNumber));
    return;
}

VOID		RCV_Interrupt_Handler		(MINIPORT_ADAPTER *Adapter)
{
	ULONG				IOBase, DataPort, PtrPort, RxFifoPort, MMUPort;
	USHORT				FIFO;
	USHORT				PacketStatus;
    USHORT				PacketRange, TempRange;
	USHORT				*ReadBuffer;
	MAC_RECEIVE_CONTEXT Context;
	int					iLength, MaxFrameSize;
	UINT				iIndex;
	SMC_PACK_HEADER		*PackHead;

#ifdef SMSC_32BIT_RW
	ULONG				dFifoData;
	USHORT				PacketControl;
#else
	USHORT				dFifoData;
#endif
	
	IOBase		= Adapter->IOBase;
	DataPort	= IOBase + BANK2_DATA1;
	PtrPort		= IOBase + BANK2_PTR;
	RxFifoPort	= IOBase + BANK2_RX_FIFO;
	MMUPort		= IOBase + BANK2_MMU_CMD;
	MaxFrameSize = MAX_FRAME_SIZE + ETHERNET_HEADER_SIZE + 4;
	PrintDebugMsg(ZONE_RX, (TEXT("LAN91C111: ==> RX Interrupt Handler\r\n")));
	
	//Assume no packet rcvd
	Adapter->NeedIndComplete = FALSE;
	//Check the fifo for the packets to be recvd
	NdisRawWritePortUshort(IOBase + BANK_SELECT,(USHORT)2);
    NdisRawReadPortUshort(IOBase + BANK2_FIFOS, &FIFO);

	while(!(FIFO & FIFO_RX_EMPTY))
	{
		
		//Set the pointer to Recieve Area, Auto Increment and Read mode
		NdisRawWritePortUshort(PtrPort,  (USHORT) (PTR_RCV | PTR_AUTO | PTR_READ));
		NdisStallExecution(1); //Atleast 370ns, so setting to 1us
#ifdef SMSC_32BIT_RW
		PackHead = (SMC_PACK_HEADER *) Adapter->LookAheadBuffer;
		//Read the first word of the rx area to get the packet status and length
		NdisRawReadPortBufferUlong(DataPort,(USHORT *) PackHead,(ULONG)1);
		PacketStatus = PackHead->Status;
        PacketRange  = PackHead->Range;
		PrintDebugMsg(ZONE_RX, (TEXT("PacketSts=%04X, PacketRange=%d\r\n"), PacketStatus, PacketRange));
#else
		NdisRawReadPortUshort(DataPort, (USHORT *)&dFifoData);
		PacketStatus = (USHORT)dFifoData;
		NdisRawReadPortUshort(DataPort, (USHORT *)&dFifoData);
		PacketRange  = (USHORT)dFifoData;
		PrintDebugMsg(ZONE_RX, (TEXT("FIFO=%08X, PacketSts=%04X, PacketRange=%d\r\n"), dFifoData, PacketStatus, PacketRange));		
#endif		
		//Check for errors.  And discard if bad.
		if ((PacketStatus & RFS_ERROR) || (PacketRange > MaxFrameSize) || (PacketRange < MIN_FRAME_SIZE))
        {
			if(PacketStatus & RFS_ALIGN)
                Adapter->Stat_AlignError++;
			//Release the frame.  This acknowledges the interrupt.
            NdisRawWritePortUshort(MMUPort, (USHORT) CMD_REM_REL_TOP);
			//Update the counter
			Adapter->Stat_RxError++;
			//Get ready for the next packet
			NdisRawReadPortUshort( IOBase + BANK2_FIFOS, &FIFO);
			continue;
        }

		//Good frame received - adjust range for SMSC packet overhead.
		PacketRange -= FRAME_OVERHEAD;
		
		ReadBuffer = Adapter->LookAheadBuffer;		
#ifdef SMSC_32BIT_RW
		iIndex = (PacketRange-1)>>1; //index to the last data 
		iLength = PacketRange >> 2;
		NdisRawReadPortBufferUlong(DataPort, (ULONG *)ReadBuffer, iLength);
		NdisRawReadPortUlong(DataPort, (PULONG) &dFifoData);
		PrintDebugMsg(ZONE_RX, (TEXT("HW=%04X, LW=%04X\r\n"), HIWORD(dFifoData), LOWORD(dFifoData)));		
		PrintDebugMsg(ZONE_RX, (TEXT("HB-HW=%02X, LB-HW=%02X, HB-LW=%02X, LB-LW=%02X\r\n"), 
			HIBYTE(HIWORD(dFifoData)), LOBYTE(HIWORD(dFifoData)), HIBYTE(LOWORD(dFifoData)), LOBYTE(LOWORD(dFifoData))));		

		//WARNING: This needs to be changed according to the platform's endianess
		//HiWord always contains the last word
		if (PacketRange % 4)
		{
			//One extra word 
			//LoWord contains the Data
			//HiWord contains the Control			
			ReadBuffer[iIndex++] = LOWORD(dFifoData);
			PacketControl = HIWORD(dFifoData);
		}
		else
		{
			//LoWord contains the Conrol
			//HiWord trash
			PacketControl = LOWORD(dFifoData);
		}		
		if ((PacketStatus & RFS_ODD) || (Adapter->ChipRev == CHIPREV_LAN91C111_REVA))
		{
			PacketRange++;
			iIndex = (PacketRange-1)>>1; //index to the last data 
			ReadBuffer[iIndex]  = LOBYTE(PacketControl);			
			PrintDebugMsg(ZONE_RX, (TEXT("Packet Odd Size=%02X, Index=%02X, OddByte=%02X\r\n"), PacketRange, iIndex, LOBYTE(PacketControl)));
		}		
#else
		iLength = PacketRange >> 1;
		NdisRawReadPortBufferUshort(DataPort, (USHORT *)ReadBuffer, iLength);
		NdisRawReadPortUshort(DataPort, (USHORT *)&dFifoData);		
		if ((PacketStatus & RFS_ODD) || (Adapter->ChipRev == CHIPREV_LAN91C111_REVA))
		{
			PacketRange++;
			iIndex = (PacketRange-1)>>1; //index to the last data 
			ReadBuffer[iIndex]  = (BYTE)dFifoData;			
		}
#endif		
		if (Adapter->PromiscuousMode != TRUE)
		{
			if (PacketStatus & RFS_BCAST)
			{
				if (Adapter->RCVBroadcast == FALSE) 
				{
					//Release the frame.  This acknowledges the interrupt.
					NdisRawWritePortUshort(MMUPort, (USHORT) CMD_REM_REL_TOP);
					//Get ready for the next packet
					NdisRawReadPortUshort( IOBase + BANK2_FIFOS, &FIFO);
					continue;
				}
			}
            else
            {
                if ((PacketStatus & RFS_MCAST) && (Adapter->RCVAllMulticast == FALSE))
                {
                    //Recv only the mulitcast with the address in the multicast table
                    if(!CheckMultiCastAddress((PUSHORT)ReadBuffer,Adapter))
                    {
                        //Release the frame.  This acknowledges the interrupt.
                        NdisRawWritePortUshort(MMUPort, (USHORT) CMD_REM_REL_TOP);
                        //Get ready for the next packet
                        NdisRawReadPortUshort( IOBase + BANK2_FIFOS, &FIFO);
                        continue;
                    }
                }
            }
		}
		
		// Release the frame.  This acknowledges the interrupt.
        NdisRawWritePortUshort(MMUPort,(USHORT) CMD_REM_REL_TOP);
		
		Context.Range		= PacketRange;
        Context.PacketData	= (USHORT *)ReadBuffer;
		TempRange			= PacketRange - ETHERNET_HEADER_SIZE;
		//Indicate the frame
		
		NdisMEthIndicateReceive(Adapter->AdapterHandle,
			(NDIS_HANDLE) &Context,
			(void *) ReadBuffer,
			(UINT) ETHERNET_HEADER_SIZE,
			(void *) ((char *) ReadBuffer + ETHERNET_HEADER_SIZE),
			TempRange,
			TempRange);
		Adapter->NeedIndComplete = TRUE;
		//Update the counter
		Adapter->Stat_RxOK++;
		
		//Next Frame....
		NdisRawReadPortUshort( IOBase + BANK2_FIFOS, &FIFO);		
	} 
	if (Adapter->NeedIndComplete)
		NdisMEthIndicateReceiveComplete(Adapter->AdapterHandle);

	PrintDebugMsg(ZONE_INTR, (TEXT("LAN91C111: <== RX Interrupt Handler\r\n")));
}

BOOLEAN CheckMultiCastAddress(USHORT *ReadBuffer, MINIPORT_ADAPTER *Adapter)
{
	//Start of CheckMultiCastAddress Function definition
	
	UINT Result;
	PUCHAR ListEntry;
	ULONG Count;
	
	PrintDebugMsg(ZONE_INIT, (TEXT("LAN91C111: ==> CheckMultiCastAddress\r\n")));
	
	Result = 1;
	Count = 0;
	ListEntry = Adapter->MulticastTable.MulticastTableEntry;
	
	//If empty list then get out.
	if(Adapter->MulticastTable.MulticastTableEntryCount == 0)
		return FALSE;
	
	// checking all the multicasttable entries against frame address.
	for(Count = 0; Count <Adapter->MulticastTable.MulticastTableEntryCount; Count++)
	{
		// Compare the Ethernet Frame Address with MulticastTableList
		ETH_COMPARE_NETWORK_ADDRESSES(ReadBuffer,	ListEntry,	&Result);
		if(!Result)	break;
		ListEntry += 6;//See next entry in multicast list
	}
	
	//returning the value depending upon the MultiCastTableCount.
	//If Less than TotalCount return TRUE means finds some multicast address
	// same as frame adress
	if(Count <= Adapter->MulticastTable.MulticastTableEntryCount)
		return TRUE;
	else	
		return FALSE;
	
	PrintDebugMsg(ZONE_INIT, (TEXT("LAN91C111: <== CheckMultiCastAddress\r\n")));
}

VOID		AllocIntEnabler	(MINIPORT_ADAPTER *Adapter)
{
	USHORT SavedBS, OldIntReg;
	
	NdisRawReadPortUshort(Adapter->IOBase + BANK_SELECT, &SavedBS);
	NdisRawWritePortUshort(Adapter->IOBase + BANK_SELECT,(USHORT) 2);
	NdisRawReadPortUshort(Adapter->IOBase + BANK2_INT_STS, &OldIntReg);
	OldIntReg &= 0xFF00; //Donot ack
	OldIntReg |= INT_ALLOC;
	NdisRawWritePortUshort(Adapter->IOBase + BANK2_INT_STS,OldIntReg);
	NdisRawWritePortUshort(Adapter->IOBase + BANK_SELECT, SavedBS);
	
	return;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧洲色图综合| 欧美成人三级电影在线| 亚洲欧洲精品一区二区三区 | 视频一区免费在线观看| 欧美午夜一区二区三区 | 欧美另类z0zxhd电影| 一区二区三区日韩精品视频| 欧美性视频一区二区三区| 午夜精品福利久久久| 欧美不卡123| 成人一区二区在线观看| 亚洲欧美日韩小说| 欧美日韩国产首页| 激情综合网av| 国产精品高潮久久久久无| 欧美影院一区二区| 老汉av免费一区二区三区| 日本一区二区三区在线不卡| 色狠狠综合天天综合综合| 婷婷成人激情在线网| 国产午夜精品福利| 日本道免费精品一区二区三区| 亚洲成人高清在线| 国产午夜精品一区二区三区视频 | 亚洲乱码中文字幕| 日韩欧美卡一卡二| caoporn国产精品| 日韩av不卡在线观看| 国产精品丝袜黑色高跟| 欧美手机在线视频| 高清国产一区二区| 日韩vs国产vs欧美| 亚洲视频一二区| 精品乱人伦一区二区三区| 99re8在线精品视频免费播放| 日韩精品91亚洲二区在线观看 | 亚洲少妇30p| 日韩西西人体444www| 91污在线观看| 国产在线精品国自产拍免费| 亚洲图片欧美综合| 亚洲国产经典视频| 日韩亚洲欧美一区二区三区| 色婷婷av一区二区三区软件| 国产福利视频一区二区三区| 五月激情综合网| 最近日韩中文字幕| 欧美国产精品v| 精品三级av在线| 91精品国产91久久综合桃花 | 久久精品亚洲一区二区三区浴池| 欧美色综合网站| 91在线观看高清| 国产一区二区导航在线播放| 三级在线观看一区二区| 夜夜精品浪潮av一区二区三区| 国产亚洲欧美在线| 精品国产电影一区二区| 欧美一区二区三区系列电影| 欧美偷拍一区二区| 91国产精品成人| 91在线观看美女| 97超碰欧美中文字幕| 丰满白嫩尤物一区二区| 国产传媒日韩欧美成人| 国产精品一线二线三线| 捆绑调教一区二区三区| 麻豆91在线看| 国产精品99久久久久久久vr| 美国十次综合导航| 久久草av在线| 精品一区二区三区免费观看| 久久国产剧场电影| 极品少妇xxxx精品少妇| 国产酒店精品激情| 国产精品资源网站| 国产精品资源网| 国产成人免费xxxxxxxx| 高清久久久久久| 91在线观看一区二区| 91网站在线观看视频| 色网站国产精品| 欧美性xxxxxxxx| 91精品国产综合久久久久久| 91精品欧美福利在线观看| 欧美一区二区精品在线| 日韩视频免费观看高清完整版 | 91精品国产91久久久久久最新毛片 | 99国产精品国产精品久久| www.性欧美| 在线精品视频一区二区三四| 欧美日韩五月天| 欧美一卡2卡3卡4卡| 欧美大片顶级少妇| 久久精品人人爽人人爽| 国产精品三级视频| 亚洲精品免费视频| 天天av天天翘天天综合网| 日本在线不卡视频| 国产麻豆精品95视频| caoporen国产精品视频| 在线看日本不卡| 欧美一级日韩免费不卡| 久久久精品天堂| 亚洲人快播电影网| 免费成人av在线播放| 国产成人午夜视频| 欧美主播一区二区三区美女| 日韩精品一区二区三区在线观看| 国产午夜精品在线观看| 亚洲精品高清在线| 麻豆精品在线看| www.视频一区| 日韩视频一区二区在线观看| 国产精品乱人伦中文| 五月婷婷综合激情| 粉嫩aⅴ一区二区三区四区| 欧美日韩精品一区二区三区四区 | 538在线一区二区精品国产| 国产亚洲综合av| 一区二区三区免费在线观看| 麻豆国产一区二区| 国产欧美一区二区三区在线老狼 | 一区二区三区在线免费观看 | 夜夜嗨av一区二区三区网页| 国产在线播放一区二区三区| 色综合咪咪久久| 精品国产乱码久久久久久蜜臀 | 午夜精品一区二区三区三上悠亚 | 欧美96一区二区免费视频| 国产成人av一区二区三区在线| 在线精品国精品国产尤物884a| 久久嫩草精品久久久久| 亚洲午夜一二三区视频| 国产.精品.日韩.另类.中文.在线.播放| 欧洲一区二区三区免费视频| 久久精品视频在线免费观看| 日韩黄色在线观看| 99久久精品免费看国产免费软件| 精品理论电影在线观看| 亚洲一区二区精品3399| youjizz久久| 久久综合99re88久久爱| 日欧美一区二区| 91国产免费看| 中文字幕亚洲区| 国产宾馆实践打屁股91| 日韩三级视频在线观看| 亚洲综合图片区| eeuss鲁一区二区三区| 国产午夜亚洲精品午夜鲁丝片| 麻豆精品一区二区三区| 欧美巨大另类极品videosbest| 亚洲欧美日韩久久| www.综合网.com| 国产精品福利av| 成人美女视频在线看| 国产日韩亚洲欧美综合| 久久69国产一区二区蜜臀| 欧美一级片在线| 日韩极品在线观看| 911精品产国品一二三产区| 亚洲第一电影网| 欧美日韩激情在线| 天堂va蜜桃一区二区三区漫画版| 欧美亚洲一区三区| 亚洲综合久久久久| 欧美午夜宅男影院| 亚洲123区在线观看| 欧美日韩激情一区| 亚洲成人激情综合网| 欧美日产在线观看| 无吗不卡中文字幕| 欧美一区二区三区在线视频| 日韩电影一区二区三区| 日韩精品中文字幕在线不卡尤物| 免费高清在线视频一区·| 日韩三级.com| 国产激情一区二区三区四区| 国产视频一区在线播放| 成人夜色视频网站在线观看| 国产精品美女一区二区三区 | 国产乱码精品一区二区三区忘忧草 | 舔着乳尖日韩一区| 欧美一区二区免费视频| 裸体在线国模精品偷拍| 亚洲精品一区二区三区福利| 国产成人免费xxxxxxxx| 1024成人网色www| 欧美色倩网站大全免费| 奇米综合一区二区三区精品视频| 日韩视频在线你懂得| 国产高清不卡一区| 1000部国产精品成人观看| 欧美在线视频不卡| 日本免费在线视频不卡一不卡二 | 欧美日韩精品一区二区天天拍小说 | 亚洲人成网站在线| 欧美理论在线播放| 国产精品一区一区三区|