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

📄 celan.c

📁 Wince4.2 BSP for SH4 engineering development board
💻 C
📖 第 1 页 / 共 4 页
字号:
        if (MediumArray[i] == NdisMedium802_3){

            break;

        }

    }

    if (i == MediumArraySize){
        DEBUGMSG(ZONE_INIT|ZONE_ERROR,
            (TEXT("CELAN:Initialize: No supported media\r\n")));
        return( NDIS_STATUS_UNSUPPORTED_MEDIA );

    } else {
        DEBUGMSG(ZONE_INIT, (TEXT("CELAN:Selected media is %d.\r\n"),i));
    }

    *SelectedMediumIndex = i;


    //
    // Set default values.
    //
    IoBaseAddr = DEFAULT_IOBASEADDR;
    InterruptNumber = DEFAULT_INTERRUPTNUMBER;
    MaxMulticastList = DEFAULT_MULTICASTLISTMAX;

    //
    // Allocate memory for the adapter block now.
    //
    Status = NdisAllocateMemory( (PVOID *)&Adapter,
                   sizeof(CELAN_ADAPTER),
                   0,
                   HighestAcceptableMax
                   );

    if (Status != NDIS_STATUS_SUCCESS) {

        DEBUGMSG(ZONE_INIT|ZONE_ERROR,
            (TEXT("CELAN:Initialize: NdisAllocateMemory(CELAN_ADAPTER) failed\r\n")));
        return Status;

    }

    //
    // Clear out the adapter block, which sets all default values to FALSE,
    // or NULL.
    //
    NdisZeroMemory (Adapter, sizeof(CELAN_ADAPTER));

    //
    // Open the configuration space.
    //
    NdisOpenConfiguration(
            &Status,
            &ConfigHandle,
            ConfigurationHandle
            );

    if (Status != NDIS_STATUS_SUCCESS) {

        NdisFreeMemory(Adapter, sizeof(CELAN_ADAPTER), 0);

        DEBUGMSG(ZONE_INIT,
            (TEXT("CELAN:Initialize: NdisOpenconfiguration failed 0x%x\r\n"),
            Status));
        return Status;

    }
	
	//
    // Initialize Statistics
    // 
    Adapter->FrameAlignmentErrors = 0;
    Adapter->CrcErrors = 0;
    Adapter->MissedPackets = 0;

    //
    //  Read in the card type.
    //
    NdisReadConfiguration(
            &Status,
            &ReturnedValue,
            ConfigHandle,
            &CardTypeStr,
            NdisParameterHexInteger
            );
    if (Status == NDIS_STATUS_SUCCESS)
        Adapter->CardType = (UINT)ReturnedValue->ParameterData.IntegerData;
    else
        DEBUGMSG(ZONE_INIT, (TEXT("CELAN:NdisReadConfigration(CardType) failed.\r\n")));

    //
    // Read net address
    //
    NdisReadNetworkAddress(
                    &Status,
                    &NetAddress,
                    &Length,
                    ConfigHandle
                    );

    if ((Length == CELAN_LENGTH_OF_ADDRESS) &&
        (Status == NDIS_STATUS_SUCCESS)) {

        //
        // Save the address that should be used.
        //
        NdisMoveMemory(
                Adapter->StationAddress,
                NetAddress,
                CELAN_LENGTH_OF_ADDRESS
                );

    }

#if NDIS_NT
    //
    // Disallow multiple adapters in the same MP machine because of hardware
    // problems this results in random packet corruption.
    //
    if ((NdisSystemProcessorCount() > 1) &&
        (CelanMiniportBlock.AdapterQueue != NULL)) {

        ConfigError = TRUE;
        ConfigErrorValue = (ULONG)NDIS_ERROR_CODE_UNSUPPORTED_CONFIGURATION;
        DEBUGMSG(ZONE_INIT,
            (TEXT("CELAN:Initialize: Invalid MP config\r\n")));
        goto RegisterAdapter;
    }
