From 4b72cb5e0f343bb0bac5a04ed9783d327466bfc0 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Thu, 11 Sep 2008 09:37:54 +0000 Subject: [PATCH] - We must call MiniQueueWorkItem while holding a spin lock svn path=/branches/aicom-network-fixes/; revision=36134 --- drivers/network/ndis/ndis/protocol.c | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/drivers/network/ndis/ndis/protocol.c b/drivers/network/ndis/ndis/protocol.c index b9fa3729792..beb00620ce4 100644 --- a/drivers/network/ndis/ndis/protocol.c +++ b/drivers/network/ndis/ndis/protocol.c @@ -238,7 +238,6 @@ ProSend( */ NDIS_DbgPrint(MAX_TRACE, ("acquiring miniport block lock\n")); KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &SpinOldIrql); - { /* * if the miniport is marked as busy, we queue the packet as a work item, * else we send the packet directly to the miniport. Sending to the miniport @@ -251,8 +250,6 @@ ProSend( NDIS_DbgPrint(MAX_TRACE, ("Setting adapter 0x%x to busy\n")); Adapter->MiniportBusy = TRUE; } - } - KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, SpinOldIrql); /* * Test the packet to see if it is a MAC loopback. @@ -269,9 +266,12 @@ ProSend( if (QueueWorkItem) { MiniQueueWorkItem(Adapter, NdisWorkItemSendLoopback, (PVOID)Packet); + KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, SpinOldIrql); return NDIS_STATUS_PENDING; } + KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, SpinOldIrql); + KeRaiseIrql(DISPATCH_LEVEL, &RaiseOldIrql); { /* @@ -306,12 +306,15 @@ ProSend( if (QueueWorkItem) { MiniQueueWorkItem(Adapter, NdisWorkItemSend, (PVOID)Packet); + KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, SpinOldIrql); NDIS_DbgPrint(MAX_TRACE, ("Queued a work item and returning\n")); return NDIS_STATUS_PENDING; } ASSERT(Adapter->NdisMiniportBlock.DriverHandle); + KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, SpinOldIrql); + /* * Call the appropriate send handler *