- Only call MiniportISR if the miniport driver called NdisMRegisterInterrupt with RequestIsr TRUE

- If RequestIsr is FALSE call the MiniportDisableInterrupt handler

svn path=/branches/aicom-network-fixes/; revision=36620
This commit is contained in:
Cameron Gutman 2008-10-02 02:04:57 +00:00
parent 769eadf101
commit 2e295e7d36

View file

@ -60,22 +60,31 @@ BOOLEAN NTAPI ServiceRoutine(
* TRUE if a miniport controlled device generated the interrupt * TRUE if a miniport controlled device generated the interrupt
*/ */
{ {
BOOLEAN InterruptRecognized; BOOLEAN InterruptRecognized = FALSE;
BOOLEAN QueueMiniportHandleInterrupt; BOOLEAN QueueMiniportHandleInterrupt = FALSE;
PLOGICAL_ADAPTER Adapter = ServiceContext; PLOGICAL_ADAPTER Adapter = ServiceContext;
NDIS_DbgPrint(MAX_TRACE, ("Called. Adapter (0x%X)\n", Adapter)); NDIS_DbgPrint(MAX_TRACE, ("Called. Adapter (0x%X)\n", Adapter));
(*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ISRHandler)( if (Adapter->NdisMiniportBlock.Interrupt->IsrRequested) {
&InterruptRecognized, (*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.ISRHandler)(
&QueueMiniportHandleInterrupt, &InterruptRecognized,
Adapter->NdisMiniportBlock.MiniportAdapterContext); &QueueMiniportHandleInterrupt,
Adapter->NdisMiniportBlock.MiniportAdapterContext);
} else if (Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.DisableInterruptHandler) {
(*Adapter->NdisMiniportBlock.DriverHandle->MiniportCharacteristics.DisableInterruptHandler)(
Adapter->NdisMiniportBlock.MiniportAdapterContext);
QueueMiniportHandleInterrupt = TRUE;
InterruptRecognized = TRUE;
}
if (QueueMiniportHandleInterrupt) if (QueueMiniportHandleInterrupt)
{ {
NDIS_DbgPrint(MAX_TRACE, ("Queueing DPC.\n")); NDIS_DbgPrint(MAX_TRACE, ("Queuing DPC.\n"));
KeInsertQueueDpc(&Adapter->NdisMiniportBlock.Interrupt->InterruptDpc, NULL, NULL); KeInsertQueueDpc(&Adapter->NdisMiniportBlock.Interrupt->InterruptDpc, NULL, NULL);
} }
NDIS_DbgPrint(MAX_TRACE, ("Leaving.\n")); NDIS_DbgPrint(MAX_TRACE, ("Leaving.\n"));
@ -767,6 +776,7 @@ NdisMRegisterInterrupt(
KeInitializeEvent(&Interrupt->DpcsCompletedEvent, NotificationEvent, FALSE); KeInitializeEvent(&Interrupt->DpcsCompletedEvent, NotificationEvent, FALSE);
Interrupt->SharedInterrupt = SharedInterrupt; Interrupt->SharedInterrupt = SharedInterrupt;
Interrupt->IsrRequested = RequestIsr;
Adapter->NdisMiniportBlock.Interrupt = Interrupt; Adapter->NdisMiniportBlock.Interrupt = Interrupt;