From ac40a36ce9990e80f89f788ec2d65aa6b071eb22 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sun, 14 Sep 2008 04:02:04 +0000 Subject: [PATCH] - 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 --- drivers/network/ndis/ndis/miniport.c | 53 ++++++++++++++++++---------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/drivers/network/ndis/ndis/miniport.c b/drivers/network/ndis/ndis/miniport.c index f6449aecf22..e854bd467de 100644 --- a/drivers/network/ndis/ndis/miniport.c +++ b/drivers/network/ndis/ndis/miniport.c @@ -748,35 +748,23 @@ NdisMQueryInformationComplete( KeLowerIrql(OldIrql); } - -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 - */ +VOID NTAPI MiniportWorker( + IN PDEVICE_OBJECT DeviceObject, + IN PVOID Context) { + PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(Context); + KIRQL OldIrql; NDIS_STATUS NdisStatus; PVOID WorkItemContext; NDIS_WORK_ITEM_TYPE WorkItemType; - PLOGICAL_ADAPTER Adapter = GET_LOGICAL_ADAPTER(DeferredContext); - NDIS_DbgPrint(DEBUG_MINIPORT, ("Called.\n")); - - KeAcquireSpinLockAtDpcLevel(&Adapter->NdisMiniportBlock.Lock); + KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); NdisStatus = MiniDequeueWorkItem (Adapter, &WorkItemType, &WorkItemContext); - KeReleaseSpinLockFromDpcLevel(&Adapter->NdisMiniportBlock.Lock); + KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); 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 NTAPI -- 2.17.1