]> asedeno.scripts.mit.edu Git - linux.git/blobdiff - drivers/infiniband/ulp/ipoib/ipoib_main.c
Merge tag 'uuid-for-4.13-2' of git://git.infradead.org/users/hch/uuid
[linux.git] / drivers / infiniband / ulp / ipoib / ipoib_main.c
index 6e86eeee370e86602977bbf3f3949bf2d5ac26ef..4ce315c92b480fa705c30b33ffd7253b4cfded3b 100644 (file)
@@ -233,6 +233,7 @@ static netdev_features_t ipoib_fix_features(struct net_device *dev, netdev_featu
 static int ipoib_change_mtu(struct net_device *dev, int new_mtu)
 {
        struct ipoib_dev_priv *priv = ipoib_priv(dev);
+       int ret = 0;
 
        /* dev->mtu > 2K ==> connected mode */
        if (ipoib_cm_admin_enabled(dev)) {
@@ -256,9 +257,34 @@ static int ipoib_change_mtu(struct net_device *dev, int new_mtu)
                ipoib_dbg(priv, "MTU must be smaller than the underlying "
                                "link layer MTU - 4 (%u)\n", priv->mcast_mtu);
 
-       dev->mtu = min(priv->mcast_mtu, priv->admin_mtu);
+       new_mtu = min(priv->mcast_mtu, priv->admin_mtu);
 
-       return 0;
+       if (priv->rn_ops->ndo_change_mtu) {
+               bool carrier_status = netif_carrier_ok(dev);
+
+               netif_carrier_off(dev);
+
+               /* notify lower level on the real mtu */
+               ret = priv->rn_ops->ndo_change_mtu(dev, new_mtu);
+
+               if (carrier_status)
+                       netif_carrier_on(dev);
+       } else {
+               dev->mtu = new_mtu;
+       }
+
+       return ret;
+}
+
+static void ipoib_get_stats(struct net_device *dev,
+                           struct rtnl_link_stats64 *stats)
+{
+       struct ipoib_dev_priv *priv = ipoib_priv(dev);
+
+       if (priv->rn_ops->ndo_get_stats64)
+               priv->rn_ops->ndo_get_stats64(dev, stats);
+       else
+               netdev_stats_to_stats64(stats, &dev->stats);
 }
 
 /* Called with an RCU read lock taken */
@@ -1808,6 +1834,7 @@ static const struct net_device_ops ipoib_netdev_ops_pf = {
        .ndo_get_vf_stats        = ipoib_get_vf_stats,
        .ndo_set_vf_guid         = ipoib_set_vf_guid,
        .ndo_set_mac_address     = ipoib_set_mac,
+       .ndo_get_stats64         = ipoib_get_stats,
 };
 
 static const struct net_device_ops ipoib_netdev_ops_vf = {
@@ -2212,6 +2239,7 @@ static struct net_device *ipoib_add_port(const char *format,
                goto register_failed;
        }
 
+       result = -ENOMEM;
        if (ipoib_cm_add_mode_attr(priv->dev))
                goto sysfs_failed;
        if (ipoib_add_pkey_attr(priv->dev))