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

📄 rtsnt.c

📁 虚拟网络驱动程序ndis for 数字电视 ip 数据接收
💻 C
📖 第 1 页 / 共 5 页
字号:

    OpenErrorStatus - Extra status bytes for opening token ring adapters.

    SelectedMediumIndex - Index of the media type chosen by the driver.

    MediumArray - Array of media types for the driver to chose from.

    MediumArraySize - Number of entries in the array.

    MiniportAdapterHandle - Handle for passing to the wrapper when
       referring to this adapter.

    ConfigurationHandle - A handle to pass to NdisOpenConfiguration.

Return Value:

    NDIS_STATUS_SUCCESS
    NDIS_STATUS_PENDING

--*/
extern
NDIS_STATUS
RTFast_Initialize(
    OUT PNDIS_STATUS OpenErrorStatus,
    OUT PUINT SelectedMediumIndex,
    IN PNDIS_MEDIUM MediumArray,
    IN UINT MediumArraySize,
    IN NDIS_HANDLE MiniportAdapterHandle,
    IN NDIS_HANDLE ConfigurationHandle
    )
{
    PRTFAST_ADAPTER Adapter;            // Pointer to our newly allocated adapter.
    BOOLEAN ConfigError = FALSE;        // TRUE if there is a configuration error.
    ULONG ConfigErrorValue = 0;         // A special value to log concerning the error
    //
    // TRUE if it is unnecessary to read the Io Base Address
    // and Interrupt from the registry.  Used for Microchannel
    // adapters, which get this information from the slot
    // information.
    //
    //BOOLEAN  WIN95Flag;
    NDIS_STATUS  Status;                  // Status of Ndis calls.
    //PNDIS_PACKET  pPacket;
    //PNDIS_BUFFER  pNdisBuffer;

    ULONG  i;
    //UCHAR  tmpInterruptNum;

#if DBG
    DbgPrint("\n>>>> Enter RTFast Initialize\n");
#endif

    DbgPrint("2830S**** RTFast_Initialize DVB NIC device %s:%s\n", __DATE__, __TIME__);


    // Search for the medium type (802.3) in the given array.
    // Support 802.3 only
    for(i = 0; i < MediumArraySize; i++)
    {
        if(MediumArray[i] == NdisMedium802_3)
        {
            break;
        }
    }

    if(i == MediumArraySize)
    {
        return (NDIS_STATUS_UNSUPPORTED_MEDIA);
    }
    *SelectedMediumIndex = i;

	DbgPrint("2830S**** media set ok.\n");

    // Allocate memory for the adapter block now.
    // To pass HCT test, we have to add tag
#if  NDIS50_MINIPORT
    Status = NdisAllocateMemoryWithTag(
                   (PVOID *)&Adapter,
                   sizeof(RTFAST_ADAPTER),
                   'mLTR'
                   );
#else
    Status = NdisAllocateMemory(
                   (PVOID *)&Adapter,
                   sizeof(RTFAST_ADAPTER),
                   0,
                   HighestAcceptableMax
                   );
#endif

	

    if(Status != NDIS_STATUS_SUCCESS)
    {
#if CREATE_MY_NEWDEVICE
        if(RTFast_MiniportBlock.NdisDeviceHandle)
            NdisMDeregisterDevice(RTFast_MiniportBlock.NdisDeviceHandle);
#endif
        return (Status);
    }
	else
	{
		DbgPrint("2830S**** allocatememory ok.\n");
	}

    NdisZeroMemory (Adapter, sizeof(RTFAST_ADAPTER));   //initializt to 0
    RtlFillMemory (Adapter->IPStatistic, sizeof(Adapter->IPStatistic), 0xff);

    Adapter->MulticastListMax = MAX_IP_FILTERPID_NUM;
    Adapter->MiniportAdapterHandle = MiniportAdapterHandle;
    Adapter->MaxLookAhead = RTFAST_MAX_LOOKAHEAD;

	//tiger add for IR
	Adapter->IRPendingIrp = NULL;
	//tiger end

	// Adapter->LinkStatus = LINK_DISCONNECT;
	Adapter->LinkStatus = LINK_CONNECT;

     //test only
#if DBG
    DbgPrint("*** Adapter = 0x%x  ", Adapter);
    DbgPrint("sizeof(Adapter) = %d\n", sizeof(RTFAST_ADAPTER));


#endif   

    //get our configuration from registry
    if( ReadRegistry(Adapter, ConfigurationHandle) != NDIS_STATUS_SUCCESS )
    {
#if CREATE_MY_NEWDEVICE
        if(RTFast_MiniportBlock.NdisDeviceHandle)
            NdisMDeregisterDevice(RTFast_MiniportBlock.NdisDeviceHandle);
#endif
        NdisFreeMemory(Adapter, sizeof(RTFAST_ADAPTER), 0);
        return (NDIS_STATUS_FAILURE);
    }

/*	
//Get and set bus configuration
#ifndef NDIS50_MINIPORT
    //ndis5 do not need it

    //check if we have to do cardbus enabler
    Adapter->DirectEnable = FALSE;

#if NDIS40_MINIPORT
    if( (Adapter->ChipOnCardbus) && (Adapter->Environment == NdisEnvironmentWindowsNt) )
#endif

#if  NDIS30_MINIPORT
    if(Adapter->ChipOnCardbus)
#endif
    {
        Status = GetPCIConfigurationOnCardbus( Adapter, ConfigurationHandle);
        if(Status != NDIS_STATUS_SUCCESS)
        {
#if CREATE_MY_NEWDEVICE
            if(RTFast_MiniportBlock.NdisDeviceHandle)
                NdisMDeregisterDevice(RTFast_MiniportBlock.NdisDeviceHandle);
#endif 
            NdisFreeMemory(Adapter, sizeof(RTFAST_ADAPTER), 0);
            return (Status);
        }
    }
    else
    {   //not direct open
        //get and set PCI configuration space
        Status = FindPciConfiguration(
                     Adapter->MiniportAdapterHandle,
                     Adapter->SlotNumber,
                     &(Adapter->IoAddr),
                     &(Adapter->IoSpace),
                     &(Adapter->InterruptLevel),
                     &(Adapter->InterruptNumber)
                     );
        if(Status != NDIS_STATUS_SUCCESS)
        {
// For Bootrom, we have to scan by ourself
#if NDIS30_MINIPORT
            if(pci_find_device (
                        RTSNT_PCI_ID,
                        &(Adapter->BusNum),
                        &(Adapter->DevNum),
                        &(Adapter->FunNum),
                        &tmpInterruptNum) != TRUE)
            {
#endif
#if CREATE_MY_NEWDEVICE
                if(RTFast_MiniportBlock.NdisDeviceHandle)
                    NdisMDeregisterDevice(RTFast_MiniportBlock.NdisDeviceHandle);
#endif
                NdisFreeMemory(Adapter, sizeof(RTFAST_ADAPTER), 0);
                return (Status);
#if NDIS30_MINIPORT
            }
            else
            {
                pci_get_byte (Adapter->BusNum, Adapter->DevNum, Adapter->FunNum, 0x3c, &(Adapter->InterruptLevel));
                pci_get_long (Adapter->BusNum, Adapter->DevNum, Adapter->FunNum, 0x10, &(Adapter->IoAddr));
                Adapter->IoAddr &= 0xfffffff0;
                Adapter->InterruptNumber = Adapter->InterruptLevel;
                Adapter->IoSpace = 0x100;
            }
#endif
        }
        SetupPCIConfiguration(Adapter);
    }
#else   //ndis5
    Status = FindPciConfiguration(
                     Adapter->MiniportAdapterHandle,
                     Adapter->SlotNumber,
                     &(Adapter->IoAddr),
                     &(Adapter->IoSpace),
                     &(Adapter->InterruptLevel),
                     &(Adapter->InterruptNumber)
                     );

    if(Status != NDIS_STATUS_SUCCESS)
    {
#if CREATE_MY_NEWDEVICE
        if(RTFast_MiniportBlock.NdisDeviceHandle)
            NdisMDeregisterDevice(RTFast_MiniportBlock.NdisDeviceHandle);
#endif
        NdisFreeMemory(Adapter, sizeof(RTFAST_ADAPTER), 0);
        return (Status);
    }

    SetupPCIConfiguration(Adapter);
#endif


	// Read Vendor ID and Device ID
	GetDeviceID(Adapter);
    if(Adapter->Version == UNKNOWN_DEV)
	{
		Status = NDIS_STATUS_FAILURE;
		goto fail1;
	}


  
    // Inform the wrapper of the physical attributes of this adapter.
    NdisMSetAttributes(
            Adapter->MiniportAdapterHandle,
            (NDIS_HANDLE)Adapter,           //our context
            TRUE,                           //bus master
            NdisInterfacePci                //PCI interface
            );
*/
	

/*	
    // get resource 1:interrupt
    // Initialize the interrupt. SHARED
    Status = NdisMRegisterInterrupt(
                 &Adapter->Interrupt,           //our interrupt object
                 Adapter->MiniportAdapterHandle,
                 (UINT)Adapter->InterruptNumber,//interrupt vector
                 (UINT)Adapter->InterruptNumber,//interrupt level
                 TRUE,
                 TRUE,                          //shared interrupt
                 NdisInterruptLevelSensitive    //PCI is level sensive
                 );

    if(Status != NDIS_STATUS_SUCCESS)
    {
#if DBG
        DbgPrint("*** Register interrupt fail, status::%x\n", Status);
#endif
        NdisWriteErrorLogEntry(
                Adapter->MiniportAdapterHandle,
                NDIS_ERROR_CODE_INTERRUPT_CONNECT,
                0 );
#if CREATE_MY_NEWDEVICE
        if(RTFast_MiniportBlock.NdisDeviceHandle)
            NdisMDeregisterDevice(RTFast_MiniportBlock.NdisDeviceHandle);
#endif
        NdisFreeMemory(Adapter, sizeof(RTFAST_ADAPTER), 0);
        return  Status;
    }

    //
    // Register the port addresses.
    //
    Status = NdisMRegisterIoPortRange(
                 (PVOID *)(&(Adapter->IoAddr)),
                 Adapter->MiniportAdapterHandle,
                 (ULONG)Adapter->IoAddr,       //io base address
                 0x100
                 );

    if(Status != NDIS_STATUS_SUCCESS)
    {
        goto fail1;
    }
 

    DbgPrint(" Device IO base address: 0x%x\n", Adapter->IoAddr);

    Status = NdisMAllocateMapRegisters(
                 Adapter->MiniportAdapterHandle,
                 0,
                 TRUE,
                 9,
                 2048
                 );

    if(Status != NDIS_STATUS_SUCCESS)
    {
        goto  fail2;  //unregister IO range
    }
*/
    // Removed by hanney on Apr 28th 2005

	/*

	// check encrypt
	if(!Check_Encrypt(Adapter))
	{
		DbgPrint(" Key checked failed!");
		Status = NDIS_STATUS_FAILURE;
		goto fail1;
	}
#ifdef DBG
	else
		DbgPrint(" Key checked OK!");
#endif

	// RTFast_DisableInterrupt(Adapter);
*/
    // Initialize DMA and register
    InitSoftwareVariable(Adapter);

	
    // Initialize hardware

    CardReadEthernetAddress(Adapter);


    // register a shutdown handler...
    NdisMRegisterAdapterShutdownHandler(
                Adapter->MiniportAdapterHandle,
                (PVOID) Adapter,
                (ADAPTER_SHUTDOWN_HANDLER) RTFast_Shutdown);


    NdisMInitializeTimer(
                &(Adapter->ResetCheckingTimer),
                Adapter->MiniportAdapterHandle,
                (PVOID) LinkHandler,
                (PVOID) Adapter);


    // if NdisReadNetworkAddress get a non-0 address, then set ID0-6 to this address

    // Initialization completed successfully.
    {
        PRTFAST_ADAPTER TmpAdapter = RTFast_MiniportBlock.AdapterQueue;
        if(TmpAdapter == NULL)
        {
           RTFast_MiniportBlock.AdapterQueue = Adapter;
           RTFast_MiniportBlock.CurAdapter = Adapter;
        }
        else
		{
            while( (TmpAdapter != NULL) && (TmpAdapter->NextAdapter != NULL) )
            {
                    TmpAdapter = TmpAdapter->NextAdapter;
            }
            TmpAdapter->NextAdapter = Adapter;
        }
    } 

#if DBG
    DbgPrint("<<< End of Initialize RTFast\n");
#endif

    //
    // Code to unwind what has already been set up when a part of
    // initialization fails, which is jumped into at various
    // points based on where the failure occured. Jumping to
    // a higher-numbered failure point will execute the code
    // for that block and all lower-numbered ones.
    //


	g_driverok = TRUE;

    return (Status);
}



