From 89dd06fa409d19d2b4b9ab48308ac6b7b9ebac34 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Wed, 1 Dec 2004 08:02:28 +0000 Subject: [PATCH] miniport: Make sure MiniQueueDpc is not called from PASSIVE_LEVEL. Moved NdisMQueryInformationComplete so that the function and not the macro is called from the DPC. This was breaking stuff severely. The adapter lock needn't be held when doing MiniDequeueWorkItem because we're at DISPATCH_LEVEL already by virtue of being in a DPC target. protocol: Make sure MiniQueueWorkItem is called at DISPATCH_LEVEL. svn path=/trunk/; revision=11883 --- reactos/drivers/net/ndis/ndis/miniport.c | 37 +++++++++++++----------- reactos/drivers/net/ndis/ndis/protocol.c | 4 ++- 2 files changed, 23 insertions(+), 18 deletions(-) diff --git a/reactos/drivers/net/ndis/ndis/miniport.c b/reactos/drivers/net/ndis/ndis/miniport.c index 4a3528661b7..70cce85d08e 100644 --- a/reactos/drivers/net/ndis/ndis/miniport.c +++ b/reactos/drivers/net/ndis/ndis/miniport.c @@ -627,6 +627,7 @@ MiniQueueWorkItem( NDIS_DbgPrint(MAX_TRACE, ("Called.\n")); ASSERT(Adapter); + ASSERT(KeGetCurrentIrql() >= DISPATCH_LEVEL); #if 0 if (Adapter->WorkQueueLevel < NDIS_MINIPORT_WORK_QUEUE_SIZE - 1) @@ -755,6 +756,24 @@ MiniDoRequest( } } + +#undef NdisMQueryInformationComplete +/* + * @implemented + */ +VOID +EXPORT +NdisMQueryInformationComplete( + IN NDIS_HANDLE MiniportAdapterHandle, + IN NDIS_STATUS Status) +{ + PNDIS_MINIPORT_BLOCK MiniportBlock = + (PNDIS_MINIPORT_BLOCK)MiniportAdapterHandle; + ASSERT(MiniportBlock); + if( MiniportBlock->QueryCompleteHandler ) + (MiniportBlock->QueryCompleteHandler)(MiniportAdapterHandle, Status); +} + VOID STDCALL MiniportDpc( IN PKDPC Dpc, @@ -777,7 +796,6 @@ VOID STDCALL MiniportDpc( NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); - /* XXX is adapter lock held here? should be... */ NdisStatus = MiniDequeueWorkItem(Adapter, &WorkItemType, &WorkItemContext); if (NdisStatus == NDIS_STATUS_SUCCESS) @@ -853,7 +871,7 @@ VOID STDCALL MiniportDpc( switch (((PNDIS_REQUEST)WorkItemContext)->RequestType) { case NdisRequestQueryInformation: - NdisMQueryInformationComplete((NDIS_HANDLE)Adapter, NdisStatus); + NdisMQueryInformationComplete((NDIS_HANDLE)Adapter, NdisStatus); break; case NdisRequestSetInformation: @@ -1046,21 +1064,6 @@ NdisInitializeWrapper( *NdisWrapperHandle = Miniport; } -#undef NdisMQueryInformationComplete - - -/* - * @implemented - */ -VOID -EXPORT -NdisMQueryInformationComplete( - IN NDIS_HANDLE MiniportAdapterHandle, - IN NDIS_STATUS Status) -{ - (*((PNDIS_MINIPORT_BLOCK)(MiniportAdapterHandle))->QueryCompleteHandler)(MiniportAdapterHandle, Status); -} - VOID STDCALL NdisIBugcheckCallback( IN PVOID Buffer, diff --git a/reactos/drivers/net/ndis/ndis/protocol.c b/reactos/drivers/net/ndis/ndis/protocol.c index 0cd27f00992..b1f95aeb1fe 100644 --- a/reactos/drivers/net/ndis/ndis/protocol.c +++ b/reactos/drivers/net/ndis/ndis/protocol.c @@ -147,14 +147,16 @@ ProRequest( Adapter->MiniportBusy = TRUE; } } - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); + /* MiniQueueWorkItem must be called at IRQL >= DISPATCH_LEVEL */ if (QueueWorkItem) { MiniQueueWorkItem(Adapter, NdisWorkItemRequest, (PVOID)NdisRequest); return NDIS_STATUS_PENDING; } + KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); + /* MiniportQueryInformation (called by MiniDoRequest) runs at DISPATCH_LEVEL */ /* TODO (?): move the irql raise into MiniDoRequest */ KeRaiseIrql(DISPATCH_LEVEL, &OldIrql);