e100 "Lucky 13" release

From: Feldman, Scott <hidden>
Date: 2003-08-21 02:44:33

More NAPI updates from jchapman@katalix.com.

	http://sf.net/projects/e1000, e100-3.0.0_dev13.tar.gz

He's getting respectable NAPI perf numbers with this.  Note the polling 
exit condition.

-scott


--- e100-3.0.0_dev12/src/e100.c	2003-08-04 20:20:42.000000000 -0700
+++ e100-3.0.0_dev13/src/e100.c	2003-08-20 18:28:56.000000000 -0700
@@ -150,11 +150,12 @@
 #include <linux/ethtool.h>
 #include <asm/unaligned.h>
 #include <asm/uaccess.h>
+#include <asm/io.h>
 
 #include "kcompat.h"
 
 #define DRV_NAME		"e100"
-#define DRV_VERSION		"3.0.0_dev12"
+#define DRV_VERSION		"3.0.0_dev13"
 #define DRV_DESCRIPTION		"Intel(R) PRO/100 Network Driver"
 #define DRV_COPYRIGHT		"Copyright(c) 1999-2003 Intel Corporation"
 #define PFX			DRV_NAME ": "
@@ -1171,7 +1172,7 @@ static void e100_watchdog(unsigned long 
 	mod_timer(&nic->watchdog, jiffies + 2 * HZ);
 }
 
-static void e100_xmit_prepare(struct nic *nic, struct cb *cb,
+static inline void e100_xmit_prepare(struct nic *nic, struct cb *cb,
 	struct sk_buff *skb)
 {
 	cb->command = nic->tx_command;
@@ -1200,7 +1201,7 @@ static int e100_xmit_frame(struct sk_buf
 	return 0;
 }
 
-static inline void e100_tx_clean(struct nic *nic)
+static inline int e100_tx_clean(struct nic *nic)
 {
 	struct cb *cb;
 	int tx_cleaned = 0;
@@ -1234,6 +1235,8 @@ static inline void e100_tx_clean(struct 
 	/* Recover from running out of Tx resources in xmit_frame */
 	if(unlikely(tx_cleaned && netif_queue_stopped(nic->netdev)))
 		netif_wake_queue(nic->netdev);
+
+	return tx_cleaned;
 }
 
 static void e100_clean_cbs(struct nic *nic, int free_mem)
@@ -1334,9 +1337,9 @@ static inline void e100_rx_rfa_add_tail(
 		struct rx_list *prev = (struct rx_list *)curr->list.prev;
 		if(likely(prev->skb != NULL)) {
 			struct rfd *prev_rfd = (struct rfd *)prev->skb->data;
-			prev_rfd->command = 0;
 			put_unaligned(cpu_to_le32(curr->dma_addr),
 				(u32 *)&prev_rfd->link);
+			prev_rfd->command = 0;
 			pci_dma_sync_single(nic->pdev, prev->dma_addr, 
 				sizeof(struct rfd), PCI_DMA_TODEVICE);
 		}
@@ -1384,7 +1387,7 @@ static inline int e100_rx_indicate(struc
 	if(unlikely(!(rfd_status & cb_ok)) ||
 	   actual_size > nic->netdev->mtu + VLAN_ETH_HLEN) {
 		/* Don't indicate if errors */
-		dev_kfree_skb_irq(skb);
+		dev_kfree_skb_any(skb);
 	} else {
 		nic->net_stats.rx_packets++;
 		nic->net_stats.rx_bytes += actual_size;
@@ -1494,14 +1497,12 @@ static irqreturn_t e100_intr(int irq, vo
 	e100_write_flush(nic);
 
 #ifdef CONFIG_E100_NAPI
-	if(likely(netif_rx_schedule_prep(netdev))) {
-		e100_disable_irq(nic);
-		__netif_rx_schedule(netdev);
-	}
+	e100_disable_irq(nic);
+	netif_rx_schedule(netdev);
 #else
-	if(likely(stat_ack & stat_ack_rx))
+	if(stat_ack & stat_ack_rx)
 		e100_rx_clean(nic, NULL, 0);
-	if(likely(stat_ack & stat_ack_tx))
+	if(stat_ack & stat_ack_tx)
 		e100_tx_clean(nic);
 #endif
 
@@ -1514,19 +1515,21 @@ static int e100_poll(struct net_device *
 	struct nic *nic = netdev->priv;
 	unsigned int work_to_do = min(netdev->quota, *budget);
 	unsigned int work_done = 0;
+	int tx_cleaned;
 
 	e100_rx_clean(nic, &work_done, work_to_do);
-	e100_tx_clean(nic);
+	tx_cleaned = e100_tx_clean(nic);
 
-	*budget -= work_done;
-	netdev->quota -= work_done;
-
-	if(likely(work_done < work_to_do)) {
+	/* If no Rx and Tx cleanup work was done, exit polling mode. */
+	if(!tx_cleaned && (work_done == 0)) {
 		netif_rx_complete(netdev);
 		e100_enable_irq(nic);
 		return 0;
 	}
 
+	*budget -= work_done;
+	netdev->quota -= work_done;
+
 	return 1;
 }
 #endif
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help