📄 rtsnt.c
字号:
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 + -