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/net…
==============================================================================
--- 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;