📄 ne2000.c
字号:
);
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 + -