Author: cgutman Date: Thu Sep 11 04:37:54 2008 New Revision: 36134
URL: http://svn.reactos.org/svn/reactos?rev=36134&view=rev Log: - We must call MiniQueueWorkItem while holding a spin lock
Modified: branches/aicom-network-fixes/drivers/network/ndis/ndis/protocol.c
Modified: branches/aicom-network-fixes/drivers/network/ndis/ndis/protocol.c URL: http://svn.reactos.org/svn/reactos/branches/aicom-network-fixes/drivers/netw... ============================================================================== --- branches/aicom-network-fixes/drivers/network/ndis/ndis/protocol.c [iso-8859-1] (original) +++ branches/aicom-network-fixes/drivers/network/ndis/ndis/protocol.c [iso-8859-1] Thu Sep 11 04:37:54 2008 @@ -238,7 +238,6 @@ */ 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 @@ 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,8 +266,11 @@ 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,11 +306,14 @@ 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