mirror of
https://github.com/reactos/reactos.git
synced 2024-07-29 15:49:03 +00:00
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:
parent
ad7e640f0c
commit
89dd06fa40
|
@ -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,
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in a new issue