IPoIB: Allow disabling/enabling TSO on the fly through ethtool
authorOr Gerlitz <ogerlitz@voltaire.com>
Thu, 4 Mar 2010 13:16:52 +0000 (13:16 +0000)
committerRoland Dreier <rolandd@cisco.com>
Thu, 22 Apr 2010 00:17:30 +0000 (17:17 -0700)
Signed-off-by: Or Gerlitz <ogerlitz@voltaire.com>
Signed-off-by: Roland Dreier <rolandd@cisco.com>
drivers/infiniband/ulp/ipoib/ipoib_ethtool.c

index d10b4ec68d28ad48ab0a637ba6d1883039ab7bdb..40e858492f905055276c3346f305fc6ac1353775 100644 (file)
@@ -49,6 +49,25 @@ static u32 ipoib_get_rx_csum(struct net_device *dev)
                !test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
 }
 
+static int ipoib_set_tso(struct net_device *dev, u32 data)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+
+       if (data) {
+               if (!test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags) &&
+                   (dev->features & NETIF_F_SG) &&
+                   (priv->hca_caps & IB_DEVICE_UD_TSO)) {
+                       dev->features |= NETIF_F_TSO;
+               } else {
+                       ipoib_warn(priv, "can't set TSO on\n");
+                       return -EOPNOTSUPP;
+               }
+       } else
+               dev->features &= ~NETIF_F_TSO;
+
+       return 0;
+}
+
 static int ipoib_get_coalesce(struct net_device *dev,
                              struct ethtool_coalesce *coal)
 {
@@ -131,6 +150,7 @@ static void ipoib_get_ethtool_stats(struct net_device *dev,
 static const struct ethtool_ops ipoib_ethtool_ops = {
        .get_drvinfo            = ipoib_get_drvinfo,
        .get_rx_csum            = ipoib_get_rx_csum,
+       .set_tso                = ipoib_set_tso,
        .get_coalesce           = ipoib_get_coalesce,
        .set_coalesce           = ipoib_set_coalesce,
        .get_flags              = ethtool_op_get_flags,