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

📄 ne2000.c

📁 自制PDA系列之PCMCIA接口驱动(处理器PXA270)
💻 C
📖 第 1 页 / 共 4 页
字号:
            );

    if (Status == NDIS_STATUS_SUCCESS) {

        Adapter->BusType = (UCHAR)ReturnedValue->ParameterData.IntegerData;

    }

/*
    if (Adapter->BusType == NdisInterfaceMca) {

        NdisReadMcaPosInformation(
                    &Status,
                    ConfigurationHandle,
                    &SlotNumber,
                    &McaData
                    );

        if (Status != NDIS_STATUS_SUCCESS) {

            ConfigError = TRUE;
            ConfigErrorValue = NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION;
            goto RegisterAdapter;

        }

        //
        // Interpret POS data
        //
        if (McaData.AdapterId == AE2_ADAPTER_ID ){
            SkipIobaseAndInterrupt = TRUE;
            switch ((McaData.PosData1 & MC_IO_BASE_MASK)>>1) {
                case 0x01:
                    IoBaseAddr = (PVOID)0x1000;
                    break;
                case 0x02:
                    IoBaseAddr = (PVOID)0x2020;
                    break;
                case 0x03:
                    IoBaseAddr = (PVOID)0x8020;
                    break;
                case 0x04:
                    IoBaseAddr = (PVOID)0x0300;
                    break;
                case 0x05:
                    IoBaseAddr = (PVOID)0x0320;
                    break;
                case 0x06:
                    IoBaseAddr = (PVOID)0x0340;
                    break;
                case 0x07:
                    IoBaseAddr = (PVOID)0x0360;
                    break;
            }
            switch ((McaData.PosData1 & MC_IRQ_MASK)>>5) {
                case 0x00:
                    InterruptNumber = 3;
                    break;
                case 0x01:
                    InterruptNumber = 4;
                    break;
                case 0x02:
                    InterruptNumber = 5;
                    break;
                case 0x03:
                    InterruptNumber = 9;
                    break;
                }

        } else if (McaData.AdapterId == NE2_ADAPTER_ID ){
            SkipIobaseAndInterrupt = TRUE;
            switch ((McaData.PosData1 & MC_IO_BASE_MASK)>>1) {
                case 0x01:
                    IoBaseAddr = (PVOID)0x1000;
                    break;
                case 0x02:
                    IoBaseAddr = (PVOID)0x2020;
                    break;
                case 0x03:
                    IoBaseAddr = (PVOID)0x8020;
                    break;
                case 0x04:
                    IoBaseAddr = (PVOID)0xa0a0;
                    break;
                case 0x05:
                    IoBaseAddr = (PVOID)0xb0b0;
                    break;
                case 0x06:
                    IoBaseAddr = (PVOID)0xc0c0;
                    break;
                case 0x07:
                    IoBaseAddr = (PVOID)0xc3d0;
                    break;
            }
            switch ((McaData.PosData1 & MC_IRQ_MASK)>>5) {
                case 0x00:
                    InterruptNumber = 3;
                    break;
                case 0x01:
                    InterruptNumber = 4;
                    break;
                case 0x02:
                    InterruptNumber = 5;
                    break;
                case 0x03:
                    InterruptNumber = 9;
                    break;
                case 0x04:
                    InterruptNumber = 10;
                    break;
                case 0x05:
                    InterruptNumber = 11;
                    break;
                case 0x06:
                    InterruptNumber = 12;
                    break;
                case 0x07:
                    InterruptNumber = 15;
                    break;
            }
        }

        //
        // You cannot read the POS information for a UBEtherNext.
        //
    }
*/

    if (!SkipIobaseAndInterrupt) {

        //
        // Read I/O Address
        //
        NdisReadConfiguration(
                &Status,
                &ReturnedValue,
                ConfigHandle,
                &IOAddressStr,
                NdisParameterHexInteger
                );

        if (Status == NDIS_STATUS_SUCCESS) {

            IoBaseAddr = (PVOID)(ReturnedValue->ParameterData.IntegerData);

        }


        //
        // Read interrupt number
        //
#if NDIS_NT
        NdisReadConfiguration(
                &Status,
                &ReturnedValue,
                ConfigHandle,
                &InterruptStr,
                NdisParameterHexInteger
                );
#else

        NdisReadConfiguration(
                &Status,
                &ReturnedValue,
                ConfigHandle,
                &InterruptStr,
                NdisParameterInteger
                );
#endif

        if (Status == NDIS_STATUS_SUCCESS) {

            InterruptNumber = (CCHAR)(ReturnedValue->ParameterData.IntegerData);

        }

        if ((Adapter->BusType == NdisInterfacePci) && (0 == IoBaseAddr) &&
            (0 == InterruptNumber)) {
            // Let's try to find this in the PCI info
            SearchPCIConfig (&(DWORD)IoBaseAddr, &InterruptNumber, PCI_CLASS_NETWORK_CTLR, PCI_SUBCLASS_NET_ETHERNET_CTLR);
        }
        
        //
        // Check that the IOBase value is valid.
        //
        if ((IoBaseAddr < (PVOID)MIN_IOBASEADDR) ||
            (IoBaseAddr > (PVOID)MAX_IOBASEADDR)) {

            ConfigError = TRUE;
            ConfigErrorValue = (ULONG)IoBaseAddr;
            DEBUGMSG(1,
                (TEXT("NE2000:Intialize: Invalid IoBaseAddr 0x%x\n"),
                IoBaseAddr));
            goto RegisterAdapter;

        }
        
        //
        // Verify that the IRQ value is valid.
        //
        if ((InterruptNumber < MIN_IRQ) ||
            (InterruptNumber > MAX_IRQ)) {

            ConfigError = TRUE;
            ConfigErrorValue = (ULONG)InterruptNumber;
            DEBUGMSG(1,
                (TEXT("NE2000:Intialize: Invalid Int 0x%x\n"),
                InterruptNumber));
            goto RegisterAdapter;

        }

/* This is too platform dependent to work in Windows CE.
        //
        //  If the adapter is a pcmcia card then get the memory window
        //  address for later use.
        //
        if (NE2000_PCMCIA == Adapter->CardType)
        {
            NDIS_STRING AttributeMemoryAddrStr =
                            NDIS_STRING_CONST("PCCARDAttributeMemoryAddress");
            NDIS_STRING AttributeMemorySizeStr =
                            NDIS_STRING_CONST("PCCARDAttributeMemorySize");

            //
            //  Read the attribute memory address.
            //
            Adapter->AttributeMemoryAddress = 0xd4000;

            NdisReadConfiguration(
                &Status,
                &ReturnedValue,
                ConfigHandle,
                &AttributeMemoryAddrStr,
                NdisParameterHexInteger
            );
            if (NDIS_STATUS_SUCCESS == Status)
            {
                Adapter->AttributeMemoryAddress =
                            (ULONG)ReturnedValue->ParameterData.IntegerData;
            }

            //
            //  Read the size of the attribute memory range.
            //
            Adapter->AttributeMemorySize = 0x1000;

            NdisReadConfiguration(
                &Status,
                &ReturnedValue,
                ConfigHandle,
                &AttributeMemorySizeStr,
                NdisParameterHexInteger
            );
            if (NDIS_STATUS_SUCCESS == Status)
            {
                Adapter->AttributeMemorySize =
                            (ULONG)ReturnedValue->ParameterData.IntegerData;
            }
        }
*/
    }

    //
    // Read MaxMulticastList
    //
    NdisReadConfiguration(
            &Status,
            &ReturnedValue,
            ConfigHandle,
            &MaxMulticastListStr,
            NdisParameterInteger
            );

    if (Status == NDIS_STATUS_SUCCESS) {

        MaxMulticastList = ReturnedValue->ParameterData.IntegerData;
		if (ReturnedValue->ParameterData.IntegerData <= DEFAULT_MULTICASTLISTMAX)
	        MaxMulticastList = ReturnedValue->ParameterData.IntegerData;
    }


