X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Fdrivers%2Fnetwork%2Fndis%2Fndis%2Ftime.c;h=0872ee7045871fdfb1d4efb629ca79306a9b11cf;hp=75a65f3b24fc1f4a7764c04f39262a226454fcb8;hb=f44eee190b536ee0362aa20d9ba9d6d271ba3d4f;hpb=d7372c2dc47a61525f8ef76fe2d94ee6c0270a28 diff --git a/reactos/drivers/network/ndis/ndis/time.c b/reactos/drivers/network/ndis/ndis/time.c index 75a65f3b24f..0872ee70458 100644 --- a/reactos/drivers/network/ndis/ndis/time.c +++ b/reactos/drivers/network/ndis/ndis/time.c @@ -95,6 +95,32 @@ NdisInitializeTimer( KeInitializeDpc (&Timer->Dpc, (PKDEFERRED_ROUTINE)TimerFunction, FunctionContext); } +VOID DequeueMiniportTimer(PNDIS_MINIPORT_TIMER Timer) +{ + PNDIS_MINIPORT_TIMER CurrentTimer; + + ASSERT(Timer->Miniport->TimerQueue); + + if (Timer->Miniport->TimerQueue == Timer) + { + Timer->Miniport->TimerQueue = Timer->NextDeferredTimer; + } + else + { + CurrentTimer = Timer->Miniport->TimerQueue; + while (CurrentTimer->NextDeferredTimer) + { + if (CurrentTimer->NextDeferredTimer == Timer) + { + CurrentTimer->NextDeferredTimer = Timer->NextDeferredTimer; + return; + } + CurrentTimer = CurrentTimer->NextDeferredTimer; + } + ASSERT(FALSE); + } +} + /* * @implemented @@ -118,6 +144,25 @@ NdisMCancelTimer( ASSERT(Timer); *TimerCancelled = KeCancelTimer (&Timer->Timer); + + DequeueMiniportTimer(Timer); +} + +VOID NTAPI +MiniTimerDpcFunction(PKDPC Dpc, + PVOID DeferredContext, + PVOID SystemArgument1, + PVOID SystemArgument2) +{ + PNDIS_MINIPORT_TIMER Timer = DeferredContext; + + Timer->MiniportTimerFunction(Dpc, + Timer->MiniportTimerContext, + SystemArgument1, + SystemArgument2); + + /* FIXME: We can't call this if we have a periodic timer */ + //DequeueMiniportTimer(Timer); } @@ -145,9 +190,14 @@ NdisMInitializeTimer( { PAGED_CODE(); ASSERT(Timer); + KeInitializeTimer (&Timer->Timer); + KeInitializeDpc (&Timer->Dpc, MiniTimerDpcFunction, Timer); - KeInitializeDpc (&Timer->Dpc, (PKDEFERRED_ROUTINE)TimerFunction, FunctionContext); + Timer->MiniportTimerFunction = TimerFunction; + Timer->MiniportTimerContext = FunctionContext; + Timer->Miniport = &((PLOGICAL_ADAPTER)MiniportAdapterHandle)->NdisMiniportBlock; + Timer->NextDeferredTimer = NULL; } @@ -177,6 +227,10 @@ NdisMSetPeriodicTimer( /* relative delays are negative, absolute are positive; resolution is 100ns */ Timeout.QuadPart = Int32x32To64(MillisecondsPeriod, -10000); + /* Add the timer at the head of the timer queue */ + Timer->NextDeferredTimer = Timer->Miniport->TimerQueue; + Timer->Miniport->TimerQueue = Timer; + KeSetTimerEx (&Timer->Timer, Timeout, MillisecondsPeriod, &Timer->Dpc); } @@ -208,6 +262,10 @@ NdisMSetTimer( /* relative delays are negative, absolute are positive; resolution is 100ns */ Timeout.QuadPart = Int32x32To64(MillisecondsToDelay, -10000); + /* Add the timer at the head of the timer queue */ + Timer->NextDeferredTimer = Timer->Miniport->TimerQueue; + Timer->Miniport->TimerQueue = Timer; + KeSetTimer (&Timer->Timer, Timeout, &Timer->Dpc); }