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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? card.c

?? 使用網(wǎng)絡(luò)驅(qū)動器接口標準開發(fā)的ne2000網(wǎng)卡的NT驅(qū)動.
?? C
?? 第 1 頁 / 共 5 頁
字號:

/*++

Copyright (c) 1990-1998 Microsoft Corporation, All Rights Reserved.

Module Name:

    card.c

Abstract:

    Card-specific functions for the NDIS 3.0 Novell 2000 driver.

Author:

    Sean Selitrennikoff

Environment:

    Kernel mode, FSD

Revision History:

--*/

#include "precomp.h"

BOOLEAN
CardSlotTest(
    IN PNE2000_ADAPTER Adapter
    );

BOOLEAN
CardRamTest(
    IN PNE2000_ADAPTER Adapter
    );


#pragma NDIS_PAGEABLE_FUNCTION(CardCheckParameters)

BOOLEAN CardCheckParameters(
    IN PNE2000_ADAPTER Adapter
)

/*++

Routine Description:

    Checks that the I/O base address is correct.

Arguments:

    Adapter - pointer to the adapter block.

Return Value:

    TRUE, if IoBaseAddress appears correct.

--*/

{
    UCHAR Tmp;

    //
    // If adapter responds to a stop command correctly -- assume it is there.
    //

    //
    // Turn off interrupts first.
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_INTR_MASK, 0);

    //
    // Stop the card.
    //
    SyncCardStop(Adapter);

    //
    // Pause
    //
    NdisStallExecution(2000);

    //
    // Read response
    //
    NdisRawReadPortUchar(Adapter->IoPAddr + NIC_COMMAND, &Tmp);

    if ((Tmp == (CR_NO_DMA | CR_STOP)) ||
        (Tmp == (CR_NO_DMA | CR_STOP | CR_START))
    )
    {
        return(TRUE);
    }
    else
    {
        return(FALSE);
    }
}
#ifdef NE2000

#pragma NDIS_PAGEABLE_FUNCTION(CardSlotTest)


BOOLEAN CardSlotTest(
    IN PNE2000_ADAPTER Adapter
)

/*++

Routine Description:

    Checks if the card is in an 8 or 16 bit slot and sets a flag in the
    adapter structure.

Arguments:

    Adapter - pointer to the adapter block.

Return Value:

    TRUE, if all goes well, else FALSE.

--*/

{
    UCHAR Tmp;
    UCHAR RomCopy[32];
    UCHAR i;
	BOOLEAN found;

    //
    // Reset the chip
    //
    NdisRawReadPortUchar(Adapter->IoPAddr + NIC_RESET, &Tmp);
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_RESET, 0xFF);

    //
    // Go to page 0 and stop
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_COMMAND, CR_STOP | CR_NO_DMA);

    //
    // Pause
    //
    NdisStallExecution(2000);

    //
    // Check that it is stopped
    //
    NdisRawReadPortUchar(Adapter->IoPAddr + NIC_COMMAND, &Tmp);
    if (Tmp != (CR_NO_DMA | CR_STOP))
    {
        IF_LOUD(DbgPrint("Could not stop the card\n");)

        return(FALSE);
    }

    //
    // Setup to read from ROM
    //
    NdisRawWritePortUchar(
        Adapter->IoPAddr + NIC_DATA_CONFIG,
        DCR_BYTE_WIDE | DCR_FIFO_8_BYTE | DCR_NORMAL
    );

    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_INTR_MASK, 0x0);

    //
    // Ack any interrupts that may be hanging around
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_INTR_STATUS, 0xFF);

    //
    // Setup to read in the ROM, the address and byte count.
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_RMT_ADDR_LSB, 0x0);

    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_RMT_ADDR_MSB, 0x0);

    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_RMT_COUNT_LSB, 32);

    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_RMT_COUNT_MSB, 0x0);

    NdisRawWritePortUchar(
        Adapter->IoPAddr + NIC_COMMAND,
        CR_DMA_READ | CR_START
    );

    //
    // Read first 32 bytes in 16 bit mode
    //
	for (i = 0; i < 32; i++)
	{
		NdisRawReadPortUchar(Adapter->IoPAddr + NIC_RACK_NIC, RomCopy + i);
	}

    IF_VERY_LOUD( DbgPrint("Resetting the chip\n"); )

    //
    // Reset the chip
    //
    NdisRawReadPortUchar(Adapter->IoPAddr + NIC_RESET, &Tmp);
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_RESET, 0xFF);

    //
    // Check ROM for 'B' (byte) or 'W' (word)
    // NOTE: If the buffer has bot BB and WW then use WW instead of BB
    IF_VERY_LOUD( DbgPrint("Checking slot type\n"); )

	found = FALSE;
	for (i = 16; i < 31; i++)
	{
		if (((RomCopy[i] == 'B') && (RomCopy[i+1] == 'B')) ||
			((RomCopy[i] == 'W') && (RomCopy[i+1] == 'W'))
		)
		{
			if (RomCopy[i] == 'B')
			{
				Adapter->EightBitSlot = TRUE;
				found = TRUE;
			}
			else
			{
				Adapter->EightBitSlot = FALSE;
				found = TRUE;
				break;		// Go no farther
			}
		}
	}

	if (found)
	{
		IF_VERY_LOUD( (Adapter->EightBitSlot?DbgPrint("8 bit slot\n"):
							  DbgPrint("16 bit slot\n")); )
	}
	else
	{
		//
		// If neither found -- then not an NE2000
		//
		IF_VERY_LOUD( DbgPrint("Failed slot type\n"); )
	}

    return(found);
}

