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

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

?? interrup.c

?? 優龍2410平臺BSP包
?? C
字號:
/*++
THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
PARTICULAR PURPOSE.
Copyright (c) 1995-1998  Microsoft Corporation

Module Name:

    interrupt.c

Abstract:

    This is a part of the driver for the Cirrus Logic CS8900
    Ethernet controller.  It contains the interrupt-handling routines.
    This driver conforms to the NDIS 3.0 interface.

    The overall structure and much of the code is taken from
    the Lance NDIS driver by Tony Ercolano.

--*/

#include "precomp.h"

//
// On debug builds tell the compiler to keep the symbols for
// internal functions, otw throw them out.
//
#if DBG
#define STATIC
#else
#define STATIC static
#endif

extern volatile IOPreg *v_pIOPRegs;
extern unsigned long *EthCommand;
//
// This is used to pad short packets.
//
static UCHAR BlankBuffer[60] = "                                                            ";

void CS8900ReceiveEvent(PCS8900_ADAPTER Adapter, unsigned short RxEvent)
{
#if	WINCEDEBUG
	unsigned short i;
#endif
	unsigned short Length, Type;
	unsigned short *pBuffer;
	unsigned short *pBufferLimit;
	unsigned char  *cptr;
	WORD PacketOper;
	
	DEBUGMSG(0, (TEXT("++CS8900ReceiveEvent\r\n")));

	// Verify that it is an RxOK event
	if (!(RxEvent & RX_EVENT_RX_OK))
	{
		DEBUGMSG(1, (TEXT("CS8900ReceiveEvent: Receive Currupted Packet!\r\n")));
		return;
	}

	readIoPort(IO_RX_TX_DATA_0);				// Discard RxStatus
	Length = readIoPort(IO_RX_TX_DATA_0);

	pBuffer = (unsigned short *)Adapter->Lookahead;
	pBufferLimit = (unsigned short *)Adapter->Lookahead + (Length + 1) / 2;
	while (pBuffer < pBufferLimit)
	{
		*pBuffer = readIoPort(IO_RX_TX_DATA_0);
		pBuffer++;
	}

	pBuffer = (unsigned short *)Adapter->Lookahead;
	Type = pBuffer[6];
	PacketOper = pBuffer[10];

	if (Type == 0x0608)
	{
		if (PacketOper == 0x0100)
			DEBUGMSG(1, (TEXT("[CS8900] Receive ARP Request Packet\r\n")));
		else if (PacketOper == 0x0200)
			DEBUGMSG(1, (TEXT("[CS8900] Receive ARP Response Packet\r\n")));
		else if (PacketOper == 0x0300)
			DEBUGMSG(1, (TEXT("[CS8900] Receive RARP Request Packet\r\n")));
		else if (PacketOper == 0x0400)
			DEBUGMSG(1, (TEXT("[CS8900] Receive RARP Response Packet\r\n")));
		else
			DEBUGMSG(1, (TEXT("[CS8900] Receive Unknown ARP Packet\r\n")));
	}
	else if (Type == 0x0008)
		DEBUGMSG(1, (TEXT("[CS8900] Receive IP Packet\r\n")));

	cptr = (unsigned char *)Adapter->Lookahead;

#if	WINCEDEBUG
	DEBUGMSG(1, (TEXT("type = %x, length = %x\r\n"), Type, Length));
	for (i=0; i<Length; i++)
		DEBUGMSG(1, (TEXT("%x "), *cptr++));
	DEBUGMSG(1, (TEXT("\r\n")));
#endif

	cptr = (unsigned char *)Adapter->Lookahead;

	NdisMEthIndicateReceive(
		Adapter->MiniportAdapterHandle,
		(NDIS_HANDLE)Adapter,
		(PCHAR)(Adapter->Lookahead),
		CS8900_HEADER_SIZE,
		(PCHAR)(cptr)+CS8900_HEADER_SIZE,
		Length - CS8900_HEADER_SIZE,
		Length - CS8900_HEADER_SIZE);

	NdisMEthIndicateReceiveComplete(Adapter->MiniportAdapterHandle);

	return;
}


VOID
CS8900EnableInterrupt(
    IN NDIS_HANDLE MiniportAdapterContext
    )