VOID
SetupPCIConfiguration(
    IN PRTFAST_ADAPTER Adapter
)
{
    UCHAR  TmpUchar;

    //19980915, CRC problem, set PCI latency timer to 0x80
    TmpUchar = 0x80;
    NdisWritePciSlotInformation(
               Adapter->MiniportAdapterHandle,
               Adapter->SlotNumber,
               0x0d,                               // command
               (PVOID)&TmpUchar,
               1);

    //
    //19980603. Make sure BusMaster is enabled
    NdisReadPciSlotInformation(
               Adapter->MiniportAdapterHandle,
               Adapter->SlotNumber,
               0x4,                               // command
               (PVOID)&TmpUchar,
               1);
    Adapter->BusMasterEnabledOnDriverLoad = TmpUchar & SIZE8_BIT2;

    //enable bus_master+momory+I/O
    TmpUchar |= SIZE8_BIT2 + SIZE8_BIT1 + SIZE8_BIT0;

    NdisWritePciSlotInformation(
               Adapter->MiniportAdapterHandle,
               Adapter->SlotNumber,
               0x4,                               // command
               (PVOID)&TmpUchar,
               1);
/*
    //check if power management is enabled
    NdisReadPciSlotInformation(
               Adapter->MiniportAdapterHandle,
               Adapter->SlotNumber,
               0x50,                               // command
               (PVOID)&TmpUchar,
               1);

    if(TmpUchar == 0x01)
    {   //power management is enabled
        TmpUchar = 0x0;                           // set to Power state 0
        NdisWritePciSlotInformation(
               Adapter->MiniportAdapterHandle,
               Adapter->SlotNumber,
               0x54,
               (PVOID)&TmpUchar,
               1);

        NdisReadPciSlotInformation(              // read cur PME_En
               Adapter->MiniportAdapterHandle,
               Adapter->SlotNumber,
               0x55,
               (PVOID)&TmpUchar,
               1);

        TmpUchar |= 0x80;                        // set

        NdisWritePciSlotInformation(
               Adapter->MiniportAdapterHandle,
               Adapter->SlotNumber,
               0x55,
               (PVOID)&TmpUchar,
               1);

    }

⌨️ 快捷键说明

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