[ofa-general] [PATCH 6 of 17] ipoib: add checksum offload support

Eli Cohen eli at mellanox.co.il
Tue Sep 11 08:54:23 PDT 2007


Add checksum offload support to ipoib

Signed-off-by: Eli Cohen <eli at mellnaox.co.il>
Signed-off-by: Ali Ayub <ali at mellnaox.co.il>

---

Add checksum offload support to ipoib

Signed-off-by: Eli Cohen <eli at mellnaox.co.il>
Signed-off-by: Ali Ayub <ali at mellnaox.co.il>

---

Index: ofa_1_3_dev_kernel/drivers/infiniband/ulp/ipoib/ipoib.h
===================================================================
--- ofa_1_3_dev_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib.h	2007-09-11 21:15:25.000000000 +0300
+++ ofa_1_3_dev_kernel/drivers/infiniband/ulp/ipoib/ipoib.h	2007-09-11 21:15:26.000000000 +0300
@@ -87,6 +87,7 @@ enum {
 	IPOIB_FLAG_NETIF_STOPPED  = 9,
 	IPOIB_FLAG_ADMIN_CM 	  = 10,
 	IPOIB_FLAG_HW_CSUM	  = 11,
+	IPOIB_FLAG_RX_CSUM	  = 12,
 
 	IPOIB_MAX_BACKOFF_SECONDS = 16,
 
Index: ofa_1_3_dev_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c
===================================================================
--- ofa_1_3_dev_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2007-09-11 21:15:25.000000000 +0300
+++ ofa_1_3_dev_kernel/drivers/infiniband/ulp/ipoib/ipoib_cm.c	2007-09-11 21:15:26.000000000 +0300
@@ -1262,6 +1262,13 @@ static ssize_t set_mode(struct device *d
 		set_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
 		ipoib_warn(priv, "enabling connected mode "
 			   "will cause multicast packet drops\n");
+
+		/* clear ipv6 flag too */
+		dev->features &= ~NETIF_F_IP_CSUM;
+
+		priv->tx_wr.send_flags &=
+			~(IB_SEND_UDP_TCP_CSUM | IB_SEND_IP_CSUM);
+
 		ipoib_flush_paths(dev);
 		return count;
 	}
@@ -1270,6 +1277,11 @@ static ssize_t set_mode(struct device *d
 		clear_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
 		dev->mtu = min(priv->mcast_mtu, dev->mtu);
 		ipoib_flush_paths(dev);
+
+		if (priv->ca->flags & IB_DEVICE_IP_CSUM &&
+		    !test_bit(IPOIB_FLAG_HW_CSUM, &priv->flags))
+			dev->features |= NETIF_F_IP_CSUM; /* ipv6 too */
+
 		return count;
 	}
 
Index: ofa_1_3_dev_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c
===================================================================
--- ofa_1_3_dev_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2007-09-11 21:15:25.000000000 +0300
+++ ofa_1_3_dev_kernel/drivers/infiniband/ulp/ipoib/ipoib_ib.c	2007-09-11 21:15:26.000000000 +0300
@@ -37,6 +37,7 @@
 
 #include <linux/delay.h>
 #include <linux/dma-mapping.h>
+#include <linux/ip.h>
 
 #include <rdma/ib_cache.h>
 
@@ -235,6 +236,11 @@ static void ipoib_ib_handle_rx_wc(struct
 	skb->dev = dev;
 	/* XXX get correct PACKET_ type here */
 	skb->pkt_type = PACKET_HOST;
+
+	/* check rx csum */
+	if (test_bit(IPOIB_FLAG_RX_CSUM, &priv->flags) && likely(wc->csum_ok))
+		skb->ip_summed = CHECKSUM_UNNECESSARY;
+
 	netif_receive_skb(skb);
 
 repost:
@@ -400,6 +406,16 @@ void ipoib_send(struct net_device *dev, 
 		return;
 	}
 
+	if (!test_bit(IPOIB_FLAG_HW_CSUM, &priv->flags) &&
+	    priv->ca->flags & IB_DEVICE_IP_CSUM &&
+	    skb->ip_summed == CHECKSUM_PARTIAL)
+		priv->tx_wr.send_flags |=
+			IB_SEND_UDP_TCP_CSUM | IB_SEND_IP_CSUM;
+	else
+		priv->tx_wr.send_flags &=
+			~(IB_SEND_UDP_TCP_CSUM | IB_SEND_IP_CSUM);
+
+
 	if (unlikely(post_send(priv, priv->tx_head & (ipoib_sendq_size - 1),
 			       address->ah, qpn,
 			       tx_req->mapping, skb_headlen(skb),
Index: ofa_1_3_dev_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c
===================================================================
--- ofa_1_3_dev_kernel.orig/drivers/infiniband/ulp/ipoib/ipoib_main.c	2007-09-11 21:15:25.000000000 +0300
+++ ofa_1_3_dev_kernel/drivers/infiniband/ulp/ipoib/ipoib_main.c	2007-09-11 21:15:26.000000000 +0300
@@ -1121,6 +1121,29 @@ int ipoib_add_pkey_attr(struct net_devic
 	return device_create_file(&dev->dev, &dev_attr_pkey);
 }
 
+static void set_tx_csum(struct net_device *dev)
+{
+	struct ipoib_dev_priv *priv = netdev_priv(dev);
+
+	if (test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags) || ipoib_hw_csum)
+		return;
+
+	if (!(priv->ca->flags & IB_DEVICE_IP_CSUM))
+		return;
+
+	dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM; /* turn on ipv6 too */
+}
+
+static void set_rx_csum(struct net_device *dev)
+{
+	struct ipoib_dev_priv *priv = netdev_priv(dev);
+
+	if (!(priv->ca->flags & IB_DEVICE_IP_CSUM))
+		return;
+
+	set_bit(IPOIB_FLAG_RX_CSUM, &priv->flags);
+}
+
 static struct net_device *ipoib_add_port(const char *format,
 					 struct ib_device *hca, u8 port)
 {
@@ -1177,6 +1200,9 @@ static struct net_device *ipoib_add_port
 		goto event_failed;
 	}
 
+	set_tx_csum(priv->dev);
+	set_rx_csum(priv->dev);
+
 	result = register_netdev(priv->dev);
 	if (result) {
 		printk(KERN_WARNING "%s: couldn't register ipoib port %d; error %d\n",




More information about the general mailing list