/*++

Routine Description:

    This routine is used to turn on the interrupt mask.

Arguments:

    Context - The adapter for the CS8900 to start.

Return Value:

    None.

--*/

{
    PCS8900_ADAPTER Adapter = (PCS8900_ADAPTER)(MiniportAdapterContext);

    DEBUGMSG(1, (TEXT("CS8900EnableInterrupt is called!!!\r\n")));

	v_pIOPRegs->rEINTMASK &= ~(1<<9);	// EINT9
}



VOID
CS8900DisableInterrupt(
    IN NDIS_HANDLE MiniportAdapterContext
    )

/*++

Routine Description:

    This routine is used to turn off the interrupt mask.

Arguments:

    Context - The adapter for the CS8900 to start.

Return Value:

    None.

--*/

{
    PCS8900_ADAPTER Adapter = (PCS8900_ADAPTER)(MiniportAdapterContext);

    DEBUGMSG(1, (TEXT("CS8900DisableInterrupt is called!!!\r\n")));

	v_pIOPRegs->rEINTMASK |= (1<<9);		// EINT9
}


VOID
CS8900Isr(
    OUT PBOOLEAN InterruptRecognized,
    OUT PBOOLEAN QueueDpc,
    IN PVOID Context
    )

/*++

Routine Description:

    This is the interrupt handler which is registered with the operating
    system. If several are pending (i.e. transmit complete and receive),
    handle them all.  Block new interrupts until all pending interrupts
    are handled.

Arguments:

    InterruptRecognized - Boolean value which returns TRUE if the
        ISR recognizes the interrupt as coming from this adapter.

    QueueDpc - TRUE if a DPC should be queued.

    Context - pointer to the adapter object

Return Value:

    None.
--*/

{
#undef NODPC
#ifdef NODPC
	unsigned short Event;
#endif
    PCS8900_ADAPTER Adapter = ((PCS8900_ADAPTER)Context);

    *InterruptRecognized = TRUE;
#ifdef NODPC
	*QueueDpc = FALSE;
#else
	*QueueDpc = TRUE;
#endif

#ifdef NODPC
	Event = CS8900ReadRegister(PKTPG_ISQ);

	DEBUGMSG(1, (TEXT("++CS8900Isr event=%x\r\n"), Event));

	while (Event != 0)
	{
		switch (Event & REG_NUM_MASK)
		{
			case REG_NUM_RX_EVENT:
				DEBUGMSG(1, (TEXT("RX\r\n")));
				CS8900ReceiveEvent(Adapter, Event);
				break;

			case REG_NUM_TX_EVENT:
				DEBUGMSG(1, (TEXT("TX\r\n")));
				break;

			case REG_NUM_BUF_EVENT:
				DEBUGMSG(1, (TEXT("BUF\r\n")));
				break;
				
			case REG_NUM_RX_MISS:
				DEBUGMSG(1, (TEXT("CS8900Isr:RX_MISS!\r\n")));
				break;			
				
			case REG_NUM_TX_COL:
				break;
		}
		
		Event = CS8900ReadRegister(PKTPG_ISQ);

		DEBUGMSG(1, (TEXT("event=%x\r\n"), Event));
	}
#endif
    DEBUGMSG(1, (TEXT("CS8900Isr is called!!!\r\n")));
}


VOID
CS8900HandleInterrupt(
    IN NDIS_HANDLE MiniportAdapterContext
    )
