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

📄 lan91c111_intr.c

📁 嵌入式网络芯片lan91c111的wince源码。
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 *
 *    Copyright (c) Standard MicroSystems Corporation.  All Rights Reserved.
 *
 *				    LAN91C111 Driver for Windows CE .NET
 *
 *							 Revision History
 *_______________________________________________________________________________
 *     Author		  Date		Version		Description
 *_______________________________________________________________________________
 * Pramod Bhardwaj  6/18/2002	  0.1		Beta Release 

 *_______________________________________________________________________________
 *
 * Description:
 *              Interrupt Service routines and other required functions for 
 *  processing the interrupts.
 *
 *
 */
#define NDIS_MINIPORT_DRIVER
#define NDIS50_MINIPORT

#include <Ndis.h>
#include <LAN91C111_Adapter.h>
#include <LAN91C111_Proto.h>



BOOLEAN CheckMultiCastAddress(UCHAR *ReadBuffer, MINIPORT_ADAPTER *Adapter);


/*
 Function Name : 	LAN91C111_MiniportISR
 Description   :
                    This routine is invoked when an interrupt occurs.  If
                    the interrupting device is identified as ours, then the DPC
                    is scheduled to complete the processing.
 Parameters    :
                         OUT PBOOLEAN     InterruptRecognized            Is it ours?
                         OUT PBOOLEAN     QueueMiniportHandleInterrupt   Run the DPC?
                         IN  NDIS_HANDLE  AdapterContext                 The Adapter structure.

 Return Value  :
                    VOID
*/
VOID		LAN91C111_MiniportISR		(
											PBOOLEAN    InterruptRecognized,
											PBOOLEAN    QueueMiniportHandleInterrupt,
											NDIS_HANDLE MiniportAdapterContext
										)
{
	MINIPORT_ADAPTER	*Adapter = (MINIPORT_ADAPTER *) MiniportAdapterContext;
	USHORT				temp;
	UCHAR				IntrSts;
    UCHAR				IntrMask;
	USHORT              SavedBank;
	
	NdisRawReadPortUshort(Adapter->IOBase + BANK_SELECT,(USHORT *) &SavedBank);    
	
	NdisRawWritePortUshort (Adapter->IOBase + BANK_SELECT,(USHORT) 2);
	NdisRawReadPortUshort  (Adapter->IOBase + BANK2_INT_STS, &temp);
	
	IntrSts  = LOBYTE(temp);
	IntrMask = HIBYTE(temp);
	if((IntrSts & (ENABLED_INTS | INT_ALLOC)))
	{
		NdisRawWritePortUshort(Adapter->IOBase + BANK2_INT_STS, 0); //Ack all intrs.. !!
		*InterruptRecognized			  =
			*QueueMiniportHandleInterrupt = TRUE;
	}
	else
	{
		*InterruptRecognized          =
			*QueueMiniportHandleInterrupt = FALSE;		
	}	
	
	NdisRawWritePortUshort(Adapter->IOBase + BANK_SELECT,SavedBank);	
	return;
}


/*
 Function Name : 	LAN91C111_MiniPortHandleInterrupt
 Description   :    
                    This routine performs deferred processing for adapter
                      interrupts.  All pending interrupt conditions are
                      handled before exit.
 Parameters    :
                    NDIS_HANDLE AdapterContext - Handle to the adapter structure

 Return Value  :
                       VOID
*/

VOID		LAN91C111_MiniPortHandleInterrupt	(IN NDIS_HANDLE  AdapterContext)
{
	MINIPORT_ADAPTER *Adapter = (MINIPORT_ADAPTER *) AdapterContext;
	USHORT          SavedBank;
	UINT			IOBase;
	UINT			IntrPort;
	USHORT			temp;
	UCHAR			IntrSts;

	IOBase		= Adapter->IOBase;
	IntrPort	= IOBase + BANK2_INT_STS;
	//Save the Bank Select..
	NdisRawReadPortUshort (IOBase + BANK_SELECT, &SavedBank);

	while(1)
	{
		NdisRawWritePortUshort(Adapter->IOBase + BANK_SELECT,(USHORT) 2);
		NdisRawReadPortUshort (IntrPort, &temp);
		IntrSts = LOBYTE(temp);
		IntrSts &= ENABLED_INTS;

		if(!IntrSts) break;

		if (IntrSts & INT_RX_CMP)
			RCV_Interrupt_Handler(Adapter);

		if (IntrSts & INT_TX_CMP)
			TX_Interrupt_Handler(Adapter);

		if (IntrSts & INT_RX_OVRN)
			RX_OVRN_Interrupt_Handler(Adapter);

		if (IntrSts & INT_EPH_INT)
			EPH_Interrupt_Handler(Adapter);

		if (IntrSts & INT_ALLOC)
			ALLOC_Interrupt_Handler(Adapter);


		if (IntrSts & INT_MDINT)
			MD_Interrupt_Handler(Adapter);
	}

	//Enable the interrupts
	//LAN91C111_MiniportEnableInterrupt(AdapterContext); //No need called by the wrapper..
	//Restore the Bank Select..
	NdisRawWritePortUshort(IOBase + BANK_SELECT, SavedBank);
	return;
}

VOID		LAN91C111_MiniportEnableInterrupt				(NDIS_HANDLE MiniportAdapterContext)
{
	MINIPORT_ADAPTER    *Adapter = (MINIPORT_ADAPTER *) MiniportAdapterContext;
    USHORT              IntrSts = ( ENABLED_INTS << 8 );
			
	DEBUGMSG(ZONE_INIT, (TEXT("LAN91C111: ==> MiniPort ENABLE Interrupt\r\n")));
	
	NdisRawWritePortUshort(Adapter->IOBase + BANK_SELECT,(USHORT) 2);
	NdisRawWritePortUshort( Adapter->IOBase + BANK2_INT_STS,IntrSts);		
	DEBUGMSG(ZONE_INIT, (TEXT("LAN91C111: <== MiniPort ENABLE Interrupt\r\n")));
	return;
}


