[ewg] [PATCH] ipoib: disable napi while cq is being drained

Yossi Etigin yosefe at voltaire.com
Fri Apr 17 08:26:46 PDT 2009


 If napi is enabled while cq is being drained, it creates a race on priv->ibwc
between ipoib_poll and ipoib_drain_cq, leading to memory corruption.
 The solution is to enable/disable napi in ipoib_ib_dev_open/stop instead of in
ipoib_open/stop, and sync napi on INITIALIZED bit instead on ADMIN_UP bit. This
way napi will be disabled when ipoib_drain_cq is called.
This fixes bugzilla #1587.

Signed-off-by: Yossi Etigin <yosefe at voltaire.com>

---

 backport/2.6.16/ipoib_0100_to_2.6.21.patch            |  129 +++++++-----------
 backport/2.6.16_sles10/ipoib_0100_to_2.6.21.patch     |  129 +++++++-----------
 backport/2.6.16_sles10_sp1/ipoib_0100_to_2.6.21.patch |  129 +++++++-----------
 backport/2.6.16_sles10_sp2/ipoib_0100_to_2.6.21.patch |  129 +++++++-----------
 backport/2.6.17/ipoib_0100_to_2.6.21.patch            |  129 +++++++-----------
 backport/2.6.18-EL5.1/ipoib_0100_to_2.6.21.patch      |  129 +++++++-----------
 backport/2.6.18-EL5.2/ipoib_0100_to_2.6.21.patch      |  129 +++++++-----------
 backport/2.6.18-EL5.3/ipoib_0100_to_2.6.21.patch      |  129 +++++++-----------
 backport/2.6.18/ipoib_0100_to_2.6.21.patch            |  129 +++++++-----------
 backport/2.6.18_FC6/ipoib_0100_to_2.6.21.patch        |  129 +++++++-----------
 backport/2.6.18_suse10_2/ipoib_0100_to_2.6.21.patch   |  129 +++++++-----------
 backport/2.6.19/ipoib_0100_to_2.6.21.patch            |  129 +++++++-----------
 backport/2.6.20/ipoib_0100_to_2.6.21.patch            |  129 +++++++-----------
 backport/2.6.21/ipoib_0100_to_2.6.21.patch            |  129 +++++++-----------
 backport/2.6.22/ipoib_to_2.6.23.patch                 |   82 ++++-------
 backport/2.6.22_suse10_3/ipoib_to_2.6.23.patch        |   82 ++++-------
 backport/2.6.23/ipoib_to_2.6.23.patch                 |   82 ++++-------
 backport/2.6.9_U4/ipoib_0100_to_2.6.21.patch          |  129 +++++++-----------
 backport/2.6.9_U5/ipoib_0100_to_2.6.21.patch          |  129 +++++++-----------
 backport/2.6.9_U6/ipoib_0100_to_2.6.21.patch          |  129 +++++++-----------
 backport/2.6.9_U7/ipoib_0100_to_2.6.21.patch          |  129 +++++++-----------
 fixes/ipoib_0550_fix_napi_poll_race.patch             |   72 ++++++++++
 22 files changed, 1158 insertions(+), 1482 deletions(-)