#endif // NE2000




#pragma NDIS_PAGEABLE_FUNCTION(CardRamTest)

BOOLEAN
CardRamTest(
    IN PNE2000_ADAPTER Adapter
    )

/*++

Routine Description:

    Finds out how much RAM the adapter has.  It starts at 1K and checks thru
    60K.  It will set Adapter->RamSize to the appropriate value iff this
    function returns TRUE.

Arguments:

    Adapter - pointer to the adapter block.

Return Value:

    TRUE, if all goes well, else FALSE.

--*/

{
    PUCHAR RamBase, RamPointer;
    PUCHAR RamEnd;

	UCHAR TestPattern[]={ 0xAA, 0x55, 0xFF, 0x00 };
	PULONG pTestPattern = (PULONG)TestPattern;
	UCHAR ReadPattern[4];
	PULONG pReadPattern = (PULONG)ReadPattern;

    for (RamBase = (PUCHAR)0x400; RamBase < (PUCHAR)0x10000; RamBase += 0x400) {

        //
        // Write Test pattern
        //

        if (!CardCopyDown(Adapter, RamBase, TestPattern, 4)) {

            continue;

        }

        //
        // Read pattern
        //

        if (!CardCopyUp(Adapter, ReadPattern, RamBase, 4)) {

            continue;

        }

        IF_VERY_LOUD( DbgPrint("Addr 0x%x: 0x%x, 0x%x, 0x%x, 0x%x\n",
                               RamBase,
                               ReadPattern[0],
                               ReadPattern[1],
                               ReadPattern[2],
                               ReadPattern[3]
                              );
                    )


        //
        // If they are the same, find the end
        //

        if (*pReadPattern == *pTestPattern) {

            for (RamEnd = RamBase; !(PtrToUlong(RamEnd) & 0xFFFF0000); RamEnd += 0x400) {

                //
                // Write test pattern
                //

                if (!CardCopyDown(Adapter, RamEnd, TestPattern, 4)) {

                    break;

                }

                //
                // Read pattern
                //

                if (!CardCopyUp(Adapter, ReadPattern, RamEnd, 4)) {

                    break;

                }

                if (*pReadPattern != *pTestPattern) {

                    break;

                }

            }

            break;

        }

    }

    IF_LOUD( DbgPrint("RamBase 0x%x, RamEnd 0x%x\n", RamBase, RamEnd); )

    //
    // If not found, error out
    //

    if ((RamBase >= (PUCHAR)0x10000) || (RamBase == RamEnd)) {

        return(FALSE);

    }

    //
    // Watch for boundary case when RamEnd is maximum value
    //

    if ((ULONG_PTR)RamEnd & 0xFFFF0000) {

        RamEnd -= 0x100;

    }

    //
    // Check all of ram
    //

    for (RamPointer = RamBase; RamPointer < RamEnd; RamPointer += 4) {

        //
        // Write test pattern
        //

        if (!CardCopyDown(Adapter, RamPointer, TestPattern, 4)) {

            return(FALSE);

        }

        //
        // Read pattern
        //

        if (!CardCopyUp(Adapter, ReadPattern, RamBase, 4)) {

            return(FALSE);

        }

        if (*pReadPattern != *pTestPattern) {

            return(FALSE);

        }

    }

    //
    // Store Results
    //

    Adapter->RamBase = RamBase;
    Adapter->RamSize = (ULONG)(RamEnd - RamBase);

    return(TRUE);

}

#pragma NDIS_PAGEABLE_FUNCTION(CardInitialize)

BOOLEAN
CardInitialize(
    IN PNE2000_ADAPTER Adapter
    )

/*++

Routine Description:

    Initializes the card into a running state.

Arguments:

    Adapter - pointer to the adapter block.

Return Value:

    TRUE, if all goes well, else FALSE.

--*/