RegisterAdapter:

    //
    // Now to use this information and register with the wrapper
    // and initialize the adapter.
    //

    //
    // First close the configuration space.
    //
    NdisCloseConfiguration(ConfigHandle);

    DEBUGMSG(1, (TEXT("NE2000:Registering adapter # buffers %ld\n"),
        DEFAULT_NUMBUFFERS));
    DEBUGMSG(1, (TEXT("NE2000:Bus type: %d\n"), Adapter->BusType));
    DEBUGMSG(1, (TEXT("NE2000:I/O base addr 0x%lx\n"), IoBaseAddr));
    DEBUGMSG(1, (TEXT("NE2000:interrupt number %ld\n"),
        InterruptNumber));
    DEBUGMSG(1, (TEXT("NE2000:max multicast %ld\n"),
        DEFAULT_MULTICASTLISTMAX));
    DEBUGMSG(1, (TEXT("NE2000:attribute memory address 0x%X\n"),
        Adapter->AttributeMemoryAddress));
    DEBUGMSG(1, (TEXT("NE2000:attribute memory size 0x%X\n"),
        Adapter->AttributeMemorySize));



    //
    // Set up the parameters.
    //
    Adapter->NumBuffers = DEFAULT_NUMBUFFERS;
    Adapter->IoBaseAddr = IoBaseAddr;

    Adapter->InterruptNumber = InterruptNumber;

    Adapter->MulticastListMax = MaxMulticastList;
    Adapter->MiniportAdapterHandle = MiniportAdapterHandle;

    Adapter->MaxLookAhead = NE2000_MAX_LOOKAHEAD;

    //
    // Now do the work.
    //
    if (Ne2000RegisterAdapter(Adapter,
          ConfigurationHandle,
          ConfigError,
          ConfigErrorValue
          ) != NDIS_STATUS_SUCCESS) {

        //
        // Ne2000RegisterAdapter failed.
        //
        NdisFreeMemory(Adapter, sizeof(NE2000_ADAPTER), 0);

        return NDIS_STATUS_FAILURE;

    }


    DEBUGMSG(1, (TEXT("NE2000:Initialize succeeded\n")));

    return NDIS_STATUS_SUCCESS;
}


