diff --git a/reactos/drivers/network/dd/ne2000/include/debug.h b/reactos/drivers/network/dd/ne2000/include/debug.h index 168bc3b4fbd..dbf5e8737e9 100644 --- a/reactos/drivers/network/dd/ne2000/include/debug.h +++ b/reactos/drivers/network/dd/ne2000/include/debug.h @@ -56,12 +56,14 @@ extern ULONG DebugTraceLevel; #endif /* NASSERT */ #endif #define ASSERT_IRQL(x) ASSERT(KeGetCurrentIrql() <= (x)) +#define ASSERT_IRQL_EQUAL(x) ASSERT(KeGetCurrentIrql() == (x)) #else /* DBG */ #define NDIS_DbgPrint(_t_, _x_) #define ASSERT_IRQL(x) +#define ASSERT_IRQL_EQUAL(x) /* #define ASSERT(x) */ /* ndis.h */ #endif /* DBG */ diff --git a/reactos/drivers/network/dd/ne2000/ne2000/main.c b/reactos/drivers/network/dd/ne2000/ne2000/main.c index f84779de0df..c948665ae12 100644 --- a/reactos/drivers/network/dd/ne2000/ne2000/main.c +++ b/reactos/drivers/network/dd/ne2000/ne2000/main.c @@ -62,8 +62,7 @@ DRIVER_INFORMATION DriverInfo = {0}; NDIS_PHYSICAL_ADDRESS HighestAcceptableMax = NDIS_PHYSICAL_ADDRESS_CONST(-1, -1); -#if 0 -static BOOLEAN MiniportCheckForHang( +static BOOLEAN STDCALL MiniportCheckForHang( IN NDIS_HANDLE MiniportAdapterContext) /* * FUNCTION: Examines if an adapter has hung @@ -77,7 +76,6 @@ static BOOLEAN MiniportCheckForHang( return FALSE; } -#endif static VOID STDCALL MiniportDisableInterrupt( @@ -120,6 +118,8 @@ static VOID STDCALL MiniportHalt( { PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext; + ASSERT_IRQL_EQUAL(PASSIVE_LEVEL); + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); #ifndef NOCARD /* Stop the NIC */ @@ -225,6 +225,8 @@ static NDIS_STATUS STDCALL MiniportInitialize( NDIS_STATUS Status; PNIC_ADAPTER Adapter; + ASSERT_IRQL_EQUAL(PASSIVE_LEVEL); + NDIS_DbgPrint(MAX_TRACE, ("Called (Adapter %X).\n", MiniportAdapterHandle)); /* Search for 802.3 media which is the only one we support */ @@ -472,6 +474,8 @@ static NDIS_STATUS STDCALL MiniportQueryInformation( NDIS_MEDIUM Medium = NdisMedium802_3; PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext; + ASSERT_IRQL_EQUAL(DISPATCH_LEVEL); + NDIS_DbgPrint(MAX_TRACE, ("Called. Oid (0x%X).\n", Oid)); Status = NDIS_STATUS_SUCCESS; @@ -638,6 +642,8 @@ static NDIS_STATUS STDCALL MiniportReset( * Status of operation */ { + ASSERT_IRQL_EQUAL(DISPATCH_LEVEL); + NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); return NDIS_STATUS_FAILURE; @@ -661,6 +667,8 @@ static NDIS_STATUS STDCALL MiniportSend( { PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext; + ASSERT_IRQL_EQUAL(DISPATCH_LEVEL); + NDIS_DbgPrint(MID_TRACE, ("Queueing packet.\n")); #ifdef NOCARD @@ -710,6 +718,8 @@ static NDIS_STATUS STDCALL MiniportSetInformation( NDIS_STATUS Status = NDIS_STATUS_SUCCESS; PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext; + ASSERT_IRQL_EQUAL(DISPATCH_LEVEL); + NDIS_DbgPrint(MAX_TRACE, ("Called. Oid (0x%X).\n", Oid)); switch (Oid) { @@ -819,6 +829,8 @@ static NDIS_STATUS STDCALL MiniportTransferData( UINT RecvStop; PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext; + ASSERT_IRQL_EQUAL(DISPATCH_LEVEL); + NDIS_DbgPrint(MAX_TRACE, ("Called. Packet (0x%X) ByteOffset (0x%X) BytesToTransfer (%d).\n", Packet, ByteOffset, BytesToTransfer)); @@ -903,7 +915,7 @@ DriverEntry( NdisZeroMemory(&Miniport, sizeof(Miniport)); Miniport.MajorNdisVersion = DRIVER_NDIS_MAJOR_VERSION; Miniport.MinorNdisVersion = DRIVER_NDIS_MINOR_VERSION; - Miniport.CheckForHangHandler = NULL; //MiniportCheckForHang; + Miniport.CheckForHangHandler = MiniportCheckForHang; Miniport.DisableInterruptHandler = MiniportDisableInterrupt; Miniport.EnableInterruptHandler = MiniportEnableInterrupt; Miniport.HaltHandler = MiniportHalt; @@ -922,6 +934,11 @@ DriverEntry( RegistryPath, NULL); + if (!NdisWrapperHandle) { + NDIS_DbgPrint(MIN_TRACE, ("NdisMInitializeWrapper() failed\n")); + return STATUS_UNSUCCESSFUL; + } + DriverInfo.NdisWrapperHandle = NdisWrapperHandle; DriverInfo.NdisMacHandle = NULL; InitializeListHead(&DriverInfo.AdapterListHead); diff --git a/reactos/drivers/network/dd/pcnet/pcnet.c b/reactos/drivers/network/dd/pcnet/pcnet.c index 6fde82e5da6..31c9c77cf4b 100644 --- a/reactos/drivers/network/dd/pcnet/pcnet.c +++ b/reactos/drivers/network/dd/pcnet/pcnet.c @@ -69,6 +69,8 @@ MiniportHandleInterrupt( DPRINT("Called\n"); + ASSERT_IRQL_EQUAL(DISPATCH_LEVEL); + NdisDprAcquireSpinLock(&Adapter->Lock); NdisRawWritePortUshort(Adapter->PortOffset + RAP, CSR0); @@ -624,6 +626,8 @@ MiniportMediaDetectionTimer( { PADAPTER Adapter = (PADAPTER)FunctionContext; + ASSERT_IRQL_EQUAL(DISPATCH_LEVEL); + if (NdisMSynchronizeWithInterrupt(&Adapter->InterruptObject, MiSyncMediaDetection, FunctionContext)) @@ -812,6 +816,8 @@ MiniportInitialize( NDIS_STATUS Status = NDIS_STATUS_FAILURE; BOOLEAN InterruptRegistered = FALSE; + ASSERT_IRQL_EQUAL(PASSIVE_LEVEL); + /* Pick a medium */ for(i = 0; i < MediumArraySize; i++) if(MediumArray[i] == NdisMedium802_3) @@ -1023,6 +1029,8 @@ MiniportReset( { DPRINT("Called\n"); + ASSERT_IRQL_EQUAL(PASSIVE_LEVEL); + /* MiniportReset doesn't do anything at the moment... perhaps this should be fixed. */ *AddressingReset = FALSE; @@ -1072,6 +1080,8 @@ MiniportSend( DPRINT("Called\n"); + ASSERT_IRQL_EQUAL(DISPATCH_LEVEL); + NdisDprAcquireSpinLock(&Adapter->Lock); /* Check if we have free entry in our circular buffer. */ diff --git a/reactos/drivers/network/dd/pcnet/pcnet.h b/reactos/drivers/network/dd/pcnet/pcnet.h index 27e51f02d44..9f6a3ba335f 100644 --- a/reactos/drivers/network/dd/pcnet/pcnet.h +++ b/reactos/drivers/network/dd/pcnet/pcnet.h @@ -141,8 +141,10 @@ MiGetMediaState(PADAPTER Adapter); #if DBG #define BREAKPOINT DbgBreakPoint(); +#define ASSERT_IRQL_EQUAL(x) ASSERT(KeGetCurrentIrql() == x) #else #define BREAKPOINT +#define ASSERT_IRQL_EQUAL(x) #endif #ifndef TAG diff --git a/reactos/drivers/network/dd/pcnet/requests.c b/reactos/drivers/network/dd/pcnet/requests.c index 236e4731b79..2f330b721cd 100644 --- a/reactos/drivers/network/dd/pcnet/requests.c +++ b/reactos/drivers/network/dd/pcnet/requests.c @@ -103,7 +103,7 @@ MiniportQueryInformation( * RETURNS: * NDIS_STATUS_SUCCESS on all queries * NOTES: - * - Called by NDIS at PASSIVE_LEVEL + * - Called by NDIS at DISPATCH_LEVEL * - If InformationBufferLength is insufficient to store the results, return the amount * needed in BytesNeeded and return NDIS_STATUS_INVALID_LENGTH * TODO: @@ -118,9 +118,11 @@ MiniportQueryInformation( DPRINT("Called. OID 0x%x\n", Oid); + ASSERT_IRQL_EQUAL(DISPATCH_LEVEL); + ASSERT(Adapter); - NdisAcquireSpinLock(&Adapter->Lock); + NdisDprAcquireSpinLock(&Adapter->Lock); Status = NDIS_STATUS_SUCCESS; CopyFrom = (PVOID)&GenericULONG; @@ -361,7 +363,7 @@ MiniportQueryInformation( } } - NdisReleaseSpinLock(&Adapter->Lock); + NdisDprReleaseSpinLock(&Adapter->Lock); DPRINT("Leaving. Status is 0x%x\n", Status); @@ -390,7 +392,7 @@ MiniportSetInformation( * RETURNS: * NDIS_STATUS_SUCCESS on all requests * NOTES: - * - Called by NDIS at PASSIVE_LEVEL + * - Called by NDIS at DISPATCH_LEVEL * - verify buffer space as mentioned in previous function notes */ { @@ -400,9 +402,11 @@ MiniportSetInformation( ASSERT(Adapter); + ASSERT_IRQL_EQUAL(DISPATCH_LEVEL); + DPRINT("Called, OID 0x%x\n", Oid); - NdisAcquireSpinLock(&Adapter->Lock); + NdisDprAcquireSpinLock(&Adapter->Lock); switch (Oid) { @@ -501,7 +505,7 @@ MiniportSetInformation( *BytesNeeded = 0; } - NdisReleaseSpinLock(&Adapter->Lock); + NdisDprReleaseSpinLock(&Adapter->Lock); DPRINT("Leaving. Status (0x%X).\n", Status); diff --git a/reactos/drivers/network/ndis/ndis/io.c b/reactos/drivers/network/ndis/ndis/io.c index e2e612698b2..fdf8c5a0881 100644 --- a/reactos/drivers/network/ndis/ndis/io.c +++ b/reactos/drivers/network/ndis/ndis/io.c @@ -268,7 +268,7 @@ NdisMAllocateMapRegisters( UINT MapRegistersPerBaseRegister = 0; ULONG AvailableMapRegisters; NTSTATUS NtStatus; - PNDIS_MINIPORT_BLOCK Adapter = 0; + PLOGICAL_ADAPTER Adapter; PDEVICE_OBJECT DeviceObject = 0; KEVENT AllocationEvent; KIRQL OldIrql; @@ -278,19 +278,19 @@ NdisMAllocateMapRegisters( memset(&Description,0,sizeof(Description)); - Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle; + Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle; ASSERT(Adapter); /* only bus masters may call this routine */ - ASSERT(Adapter->Flags & NDIS_ATTRIBUTE_BUS_MASTER); - if(!(Adapter->Flags & NDIS_ATTRIBUTE_BUS_MASTER)) + ASSERT(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER); + if(!(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER)) return NDIS_STATUS_SUCCESS; - DeviceObject = Adapter->DeviceObject; + DeviceObject = Adapter->NdisMiniportBlock.DeviceObject; KeInitializeEvent(&AllocationEvent, NotificationEvent, FALSE); - Adapter->AllocationEvent = &AllocationEvent; + Adapter->NdisMiniportBlock.AllocationEvent = &AllocationEvent; /* * map registers correlate to physical pages. ndis documents a @@ -310,12 +310,12 @@ NdisMAllocateMapRegisters( Description.Master = TRUE; /* implied by calling this function */ Description.ScatterGather = TRUE; /* XXX UNTRUE: All BM DMA are S/G (ms seems to do this) */ Description.Dma32BitAddresses = DmaSize; - Description.BusNumber = Adapter->BusNumber; - Description.InterfaceType = Adapter->BusType; + Description.BusNumber = Adapter->NdisMiniportBlock.BusNumber; + Description.InterfaceType = Adapter->NdisMiniportBlock.BusType; Description.DmaChannel = DmaChannel; Description.MaximumLength = MaximumBufferSize; - if(Adapter->AdapterType == Isa) + if(Adapter->NdisMiniportBlock.AdapterType == Isa) { /* system dma */ if(DmaChannel < 4) @@ -325,7 +325,7 @@ NdisMAllocateMapRegisters( Description.DmaSpeed = Compatible; } - else if(Adapter->AdapterType == PCIBus) + else if(Adapter->NdisMiniportBlock.AdapterType == PCIBus) { if(DmaSize == NDIS_DMA_64BITS) Description.Dma64BitAddresses = TRUE; @@ -339,7 +339,7 @@ NdisMAllocateMapRegisters( } AdapterObject = IoGetDmaAdapter( - Adapter->PhysicalDeviceObject, &Description, &AvailableMapRegisters); + Adapter->NdisMiniportBlock.PhysicalDeviceObject, &Description, &AvailableMapRegisters); if(!AdapterObject) { @@ -347,7 +347,7 @@ NdisMAllocateMapRegisters( return NDIS_STATUS_RESOURCES; } - Adapter->SystemAdapterObject = AdapterObject; + Adapter->NdisMiniportBlock.SystemAdapterObject = AdapterObject; if(AvailableMapRegisters < MapRegistersPerBaseRegister) { @@ -358,22 +358,22 @@ NdisMAllocateMapRegisters( } /* allocate & zero space in the miniport block for the registers */ - Adapter->MapRegisters = ExAllocatePool(NonPagedPool, BaseMapRegistersNeeded * sizeof(MAP_REGISTER_ENTRY)); - if(!Adapter->MapRegisters) + Adapter->NdisMiniportBlock.MapRegisters = ExAllocatePool(NonPagedPool, BaseMapRegistersNeeded * sizeof(MAP_REGISTER_ENTRY)); + if(!Adapter->NdisMiniportBlock.MapRegisters) { NDIS_DbgPrint(MIN_TRACE, ("insufficient resources.\n")); return NDIS_STATUS_RESOURCES; } - memset(Adapter->MapRegisters, 0, BaseMapRegistersNeeded * sizeof(MAP_REGISTER_ENTRY)); - Adapter->BaseMapRegistersNeeded = (USHORT)BaseMapRegistersNeeded; + memset(Adapter->NdisMiniportBlock.MapRegisters, 0, BaseMapRegistersNeeded * sizeof(MAP_REGISTER_ENTRY)); + Adapter->NdisMiniportBlock.BaseMapRegistersNeeded = (USHORT)BaseMapRegistersNeeded; while(BaseMapRegistersNeeded) { NDIS_DbgPrint(MAX_TRACE, ("iterating, basemapregistersneeded = %d\n", BaseMapRegistersNeeded)); BaseMapRegistersNeeded--; - Adapter->CurrentMapRegister = (USHORT)BaseMapRegistersNeeded; + Adapter->NdisMiniportBlock.CurrentMapRegister = (USHORT)BaseMapRegistersNeeded; KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); { NtStatus = AdapterObject->DmaOperations->AllocateAdapterChannel( @@ -385,7 +385,7 @@ NdisMAllocateMapRegisters( if(!NT_SUCCESS(NtStatus)) { NDIS_DbgPrint(MIN_TRACE, ("IoAllocateAdapterChannel failed: 0x%x\n", NtStatus)); - ExFreePool(Adapter->MapRegisters); + ExFreePool(Adapter->NdisMiniportBlock.MapRegisters); return NDIS_STATUS_RESOURCES; } @@ -396,7 +396,7 @@ NdisMAllocateMapRegisters( if(!NT_SUCCESS(NtStatus)) { NDIS_DbgPrint(MIN_TRACE, ("KeWaitForSingleObject failed: 0x%x\n", NtStatus)); - ExFreePool(Adapter->MapRegisters); + ExFreePool(Adapter->NdisMiniportBlock.MapRegisters); return NDIS_STATUS_RESOURCES; } @@ -439,7 +439,7 @@ NdisMStartBufferPhysicalMapping( * - The caller supplies storage for the physical address array. */ { - PNDIS_MINIPORT_BLOCK Adapter; + PLOGICAL_ADAPTER Adapter; PVOID CurrentVa; ULONG TotalLength; PHYSICAL_ADDRESS ReturnedAddress; @@ -448,7 +448,7 @@ NdisMStartBufferPhysicalMapping( ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL); ASSERT(MiniportAdapterHandle && Buffer && PhysicalAddressArray && ArraySize); - Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle; + Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle; CurrentVa = MmGetMdlVirtualAddress(Buffer); TotalLength = MmGetMdlByteCount(Buffer); @@ -456,12 +456,12 @@ NdisMStartBufferPhysicalMapping( { ULONG Length = TotalLength; - ReturnedAddress = Adapter->SystemAdapterObject->DmaOperations->MapTransfer( - Adapter->SystemAdapterObject, Buffer, - Adapter->MapRegisters[PhysicalMapRegister].MapRegister, + ReturnedAddress = Adapter->NdisMiniportBlock.SystemAdapterObject->DmaOperations->MapTransfer( + Adapter->NdisMiniportBlock.SystemAdapterObject, Buffer, + Adapter->NdisMiniportBlock.MapRegisters[PhysicalMapRegister].MapRegister, CurrentVa, &Length, WriteToDevice); - Adapter->MapRegisters[PhysicalMapRegister].WriteToDevice = WriteToDevice; + Adapter->NdisMiniportBlock.MapRegisters[PhysicalMapRegister].WriteToDevice = WriteToDevice; PhysicalAddressArray[LoopCount].PhysicalAddress = ReturnedAddress; PhysicalAddressArray[LoopCount].Length = Length; @@ -495,22 +495,22 @@ NdisMCompleteBufferPhysicalMapping( * - May be called at IRQL <= DISPATCH_LEVEL */ { - PNDIS_MINIPORT_BLOCK Adapter; + PLOGICAL_ADAPTER Adapter; VOID *CurrentVa; ULONG Length; ASSERT(KeGetCurrentIrql() <= DISPATCH_LEVEL); ASSERT(MiniportAdapterHandle && Buffer); - Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle; + Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle; CurrentVa = MmGetMdlVirtualAddress(Buffer); Length = MmGetMdlByteCount(Buffer); - Adapter->SystemAdapterObject->DmaOperations->FlushAdapterBuffers( - Adapter->SystemAdapterObject, Buffer, - Adapter->MapRegisters[PhysicalMapRegister].MapRegister, + Adapter->NdisMiniportBlock.SystemAdapterObject->DmaOperations->FlushAdapterBuffers( + Adapter->NdisMiniportBlock.SystemAdapterObject, Buffer, + Adapter->NdisMiniportBlock.MapRegisters[PhysicalMapRegister].MapRegister, CurrentVa, Length, - Adapter->MapRegisters[PhysicalMapRegister].WriteToDevice); + Adapter->NdisMiniportBlock.MapRegisters[PhysicalMapRegister].WriteToDevice); } @@ -582,7 +582,7 @@ NdisMFreeMapRegisters( */ { KIRQL OldIrql; - PNDIS_MINIPORT_BLOCK Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle; + PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle; PDMA_ADAPTER AdapterObject; UINT MapRegistersPerBaseRegister; UINT i; @@ -592,31 +592,31 @@ NdisMFreeMapRegisters( ASSERT(Adapter); /* only bus masters may call this routine */ - ASSERT(Adapter->Flags & NDIS_ATTRIBUTE_BUS_MASTER); - if(!(Adapter->Flags & NDIS_ATTRIBUTE_BUS_MASTER) || - Adapter->SystemAdapterObject == NULL) + ASSERT(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER); + if(!(Adapter->NdisMiniportBlock.Flags & NDIS_ATTRIBUTE_BUS_MASTER) || + Adapter->NdisMiniportBlock.SystemAdapterObject == NULL) return; - MapRegistersPerBaseRegister = ((Adapter->MaximumPhysicalMapping - 2) / PAGE_SIZE) + 2; + MapRegistersPerBaseRegister = ((Adapter->NdisMiniportBlock.MaximumPhysicalMapping - 2) / PAGE_SIZE) + 2; - AdapterObject = Adapter->SystemAdapterObject; + AdapterObject = Adapter->NdisMiniportBlock.SystemAdapterObject; KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); { - for(i = 0; i < Adapter->BaseMapRegistersNeeded; i++) + for(i = 0; i < Adapter->NdisMiniportBlock.BaseMapRegistersNeeded; i++) { AdapterObject->DmaOperations->FreeMapRegisters( - Adapter->SystemAdapterObject, - Adapter->MapRegisters[i].MapRegister, + Adapter->NdisMiniportBlock.SystemAdapterObject, + Adapter->NdisMiniportBlock.MapRegisters[i].MapRegister, MapRegistersPerBaseRegister); } } KeLowerIrql(OldIrql); AdapterObject->DmaOperations->PutDmaAdapter(AdapterObject); - Adapter->SystemAdapterObject = NULL; + Adapter->NdisMiniportBlock.SystemAdapterObject = NULL; - ExFreePool(Adapter->MapRegisters); + ExFreePool(Adapter->NdisMiniportBlock.MapRegisters); } @@ -752,7 +752,7 @@ NdisMRegisterInterrupt( ULONG MappedIRQ; KIRQL DIrql; KAFFINITY Affinity; - PNDIS_MINIPORT_BLOCK Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle; + PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle; NDIS_DbgPrint(MAX_TRACE, ("Called. InterruptVector (0x%X) InterruptLevel (0x%X) " "SharedInterrupt (%d) InterruptMode (0x%X)\n", @@ -768,9 +768,9 @@ NdisMRegisterInterrupt( Interrupt->SharedInterrupt = SharedInterrupt; - Adapter->Interrupt = Interrupt; + Adapter->NdisMiniportBlock.Interrupt = Interrupt; - MappedIRQ = HalGetInterruptVector(Adapter->BusType, Adapter->BusNumber, + MappedIRQ = HalGetInterruptVector(Adapter->NdisMiniportBlock.BusType, Adapter->NdisMiniportBlock.BusNumber, InterruptLevel, InterruptVector, &DIrql, &Affinity); @@ -818,7 +818,7 @@ NdisMRegisterIoPortRange( */ { PHYSICAL_ADDRESS PortAddress, TranslatedAddress; - PNDIS_MINIPORT_BLOCK Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle; + PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle; ULONG AddressSpace = 1; /* FIXME The HAL handles this wrong atm */ *PortOffset = 0; @@ -840,7 +840,7 @@ NdisMRegisterIoPortRange( NDIS_DbgPrint(MAX_TRACE, ("Translating address 0x%x 0x%x\n", PortAddress.u.HighPart, PortAddress.u.LowPart)); - if(!HalTranslateBusAddress(Adapter->BusType, Adapter->BusNumber, + if(!HalTranslateBusAddress(Adapter->NdisMiniportBlock.BusType, Adapter->NdisMiniportBlock.BusNumber, PortAddress, &AddressSpace, &TranslatedAddress)) { NDIS_DbgPrint(MIN_TRACE, ("Unable to translate address\n")); diff --git a/reactos/drivers/network/ndis/ndis/memory.c b/reactos/drivers/network/ndis/ndis/memory.c index 9d0aa928a9a..22fe324e828 100644 --- a/reactos/drivers/network/ndis/ndis/memory.c +++ b/reactos/drivers/network/ndis/ndis/memory.c @@ -189,12 +189,12 @@ NdisMAllocateSharedMemory( * - Cached is ignored; we always allocate non-cached */ { - PNDIS_MINIPORT_BLOCK Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle; + PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle; NDIS_DbgPrint(MAX_TRACE,("Called.\n")); - *VirtualAddress = Adapter->SystemAdapterObject->DmaOperations->AllocateCommonBuffer( - Adapter->SystemAdapterObject, Length, PhysicalAddress, Cached); + *VirtualAddress = Adapter->NdisMiniportBlock.SystemAdapterObject->DmaOperations->AllocateCommonBuffer( + Adapter->NdisMiniportBlock.SystemAdapterObject, Length, PhysicalAddress, Cached); } @@ -267,7 +267,7 @@ NdisMFreeSharedMemory( */ { HANDLE ThreadHandle; - PNDIS_MINIPORT_BLOCK Adapter = (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle; + PLOGICAL_ADAPTER Adapter = (PLOGICAL_ADAPTER)MiniportAdapterHandle; PMINIPORT_SHARED_MEMORY Memory; NDIS_DbgPrint(MAX_TRACE,("Called.\n")); @@ -283,7 +283,7 @@ NdisMFreeSharedMemory( return; } - Memory->AdapterObject = Adapter->SystemAdapterObject; + Memory->AdapterObject = Adapter->NdisMiniportBlock.SystemAdapterObject; Memory->Length = Length; Memory->PhysicalAddress = PhysicalAddress; Memory->VirtualAddress = VirtualAddress; diff --git a/reactos/drivers/network/ndis/ndis/miniport.c b/reactos/drivers/network/ndis/ndis/miniport.c index 344f6407678..bf77c746cfb 100644 --- a/reactos/drivers/network/ndis/ndis/miniport.c +++ b/reactos/drivers/network/ndis/ndis/miniport.c @@ -583,6 +583,76 @@ MiniQueryInformation( return NdisStatus; } +BOOLEAN +MiniCheckForHang( PLOGICAL_ADAPTER Adapter ) +/* + * FUNCTION: Checks to see if the miniport is hung + * ARGUMENTS: + * Adapter = Pointer to the logical adapter object + * RETURNS: + * TRUE if the miniport is hung + * FALSE if the miniport is not hung + */ +{ + BOOLEAN Ret = FALSE; + KIRQL OldIrql; + + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + if (Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CheckForHangHandler) + Ret = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.CheckForHangHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext); + KeLowerIrql(OldIrql); + + return Ret; +} + +NDIS_STATUS +MiniReset( + PLOGICAL_ADAPTER Adapter, + PBOOLEAN AddressingReset) +/* + * FUNCTION: Resets the miniport + * ARGUMENTS: + * Adapter = Pointer to the logical adapter object + * AddressingReset = Set to TRUE if we need to call MiniportSetInformation later + * RETURNS: + * Status of the operation + */ +{ + NDIS_STATUS Status = NDIS_STATUS_FAILURE; + KIRQL OldIrql; + + /* FIXME: What should we return if there isn't a reset handler? */ + + KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); + if (Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler) + Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)( + Adapter->NdisMiniportBlock.MiniportAdapterContext, + AddressingReset); + KeLowerIrql(OldIrql); + + return Status; +} + +VOID STDCALL +MiniportHangDpc( + PKDPC Dpc, + PVOID DeferredContext, + PVOID SystemArgument1, + PVOID SystemArgument2) +{ + PLOGICAL_ADAPTER Adapter = DeferredContext; + BOOLEAN AddressingReset = FALSE; + + + if (MiniCheckForHang(Adapter)) { + NDIS_DbgPrint(MIN_TRACE, ("Miniport detected adapter hang\n")); + MiniReset(Adapter, &AddressingReset); + } + + /* FIXME: We should call MiniportSetInformation if AddressingReset is TRUE */ +} + NDIS_STATUS FASTCALL @@ -1370,7 +1440,8 @@ NdisIPnPStartDevice( PNDIS_CONFIGURATION_PARAMETER ConfigParam; NDIS_HANDLE ConfigHandle; ULONG Size; -/* FIXME - KIRQL OldIrql; */ + LARGE_INTEGER Timeout; + /* FIXME - KIRQL OldIrql; */ /* * Prepare wrapper context used by HW and configuration routines. @@ -1582,9 +1653,18 @@ NdisIPnPStartDevice( return (NTSTATUS)NdisStatus; } + /* Check for a hang every two seconds if it wasn't set in MiniportInitialize */ + if (Adapter->NdisMiniportBlock.CheckForHangSeconds == 0) + Adapter->NdisMiniportBlock.CheckForHangSeconds = 2; + Adapter->NdisMiniportBlock.OldPnPDeviceState = Adapter->NdisMiniportBlock.PnPDeviceState; Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceStarted; + Timeout.QuadPart = (LONGLONG)Adapter->NdisMiniportBlock.CheckForHangSeconds * -1000000; + KeSetTimerEx(&Adapter->NdisMiniportBlock.WakeUpDpcTimer.Timer, Timeout, + Adapter->NdisMiniportBlock.CheckForHangSeconds * 1000, + &Adapter->NdisMiniportBlock.WakeUpDpcTimer.Dpc); + /* Put adapter in adapter list for this miniport */ ExInterlockedInsertTailList(&Adapter->NdisMiniportBlock.DriverHandle->DeviceList, &Adapter->MiniportListEntry, &Adapter->NdisMiniportBlock.DriverHandle->Lock); @@ -1640,6 +1720,8 @@ NdisIPnPStopDevice( Adapter->NdisMiniportBlock.OldPnPDeviceState = Adapter->NdisMiniportBlock.PnPDeviceState; Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceStopped; + KeCancelTimer(&Adapter->NdisMiniportBlock.WakeUpDpcTimer.Timer); + return STATUS_SUCCESS; } @@ -1826,7 +1908,9 @@ NdisIAddDevice( Adapter->NdisMiniportBlock.OldPnPDeviceState = 0; Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceAdded; - KeInitializeDpc(&Adapter->NdisMiniportBlock.DeferredDpc, MiniportDpc, (PVOID)Adapter); + KeInitializeTimer(&Adapter->NdisMiniportBlock.WakeUpDpcTimer.Timer); + KeInitializeDpc(&Adapter->NdisMiniportBlock.WakeUpDpcTimer.Dpc, MiniportHangDpc, Adapter); + KeInitializeDpc(&Adapter->NdisMiniportBlock.DeferredDpc, MiniportDpc, Adapter); DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING; @@ -2078,8 +2162,6 @@ NdisMSetAttributesEx( * AdapterType = Specifies the I/O bus interface of the caller's NIC */ { - /* TODO: Take CheckForHandTimeInSeconds into account! */ - PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(MiniportAdapterHandle); NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); @@ -2087,6 +2169,8 @@ NdisMSetAttributesEx( Adapter->NdisMiniportBlock.MiniportAdapterContext = MiniportAdapterContext; Adapter->NdisMiniportBlock.Flags = AttributeFlags; Adapter->NdisMiniportBlock.AdapterType = AdapterType; + if (CheckForHangTimeInSeconds > 0) + Adapter->NdisMiniportBlock.CheckForHangSeconds = CheckForHangTimeInSeconds; if (AttributeFlags & NDIS_ATTRIBUTE_INTERMEDIATE_DRIVER) NDIS_DbgPrint(MAX_TRACE, ("Intermediate drivers not supported yet.\n")); }