diff --git a/kernel_patches/backport/2.6.16/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.16/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.16/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.16/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.16_sles10/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.16_sles10/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.16_sles10/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.16_sles10/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.16_sles10_sp1/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.16_sles10_sp1/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.16_sles10_sp1/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.16_sles10_sp1/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.16_sles10_sp2/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.16_sles10_sp2/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.16_sles10_sp2/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.16_sles10_sp2/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.17/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.17/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.17/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.17/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.18-EL5.1/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.18-EL5.1/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.18-EL5.1/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.18-EL5.1/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.18-EL5.2/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.18-EL5.2/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.18-EL5.2/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.18-EL5.2/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.18-EL5.3/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.18-EL5.3/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.18-EL5.3/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.18-EL5.3/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.18/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.18/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.18/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.18/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.18_FC6/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.18_FC6/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.18_FC6/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.18_FC6/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.18_suse10_2/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.18_suse10_2/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.18_suse10_2/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.18_suse10_2/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.19/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.19/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.19/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.19/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.20/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.20/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.20/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.20/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.21/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.21/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.21/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.21/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.22/ipoib_to_2.6.23.patch b/kernel_patches/backport/2.6.22/ipoib_to_2.6.23.patch
index a9dac58..702b647 100644
--- a/kernel_patches/backport/2.6.22/ipoib_to_2.6.23.patch
+++ b/kernel_patches/backport/2.6.22/ipoib_to_2.6.23.patch
@@ -10,11 +10,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_main.c |   19 ++++------------
  3 files changed, 25 insertions(+), 32 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 19:00:27.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 19:30:31.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-17 16:53:49.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-17 16:56:10.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -23,7 +23,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -425,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +421,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -32,10 +32,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 19:00:27.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 19:30:31.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-17 16:53:56.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-17 16:57:35.000000000 +0300
 @@ -408,20 +408,19 @@ static int poll_tx(struct ipoib_dev_priv
  	return n == MAX_SEND_CQE;
  }
@@ -109,58 +109,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  }
  
  static void drain_tx_cq(struct net_device *dev)
-@@ -809,6 +811,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +710,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +829,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +896,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +904,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 19:00:28.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 19:31:25.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
-+	if (ipoib_ib_dev_open(dev))
- 		return -EINVAL;
--	}
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-17 16:53:56.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-17 16:56:10.000000000 +0300
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -169,7 +151,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -1008,10 +1003,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +991,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -180,7 +162,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1060,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1048,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
diff --git a/kernel_patches/backport/2.6.22_suse10_3/ipoib_to_2.6.23.patch b/kernel_patches/backport/2.6.22_suse10_3/ipoib_to_2.6.23.patch
index a9dac58..702b647 100644
--- a/kernel_patches/backport/2.6.22_suse10_3/ipoib_to_2.6.23.patch
+++ b/kernel_patches/backport/2.6.22_suse10_3/ipoib_to_2.6.23.patch
@@ -10,11 +10,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_main.c |   19 ++++------------
  3 files changed, 25 insertions(+), 32 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 19:00:27.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 19:30:31.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-17 16:53:49.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-17 16:56:10.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -23,7 +23,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -425,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +421,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -32,10 +32,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 19:00:27.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 19:30:31.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-17 16:53:56.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-17 16:57:35.000000000 +0300
 @@ -408,20 +408,19 @@ static int poll_tx(struct ipoib_dev_priv
  	return n == MAX_SEND_CQE;
  }
@@ -109,58 +109,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  }
  
  static void drain_tx_cq(struct net_device *dev)
-@@ -809,6 +811,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +710,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +829,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +896,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +904,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 19:00:28.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 19:31:25.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
-+	if (ipoib_ib_dev_open(dev))
- 		return -EINVAL;
--	}
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-17 16:53:56.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-17 16:56:10.000000000 +0300
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -169,7 +151,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -1008,10 +1003,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +991,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -180,7 +162,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1060,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1048,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
diff --git a/kernel_patches/backport/2.6.23/ipoib_to_2.6.23.patch b/kernel_patches/backport/2.6.23/ipoib_to_2.6.23.patch
index a9dac58..702b647 100644
--- a/kernel_patches/backport/2.6.23/ipoib_to_2.6.23.patch
+++ b/kernel_patches/backport/2.6.23/ipoib_to_2.6.23.patch
@@ -10,11 +10,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_main.c |   19 ++++------------
  3 files changed, 25 insertions(+), 32 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 19:00:27.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 19:30:31.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-17 16:53:49.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-17 16:56:10.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -23,7 +23,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -425,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +421,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -32,10 +32,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 19:00:27.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 19:30:31.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-17 16:53:56.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-17 16:57:35.000000000 +0300
 @@ -408,20 +408,19 @@ static int poll_tx(struct ipoib_dev_priv
  	return n == MAX_SEND_CQE;
  }
@@ -109,58 +109,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  }
  
  static void drain_tx_cq(struct net_device *dev)