VOID		LAN91C111_MiniportDisableInterrupt			(NDIS_HANDLE MiniportAdapterContext)
{
	MINIPORT_ADAPTER    *Adapter = (MINIPORT_ADAPTER *) MiniportAdapterContext;
    		
	DEBUGMSG(ZONE_INIT, (TEXT("LAN91C111: ==> MiniPort DISABLE Interrupt\r\n")));
		
	NdisRawWritePortUshort(Adapter->IOBase + BANK_SELECT,(USHORT) 2);
	NdisRawWritePortUchar( Adapter->IOBase + BANK2_INT_MSK,0);
		
	DEBUGMSG(ZONE_INIT, (TEXT("LAN91C111: <== MiniPort DISABLE Interrupt\r\n")));
	return;
}


VOID			MD_Interrupt_Handler	(MINIPORT_ADAPTER *Adapter)
{
	DEBUGMSG(ZONE_INIT, (TEXT("LAN91C111: ==> MDINT Interrupt Handler\r\n")));
	
	//Acknowledge the interrupt
	NdisRawWritePortUshort(Adapter->IOBase + BANK_SELECT,2);
	NdisRawWritePortUchar (Adapter->IOBase + BANK2_INT_STS,INT_MDINT);

	//Acknowledge the PHY interrupt
	ReadPhyRegister(Adapter->IOBase, 18);

	//Indicate to the change to the higher layer.
	if (Adapter->LinkStatus == MEDIA_CONNECTED)
	{
        NdisMIndicateStatus(Adapter->AdapterHandle,NDIS_STATUS_MEDIA_DISCONNECT,NULL,0);
		Adapter->LinkStatus = MEDIA_DISCONNECTED;
	}
	else
	{
		//Re-Negotiate the Link..
		EstablishLink(Adapter);
		NdisMIndicateStatus(Adapter->AdapterHandle,NDIS_STATUS_MEDIA_CONNECT,NULL,0);
		Adapter->LinkStatus = MEDIA_CONNECTED;
	}
	NdisMIndicateStatusComplete(Adapter->AdapterHandle);
		
	DEBUGMSG(ZONE_INIT, (TEXT("LAN91C111<== MDINT Interrupt\r\n")));
	return;
}

VOID		EPH_Interrupt_Handler		(MINIPORT_ADAPTER *Adapter)
{
	USHORT EPHStatus;
	USHORT temp;
	DEBUGMSG(ZONE_INIT, (TEXT("LAN91C111: ==> EPH Interrupt Handler\r\n")));
		
	//Read the EPH Status register
	NdisRawWritePortUshort(Adapter->IOBase + BANK_SELECT, (USHORT) 0);
	NdisRawReadPortUshort(Adapter->IOBase + BANK0_STS, &EPHStatus);

	//Check for errors
	if (EPHStatus & TFS_LINKERROR)
	{
		//Acked by clearing the LE_ENABLE bit in the Control Register
		DEBUGMSG(ZONE_INIT, (TEXT("LAN91C111: LINK_OK\r\n")));
	}
	if (EPHStatus & TFS_COUNTER)
	{
		//This is cleared by reading the ECR
		NdisRawReadPortUshort(Adapter->IOBase + BANK0_CTR, &temp);
	}

	//Renable the Transmitter..
	NdisRawWritePortUshort(Adapter->IOBase + BANK_SELECT, (USHORT) 0);
	NdisRawWritePortUshort(Adapter->IOBase + BANK0_TCR, Adapter->TCR);

	DEBUGMSG(ZONE_INIT, (TEXT("LAN91C111: <== EPH Interrupt Handler\r\n")));
}


VOID		RX_OVRN_Interrupt_Handler	(MINIPORT_ADAPTER *Adapter)
{
	DEBUGMSG(ZONE_INIT, (TEXT("LAN91C111: ==> RX OVRN Interrupt Handler\r\n")));
	//Acknowledge the interrupt
	NdisRawWritePortUshort(Adapter->IOBase + BANK_SELECT,2);
	NdisRawWritePortUchar (Adapter->IOBase + BANK2_INT_STS,INT_RX_OVRN);

	//Update the counter
	Adapter->Stat_RxOvrn++;

	//Make sure the RCR is ok.
	NdisRawWritePortUshort(Adapter->IOBase + BANK_SELECT,(USHORT) 0);
    NdisRawWritePortUshort(Adapter->IOBase + BANK0_RCR, Adapter->RCR);
	DEBUGMSG(ZONE_INIT, (TEXT("LAN91C111: <== RX OVRN Interrupt Handler\r\n")));
}

VOID		ALLOC_Interrupt_Handler		(MINIPORT_ADAPTER *Adapter)
{
	UCHAR            PacketNumber;
	UINT IOBase = Adapter->IOBase;
    MINIPORT_PACKET *Packet = (MINIPORT_PACKET *) 0;

	DEBUGMSG(ZONE_INIT, (TEXT("LAN91C111: ==> ALLOC Interrupt Handler\r\n")));
	Adapter->AllocateFlag = FALSE;
	//Retrieve allocated packet number.
	NdisRawWritePortUshort(Adapter->IOBase + BANK_SELECT,2);
    NdisRawReadPortUchar(IOBase + BANK2_ARR,(UCHAR *) &PacketNumber);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -