- Queue a work item to do our work that was previously done in MiniportDpc so SendHandler gets called at the correct IRQL

svn path=/branches/aicom-network-fixes/; revision=36206
This commit is contained in:
Cameron Gutman 2008-09-14 04:02:04 +00:00
parent 86ca4446aa
commit ac40a36ce9

View file

@ -748,35 +748,23 @@ NdisMQueryInformationComplete(
KeLowerIrql(OldIrql); KeLowerIrql(OldIrql);
} }
VOID NTAPI MiniportWorker(
VOID NTAPI MiniportDpc( IN PDEVICE_OBJECT DeviceObject,
IN PKDPC Dpc, IN PVOID Context)
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2)
/*
* FUNCTION: Deferred routine to handle serialization
* ARGUMENTS:
* Dpc = Pointer to DPC object
* DeferredContext = Pointer to context information (LOGICAL_ADAPTER)
* SystemArgument1 = Unused
* SystemArgument2 = Unused
*/
{ {
PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(Context);
KIRQL OldIrql;
NDIS_STATUS NdisStatus; NDIS_STATUS NdisStatus;
PVOID WorkItemContext; PVOID WorkItemContext;
NDIS_WORK_ITEM_TYPE WorkItemType; NDIS_WORK_ITEM_TYPE WorkItemType;
PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext);
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql);
KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock);
NdisStatus = NdisStatus =
MiniDequeueWorkItem MiniDequeueWorkItem
(Adapter, &WorkItemType, &WorkItemContext); (Adapter, &WorkItemType, &WorkItemContext);
KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql);
if (NdisStatus == NDIS_STATUS_SUCCESS) if (NdisStatus == NDIS_STATUS_SUCCESS)
{ {
@ -872,6 +860,33 @@ VOID NTAPI MiniportDpc(
} }
} }
VOID NTAPI MiniportDpc(
IN PKDPC Dpc,
IN PVOID DeferredContext,
IN PVOID SystemArgument1,
IN PVOID SystemArgument2)
/*
* FUNCTION: Deferred routine to handle serialization
* ARGUMENTS:
* Dpc = Pointer to DPC object
* DeferredContext = Pointer to context information (LOGICAL_ADAPTER)
* SystemArgument1 = Unused
* SystemArgument2 = Unused
*/
{
PIO_WORKITEM WorkItem;
PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext);
NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n"));
WorkItem = IoAllocateWorkItem(Adapter->NdisMiniportBlock.DeviceObject);
if( !WorkItem ) return;
IoQueueWorkItem(WorkItem, MiniportWorker, CriticalWorkQueue, DeferredContext);
}
VOID VOID
NTAPI NTAPI