-@@ -809,6 +811,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +710,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +829,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +896,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +904,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 19:00:28.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 19:31:25.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
-+	if (ipoib_ib_dev_open(dev))
- 		return -EINVAL;
--	}
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-17 16:53:56.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-17 16:56:10.000000000 +0300
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -169,7 +151,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -1008,10 +1003,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +991,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -180,7 +162,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1060,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1048,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
diff --git a/kernel_patches/backport/2.6.9_U4/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.9_U4/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.9_U4/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.9_U4/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.9_U5/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.9_U5/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.9_U5/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.9_U5/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.9_U6/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.9_U6/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.9_U6/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.9_U6/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/backport/2.6.9_U7/ipoib_0100_to_2.6.21.patch b/kernel_patches/backport/2.6.9_U7/ipoib_0100_to_2.6.21.patch
index bddb507..ee2706f 100644
--- a/kernel_patches/backport/2.6.9_U7/ipoib_0100_to_2.6.21.patch
+++ b/kernel_patches/backport/2.6.9_U7/ipoib_0100_to_2.6.21.patch
@@ -12,11 +12,11 @@ Signed-off-by: Eli Cohen <eli at mellanox.co.il>
  drivers/infiniband/ulp/ipoib/ipoib_multicast.c |   10 ++--
  5 files changed, 61 insertions(+), 64 deletions(-)
 
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2008-11-03 18:56:08.000000000 +0200
-@@ -279,8 +279,6 @@ struct ipoib_dev_priv {
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib.h	2009-04-16 23:46:20.000000000 +0300
+@@ -277,8 +277,6 @@ struct ipoib_dev_priv {
  
  	struct net_device *dev;
  
@@ -25,7 +25,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	unsigned long flags;
  
  	struct mutex vlan_mutex;
-@@ -338,6 +336,8 @@ struct ipoib_dev_priv {
+@@ -336,6 +334,8 @@ struct ipoib_dev_priv {
  
  	struct ib_event_handler event_handler;
  
@@ -34,7 +34,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  	struct net_device *parent;
  	struct list_head child_intfs;
  	struct list_head list;
-@@ -425,7 +425,7 @@ extern struct workqueue_struct *ipoib_wo
+@@ -423,7 +423,7 @@ extern struct workqueue_struct *ipoib_wo
  
  /* functions */
  
@@ -43,10 +43,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
  void ipoib_ib_completion(struct ib_cq *cq, void *dev_ptr);
  void ipoib_send_comp_handler(struct ib_cq *cq, void *dev_ptr);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2009-04-16 23:46:20.000000000 +0300
 @@ -593,7 +593,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		ipoib_dbg(priv, "cm recv error "
  			   "(status=%d, wrid=%d vend_err %x)\n",
@@ -56,7 +56,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		if (has_srq)
  			goto repost;
  		else {
-@@ -658,7 +658,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
+@@ -646,7 +646,7 @@ void ipoib_cm_handle_rx_wc(struct net_de
  		 * this packet and reuse the old buffer.
  		 */
  		ipoib_dbg(priv, "failed to allocate receive buffer %d\n", wr_id);
@@ -65,7 +65,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		goto repost;
  	}
  
-@@ -676,8 +676,8 @@ copied:
+@@ -664,8 +664,8 @@ copied:
  	skb_pull(skb, IPOIB_ENCAP_LEN);
  
  	dev->last_rx = jiffies;
@@ -76,7 +76,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	skb->dev = dev;
  	/* XXX get correct PACKET_ type here */
-@@ -726,8 +726,8 @@ void ipoib_cm_send(struct net_device *de
+@@ -714,8 +714,8 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(skb->len > tx->mtu)) {
  		ipoib_warn(priv, "packet len %d (> %d) too long to send, dropping\n",
  			   skb->len, tx->mtu);
@@ -87,7 +87,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ipoib_cm_skb_too_long(dev, skb, tx->mtu - IPOIB_ENCAP_LEN);
  		return;
  	}
-@@ -746,7 +746,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -734,7 +734,7 @@ void ipoib_cm_send(struct net_device *de
  	tx_req->skb = skb;
  	addr = ib_dma_map_single(priv->ca, skb->data, skb->len, DMA_TO_DEVICE);
  	if (unlikely(ib_dma_mapping_error(priv->ca, addr))) {
@@ -96,7 +96,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -756,7 +756,7 @@ void ipoib_cm_send(struct net_device *de
+@@ -744,7 +744,7 @@ void ipoib_cm_send(struct net_device *de
  	if (unlikely(post_send(priv, tx, tx->tx_head & (ipoib_sendq_size - 1),
  			       addr, skb->len))) {
  		ipoib_warn(priv, "post_send failed\n");
@@ -105,7 +105,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  		ib_dma_unmap_single(priv->ca, addr, skb->len, DMA_TO_DEVICE);
  		dev_kfree_skb_any(skb);
  	} else {
-@@ -793,8 +793,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
+@@ -781,8 +781,8 @@ void ipoib_cm_handle_tx_wc(struct net_de
  	ib_dma_unmap_single(priv->ca, tx_req->mapping, tx_req->skb->len, DMA_TO_DEVICE);
  
  	/* FIXME: is this right? Shouldn't we only increment on success? */
@@ -116,10 +116,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
  
  	dev_kfree_skb_any(tx_req->skb);
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:49:04.000000000 +0300
 @@ -261,7 +261,7 @@ static void ipoib_ib_handle_rx_wc(struct
  	 * this packet and reuse the old buffer.
  	 */
@@ -263,59 +263,40 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
  		--priv->tx_outstanding;
  		ipoib_dma_unmap_tx(priv->ca, tx_req);
  		dev_kfree_skb_any(skb);
-@@ -809,6 +812,7 @@ int ipoib_ib_dev_stop(struct net_device 
+@@ -708,8 +711,7 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+ 
+ 	return 0;
+ }
+@@ -828,8 +830,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
  	int i;
  
- 	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
+-	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
+-		napi_disable(&priv->napi);
++	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
 +	netif_poll_disable(dev);
  
  	ipoib_cm_dev_stop(dev);
  
-@@ -893,6 +897,7 @@ timeout:
- 		msleep(1);
- 	}
+@@ -903,6 +905,7 @@ timeout:
+ 
+ 	ipoib_ah_dev_cleanup(dev);
  
 +	netif_poll_enable(dev);
  	ib_req_notify_cq(priv->recv_cq, IB_CQ_NEXT_COMP);
  
  	return 0;
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:55:35.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2008-11-03 18:58:18.000000000 +0200
-@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
- 
- 	ipoib_dbg(priv, "bringing up interface\n");
- 
--	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
--		napi_enable(&priv->napi);
-+	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
- 
- 	if (ipoib_pkey_dev_delay_open(dev))
- 		return 0;
- 
--	if (ipoib_ib_dev_open(dev)) {
--		napi_disable(&priv->napi);
--		return -EINVAL;
--	}
-+	if (ipoib_ib_dev_open(dev))
-+  		return -EINVAL;
- 
- 	if (ipoib_ib_dev_up(dev)) {
- 		ipoib_ib_dev_stop(dev, 1);
--		napi_disable(&priv->napi);
- 		return -EINVAL;
- 	}
- 
-@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
- 	ipoib_dbg(priv, "stopping interface\n");
- 
- 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
--	napi_disable(&priv->napi);
- 
- 	netif_stop_queue(dev);
- 
-@@ -604,7 +599,7 @@ static void neigh_add_path(struct sk_buf
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:46:20.000000000 +0300
+@@ -585,7 +585,7 @@ static void neigh_add_path(struct sk_buf
  
  	neigh = ipoib_neigh_alloc(skb->dst->neighbour, skb->dev);
  	if (!neigh) {
@@ -324,7 +305,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  		return;
  	}
-@@ -667,7 +662,7 @@ err_list:
+@@ -646,7 +646,7 @@ err_list:
  err_path:
  	ipoib_neigh_free(dev, neigh);
  err_drop:
@@ -333,7 +314,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  	dev_kfree_skb_any(skb);
  
  	spin_unlock_irqrestore(&priv->lock, flags);
-@@ -714,7 +709,7 @@ static void unicast_arp_send(struct sk_b
+@@ -697,7 +697,7 @@ static void unicast_arp_send(struct sk_b
  			} else
  				__path_add(dev, path);
  		} else {
@@ -342,7 +323,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  
-@@ -733,7 +728,7 @@ static void unicast_arp_send(struct sk_b
+@@ -716,7 +716,7 @@ static void unicast_arp_send(struct sk_b
  		skb_push(skb, sizeof *phdr);
  		__skb_queue_tail(&path->queue, skb);
  	} else {
@@ -351,7 +332,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  
-@@ -790,7 +785,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -773,7 +773,7 @@ static int ipoib_start_xmit(struct sk_bu
  			__skb_queue_tail(&neigh->queue, skb);
  			spin_unlock_irqrestore(&priv->lock, flags);
  		} else {
@@ -360,7 +341,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  			dev_kfree_skb_any(skb);
  		}
  	} else {
-@@ -816,7 +811,7 @@ static int ipoib_start_xmit(struct sk_bu
+@@ -799,7 +799,7 @@ static int ipoib_start_xmit(struct sk_bu
  					   IPOIB_QPN(phdr->hwaddr),
  					   IPOIB_GID_RAW_ARG(phdr->hwaddr + 4));
  				dev_kfree_skb_any(skb);
@@ -369,7 +350,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  				return NETDEV_TX_OK;
  			}
  
-@@ -842,7 +837,7 @@ static void ipoib_timeout(struct net_dev
+@@ -825,7 +825,7 @@ static void ipoib_timeout(struct net_dev
  static int ipoib_hard_header(struct sk_buff *skb,
  			     struct net_device *dev,
  			     unsigned short type,
@@ -378,7 +359,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  {
  	struct ipoib_header *header;
  
-@@ -931,9 +926,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
+@@ -914,9 +914,10 @@ struct ipoib_neigh *ipoib_neigh_alloc(st
  void ipoib_neigh_free(struct net_device *dev, struct ipoib_neigh *neigh)
  {
  	struct sk_buff *skb;
@@ -390,7 +371,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  		dev_kfree_skb_any(skb);
  	}
  	if (ipoib_cm_get(neigh))
-@@ -1008,10 +1004,6 @@ void ipoib_dev_cleanup(struct net_device
+@@ -991,10 +992,6 @@ void ipoib_dev_cleanup(struct net_device
  	priv->tx_ring = NULL;
  }
  
@@ -401,7 +382,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  static int get_skb_hdr(struct sk_buff *skb, void **iphdr,
  		       void **tcph, u64 *hdr_flags, void *priv)
  {
-@@ -1069,13 +1061,13 @@ static void ipoib_setup(struct net_devic
+@@ -1052,13 +1049,13 @@ static void ipoib_setup(struct net_devic
  	dev->change_mtu		 = ipoib_change_mtu;
  	dev->hard_start_xmit	 = ipoib_start_xmit;
  	dev->tx_timeout		 = ipoib_timeout;
@@ -418,10 +399,10 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
  
  	dev->watchdog_timeo	 = HZ;
  
-Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
 ===================================================================
---- ofed_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:55:34.000000000 +0200
-+++ ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2008-11-03 18:56:08.000000000 +0200
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_multicast.c	2009-04-16 23:46:20.000000000 +0300
 @@ -100,7 +100,7 @@ static void ipoib_mcast_free(struct ipoi
  	}
  
@@ -448,7 +429,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb_dequeue(&mcast->pkt_queue));
  		}
  		netif_tx_unlock_bh(dev);
-@@ -667,7 +668,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -677,7 +678,7 @@ void ipoib_mcast_send(struct net_device 
  	if (!test_bit(IPOIB_FLAG_OPER_UP, &priv->flags)		||
  	    !priv->broadcast					||
  	    !test_bit(IPOIB_MCAST_FLAG_ATTACHED, &priv->broadcast->flags)) {
@@ -457,7 +438,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  		dev_kfree_skb_any(skb);
  		goto unlock;
  	}
-@@ -682,7 +683,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -692,7 +693,7 @@ void ipoib_mcast_send(struct net_device 
  		if (!mcast) {
  			ipoib_warn(priv, "unable to allocate memory for "
  				   "multicast structure\n");
@@ -466,7 +447,7 @@ Index: ofed_kernel/drivers/infiniband/ulp/ipoib/ipoib_multicast.c
  			dev_kfree_skb_any(skb);
  			goto out;
  		}
-@@ -697,7 +698,7 @@ void ipoib_mcast_send(struct net_device 
+@@ -707,7 +708,7 @@ void ipoib_mcast_send(struct net_device 
  		if (skb_queue_len(&mcast->pkt_queue) < IPOIB_MAX_MCAST_QUEUE)
  			skb_queue_tail(&mcast->pkt_queue, skb);
  		else {
diff --git a/kernel_patches/fixes/ipoib_0550_fix_napi_poll_race.patch b/kernel_patches/fixes/ipoib_0550_fix_napi_poll_race.patch
new file mode 100644
index 0000000..8bc1600
--- /dev/null
+++ b/kernel_patches/fixes/ipoib_0550_fix_napi_poll_race.patch
@@ -0,0 +1,72 @@
+ipoib: disable napi while cq is being drained
+
+ If napi is enabled while cq is being drained, it creates a race on priv->ibwc
+between ipoib_poll and ipoib_drain_cq, leading to memory corruption.
+ The solution is to enable/disable napi in ipoib_ib_dev_open/stop instead of in
+ipoib_open/stop, and sync napi on INITIALIZED bit instead on ADMIN_UP bit. This
+way napi will be disabled when ipoib_drain_cq is called.
+
+Fix bugzilla #1587.
+
+Signed-off-by: Yossi Etigin <yosefe at voltaire.com>
+
+
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c
+===================================================================
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2009-04-16 23:43:16.000000000 +0300
+@@ -708,7 +708,8 @@ int ipoib_ib_dev_open(struct net_device 
+ 	priv->poll_timer.function = ipoib_ib_tx_timer_func;
+ 	priv->poll_timer.data = (unsigned long)dev;
+ 
+-	set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
++	if (!test_and_set_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
++		napi_enable(&priv->napi);
+ 
+ 	return 0;
+ }
+@@ -827,7 +828,8 @@ int ipoib_ib_dev_stop(struct net_device 
+ 	struct ipoib_tx_buf *tx_req;
+ 	int i;
+ 
+-	clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags);
++	if (test_and_clear_bit(IPOIB_FLAG_INITIALIZED, &priv->flags))
++		napi_disable(&priv->napi);
+ 
+ 	ipoib_cm_dev_stop(dev);
+ 
+Index: linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c
+===================================================================
+--- linux-2.6.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:35:04.000000000 +0300
++++ linux-2.6/drivers/infiniband/ulp/ipoib/ipoib_main.c	2009-04-16 23:44:02.000000000 +0300
+@@ -106,20 +106,16 @@ int ipoib_open(struct net_device *dev)
+ 
+ 	ipoib_dbg(priv, "bringing up interface\n");
+ 
+-	if (!test_and_set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags))
+-		napi_enable(&priv->napi);
++	set_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
+ 
+ 	if (ipoib_pkey_dev_delay_open(dev))
+ 		return 0;
+ 
+-	if (ipoib_ib_dev_open(dev)) {
+-		napi_disable(&priv->napi);
++	if (ipoib_ib_dev_open(dev))
+ 		return -EINVAL;
+-	}
+ 
+ 	if (ipoib_ib_dev_up(dev)) {
+ 		ipoib_ib_dev_stop(dev, 1);
+-		napi_disable(&priv->napi);
+ 		return -EINVAL;
+ 	}
+ 
+@@ -152,7 +148,6 @@ static int ipoib_stop(struct net_device 
+ 	ipoib_dbg(priv, "stopping interface\n");
+ 
+ 	clear_bit(IPOIB_FLAG_ADMIN_UP, &priv->flags);
+-	napi_disable(&priv->napi);
+ 
+ 	netif_stop_queue(dev);
+ 



More information about the ewg mailing list