netdev
[Top] [All Lists]

RE: [Fwd: [E1000] NAPI re-insertion w/ changes]

To: "Feldman, Scott" <scott.feldman@xxxxxxxxx>
Subject: RE: [Fwd: [E1000] NAPI re-insertion w/ changes]
From: Robert Olsson <Robert.Olsson@xxxxxxxxxxx>
Date: Mon, 31 Mar 2003 19:14:36 +0200
Cc: Robert Olsson <Robert.Olsson@xxxxxxxxxxx>, Jeff Garzik <jgarzik@xxxxxxxxx>, netdev@xxxxxxxxxxx
In-reply-to: <C6F5CF431189FA4CBAEC9E7DD5441E010107D2D8@orsmsx402.jf.intel.com>
References: <C6F5CF431189FA4CBAEC9E7DD5441E010107D2D8@orsmsx402.jf.intel.com>
Sender: netdev-bounce@xxxxxxxxxxx

Hello!

A better approximation I think but probably not the last...

Cheers.
                                                --ro



--- linux/drivers/net/e1000/e1000_main.c.orig   2003-03-27 14:38:02.000000000 
+0100
+++ linux/drivers/net/e1000/e1000_main.c        2003-03-31 17:56:05.000000000 
+0200
@@ -1999,11 +1999,17 @@
                mod_timer(&adapter->watchdog_timer, jiffies);
        }
 
-#ifdef CONFIG_E1000_NAPI
-       /* Don't disable interrupts - rely on h/w interrupt
-        * moderation to keep interrupts low.  netif_rx_schedule
-        * is NOP if already polling. */
-       netif_rx_schedule(netdev);
+#ifdef  CONFIG_E1000_NAPI
+       if (netif_rx_schedule_prep(netdev)) {
+
+               /* Disable interrupts and register for poll. The flush 
+                  of the posted write is intentionally left out.
+               */
+
+               atomic_inc(&adapter->irq_sem);
+               E1000_WRITE_REG(&adapter->hw, IMC, ~0);
+               __netif_rx_schedule(netdev);
+       }
 #else
        for(i = 0; i < E1000_MAX_INTR; i++)
                if(!e1000_clean_rx_irq(adapter) &&
@@ -2025,17 +2031,16 @@
        int work_to_do = min(*budget, netdev->quota);
        int work_done = 0;
        
-       while(work_done < work_to_do)
-               if(!e1000_clean_rx_irq(adapter, &work_done, work_to_do) &&
-                  !e1000_clean_tx_irq(adapter))
-                       break;
+       e1000_clean_tx_irq(adapter);
+       e1000_clean_rx_irq(adapter, &work_done, work_to_do);
 
        *budget -= work_done;
        netdev->quota -= work_done;
        
-       if(work_done < work_to_do)
+       if(work_done < work_to_do) {
                netif_rx_complete(netdev);
-
+               e1000_irq_enable(adapter);
+       }
        return (work_done >= work_to_do);
 }
#endif

<Prev in Thread] Current Thread [Next in Thread>