/*++

Routine Description:

    This is the defered processing routine for interrupts.  It
    reads from the Interrupt Status Register any outstanding
    interrupts and handles them.

Arguments:

    MiniportAdapterContext - a handle to the adapter block.

Return Value:

    NONE.

--*/
{
    //
    // The adapter to process
    //
    PCS8900_ADAPTER Adapter = ((PCS8900_ADAPTER)MiniportAdapterContext);

	unsigned short Event;

	Event = CS8900ReadRegister(PKTPG_ISQ);

	DEBUGMSG(1, (TEXT("++CS8900HandleInterrupt event=%x\r\n"), Event));

	while (Event != 0)
	{
		switch (Event & REG_NUM_MASK)
		{
			case REG_NUM_RX_EVENT:
				DEBUGMSG(1, (TEXT("RX\r\n")));
				CS8900ReceiveEvent(Adapter, Event);
				break;

			case REG_NUM_TX_EVENT:
				DEBUGMSG(1, (TEXT("TX\r\n")));
				break;

			case REG_NUM_BUF_EVENT:
				DEBUGMSG(1, (TEXT("BUF\r\n")));
				break;
				
			case REG_NUM_RX_MISS:
				DEBUGMSG(1, (TEXT("CS8900HandleInterrupt:RX_MISS!\r\n")));
				break;			
				
			case REG_NUM_TX_COL:
				break;
		}
		
		Event = CS8900ReadRegister(PKTPG_ISQ);

		DEBUGMSG(1, (TEXT("event=%x\r\n"), Event));
	}

	DEBUGMSG(1, (TEXT("--CS8900HandleInterrupt\r\n")));
}


NDIS_STATUS
CS8900TransferData(
    OUT PNDIS_PACKET Packet,
    OUT PUINT BytesTransferred,
    IN NDIS_HANDLE MiniportAdapterContext,
    IN NDIS_HANDLE MiniportReceiveContext,
    IN UINT ByteOffset,
    IN UINT BytesToTransfer
    )

/*++

Routine Description:

    A protocol calls the CS8900TransferData request (indirectly via
    NdisTransferData) from within its Receive event handler
    to instruct the driver to copy the contents of the received packet
    a specified packet buffer.

Arguments:

    MiniportAdapterContext - Context registered with the wrapper, really
        a pointer to the adapter.

    MiniportReceiveContext - The context value passed by the driver on its call
    to NdisMEthIndicateReceive.  The driver can use this value to determine
    which packet, on which adapter, is being received.

    ByteOffset - An unsigned integer specifying the offset within the
    received packet at which the copy is to begin.  If the entire packet
    is to be copied, ByteOffset must be zero.

    BytesToTransfer - An unsigned integer specifying the number of bytes
    to copy.  It is legal to transfer zero bytes; this has no effect.  If
    the sum of ByteOffset and BytesToTransfer is greater than the size
    of the received packet, then the remainder of the packet (starting from
    ByteOffset) is transferred, and the trailing portion of the receive
    buffer is not modified.

    Packet - A pointer to a descriptor for the packet storage into which
    the MAC is to copy the received packet.

    BytesTransfered - A pointer to an unsigned integer.  The MAC writes
    the actual number of bytes transferred into this location.  This value
    is not valid if the return status is STATUS_PENDING.

Notes:

  - The MacReceiveContext will be a pointer to the open block for
    the packet.

--*/

{
    //
    // The adapter to transfer from.
    //
    PCS8900_ADAPTER Adapter = ((PCS8900_ADAPTER)MiniportReceiveContext);

	DEBUGMSG(1, (TEXT("+CS8900:CS8900TransferData\r\n")));
	while(1);

    return(NDIS_STATUS_SUCCESS);
}


NDIS_STATUS
CS8900Send(
    IN NDIS_HANDLE MiniportAdapterContext,
    IN PNDIS_PACKET Packet,
    IN UINT Flags
    )

/*++

Routine Description:


    The CS8900Send request instructs a driver to transmit a packet through
    the adapter onto the medium.

Arguments:

    MiniportAdapterContext - Context registered with the wrapper, really
        a pointer to the adapter.

    Packet - A pointer to a descriptor for the packet that is to be
    transmitted.

    SendFlags - Optional send flags

Notes:

    This miniport driver will always accept a send.  This is because
    the CS8900 has limited send resources and the driver needs packets
    to copy to the adapter immediately after a transmit completes in
    order to keep the adapter as busy as possible.

    This is not required for other adapters, as they have enough
    resources to keep the transmitter busy until the wrapper submits
    the next packet.

--*/

{
	ULONG	Len;
	PUCHAR	CurBufAddress;
	UCHAR	TotalPacket[2048];

	PNDIS_BUFFER CurBuffer;
	
	UINT	i;
	UINT	Count = 0;
	UINT	CurBufLen;
	UINT	PacketLength;
	USHORT	BusStatus;

	PCS8900_ADAPTER Adapter = (PCS8900_ADAPTER)(MiniportAdapterContext);

	DEBUGMSG(1, (TEXT("CS8900Send\r\n")));	

	NdisQueryPacket(
		Packet,
		NULL,
		NULL,
		NULL,
		&Len
		);

	NdisQueryPacket(Packet, NULL, NULL, &CurBuffer, &PacketLength);
	NdisQueryBuffer(CurBuffer, (PVOID *)&CurBufAddress, &CurBufLen);

	for (i = 0; i < CurBufLen; i++)
		TotalPacket[Count++] = CurBufAddress[i];

	NdisGetNextBuffer(CurBuffer, &CurBuffer);
	while (CurBuffer && (CurBufLen != 0))
	{
		NdisQueryBuffer(CurBuffer, (PVOID *)&CurBufAddress, &CurBufLen);

		for (i = 0; i < CurBufLen; i++)
		{
			TotalPacket[Count++] = CurBufAddress[i];
		}

		NdisGetNextBuffer(CurBuffer, &CurBuffer);
	}

	// Request that a transmit be started
	BusStatus = CS8900RequestTransmit(PacketLength);
		
	// If there was an error with the transmit bid
	if (BusStatus & BUS_ST_TX_BID_ERR)
	{
		DEBUGMSG(1, (TEXT("##### BUS_ST_TX_BID_ERR #####\r\n")));
	}
	else if (BusStatus & BUS_ST_RDY4TXNOW)
	{
		// The chip is ready for transmission now
		// Copy the message to the chip to start the transmit
		CS8900CopyTxFrame((PCHAR)TotalPacket, PacketLength);
		return(NDIS_STATUS_SUCCESS);
	}
	return(NDIS_STATUS_FAILURE);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
本田岬高潮一区二区三区| 国产无人区一区二区三区| 久久久精品国产免费观看同学| 亚洲日本在线a| 经典三级一区二区| 欧美精品三级日韩久久| 亚洲欧洲美洲综合色网| 青青草国产精品97视觉盛宴| 一本大道av伊人久久综合| 精品福利一二区| 日欧美一区二区| 色综合久久中文字幕| 欧美激情中文字幕一区二区| 狠狠色丁香九九婷婷综合五月 | 婷婷一区二区三区| 91一区二区在线| 国产精品区一区二区三区| 国产一区久久久| 2022国产精品视频| 美女任你摸久久| 欧美狂野另类xxxxoooo| 一区二区久久久| 色综合中文字幕国产| ...中文天堂在线一区| 国产成人免费网站| 国产欧美日韩综合精品一区二区| 国产乱人伦偷精品视频免下载| 337p亚洲精品色噜噜狠狠| 亚洲高清久久久| 在线电影国产精品| 日日摸夜夜添夜夜添国产精品 | 久久免费国产精品 | 免费成人在线视频观看| 欧美精品久久天天躁| 午夜电影一区二区| 91精品国产欧美日韩| 日韩极品在线观看| 日韩美女一区二区三区| 久久疯狂做爰流白浆xx| 欧美精品一区在线观看| 国产老肥熟一区二区三区| 国产欧美综合色| av不卡一区二区三区| 亚洲欧美日本韩国| 欧美日韩国产成人在线91| 丝袜亚洲另类欧美| www精品美女久久久tv| 成人午夜电影网站| 一区二区在线观看av| 欧美日本国产视频| 美女视频免费一区| 国产精品进线69影院| 欧美色窝79yyyycom| 美女视频网站久久| 自拍偷拍国产精品| 9191成人精品久久| 国产精品资源在线看| 亚洲欧美日韩小说| 日韩精品在线一区二区| 国产a区久久久| 亚洲国产成人av好男人在线观看| 欧美成人伊人久久综合网| 北岛玲一区二区三区四区| 天天色 色综合| 欧美激情一区二区三区蜜桃视频| 色哟哟亚洲精品| 激情国产一区二区| 亚洲精品中文在线| 国产丝袜美腿一区二区三区| 一本久久a久久免费精品不卡| 久久精品99国产国产精| 亚洲欧美影音先锋| 精品欧美一区二区三区精品久久| 成人av在线资源网| 另类专区欧美蜜桃臀第一页| 亚洲黄色免费网站| 久久毛片高清国产| 欧美日韩一级视频| aaa欧美日韩| 狠狠色狠狠色合久久伊人| 一区二区成人在线| 欧美激情在线一区二区三区| 日韩一区二区电影网| 在线观看av一区二区| 大胆欧美人体老妇| 久久国产人妖系列| 亚洲一区在线视频观看| 中文字幕制服丝袜一区二区三区 | 粉嫩欧美一区二区三区高清影视| 亚洲一级在线观看| 亚洲视频1区2区| 国产欧美日韩三区| 久久综合丝袜日本网| 91精品国产综合久久福利| 91国偷自产一区二区三区观看 | 日韩一区二区三区免费观看| 色综合久久久久久久久| 国产成人高清视频| 国产成人av电影在线| 国产又黄又大久久| 精品在线观看免费| 免费看欧美女人艹b| 肉肉av福利一精品导航| 午夜久久久久久| 婷婷夜色潮精品综合在线| 亚洲一区欧美一区| 亚洲一区在线电影| 亚洲bt欧美bt精品| 亚洲国产视频一区二区| 亚洲亚洲人成综合网络| 亚洲va韩国va欧美va精品| 亚洲国产日韩综合久久精品| 亚洲一区二区欧美| 亚洲已满18点击进入久久| 亚洲成人福利片| 肉色丝袜一区二区| 久久69国产一区二区蜜臀| 精品综合久久久久久8888| 国产精品一二三四| 国产成人福利片| 91视频91自| 欧美揉bbbbb揉bbbbb| 欧美日韩国产美女| 欧美一级一区二区| 国产日韩欧美激情| 亚洲欧洲综合另类在线| 一区二区三区在线视频免费 | 91精品欧美综合在线观看最新 | 日韩欧美在线1卡| 亚洲精品在线免费观看视频| 久久久久久久久久电影| 国产精品电影一区二区三区| 亚洲黄色av一区| 日韩av一区二| 国产成人自拍高清视频在线免费播放| 风间由美中文字幕在线看视频国产欧美 | 精品国产免费久久 | 麻豆91在线观看| 国产福利不卡视频| 91久久一区二区| 91精品国产高清一区二区三区蜜臀| 日韩精品影音先锋| 自拍偷拍欧美精品| 麻豆精品一区二区av白丝在线| 国产不卡视频在线观看| 色欧美日韩亚洲| 欧美精品一区二区三区蜜臀 | 国产精品日日摸夜夜摸av| 亚洲国产另类av| 国产精品18久久久久久vr| 色婷婷av一区二区三区软件| 精品国产一二三区| 亚洲免费三区一区二区| 激情图区综合网| 欧美三级电影一区| 国产精品久久久久久久久快鸭| 午夜伦理一区二区| 成人高清免费观看| 日韩一区二区免费高清| 亚洲色图在线看| 国产一区二区电影| 欧美高清www午色夜在线视频| 国产欧美日韩久久| 免费视频最近日韩| 在线观看免费成人| 国产精品二区一区二区aⅴ污介绍| 麻豆精品一区二区av白丝在线 | 在线亚洲高清视频| 国产网站一区二区| 免费一级片91| 欧美日韩三级在线| 亚洲激情图片一区| 成人精品视频网站| 久久嫩草精品久久久精品| 三级不卡在线观看| 欧美日韩激情一区| 一区二区三区av电影| 9人人澡人人爽人人精品| 国产亚洲一区二区三区在线观看 | 欧美激情一区不卡| 韩国欧美一区二区| 欧美xxxx在线观看| 青青草精品视频| 欧美一卡二卡三卡四卡| 亚洲中国最大av网站| 一本色道久久加勒比精品| 中文字幕一区在线| 99久久综合精品| 中文字幕一区二区三区四区不卡| 国产jizzjizz一区二区| 国产三级三级三级精品8ⅰ区| 国模娜娜一区二区三区| 26uuu久久天堂性欧美| 久久精品国产成人一区二区三区| 欧美一区二区在线不卡| 日韩成人一区二区三区在线观看| 91精品婷婷国产综合久久| 日韩av电影免费观看高清完整版在线观看| 欧美性一区二区| 午夜视频久久久久久|