#endif


    //
    // Read Bus Type (for NE2/AE2 support)
    //

    NdisReadConfiguration(
            &Status,
            &ReturnedValue,
            ConfigHandle,
            &BusTypeStr,
            NdisParameterHexInteger
            );

    if (Status == NDIS_STATUS_SUCCESS) {

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

    }
    else
        DEBUGMSG(ZONE_INIT, (TEXT("CELAN:NdisReadConfigration(BusType) failed.\r\n")));

    if (!SkipIobaseAndInterrupt) {

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

        if (Status == NDIS_STATUS_SUCCESS) {

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

        } else
        	DEBUGMSG(ZONE_INIT, (TEXT("CELAN:NdisReadConfigration(IOAddress) failed.\r\n")));

        //
        // Check that the value is valid.
        //
        if ((IoBaseAddr < (PVOID)MIN_IOBASEADDR) ||
            (IoBaseAddr > (PVOID)MAX_IOBASEADDR)) {

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

        }

        //
        // 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);

        } else
        	DEBUGMSG(ZONE_INIT, (TEXT("CELAN:NdisReadConfigration(Interrupt) failed.\r\n")));

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

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

        }
    }

    //
    // 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;
    } else
        	DEBUGMSG(ZONE_INIT, (TEXT("CELAN:NdisReadConfigration(Attrbute MemorySize) failed.\r\n")));
	        DEBUGMSG(ZONE_INIT, (TEXT("Status = 0x%x, NDIS_STATUS_SUCCESS = 0x%x\r\n"),Status,NDIS_STATUS_SUCCESS));


RegisterAdapter:

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

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

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



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

    Adapter->InterruptNumber = InterruptNumber;

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

    Adapter->MaxLookAhead = CELAN_MAX_LOOKAHEAD;

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

        //
        // CelanRegisterAdapter failed.
        //
        NdisFreeMemory(Adapter, sizeof(CELAN_ADAPTER), 0);
        DEBUGMSG(ZONE_INIT, (TEXT("CELAN:NdisRegisterAdapter failed.\r\n")));

        return NDIS_STATUS_FAILURE;

    }


    DEBUGMSG(ZONE_INIT, (TEXT("CELAN:Initialize succeeded\r\n")));

    DEBUGMSG(ZONE_FUNCTION, (TEXT("-CELAN:Initialize\r\n")));

    return NDIS_STATUS_SUCCESS;
}


#pragma NDIS_PAGEABLE_FUNCTION(CelanRegisterAdapter)
NDIS_STATUS
CelanRegisterAdapter(
    IN PCELAN_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 CelanInitialize.

    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(ZONE_INIT,
            (TEXT("CELAN:RegisterAdapter: CelanInitialize had a config error %d\r\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;

    //
    // Initialize the card.
    //
    DEBUGMSG(ZONE_INIT,
        (TEXT("CELAN:RegisterAdapter calling CardInitialize\r\n")));

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

        DEBUGMSG(ZONE_INIT,
            (TEXT("CELAN:RegisterAdapter CardInitialize -- Failed\r\n")));

        RETAILMSG(1,(TEXT("CELAN:RegisterAdapter CardInitialize -- Failed\r\n")));


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

        status = NDIS_STATUS_ADAPTER_NOT_FOUND;

        goto fail2;
    }

    DEBUGMSG(ZONE_INIT,
        (TEXT("CELAN:RegisterAdapter CardInitialize  -- Success\r\n")));


    //
    // Initialize the receive variables.
    //
    Adapter->NicReceiveConfig = RCR_ENABLE | 0x0200; // RCR_REJECT_ERR;


    //
    // Read the Ethernet address off of the PROM.
    //
    if (!CardReadEthernetAddress(Adapter))
    {
        DEBUGMSG(ZONE_INIT,
            (TEXT("CELAN:RegisterAdapter Could not read the ethernet address\r\n")));

        RETAILMSG(1,(TEXT("CELAN:RegisterAdapter Could not read the ethernet address\r\n")));

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

        status = NDIS_STATUS_ADAPTER_NOT_FOUND;

        goto fail2;
    }

    //
    // Now initialize the NIC and Gate Array registers.
    //
//for LAN91C96    Adapter->NicInterruptMask = IM_TX_INT | IM_RCV_INT | IM_RX_OVRN_INT;
	  Adapter->NicInterruptMask = IM_TX_INT | IM_RCV_INT | IM_RX_OVRN_INT | IM_MD_INT;//for LAN91C111

    //
    // Link us on to the chain of adapters for this driver.
    //
    Adapter->NextAdapter = CelanMiniportBlock.AdapterQueue;
    CelanMiniportBlock.AdapterQueue = Adapter;


    //
    // Setup the card based on the initialization information
    //

    DEBUGMSG(ZONE_INIT, (TEXT("CELAN:RegisterAdapter CardSetup\r\n")));

    if (!CardSetup(Adapter))
    {
        //
        // The NIC could not be written to.
        //

        NdisWriteErrorLogEntry(

⌨️ 快捷键说明

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