From 9826b2ad0433b88d00808507e0979a61eed3a715 Mon Sep 17 00:00:00 2001 From: Cameron Gutman Date: Sat, 27 Sep 2008 18:00:08 +0000 Subject: [PATCH] - Queue a work item in MiniReset if the adapter is currently busy - Handle NdisWorkItemResetRequested in MiniportWorker - Remove a fixme svn path=/branches/aicom-network-fixes/; revision=36551 --- drivers/network/ndis/ndis/miniport.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/drivers/network/ndis/ndis/miniport.c b/drivers/network/ndis/ndis/miniport.c index 6f06ec65418..f095c8ca3a1 100644 --- a/drivers/network/ndis/ndis/miniport.c +++ b/drivers/network/ndis/ndis/miniport.c @@ -619,14 +619,18 @@ MiniReset( * Status of the operation */ { - NDIS_STATUS Status = NDIS_STATUS_FAILURE; + NDIS_STATUS Status; KIRQL OldIrql; - /* FIXME: What should we return if there isn't a reset handler? */ + if (Adapter->MiniportBusy) { + KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); + MiniQueueWorkItem(Adapter, NdisWorkItemResetRequested, NULL); + KeReleaseSpinLock(&Adapter->NdisMiniportBlock.Lock, OldIrql); + return NDIS_STATUS_PENDING; + } KeRaiseIrql(DISPATCH_LEVEL, &OldIrql); - if (Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler) - Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)( + Status = (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ResetHandler)( Adapter->NdisMiniportBlock.MiniportAdapterContext, AddressingReset); KeLowerIrql(OldIrql); @@ -841,6 +845,7 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem) NDIS_STATUS NdisStatus; PVOID WorkItemContext; NDIS_WORK_ITEM_TYPE WorkItemType; + BOOLEAN AddressingReset; KeAcquireSpinLock(&Adapter->NdisMiniportBlock.Lock, &OldIrql); @@ -938,6 +943,12 @@ VOID NTAPI MiniportWorker(IN PVOID WorkItem) break; case NdisWorkItemResetRequested: + NdisStatus = MiniReset(Adapter, &AddressingReset); + + if (NdisStatus == NDIS_STATUS_PENDING) + break; + + MiniResetComplete(Adapter, NdisStatus, AddressingReset); break; case NdisWorkItemResetInProgress: