net: infiniband/ulp/ipoib: convert to hw_features
authorMichał Mirosław <mirq-linux@rere.qmqm.pl>
Tue, 19 Apr 2011 00:43:20 +0000 (00:43 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 20 Apr 2011 08:30:42 +0000 (01:30 -0700)
Signed-off-by: Michał Mirosław <mirq-linux@rere.qmqm.pl>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/infiniband/ulp/ipoib/ipoib.h
drivers/infiniband/ulp/ipoib/ipoib_cm.c
drivers/infiniband/ulp/ipoib/ipoib_ethtool.c
drivers/infiniband/ulp/ipoib/ipoib_ib.c
drivers/infiniband/ulp/ipoib/ipoib_main.c

index ab97f92fc257a9fb9741a86013542f742a0e3b29..7b6985a2e6520f98e38d4a38337a6809e0049d85 100644 (file)
@@ -91,7 +91,6 @@ enum {
        IPOIB_STOP_REAPER         = 7,
        IPOIB_FLAG_ADMIN_CM       = 9,
        IPOIB_FLAG_UMCAST         = 10,
-       IPOIB_FLAG_CSUM           = 11,
 
        IPOIB_MAX_BACKOFF_SECONDS = 16,
 
index 93d55806b9670dab23f0062108df49fb93141e1d..39913a065f99d833bcced4257c794c26341235b4 100644 (file)
@@ -1463,8 +1463,7 @@ static ssize_t set_mode(struct device *d, struct device_attribute *attr,
                set_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
                ipoib_warn(priv, "enabling connected mode "
                           "will cause multicast packet drops\n");
-
-               dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_SG | NETIF_F_TSO);
+               netdev_update_features(dev);
                rtnl_unlock();
                priv->tx_wr.send_flags &= ~IB_SEND_IP_CSUM;
 
@@ -1474,13 +1473,7 @@ static ssize_t set_mode(struct device *d, struct device_attribute *attr,
 
        if (!strcmp(buf, "datagram\n")) {
                clear_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags);
-
-               if (test_bit(IPOIB_FLAG_CSUM, &priv->flags)) {
-                       dev->features |= NETIF_F_IP_CSUM | NETIF_F_SG;
-                       priv->dev->features |= NETIF_F_GRO;
-                       if (priv->hca_caps & IB_DEVICE_UD_TSO)
-                               dev->features |= NETIF_F_TSO;
-               }
+               netdev_update_features(dev);
                dev_set_mtu(dev, min(priv->mcast_mtu, dev->mtu));
                rtnl_unlock();
                ipoib_flush_paths(dev);
index 19f7f5206f781dfec652c4d5b0f026a9b80ac5a6..29bc7b5724aceb8746f8444fbbbae506abbea244 100644 (file)
@@ -42,32 +42,6 @@ static void ipoib_get_drvinfo(struct net_device *netdev,
        strncpy(drvinfo->driver, "ipoib", sizeof(drvinfo->driver) - 1);
 }
 
-static u32 ipoib_get_rx_csum(struct net_device *dev)
-{
-       struct ipoib_dev_priv *priv = netdev_priv(dev);
-       return test_bit(IPOIB_FLAG_CSUM, &priv->flags) &&
-               !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)
 {
@@ -108,8 +82,6 @@ static int ipoib_set_coalesce(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,
 };
index 806d0292dc3928fab53ee892a39128ef38c9b2d4..81ae61d68a222fd9091cd609b3de1667b5d54aff 100644 (file)
@@ -292,7 +292,7 @@ static void ipoib_ib_handle_rx_wc(struct net_device *dev, struct ib_wc *wc)
        dev->stats.rx_bytes += skb->len;
 
        skb->dev = dev;
-       if (test_bit(IPOIB_FLAG_CSUM, &priv->flags) && likely(wc->csum_ok))
+       if ((dev->features & NETIF_F_RXCSUM) && likely(wc->csum_ok))
                skb->ip_summed = CHECKSUM_UNNECESSARY;
 
        napi_gro_receive(&priv->napi, skb);
index aca3b44f7aed130b71a00a264c1e964fab3640ac..86addca9ddf6f9c035dd633ae7d2d88cafcb85e3 100644 (file)
@@ -171,6 +171,16 @@ static int ipoib_stop(struct net_device *dev)
        return 0;
 }
 
+static u32 ipoib_fix_features(struct net_device *dev, u32 features)
+{
+       struct ipoib_dev_priv *priv = netdev_priv(dev);
+
+       if (test_bit(IPOIB_FLAG_ADMIN_CM, &priv->flags))
+               features &= ~(NETIF_F_SG | NETIF_F_IP_CSUM | NETIF_F_TSO);
+
+       return features;
+}
+
 static int ipoib_change_mtu(struct net_device *dev, int new_mtu)
 {
        struct ipoib_dev_priv *priv = netdev_priv(dev);
@@ -970,6 +980,7 @@ static const struct net_device_ops ipoib_netdev_ops = {
        .ndo_open                = ipoib_open,
        .ndo_stop                = ipoib_stop,
        .ndo_change_mtu          = ipoib_change_mtu,
+       .ndo_fix_features        = ipoib_fix_features,
        .ndo_start_xmit          = ipoib_start_xmit,
        .ndo_tx_timeout          = ipoib_timeout,
        .ndo_set_multicast_list  = ipoib_set_mcast_list,
@@ -1154,19 +1165,18 @@ int ipoib_set_dev_features(struct ipoib_dev_priv *priv, struct ib_device *hca)
        kfree(device_attr);
 
        if (priv->hca_caps & IB_DEVICE_UD_IP_CSUM) {
-               set_bit(IPOIB_FLAG_CSUM, &priv->flags);
-               priv->dev->features |= NETIF_F_SG | NETIF_F_IP_CSUM;
-       }
+               priv->dev->hw_features = NETIF_F_SG |
+                       NETIF_F_IP_CSUM | NETIF_F_RXCSUM;
 
-       priv->dev->features |= NETIF_F_GRO;
+               if (priv->hca_caps & IB_DEVICE_UD_TSO)
+                       priv->dev->hw_features |= NETIF_F_TSO;
 
-       if (priv->dev->features & NETIF_F_SG && priv->hca_caps & IB_DEVICE_UD_TSO)
-               priv->dev->features |= NETIF_F_TSO;
+               priv->dev->features |= priv->dev->hw_features;
+       }
 
        return 0;
 }
 
-
 static struct net_device *ipoib_add_port(const char *format,
                                         struct ib_device *hca, u8 port)
 {