#pragma NDIS_PAGEABLE_FUNCTION(Ne2000RegisterAdapter)
NDIS_STATUS
Ne2000RegisterAdapter(
    IN PNE2000_ADAPTER Adapter,
    IN NDIS_HANDLE ConfigurationHandle,
    IN BOOLEAN ConfigError,
    IN ULONG ConfigErrorValue
    )

/*++

Routine Description:

    Called when a new adapter should be registered. It allocates space for
    the adapter, initializes the adapter's block, registers resources
    with the wrapper and initializes the physical adapter.

Arguments:

    Adapter - The adapter structure.

    ConfigurationHandle - Handle passed to Ne2000Initialize.

    ConfigError - Was there an error during configuration reading.

    ConfigErrorValue - Value to log if there is an error.

Return Value:

    Indicates the success or failure of the registration.

--*/

{

    //
    // Temporary looping variable.
    //
    UINT i;

    //
    // General purpose return from NDIS calls
    //
    NDIS_STATUS status;

    //
    // check that NumBuffers <= MAX_XMIT_BUFS
    //

    if (Adapter->NumBuffers > MAX_XMIT_BUFS)
        return(NDIS_STATUS_RESOURCES);

    //
    // Check for a configuration error
    //
    if (ConfigError)
    {
        //
        // Log Error and exit.
        //
        NdisWriteErrorLogEntry(
            Adapter->MiniportAdapterHandle,
            NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION,
            1,
            ConfigErrorValue
            );
        DEBUGMSG(1,
            (TEXT("NE2000:RegisterAdapter: Ne2000Initialize had a config error %d\n"),
            ConfigErrorValue));

        return(NDIS_STATUS_FAILURE);
    }

    //
    // Inform the wrapper of the physical attributes of this adapter.
    //
    NdisMSetAttributes(
        Adapter->MiniportAdapterHandle,
        (NDIS_HANDLE)Adapter,
        FALSE,
        Adapter->BusType
    );

    //
    // Register the port addresses.
    //
    status = NdisMRegisterIoPortRange(
                 (PVOID *)(&(Adapter->IoPAddr)),
                 Adapter->MiniportAdapterHandle,
                 (ULONG)Adapter->IoBaseAddr,
                 0x20
             );

    if (status != NDIS_STATUS_SUCCESS)
        return(status);

    if (Adapter->IoPAddr == 0)
        return NDIS_STATUS_FAILURE;

    if (NdisInterfaceIsa == Adapter->BusType) {
        //
        // Check that the IoBaseAddress seems to be correct.
        //
        DEBUGMSG(1,
            (TEXT("NE2000:RegisterAdapter Checking Parameters\n")));

        if (!CardCheckParameters(Adapter)) {
            //
            // The card does not seem to be there, fail silently.
            //
            DEBUGMSG(1,
                (TEXT("NE2000:RegisterAdapter CardCheckParameters -- Failed\n")));

            NdisWriteErrorLogEntry(
                Adapter->MiniportAdapterHandle,
                NDIS_ERROR_CODE_ADAPTER_NOT_FOUND,
                0
            );

            status = NDIS_STATUS_ADAPTER_NOT_FOUND;

            goto fail2;
        }

        DEBUGMSG(1,
            (TEXT("NE2000:RegisterAdapter CardCheckParamters succeeded\n")));
    }

    //
    // Initialize the card.
    //
    DEBUGMSG(1,
        (TEXT("NE2000:RegisterAdapter calling CardInitialize\n")));

    if (!CardInitialize(Adapter))
    {
        //
        // Card seems to have failed.
        //

        DEBUGMSG(1,
            (TEXT("NE2000:RegisterAdapter CardInitialize -- Failed\n")));

        NdisWriteErrorLogEntry(
            Adapter->MiniportAdapterHandle,
            NDIS_ERROR_CODE_ADAPTER_NOT_FOUND,
            0
        );

        status = NDIS_STATUS_ADAPTER_NOT_FOUND;

        goto fail2;
    }

    DEBUGMSG(1,
        (TEXT("NE2000:RegisterAdapter CardInitialize  -- Success\n")));

    //
    //
    // For programmed I/O, we will refer to transmit/receive memory in
    // terms of offsets in the card's 64K address space.
    //
    Adapter->XmitStart = Adapter->RamBase;

    //
    // For the NicXXX fields, always use the addressing system
    // containing the MSB only).
    //
    Adapter->NicXmitStart = (UCHAR)(((ULONG)Adapter->XmitStart) >> 8);

    //
    // The start of the receive space.
    //
    Adapter->PageStart = Adapter->XmitStart +
            (Adapter->NumBuffers * TX_BUF_SIZE);

    Adapter->NicPageStart = Adapter->NicXmitStart +
            (UCHAR)(Adapter->NumBuffers * BUFS_PER_TX);

    ASSERT(Adapter->PageStart < (Adapter->RamBase + Adapter->RamSize));

    //
    // The end of the receive space.
    //
    Adapter->PageStop = Adapter->XmitStart + Adapter->RamSize;
    Adapter->NicPageStop = Adapter->NicXmitStart + (UCHAR)(Adapter->RamSize >> 8);

    ASSERT(Adapter->PageStop <= (Adapter->RamBase + Adapter->RamSize));

    DEBUGMSG(1, (TEXT("NE2000:RegisterAdapter Xmit Start (0x%x, 0x%x) : Rcv Start (0x%x, 0x%x) : Rcv End (0x%x, 0x%x)\n"),
              Adapter->XmitStart,
              Adapter->NicXmitStart,
              Adapter->PageStart,
              Adapter->NicPageStart,
              (ULONG)Adapter->PageStop,
              Adapter->NicPageStop));

⌨️ 快捷键说明

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