--- /usr/src/linux-3.3.8-gentoo/drivers/net/ethernet/intel/igb/igb_main.c	2012-03-19 00:15:34.000000000 +0100
+++ net/igb/igb_main.c	2012-07-30 16:43:35.000000000 +0200
@@ -236,6 +236,10 @@ MODULE_DESCRIPTION("Intel(R) Gigabit Eth
 MODULE_LICENSE("GPL");
 MODULE_VERSION(DRV_VERSION);
 
+#if defined(CONFIG_NETMAP) || defined(CONFIG_NETMAP_MODULE)
+#include <if_igb_netmap.h>
+#endif
+
 struct igb_reg_info {
 	u32 ofs;
 	char *name;
@@ -2081,6 +2085,10 @@ static int __devinit igb_probe(struct pc
 	/* carrier off reporting is important to ethtool even BEFORE open */
 	netif_carrier_off(netdev);
 
+#ifdef DEV_NETMAP
+	igb_netmap_attach(adapter);
+#endif /* DEV_NETMAP */
+
 #ifdef CONFIG_IGB_DCA
 	if (dca_add_requester(&pdev->dev) == 0) {
 		adapter->flags |= IGB_FLAG_DCA_ENABLED;
@@ -2211,6 +2219,10 @@ static void __devexit igb_remove(struct
 		dev_info(&pdev->dev, "IOV Disabled\n");
 	}
 #endif
+#ifdef DEV_NETMAP
+	netmap_detach(netdev);
+#endif /* DEV_NETMAP */
+
 
 	iounmap(hw->hw_addr);
 	if (hw->flash_address)
@@ -2750,6 +2762,9 @@ void igb_configure_tx_ring(struct igb_ad
 
 	txdctl |= E1000_TXDCTL_QUEUE_ENABLE;
 	wr32(E1000_TXDCTL(reg_idx), txdctl);
+#ifdef DEV_NETMAP
+	igb_netmap_configure_tx_ring(adapter, reg_idx);
+#endif /* DEV_NETMAP */
 }
 
 /**
@@ -5753,6 +5768,10 @@ static bool igb_clean_tx_irq(struct igb_
 
 	if (test_bit(__IGB_DOWN, &adapter->state))
 		return true;
+#ifdef DEV_NETMAP
+        if (netmap_tx_irq(tx_ring->netdev, tx_ring->queue_index))
+                return 1; /* cleaned ok */
+#endif /* DEV_NETMAP */
 
 	tx_buffer = &tx_ring->tx_buffer_info[i];
 	tx_desc = IGB_TX_DESC(tx_ring, i);
@@ -6030,6 +6049,12 @@ static bool igb_clean_rx_irq(struct igb_
 	u16 cleaned_count = igb_desc_unused(rx_ring);
 	u16 i = rx_ring->next_to_clean;
 
+#ifdef DEV_NETMAP
+	int dummy = 1; // select rx irq handling
+	if (netmap_rx_irq(rx_ring->netdev, rx_ring->queue_index, &dummy))
+		return 1;
+#endif /* DEV_NETMAP */
+
 	rx_desc = IGB_RX_DESC(rx_ring, i);
 
 	while (igb_test_staterr(rx_desc, E1000_RXD_STAT_DD)) {
@@ -6220,6 +6245,11 @@ void igb_alloc_rx_buffers(struct igb_rin
 	struct igb_rx_buffer *bi;
 	u16 i = rx_ring->next_to_use;
 
+#ifdef DEV_NETMAP
+	if (igb_netmap_configure_rx_ring(rx_ring))
+                return;
+#endif /* DEV_NETMAP */
+
 	rx_desc = IGB_RX_DESC(rx_ring, i);
 	bi = &rx_ring->rx_buffer_info[i];
 	i -= rx_ring->count;
