Author: amunger Date: Thu Jul 27 20:52:03 2006 New Revision: 23320
URL: http://svn.reactos.org/svn/reactos?rev=23320&view=rev Log: "PnPify" ne2000, patch from Filip. This allows the ne2000 driver to work with (and without) the new qemu acpi settings.
Modified: trunk/reactos/drivers/network/dd/ne2000/include/ne2000.h trunk/reactos/drivers/network/dd/ne2000/ne2000/main.c
Modified: trunk/reactos/drivers/network/dd/ne2000/include/ne2000.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/dd/ne2000/i... ============================================================================== --- trunk/reactos/drivers/network/dd/ne2000/include/ne2000.h (original) +++ trunk/reactos/drivers/network/dd/ne2000/include/ne2000.h Thu Jul 27 20:52:03 2006 @@ -78,7 +78,8 @@
/* I/O base address and interrupt number of adapter */ ULONG IoBaseAddress; - ULONG InterruptNumber; + ULONG InterruptLevel; + ULONG InterruptVector;
/* Mapped address of the I/O base port */ PUCHAR IOBase;
Modified: trunk/reactos/drivers/network/dd/ne2000/ne2000/main.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/dd/ne2000/n... ============================================================================== --- trunk/reactos/drivers/network/dd/ne2000/ne2000/main.c (original) +++ trunk/reactos/drivers/network/dd/ne2000/ne2000/main.c Thu Jul 27 20:52:03 2006 @@ -151,6 +151,54 @@ }
+static VOID STDCALL MiQueryResources( + OUT PNDIS_STATUS Status, + IN PNIC_ADAPTER Adapter, + IN NDIS_HANDLE WrapperConfigurationContext) +{ + PNDIS_RESOURCE_LIST AssignedResources; + UINT BufferSize = 0; + PCM_PARTIAL_RESOURCE_DESCRIPTOR Descriptor; + int i; + + NdisMQueryAdapterResources(Status, + WrapperConfigurationContext, + NULL, + &BufferSize); + if (*Status != NDIS_STATUS_RESOURCES) + return; + + *Status = NdisAllocateMemory((PVOID)&AssignedResources, + BufferSize, + 0, + HighestAcceptableMax); + if (*Status != NDIS_STATUS_SUCCESS) + return; + + NdisMQueryAdapterResources(Status, + WrapperConfigurationContext, + AssignedResources, + &BufferSize); + if (*Status != NDIS_STATUS_SUCCESS) + return; + + for (i = 0; i < AssignedResources->Count; i++) + { + Descriptor = AssignedResources->PartialDescriptors + i; + switch (Descriptor->Type) + { + case CmResourceTypeInterrupt: + Adapter->InterruptLevel = Descriptor->u.Interrupt.Level; + Adapter->InterruptVector = Descriptor->u.Interrupt.Vector; + break; + case CmResourceTypePort: + Adapter->IoBaseAddress = Descriptor->u.Port.Start.LowPart; + break; + } + } +} + + static NDIS_STATUS STDCALL MiniportInitialize( OUT PNDIS_STATUS OpenErrorStatus, OUT PUINT SelectedMediumIndex, @@ -202,13 +250,18 @@ NdisZeroMemory(Adapter, sizeof(NIC_ADAPTER)); Adapter->MiniportAdapterHandle = MiniportAdapterHandle; Adapter->IoBaseAddress = DRIVER_DEFAULT_IO_BASE_ADDRESS; - Adapter->InterruptNumber = DRIVER_DEFAULT_INTERRUPT_NUMBER; + Adapter->InterruptLevel = DRIVER_DEFAULT_INTERRUPT_NUMBER; + Adapter->InterruptVector = DRIVER_DEFAULT_INTERRUPT_NUMBER; Adapter->MaxMulticastListSize = DRIVER_MAX_MULTICAST_LIST_SIZE; Adapter->InterruptMask = DRIVER_INTERRUPT_MASK; Adapter->LookaheadSize = DRIVER_MAXIMUM_LOOKAHEAD;
- /* get the port, irq, and MAC address from registry */ - do + /* Query the resources from PnP. */ + MiQueryResources(&Status, Adapter, WrapperConfigurationContext); + + /* Get the port, irq, and MAC address from registry if the PnP + failed. */ + if (Status != NDIS_STATUS_SUCCESS) { PNDIS_CONFIGURATION_PARAMETER ConfigurationParameter; NDIS_HANDLE ConfigurationHandle; @@ -217,52 +270,54 @@ UINT RegNetworkAddressLength = 0;
NdisOpenConfiguration(&Status, &ConfigurationHandle, WrapperConfigurationContext); - if(Status != NDIS_STATUS_SUCCESS) + if (Status == NDIS_STATUS_SUCCESS) + { + NdisInitUnicodeString(&Keyword, L"Irq"); + NdisReadConfiguration(&Status, &ConfigurationParameter, ConfigurationHandle, &Keyword, NdisParameterHexInteger); + if(Status == NDIS_STATUS_SUCCESS) + { + NDIS_DbgPrint(MID_TRACE,("NdisReadConfiguration for Irq returned successfully, irq 0x%x\n", + ConfigurationParameter->ParameterData.IntegerData)); + Adapter->InterruptLevel = + Adapter->InterruptVector = ConfigurationParameter->ParameterData.IntegerData; + } + + NdisInitUnicodeString(&Keyword, L"Port"); + NdisReadConfiguration(&Status, &ConfigurationParameter, ConfigurationHandle, &Keyword, NdisParameterHexInteger); + if(Status == NDIS_STATUS_SUCCESS) + { + NDIS_DbgPrint(MID_TRACE,("NdisReadConfiguration for Port returned successfully, port 0x%x\n", + ConfigurationParameter->ParameterData.IntegerData)); + Adapter->IoBaseAddress = ConfigurationParameter->ParameterData.IntegerData; + } + + /* the returned copy of the data is owned by NDIS and will be released on NdisCloseConfiguration */ + NdisReadNetworkAddress(&Status, (PVOID *)&RegNetworkAddress, &RegNetworkAddressLength, ConfigurationHandle); + if(Status == NDIS_STATUS_SUCCESS && RegNetworkAddressLength == DRIVER_LENGTH_OF_ADDRESS) + { + int i; + NDIS_DbgPrint(MID_TRACE,("NdisReadNetworkAddress returned successfully, address %x:%x:%x:%x:%x:%x\n", + RegNetworkAddress[0], RegNetworkAddress[1], RegNetworkAddress[2], RegNetworkAddress[3], + RegNetworkAddress[4], RegNetworkAddress[5])); + for(i = 0; i < DRIVER_LENGTH_OF_ADDRESS; i++) + Adapter->StationAddress[i] = RegNetworkAddress[i]; + } + + NdisCloseConfiguration(ConfigurationHandle); + } + else { NDIS_DbgPrint(MIN_TRACE,("NdisOpenConfiguration returned error 0x%x\n", Status)); - break; } - - NdisInitUnicodeString(&Keyword, L"Irq"); - NdisReadConfiguration(&Status, &ConfigurationParameter, ConfigurationHandle, &Keyword, NdisParameterHexInteger); - if(Status == NDIS_STATUS_SUCCESS) - { - NDIS_DbgPrint(MID_TRACE,("NdisReadConfiguration for Irq returned successfully, irq 0x%x\n", - ConfigurationParameter->ParameterData.IntegerData)); - Adapter->InterruptNumber = ConfigurationParameter->ParameterData.IntegerData; - } - - NdisInitUnicodeString(&Keyword, L"Port"); - NdisReadConfiguration(&Status, &ConfigurationParameter, ConfigurationHandle, &Keyword, NdisParameterHexInteger); - if(Status == NDIS_STATUS_SUCCESS) - { - NDIS_DbgPrint(MID_TRACE,("NdisReadConfiguration for Port returned successfully, port 0x%x\n", - ConfigurationParameter->ParameterData.IntegerData)); - Adapter->IoBaseAddress = ConfigurationParameter->ParameterData.IntegerData; - } - - /* the returned copy of the data is owned by NDIS and will be released on NdisCloseConfiguration */ - NdisReadNetworkAddress(&Status, (PVOID *)&RegNetworkAddress, &RegNetworkAddressLength, ConfigurationHandle); - if(Status == NDIS_STATUS_SUCCESS && RegNetworkAddressLength == DRIVER_LENGTH_OF_ADDRESS) - { - int i; - NDIS_DbgPrint(MID_TRACE,("NdisReadNetworkAddress returned successfully, address %x:%x:%x:%x:%x:%x\n", - RegNetworkAddress[0], RegNetworkAddress[1], RegNetworkAddress[2], RegNetworkAddress[3], - RegNetworkAddress[4], RegNetworkAddress[5])); - for(i = 0; i < DRIVER_LENGTH_OF_ADDRESS; i++) - Adapter->StationAddress[i] = RegNetworkAddress[i]; - } - - NdisCloseConfiguration(ConfigurationHandle); - } while(0); + }
/* find the nic */ if (!NICCheck(Adapter)) { NDIS_DbgPrint(MID_TRACE, ("No adapter found at (0x%X).\n", Adapter->IoBaseAddress)); + NdisFreeMemory(Adapter, sizeof(NIC_ADAPTER), 0); return NDIS_STATUS_ADAPTER_NOT_FOUND; } else NDIS_DbgPrint(MID_TRACE, ("Adapter found at (0x%X).\n", Adapter->IoBaseAddress)); -
NdisMSetAttributes( MiniportAdapterHandle, @@ -334,8 +389,8 @@ Status = NdisMRegisterInterrupt( &Adapter->Interrupt, MiniportAdapterHandle, - Adapter->InterruptNumber, - Adapter->InterruptNumber, + Adapter->InterruptVector, + Adapter->InterruptLevel, FALSE, FALSE, NdisInterruptLatched);