--- /home/luigi/ksrc/linux-2.6.32.1/drivers/net/e1000e//netdev.c	2009-12-14 18:47:25.000000000 +0100
+++ net/e1000e/netdev.c	2012-07-31 13:14:44.000000000 +0200
@@ -446,6 +446,10 @@
 	bool cleaned = 0;
 	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
 
+#ifdef DEV_NETMAP$
+	if (netmap_tx_irq(netdev, 0))
+		return 1; /* cleaned ok */
+#endif /* DEV_NETMAP */
 	i = rx_ring->next_to_clean;
 	rx_desc = E1000_RX_DESC(*rx_ring, i);
 	buffer_info = &rx_ring->buffer_info[i];
@@ -624,6 +628,10 @@
 	unsigned int count = 0;
 	unsigned int total_tx_bytes = 0, total_tx_packets = 0;
 
+#ifdef DEV_NETMAP
+	if (netmap_tx_irq(netdev, 0))
+		return 1; /* cleaned ok */
+#endif /* DEV_NETMAP */
 	i = tx_ring->next_to_clean;
 	eop = tx_ring->buffer_info[i].next_to_watch;
 	eop_desc = E1000_TX_DESC(*tx_ring, eop);
@@ -718,6 +726,10 @@
 	bool cleaned = 0;
 	unsigned int total_rx_bytes = 0, total_rx_packets = 0;
 
+#ifdef DEV_NETMAP
+	if (netmap_rx_irq(netdev, 0, work_done))
+		return 1; /* seems to be ignored */
+#endif /* DEV_NETMAP */
 	i = rx_ring->next_to_clean;
 	rx_desc = E1000_RX_DESC_PS(*rx_ring, i);
 	staterr = le32_to_cpu(rx_desc->wb.middle.status_error);
@@ -2632,6 +2644,10 @@
 	e1000_configure_tx(adapter);
 	e1000_setup_rctl(adapter);
 	e1000_configure_rx(adapter);
+#ifdef DEV_NETMAP
+	if (e1000e_netmap_init_buffers(adapter))
+		return;
+#endif /* DEV_NETMAP */
 	adapter->alloc_rx_buf(adapter, e1000_desc_unused(adapter->rx_ring));
 }
 
@@ -3288,6 +3304,10 @@
 	e1000_get_phy_info(&adapter->hw);
 }
 
+#if defined(CONFIG_NETMAP) || defined(CONFIG_NETMAP_MODULE)
+#include <if_e1000e_netmap.h>
+#endif
+
 /*
  * Need to wait a few seconds after link up to get diagnostic information from
  * the phy
@@ -5227,6 +5247,9 @@
 	if (err)
 		goto err_register;
 
+#ifdef DEV_NETMAP
+	e1000_netmap_attach(adapter);
+#endif /* DEV_NETMAP */
 	/* carrier off reporting is important to ethtool even BEFORE open */
 	netif_carrier_off(netdev);
 
@@ -5300,6 +5323,10 @@
 	kfree(adapter->tx_ring);
 	kfree(adapter->rx_ring);
 
+#ifdef DEV_NETMAP
+	netmap_detach(netdev);
+#endif /* DEV_NETMAP */
+
 	iounmap(adapter->hw.hw_addr);
 	if (adapter->hw.flash_address)
 		iounmap(adapter->hw.flash_address);
