Author: cgutman Date: Tue Sep 23 18:59:43 2008 New Revision: 36442
URL: http://svn.reactos.org/svn/reactos?rev=36442&view=rev Log: - Use timers so the code is much more simple and works better
Modified: branches/aicom-network-fixes/drivers/network/ndis/ndis/miniport.c
Modified: branches/aicom-network-fixes/drivers/network/ndis/ndis/miniport.c URL: http://svn.reactos.org/svn/reactos/branches/aicom-network-fixes/drivers/netw... ============================================================================== --- branches/aicom-network-fixes/drivers/network/ndis/ndis/miniport.c [iso-8859-1] (original) +++ branches/aicom-network-fixes/drivers/network/ndis/ndis/miniport.c [iso-8859-1] Tue Sep 23 18:59:43 2008 @@ -635,24 +635,20 @@ }
VOID STDCALL -HangTimer( PVOID Context ) -{ - PLOGICAL_ADAPTER Adapter = Context; - BOOLEAN AddressingReset; - - while (Adapter->NdisMiniportBlock.PnPDeviceState == NdisPnPDeviceStarted) - { - AddressingReset = FALSE; - - NdisMSleep(Adapter->NdisMiniportBlock.CheckForHangSeconds * 1000000); - - if (MiniCheckForHang(Adapter)) - MiniReset(Adapter, &AddressingReset); - - /* FIXME: We should call MiniportSetInformation if AddressingReset is TRUE */ - } - - PsTerminateSystemThread(STATUS_SUCCESS); +MiniportHangDpc( + PKDPC Dpc, + PVOID DeferredContext, + PVOID SystemArgument1, + PVOID SystemArgument2) +{ + PLOGICAL_ADAPTER Adapter = DeferredContext; + BOOLEAN AddressingReset = FALSE; + + + if (MiniCheckForHang(Adapter)) + MiniReset(Adapter, &AddressingReset); + + /* FIXME: We should call MiniportSetInformation if AddressingReset is TRUE */ }
@@ -1442,9 +1438,8 @@ PNDIS_CONFIGURATION_PARAMETER ConfigParam; NDIS_HANDLE ConfigHandle; ULONG Size; - HANDLE HangTimerHandle; - -/* FIXME - KIRQL OldIrql; */ + LARGE_INTEGER Timeout; + /* FIXME - KIRQL OldIrql; */
/* * Prepare wrapper context used by HW and configuration routines. @@ -1663,9 +1658,10 @@ Adapter->NdisMiniportBlock.OldPnPDeviceState = Adapter->NdisMiniportBlock.PnPDeviceState; Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceStarted;
- PsCreateSystemThread(&HangTimerHandle, THREAD_ALL_ACCESS, 0, 0, 0, - HangTimer, Adapter); - ZwClose(HangTimerHandle); + 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); @@ -1721,6 +1717,8 @@
Adapter->NdisMiniportBlock.OldPnPDeviceState = Adapter->NdisMiniportBlock.PnPDeviceState; Adapter->NdisMiniportBlock.PnPDeviceState = NdisPnPDeviceStopped; + + KeCancelTimer(&Adapter->NdisMiniportBlock.WakeUpDpcTimer.Timer);
return STATUS_SUCCESS; } @@ -1908,7 +1906,9 @@ 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;