{
    UCHAR Tmp;
    USHORT i;

    //
    // Stop the card.
    //
    SyncCardStop(Adapter);

    //
    // Initialize the Data Configuration register.
    //
    NdisRawWritePortUchar(
        Adapter->IoPAddr + NIC_DATA_CONFIG,
        DCR_AUTO_INIT | DCR_FIFO_8_BYTE
    );

    //
    // Set Xmit start location
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_XMIT_START, 0xA0);

    //
    // Set Xmit configuration
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_XMIT_CONFIG, 0x0);

    //
    // Set Receive configuration
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_RCV_CONFIG, RCR_MONITOR);

    //
    // Set Receive start
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_PAGE_START, 0x4);

    //
    // Set Receive end
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_PAGE_STOP, 0xFF);

    //
    // Set Receive boundary
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_BOUNDARY, 0x4);

    //
    // Set Xmit bytes
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_XMIT_COUNT_LSB, 0x3C);
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_XMIT_COUNT_MSB, 0x0);

    //
    // Pause
    //
    NdisStallExecution(2000);

    //
    // Ack all interrupts that we might have produced
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_INTR_STATUS, 0xFF);

    //
    // Change to page 1
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_COMMAND, CR_PAGE1 | CR_STOP);

    //
    // Set current
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_CURRENT, 0x4);

    //
    // Back to page 0
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_COMMAND, CR_PAGE0 | CR_STOP);

    //
    // Pause
    //
    NdisStallExecution(2000);

    //
    // Check that Command register reflects this last command
    //
    NdisRawReadPortUchar(Adapter->IoPAddr + NIC_COMMAND, &Tmp);
    if (!(Tmp & CR_STOP))
    {
        IF_LOUD(DbgPrint("Invalid command register\n");)

        return(FALSE);
    }

    //
    // Do initialization errata
    //
    NdisRawWritePortUchar(Adapter->IoPAddr + NIC_RMT_COUNT_LSB, 55);

    //
    // Setup for a read
    //
    NdisRawWritePortUchar(
        Adapter->IoPAddr + NIC_COMMAND,
        CR_DMA_READ | CR_START
    );

#ifdef NE2000

    //
    // Check if the slot is 8 or 16 bit (affects data transfer rate).
    //

    if ((Adapter->BusType == NdisInterfaceMca) ||
		(NE2000_PCMCIA == Adapter->CardType))
    {
        Adapter->EightBitSlot = FALSE;
    }
    else
    {
        IF_VERY_LOUD(DbgPrint("CardSlotTest\n");)

        if (CardSlotTest(Adapter) == FALSE)
        {
            //
            // Stop chip
            //
            SyncCardStop(Adapter);

            IF_LOUD(DbgPrint("  -- Failed\n");)
            return(FALSE);
        }

    }

