From fa71aedefe54a434ba1e9dd256882cb636fbd9ec Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 2 Oct 2008 09:42:08 +0000 Subject: [PATCH] - Merge aicom-network-fixes up to r36621 svn path=/trunk/; revision=36622 --- reactos/drivers/network/ndis/ndis/hardware.c | 26 +++++++------- reactos/drivers/network/ndis/ndis/io.c | 38 ++++++++++++-------- 2 files changed, 37 insertions(+), 27 deletions(-) diff --git a/reactos/drivers/network/ndis/ndis/hardware.c b/reactos/drivers/network/ndis/ndis/hardware.c index 022fef52daa..ff2a3bef864 100644 --- a/reactos/drivers/network/ndis/ndis/hardware.c +++ b/reactos/drivers/network/ndis/ndis/hardware.c @@ -57,20 +57,20 @@ NdisImmediateWritePciSlotInformation( NDIS_STATUS EXPORT NdisMPciAssignResources( - IN NDIS_HANDLE MiniportHandle, + IN NDIS_HANDLE MiniportAdapterHandle, IN ULONG SlotNumber, OUT PNDIS_RESOURCE_LIST *AssignedResources) { - PNDIS_MINIPORT_BLOCK MiniportBlock = (PNDIS_MINIPORT_BLOCK)MiniportHandle; + PLOGICAL_ADAPTER Adapter = MiniportAdapterHandle; - if (MiniportBlock->BusType != PCIBus || - MiniportBlock->AllocatedResources == NULL) + if (Adapter->NdisMiniportBlock.BusType != PCIBus || + Adapter->NdisMiniportBlock.AllocatedResources == NULL) { *AssignedResources = NULL; return NDIS_STATUS_FAILURE; } - *AssignedResources = &MiniportBlock->AllocatedResources->List[0].PartialResourceList; + *AssignedResources = &Adapter->NdisMiniportBlock.AllocatedResources->List[0].PartialResourceList; return NDIS_STATUS_SUCCESS; } @@ -99,7 +99,7 @@ NdisMQueryAdapterResources( */ { PNDIS_WRAPPER_CONTEXT WrapperContext = (PNDIS_WRAPPER_CONTEXT)WrapperConfigurationContext; - PNDIS_MINIPORT_BLOCK MiniportBlock = WrapperContext->DeviceObject->DeviceExtension; + PLOGICAL_ADAPTER Adapter = WrapperContext->DeviceObject->DeviceExtension; ULONG ResourceListSize; PAGED_CODE(); @@ -107,7 +107,7 @@ NdisMQueryAdapterResources( NDIS_DbgPrint(MAX_TRACE, ("Called\n")); - if (MiniportBlock->AllocatedResources == NULL) + if (Adapter->NdisMiniportBlock.AllocatedResources == NULL) { NDIS_DbgPrint(MIN_TRACE, ("No allocated resources!\n")); *Status = NDIS_STATUS_FAILURE; @@ -116,13 +116,13 @@ NdisMQueryAdapterResources( ResourceListSize = FIELD_OFFSET(CM_PARTIAL_RESOURCE_LIST, PartialDescriptors) + - MiniportBlock->AllocatedResources->List[0].PartialResourceList.Count * + Adapter->NdisMiniportBlock.AllocatedResources->List[0].PartialResourceList.Count * sizeof(CM_PARTIAL_RESOURCE_DESCRIPTOR); if (*BufferSize >= ResourceListSize) { RtlCopyMemory(ResourceList, - &MiniportBlock->AllocatedResources->List[0].PartialResourceList, + &Adapter->NdisMiniportBlock.AllocatedResources->List[0].PartialResourceList, ResourceListSize); *BufferSize = ResourceListSize; *Status = NDIS_STATUS_SUCCESS; @@ -196,10 +196,10 @@ NdisReadPciSlotInformation( IN PVOID Buffer, IN ULONG Length) { - PNDIS_MINIPORT_BLOCK Adapter = (PNDIS_MINIPORT_BLOCK)NdisAdapterHandle; + PLOGICAL_ADAPTER Adapter = NdisAdapterHandle; /* Slot number is ignored since W2K for all NDIS drivers. */ return HalGetBusDataByOffset(PCIConfiguration, - Adapter->BusNumber, Adapter->SlotNumber, + Adapter->NdisMiniportBlock.BusNumber, Adapter->NdisMiniportBlock.SlotNumber, Buffer, Offset, Length); } @@ -216,10 +216,10 @@ NdisWritePciSlotInformation( IN PVOID Buffer, IN ULONG Length) { - PNDIS_MINIPORT_BLOCK Adapter = (PNDIS_MINIPORT_BLOCK)NdisAdapterHandle; + PLOGICAL_ADAPTER Adapter = NdisAdapterHandle; /* Slot number is ignored since W2K for all NDIS drivers. */ return HalSetBusDataByOffset(PCIConfiguration, - Adapter->BusNumber, Adapter->SlotNumber, + Adapter->NdisMiniportBlock.BusNumber, Adapter->NdisMiniportBlock.SlotNumber, Buffer, Offset, Length); } diff --git a/reactos/drivers/network/ndis/ndis/io.c b/reactos/drivers/network/ndis/ndis/io.c index fdf8c5a0881..e5effbd245c 100644 --- a/reactos/drivers/network/ndis/ndis/io.c +++ b/reactos/drivers/network/ndis/ndis/io.c @@ -60,22 +60,31 @@ BOOLEAN NTAPI ServiceRoutine( * TRUE if a miniport controlled device generated the interrupt */ { - BOOLEAN InterruptRecognized; - BOOLEAN QueueMiniportHandleInterrupt; - PNDIS_MINIPORT_BLOCK Adapter = (PNDIS_MINIPORT_BLOCK)ServiceContext; + BOOLEAN InterruptRecognized = FALSE; + BOOLEAN QueueMiniportHandleInterrupt = FALSE; + PLOGICAL_ADAPTER Adapter = ServiceContext; NDIS_DbgPrint(MAX_TRACE, ("Called. Adapter (0x%X)\n", Adapter)); - (*Adapter->DriverHandle->MiniportCharacteristics.ISRHandler)( - &InterruptRecognized, - &QueueMiniportHandleInterrupt, - Adapter->MiniportAdapterContext); + if (Adapter->NdisMiniportBlock.Interrupt->IsrRequested) { + (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ISRHandler)( + &InterruptRecognized, + &QueueMiniportHandleInterrupt, + Adapter->NdisMiniportBlock.MiniportAdapterContext); + + } else if (Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.DisableInterruptHandler) { + (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.DisableInterruptHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext); + QueueMiniportHandleInterrupt = TRUE; + InterruptRecognized = TRUE; + } + if (QueueMiniportHandleInterrupt) - { - NDIS_DbgPrint(MAX_TRACE, ("Queueing DPC.\n")); - KeInsertQueueDpc(&Adapter->Interrupt->InterruptDpc, NULL, NULL); - } + { + NDIS_DbgPrint(MAX_TRACE, ("Queuing DPC.\n")); + KeInsertQueueDpc(&Adapter->NdisMiniportBlock.Interrupt->InterruptDpc, NULL, NULL); + } NDIS_DbgPrint(MAX_TRACE, ("Leaving.\n")); @@ -207,15 +216,15 @@ IO_ALLOCATION_ACTION NTAPI NdisMapRegisterCallback ( * - Called at IRQL = DISPATCH_LEVEL */ { - PNDIS_MINIPORT_BLOCK Adapter = (PNDIS_MINIPORT_BLOCK)Context; + PLOGICAL_ADAPTER Adapter = Context; NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); - Adapter->MapRegisters[Adapter->CurrentMapRegister].MapRegister = MapRegisterBase; + Adapter->NdisMiniportBlock.MapRegisters[Adapter->NdisMiniportBlock.CurrentMapRegister].MapRegister = MapRegisterBase; NDIS_DbgPrint(MAX_TRACE, ("setting event and leaving.\n")); - KeSetEvent(Adapter->AllocationEvent, 0, FALSE); + KeSetEvent(Adapter->NdisMiniportBlock.AllocationEvent, 0, FALSE); /* this is only the thing to do for busmaster NICs */ return DeallocateObjectKeepRegisters; @@ -767,6 +776,7 @@ NdisMRegisterInterrupt( KeInitializeEvent(&Interrupt->DpcsCompletedEvent, NotificationEvent, FALSE); Interrupt->SharedInterrupt = SharedInterrupt; + Interrupt->IsrRequested = RequestIsr; Adapter->NdisMiniportBlock.Interrupt = Interrupt;