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
This commit is contained in:
Art Yerkes 2004-12-01 08:02:28 +00:00
parent ad7e640f0c
commit 89dd06fa40
2 changed files with 23 additions and 18 deletions

View file

@ -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,

View file

@ -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);