Author: cgutman Date: Fri Dec 28 00:36:28 2012 New Revision: 58022
URL: http://svn.reactos.org/svn/reactos?rev=58022&view=rev Log: - Never queue a DPC for MiniportHandleInterrupt regardless of what MiniportISR requests if MiniportInitialize is executing - Very likely fixes CORE-6064
Modified: trunk/reactos/drivers/network/ndis/ndis/io.c
Modified: trunk/reactos/drivers/network/ndis/ndis/io.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/drivers/network/ndis/ndis/i... ============================================================================== --- trunk/reactos/drivers/network/ndis/ndis/io.c [iso-8859-1] (original) +++ trunk/reactos/drivers/network/ndis/ndis/io.c [iso-8859-1] Fri Dec 28 00:36:28 2012 @@ -62,11 +62,16 @@ BOOLEAN QueueMiniportHandleInterrupt = FALSE; PNDIS_MINIPORT_INTERRUPT NdisInterrupt = ServiceContext; PNDIS_MINIPORT_BLOCK NdisMiniportBlock = NdisInterrupt->Miniport; + BOOLEAN Initializing;
NDIS_DbgPrint(MAX_TRACE, ("Called. Interrupt (0x%X)\n", NdisInterrupt));
- /* FIXME: This probably isn't the right check for MiniportInitialize, but we need to see what Windows uses here */ - if ((NdisMiniportBlock->PnPDeviceState != NdisPnPDeviceStarted) || (NdisInterrupt->IsrRequested)) { + /* Certain behavior differs if MiniportInitialize is executing when the interrupt is generated */ + Initializing = (NdisMiniportBlock->PnPDeviceState != NdisPnPDeviceStarted); + NDIS_DbgPrint(MAX_TRACE, ("MiniportInitialize executing: %s\n", (Initializing ? "yes" : "no"))); + + /* MiniportISR is always called for interrupts during MiniportInitialize */ + if ((Initializing) || (NdisInterrupt->IsrRequested)) { NDIS_DbgPrint(MAX_TRACE, ("Calling MiniportISR\n")); (*NdisMiniportBlock->DriverHandle->MiniportCharacteristics.ISRHandler)( &InterruptRecognized, @@ -81,8 +86,8 @@ InterruptRecognized = TRUE; }
- - if (QueueMiniportHandleInterrupt) + /* MiniportHandleInterrupt is never called for an interrupt during MiniportInitialize */ + if ((QueueMiniportHandleInterrupt) && (!Initializing)) { NDIS_DbgPrint(MAX_TRACE, ("Queuing DPC.\n")); KeInsertQueueDpc(&NdisInterrupt->InterruptDpc, NULL, NULL);