#else // NE2000

    Adapter->EightBitSlot = TRUE;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲欧洲美洲综合色网| 波多野结衣在线aⅴ中文字幕不卡| 美洲天堂一区二卡三卡四卡视频| 国产精品一级片在线观看| 一本到一区二区三区| 26uuu精品一区二区在线观看| 国产精品久久久久久久第一福利| 青青草国产精品亚洲专区无| 91无套直看片红桃| 欧美激情一二三区| 久久aⅴ国产欧美74aaa| 在线观看日韩高清av| 国产亚洲人成网站| 毛片一区二区三区| 欧美日韩国产精选| 一区二区三区欧美视频| 成人美女视频在线观看| 欧美一级二级在线观看| 亚洲一卡二卡三卡四卡五卡| 99久久精品情趣| 国产欧美日韩视频在线观看| 老司机午夜精品| 日韩一级在线观看| 免费在线观看一区| 正在播放一区二区| 亚洲国产精品一区二区久久| 一本久久a久久精品亚洲| 亚洲三级理论片| www.久久久久久久久| 国产视频视频一区| 国产精品亚洲第一| 久久久国产精品午夜一区ai换脸| 精品综合久久久久久8888| 日韩欧美一级精品久久| 毛片基地黄久久久久久天堂| 日韩三级电影网址| 精品一区二区综合| 久久婷婷综合激情| 国产**成人网毛片九色| 中文字幕乱码日本亚洲一区二区| 国产乱子伦一区二区三区国色天香 | 美腿丝袜在线亚洲一区| 欧美一区国产二区| 精品一区二区三区不卡| 欧美电视剧免费全集观看| 韩国女主播一区| 国产欧美日韩视频在线观看| 成人app在线| 一区二区三区久久久| 欧美日韩精品一区二区三区 | 激情深爱一区二区| 国产婷婷色一区二区三区| www.欧美.com| 亚洲777理论| 日韩欧美视频一区| 成人免费黄色在线| 一级特黄大欧美久久久| 欧美一卡二卡三卡| 国产成人av福利| 中文字幕一区二区三区不卡| 91女厕偷拍女厕偷拍高清| 午夜精品久久久久| 国产日韩精品一区| 欧美午夜精品理论片a级按摩| 秋霞成人午夜伦在线观看| 久久久国产精品麻豆| av在线免费不卡| 日本不卡免费在线视频| 亚洲国产经典视频| 在线国产亚洲欧美| 国产在线播放一区| 亚洲一区二区三区中文字幕在线 | 91黄色免费观看| 麻豆精品蜜桃视频网站| 国产精品福利一区二区三区| 欧美久久久久免费| 成人黄色大片在线观看| 午夜a成v人精品| 国产精品人成在线观看免费| 欧美日韩一区二区在线视频| 国产高清久久久久| 午夜欧美电影在线观看| 欧美激情一区二区| 日韩一区二区在线看| 99在线精品免费| 国产一区二区免费在线| 午夜激情久久久| 中文字幕在线免费不卡| 精品日本一线二线三线不卡| 91精品福利在线| 波多野结衣在线aⅴ中文字幕不卡| 免费在线看成人av| 亚洲二区在线视频| 成人免费在线视频观看| 久久久亚洲精品石原莉奈| 欧美精品三级日韩久久| 一本色道久久加勒比精品| 国产精品1区2区3区在线观看| 日韩国产欧美在线观看| 亚洲成人午夜电影| 亚洲精品国产高清久久伦理二区| 久久久久国产免费免费| 欧美一区二区三区色| 欧美日韩中文一区| 欧美性生活一区| 色婷婷综合五月| 91免费小视频| 粉嫩av一区二区三区粉嫩| 国产麻豆视频一区| 久久精品国产色蜜蜜麻豆| 日本女优在线视频一区二区| 亚洲一区av在线| 亚洲第一精品在线| 亚洲国产乱码最新视频 | 欧美日韩mp4| 欧美色国产精品| 欧美天堂一区二区三区| 欧美手机在线视频| 欧美猛男超大videosgay| 在线观看网站黄不卡| 欧美性高清videossexo| 欧美少妇bbb| 678五月天丁香亚洲综合网| 欧美精品乱码久久久久久| 欧美人妖巨大在线| 欧美一级搡bbbb搡bbbb| 久久午夜色播影院免费高清| 日本一区二区综合亚洲| 国产精品久久久久久久久动漫| 亚洲视频中文字幕| 无吗不卡中文字幕| 久久不见久久见免费视频7| 国产呦精品一区二区三区网站| 精品在线观看视频| 国产成人av自拍| 99久免费精品视频在线观看 | 日韩欧美亚洲一区二区| 26uuu成人网一区二区三区| 国产欧美日韩麻豆91| 亚洲色图制服诱惑| 99re成人精品视频| 91.com在线观看| 欧美日韩一级片网站| 午夜欧美2019年伦理| 久久精品免费观看| 欧美三级乱人伦电影| 欧美国产精品久久| 美女一区二区视频| 欧美专区日韩专区| 国产精品久久久久久久久免费丝袜 | 玉足女爽爽91| 成人激情黄色小说| 国产日产精品一区| 国产一区二区福利视频| 欧美一区二区精品在线| 亚洲国产视频直播| 色综合网站在线| 国产精品久久精品日日| 国产精品2024| 久久综合九色综合久久久精品综合 | 欧美影院一区二区三区| 成人欧美一区二区三区| 成人av小说网| 欧美激情一二三区| 粉嫩欧美一区二区三区高清影视| 精品国产乱码久久久久久蜜臀| 日韩国产成人精品| 日韩欧美一区在线| 蜜桃视频一区二区| 欧美成人三级在线| 精品亚洲国内自在自线福利| 日韩亚洲欧美一区| 蜜桃视频在线观看一区二区| 日韩一二三区视频| 九九久久精品视频| 久久综合九色欧美综合狠狠| 国产综合一区二区| 国产日韩精品视频一区| 成人手机在线视频| 国产精品国产三级国产有无不卡| 国产福利一区在线观看| 国产精品私人自拍| 91在线一区二区三区| 亚洲人成网站精品片在线观看 | 亚洲r级在线视频| 欧美综合久久久| 日日骚欧美日韩| 91精品国产91综合久久蜜臀| 精品亚洲欧美一区| 国产精品久线观看视频| 色综合天天综合在线视频| 亚洲狠狠爱一区二区三区| 欧美日产在线观看| 国产一区二区免费视频| 亚洲欧美一区二区在线观看| 日本电影欧美片| 欧美a级一区二区| 国产女主播一区| 欧美乱妇23p| 国产精品一区二区三区网站|