📄 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);
}
if (Adapter->BusType != NdisInterfacePcMcia)
{
//
// Check that the value is valid.
//
if ((IoBaseAddr < (PVOID)MIN_IOBASEADDR) ||
(IoBaseAddr > (PVOID)MAX_IOBASEADDR)) {
ConfigError = TRUE;
ConfigErrorValue = PtrToUlong(IoBaseAddr);
goto RegisterAdapter;
}
}
//
// Read interrupt number
//
NdisReadConfiguration(
&Status,
&ReturnedValue,
ConfigHandle,
&InterruptStr,
NdisParameterHexInteger
);
if (Status == NDIS_STATUS_SUCCESS) {
InterruptNumber = (CCHAR)(ReturnedValue->ParameterData.IntegerData);
}
//
// Verify that the value is valid.
//
if ((InterruptNumber < MIN_IRQ) ||
(InterruptNumber > MAX_IRQ)) {
ConfigError = TRUE;
ConfigErrorValue = (ULONG)InterruptNumber;
goto RegisterAdapter;
}
//
// If the adapter is a pcmcia card then get the memory window
// address for later use.
//
if (NE2000_PCMCIA == Adapter->CardType)
{
#if 0
NDIS_STRING AttributeMemoryAddrStr =
NDIS_STRING_CONST("MemoryMappedBaseAddress");
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;
}
#endif
}
}
//
// 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);
IF_LOUD( DbgPrint(
"Registering adapter # buffers %ld\n"
"Card type: 0x%x\n"
"I/O base addr 0x%lx\n"
"interrupt number %ld\n"
"max multicast %ld\nattribute memory address 0x%X\n"
"attribute memory size 0x%X\n"
"CardType: %d\n",
DEFAULT_NUMBUFFERS,
Adapter->CardType,
IoBaseAddr,
InterruptNumber,
DEFAULT_MULTICASTLISTMAX,
Adapter->AttributeMemoryAddress,
Adapter->AttributeMemorySize,
Adapter->CardType );)
//
// 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;
}
IF_LOUD( DbgPrint( "Ne2000RegisterAdapter 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
);
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,
PtrToUint(Adapter->IoBaseAddr),
0x20
);
if (status != NDIS_STATUS_SUCCESS)
return(status);
if (NE2000_ISA == Adapter->CardType)
{
//
// Check that the IoBaseAddress seems to be correct.
//
IF_VERY_LOUD( DbgPrint("Checking Parameters\n"); )
if (!CardCheckParameters(Adapter))
{
//
// The card does not seem to be there, fail silently.
//
IF_VERY_LOUD( DbgPrint(" -- Failed\n"); )
NdisWriteErrorLogEntry(
Adapter->MiniportAdapterHandle,
NDIS_ERROR_CODE_ADAPTER_NOT_FOUND,
0
);
status = NDIS_STATUS_ADAPTER_NOT_FOUND;
goto fail2;
}
IF_VERY_LOUD( DbgPrint(" -- Success\n"); )
}
//
// Initialize the card.
//
IF_VERY_LOUD( DbgPrint("CardInitialize\n"); )
if (!CardInitialize(Adapter))
{
//
// Card seems to have failed.
//
IF_VERY_LOUD( DbgPrint(" -- Failed\n"); )
NdisWriteErrorLogEntry(
Adapter->MiniportAdapterHandle,
NDIS_ERROR_CODE_ADAPTER_NOT_FOUND,
0
);
status = NDIS_STATUS_ADAPTER_NOT_FOUND;
goto fail2;
}
IF_VERY_LOUD( DbgPrint(" -- 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)((PtrToUlong(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));
IF_LOUD( DbgPrint("Xmit Start (0x%x, 0x%x) : Rcv Start (0x%x, 0x%x) : Rcv End (0x%x, 0x%x)\n",
Adapter->XmitStart,
Adapter->NicXmitStart,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -