- Limit the number of interrupts that are handled per call to MiniportHandleInterrup...
authorCameron Gutman <aicommander@gmail.com>
Fri, 23 Oct 2009 00:27:00 +0000 (00:27 +0000)
committerCameron Gutman <aicommander@gmail.com>
Fri, 23 Oct 2009 00:27:00 +0000 (00:27 +0000)
svn path=/trunk/; revision=43693

reactos/drivers/network/dd/ne2000/include/ne2000.h
reactos/drivers/network/dd/ne2000/ne2000/8390.c
reactos/drivers/network/dd/pcnet/pcnet.c
reactos/drivers/network/dd/pcnet/pcnet.h

index eb14bcd..1676619 100644 (file)
@@ -55,7 +55,8 @@
 /* Interrupt Mask Register value */
 #define DRIVER_INTERRUPT_MASK   IMR_ALLE - IMR_RDCE
 
-
+/* Maximum number of interrupts handled per call to MiniportHandleInterrupt */
+#define INTERRUPT_LIMIT 10
 
 /* Global structures */
 
index 4a3a409..c055d43 100644 (file)
@@ -1315,6 +1315,7 @@ VOID NTAPI MiniportHandleInterrupt(
     UCHAR ISRMask;
     UCHAR Mask;
     PNIC_ADAPTER Adapter = (PNIC_ADAPTER)MiniportAdapterContext;
+    UINT i = 0;
 
     ISRMask = Adapter->InterruptMask;
     NdisRawReadPortUchar(Adapter->IOBase + PG0_ISR, &ISRValue);
@@ -1323,12 +1324,14 @@ VOID NTAPI MiniportHandleInterrupt(
 
     Adapter->InterruptStatus |= (ISRValue & ISRMask);
 
-    if (ISRValue != 0x00)
-        /* Acknowledge interrupts */
-        NdisRawWritePortUchar(Adapter->IOBase + PG0_ISR, ISRValue);
-
     Mask = 0x01;
-    while (Adapter->InterruptStatus != 0x00) {
+    while (Adapter->InterruptStatus != 0x00 && i++ < INTERRUPT_LIMIT) {
+
+        if (ISRValue != 0x00) {
+            /* Acknowledge interrupts */
+            NdisRawWritePortUchar(Adapter->IOBase + PG0_ISR, ISRValue);
+            Mask = 0x01;
+        }
 
         NDIS_DbgPrint(MID_TRACE, ("Adapter->InterruptStatus (0x%X)  Mask (0x%X).\n",
             Adapter->InterruptStatus, Mask));
@@ -1409,12 +1412,6 @@ VOID NTAPI MiniportHandleInterrupt(
         NDIS_DbgPrint(MID_TRACE, ("ISRValue (0x%X).\n", ISRValue));
 
         Adapter->InterruptStatus |= (ISRValue & ISRMask);
-
-        if (ISRValue != 0x00) {
-            /* Acknowledge interrupts */
-            NdisRawWritePortUchar(Adapter->IOBase + PG0_ISR, ISRValue);
-            Mask = 0x01;
-        }
     }
 
     NICEnableInterrupts((PNIC_ADAPTER)MiniportAdapterContext);
index f6c4630..a89987e 100644 (file)
@@ -66,6 +66,7 @@ MiniportHandleInterrupt(
 {
   PADAPTER Adapter = (PADAPTER)MiniportAdapterContext;
   USHORT Data;
+  UINT i = 0;
 
   DPRINT("Called\n");
 
@@ -78,7 +79,7 @@ MiniportHandleInterrupt(
 
   DPRINT("CSR0 is 0x%x\n", Data);
 
-  while(Data & CSR0_INTR)
+  while((Data & CSR0_INTR) && i++ < INTERRUPT_LIMIT)
     {
       /* Clear interrupt flags early to avoid race conditions. */
       NdisRawWritePortUshort(Adapter->PortOffset + RDP, Data);
index 62312ee..0f72aee 100644 (file)
@@ -149,6 +149,9 @@ MiGetMediaDuplex(PADAPTER Adapter);
 /* flags */
 #define RESET_IN_PROGRESS 0x1
 
+/* Maximum number of interrupts handled per call to MiniportHandleInterrupt */
+#define INTERRUPT_LIMIT 10
+
 #if DBG
 #define BREAKPOINT DbgBreakPoint();
 #else