📄 lan91c96_init.c
字号:
RETAILMSG(1, (TEXT("-%02X-%02X\r\n"), LOBYTE(temp), HIBYTE(temp)));
//Reset the card
if(!AdapterReset(Adapter))
{
RETAILMSG(1, (TEXT("LAN91C96: ERROR Can't Reset the Adapter!\r\n")));
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:<== MiniPort Initialize\r\n")));
BackOut(Adapter);
return(NDIS_STATUS_FAILURE);
}
//Link Established
Adapter->LinkStatus = MEDIA_CONNECTED;
//Enable the interrupts !!
LAN91C96_Write(Adapter->IOBase + BANK_SELECT,(USHORT) 2);
LAN91C96_Write( Adapter->IOBase + BANK2_INT_STS,(USHORT)(ENABLED_INTS << 8));
{
//initialize GPIO8_1 as NIC IRQ pin
PHYSICAL_ADDRESS PhysicalIoBase;
volatile unsigned long *GPIO_ADD;
PhysicalIoBase.HighPart = 0;
PhysicalIoBase.LowPart = 0x2002f400;
GPIO_ADD = (unsigned long *)MmMapIoSpace( PhysicalIoBase, 0x100 ,FALSE );
RETAILMSG(0,(TEXT("GPIO_ADD = 0x%x\r\n"),GPIO_ADD));
/*
*(volatile long *)(GPIO_ADD + GPIOIS) |= 0x2; //level int
*(volatile long *)(GPIO_ADD + GPIOIBE) = 0x0;
*(volatile long *)(GPIO_ADD + GPIOIEV) |= 0x2; //high level
*(volatile long *)(GPIO_ADD + GPIOIE) |= 0x2; //enable GPIO INT
*/
*(volatile long *)(GPIO_ADD + 1) |= 0x2; //level int
*(volatile long *)(GPIO_ADD + 2) = 0x0;
*(volatile long *)(GPIO_ADD + 3) |= 0x2; //high level
*(volatile long *)(GPIO_ADD + 4) |= 0x2; //enable GPIO INT
}
/*test
{ USHORT DAT;
USHORT SavedBS;
LAN91C96_Read(Adapter->IOBase + BANK_SELECT, &SavedBS);
LAN91C96_Write(Adapter->IOBase + BANK_SELECT,(USHORT) 0);
LAN91C96_Read(Adapter->IOBase + BANK0_TCR, &DAT);
RETAILMSG(1, (TEXT(" BANK0_TCR = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK0_STS, &DAT);
RETAILMSG(1, (TEXT(" BANK0_STS = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK0_RCR, &DAT);
RETAILMSG(1, (TEXT(" BANK0_RCR = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK0_CTR, &DAT);
RETAILMSG(1, (TEXT(" BANK0_CTR = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK0_MIR, &DAT);
RETAILMSG(1, (TEXT(" BANK0_MIR = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK0_MCR, &DAT);
RETAILMSG(1, (TEXT(" BANK0_MCR = 0x%x\r\n"),DAT));
LAN91C96_Write(Adapter->IOBase + BANK_SELECT,(USHORT) 1);
LAN91C96_Read(Adapter->IOBase + BANK1_CONFIG, &DAT);
RETAILMSG(1, (TEXT(" BANK1_CONFIG = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK1_BASE, &DAT);
RETAILMSG(1, (TEXT(" BANK1_BASE = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK1_IA0, &DAT);
RETAILMSG(1, (TEXT(" BANK1_IA0 = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK1_GEN, &DAT);
RETAILMSG(1, (TEXT(" BANK1_GEN = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK1_CTL, &DAT);
RETAILMSG(1, (TEXT(" BANK1_CTL = 0x%x\r\n"),DAT));
LAN91C96_Write(Adapter->IOBase + BANK_SELECT,(USHORT) 2);
LAN91C96_Read(Adapter->IOBase + BANK2_MMUCMD, &DAT);
RETAILMSG(1, (TEXT(" BANK2_MMU_CMD = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK2_PNR, &DAT);
RETAILMSG(1, (TEXT(" BANK2_PNR = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK2_FIFOS, &DAT);
RETAILMSG(1, (TEXT(" BANK2_FIFOS = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK2_INT_STS, &DAT);
RETAILMSG(1, (TEXT(" BANK2_INT_STS = 0x%x\r\n"),DAT));
LAN91C96_Write(Adapter->IOBase + BANK_SELECT,(USHORT) 3);
LAN91C96_Read(Adapter->IOBase + BANK3_MT01, &DAT);
RETAILMSG(1, (TEXT(" BANK3_MT01 = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK3_MT23, &DAT);
RETAILMSG(1, (TEXT(" BANK3_MT23 = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK3_MT45, &DAT);
RETAILMSG(1, (TEXT(" BANK3_MT45 = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK3_MT67, &DAT);
RETAILMSG(1, (TEXT(" BANK3_MT67 = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK3_MGMT, &DAT);
RETAILMSG(1, (TEXT(" BANK3_MGMT = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK3_REV, &DAT);
RETAILMSG(1, (TEXT(" BANK3_REV = 0x%x\r\n"),DAT));
LAN91C96_Read(Adapter->IOBase + BANK3_ERCV, &DAT);
RETAILMSG(1, (TEXT(" BANK3_ERCV = 0x%x\r\n"),DAT));
LAN91C96_Write(Adapter->IOBase + BANK_SELECT, SavedBS);
}
*/
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 <== MiniportInitialize \r\n")));
//Ready
Adapter->State = NORMAL_STATE;
return NDIS_STATUS_SUCCESS;
}
/*
Function Name : GetRegistrySettings
Description :
Reads the registry values, and loads them into the adapter structure
Parameters :
MINIPORT_ADAPTER *Adapter - Pointer to the adapter structure
NDIS_HANDLE ConfigurationContext - Context handler, from the NDIS wrapper
Return Value :
NDIS_STATUS Status
*/
NDIS_STATUS GetRegistrySettings(MINIPORT_ADAPTER *Adapter,
NDIS_HANDLE ConfigurationContext)
{
NDIS_STATUS Status;
NDIS_HANDLE ConfigurationHandle;
PNDIS_CONFIGURATION_PARAMETER ConfigurationParameter;
UCHAR * NewNetworkAddress=NULL;
UINT NewNetworkAddressLength;
NDIS_STRING BusTypeString = NDIS_STRING_CONST("BusType");
NDIS_STRING BusNumberString = NDIS_STRING_CONST("BusNumber");
NDIS_STRING DuplexString = NDIS_STRING_CONST("FullDuplex");
NDIS_STRING IOBase = NDIS_STRING_CONST("IoBaseAddress");
NDIS_STRING Interrupt = NDIS_STRING_CONST("InterruptNumber");
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 ==> GetRegistrySettings \r\n")));
//Set up the default values
// First set up defaults.
Adapter->InterruptVector =
Adapter->InterruptLevel = DEFAULT_IRQ;
Adapter->InterruptType = CM_RESOURCE_INTERRUPT_LATCHED;
Adapter->IOBase = DEFAULT_IO_BASE;
Adapter->LookAhead = MAX_LOOKAHEAD_SIZE;
Adapter->LinkStatus = (USHORT)MEDIA_DISCONNECTED;
Adapter->MACAddress[0] =
Adapter->MACAddress[1] =
Adapter->MACAddress[2] = 0;
//Open the Registry tree for this adapter.
NdisOpenConfiguration((PNDIS_STATUS) &Status,(PNDIS_HANDLE) &ConfigurationHandle,ConfigurationContext);
if(Status != NDIS_STATUS_SUCCESS)
{
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 : ERROR - No information for adapter!\r\n")));
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 <== Configure Adapter\r\n")));
return(NDIS_STATUS_FAILURE);
}
//Get configured bus type value from registry,
NdisReadConfiguration((PNDIS_STATUS) &Status,
&ConfigurationParameter,
ConfigurationHandle,
(PNDIS_STRING) &BusTypeString,
NdisParameterInteger);
if(Status == NDIS_STATUS_SUCCESS)
{
Adapter->BusType = (USHORT) ConfigurationParameter->ParameterData.IntegerData;
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:BusType = 0x%x\r\n"), Adapter->BusType));
}
else
{
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 : ERROR - BusType not in Registry!\r\n")));
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 <== Configure Adapter\r\n")));
NdisCloseConfiguration(ConfigurationHandle);
return(NDIS_STATUS_FAILURE);
}
//Get bus number value from registry.
NdisReadConfiguration((PNDIS_STATUS) &Status,
&ConfigurationParameter,
ConfigurationHandle,
(PNDIS_STRING) &BusNumberString,
NdisParameterInteger);
if(Status == NDIS_STATUS_SUCCESS)
{
Adapter->BusNumber = (USHORT) ConfigurationParameter->ParameterData.IntegerData;
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:BusNumber = 0x%x\r\n"), Adapter->BusNumber));
}
else
{
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96: ERROR - BusNumber not in Registry!\r\n")));
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96<== Configure Adapter\r\n")));
NdisCloseConfiguration(ConfigurationHandle);
return(NDIS_STATUS_FAILURE);
}
//Check for updates to IRQ value.
NdisReadConfiguration((PNDIS_STATUS) &Status,
&ConfigurationParameter,
ConfigurationHandle,
(PNDIS_STRING) &Interrupt,
NdisParameterInteger);
if(Status == NDIS_STATUS_SUCCESS)
{
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:New IRQ Value found in register.. overiding the default value\r\n")));
Adapter->InterruptVector =
Adapter->InterruptLevel = (USHORT) (ConfigurationParameter->ParameterData.IntegerData);
Adapter->InterruptType = CM_RESOURCE_INTERRUPT_LATCHED;
}
else
{
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:Unable to read Interrupt from Registry using default value!!!\r\n")));
}
//Check for update IOBase address
NdisReadConfiguration((PNDIS_STATUS) &Status,
&ConfigurationParameter,
ConfigurationHandle,
(PNDIS_STRING) &IOBase,
NdisParameterInteger);
if (Status == NDIS_STATUS_SUCCESS)
{
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:New IOBase address found in register.. overiding the default value\r\n")));
Adapter->IOBase = (UINT) (ConfigurationParameter->ParameterData.IntegerData);
}
//Make sure we're still okay.
if(Status != NDIS_STATUS_SUCCESS)
{
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:<== Configure Adapter\r\n")));
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:ERROR: Config Handler Failed!\n")));
return(Status);
}
//Check for the Aneg
//If the Duplex String = FULL then the FDSE bit i
NdisReadConfiguration((PNDIS_STATUS) &Status,
&ConfigurationParameter,
ConfigurationHandle,
(PNDIS_STRING) &DuplexString,
NdisParameterInteger);
if (Status == NDIS_STATUS_SUCCESS)
{
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:New IOBase address found in register.. overiding the default value\r\n")));
Adapter->Duplex = (UINT) (ConfigurationParameter->ParameterData.IntegerData);
}
else
Adapter->Duplex = 0;
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:BusNumber = %d\r\n"), Adapter->BusNumber));
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:BusType = %d\r\n"), Adapter->BusType));
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:IoBase = %04x\r\n"), Adapter->IOBase));
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:Interrupt = %d\r\n"), Adapter->InterruptLevel));
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:Duplex = %d\r\n"), Adapter->Duplex));
//See if user has defined new MAC address.
NdisReadNetworkAddress((PNDIS_STATUS) &Status,
(PVOID *) &NewNetworkAddress,
&NewNetworkAddressLength,
ConfigurationHandle);
if((Status == NDIS_STATUS_SUCCESS) && (NewNetworkAddressLength != 0))
{
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:H/W MAC Address over-ride!\r\n")));
if((NewNetworkAddressLength != ETH_LENGTH_OF_ADDRESS))
{
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:Invalid MAC address length!\r\n")));
}
else
{
USHORT temp;
temp = NewNetworkAddress[1] << 8;
temp |= NewNetworkAddress[0];
Adapter->MACAddress[0] = temp;
temp = NewNetworkAddress[3] << 8;
temp |= NewNetworkAddress[2];
Adapter->MACAddress[1] = temp;
temp = NewNetworkAddress[5] << 8;
temp |= NewNetworkAddress[4];
Adapter->MACAddress[2] = temp;
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:New MAC Address = %04X%04X%04X\r\n"),
Adapter->MACAddress[0],
Adapter->MACAddress[1],
Adapter->MACAddress[2]));
}
}
else
{
Status = NDIS_STATUS_SUCCESS;
}
NdisCloseConfiguration(ConfigurationHandle);
if(Status != NDIS_STATUS_SUCCESS)
{
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:ERROR: Specific Configuration Handler Failed!\r\n")));
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96:<== Configure Adapter\r\n")));
return(Status);
}
RETAILMSG(ZONE_INIT, (TEXT("LAN91C96 <== GetRegistrySettings \r\n")));
return(Status);
}
/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -