Signed-off-by: Vladimir Sokolovsky <vlad@mellanox.com>
---
- drivers/infiniband/ulp/ipoib/ipoib_main.c | 50 +++++++++++++++++++++++++++-
- drivers/infiniband/ulp/ipoib/ipoib_netlink.c | 31 ++++++++++++++++-
- 2 files changed, 79 insertions(+), 2 deletions(-)
+ drivers/infiniband/ulp/ipoib/ipoib_main.c | 64 +++++++++++++++++++++++++++-
+ drivers/infiniband/ulp/ipoib/ipoib_netlink.c | 31 +++++++++++++-
+ 2 files changed, 93 insertions(+), 2 deletions(-)
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_main.c b/drivers/infiniband/ulp/ipoib/ipoib_main.c
index xxxxxxx..xxxxxxx xxxxxx
--- a/drivers/infiniband/ulp/ipoib/ipoib_main.c
+++ b/drivers/infiniband/ulp/ipoib/ipoib_main.c
-@@ -258,14 +258,21 @@ static int ipoib_change_mtu(struct net_device *dev, int new_mtu)
+@@ -112,8 +112,12 @@ static struct ib_client ipoib_client = {
+ static int ipoib_netdev_event(struct notifier_block *this,
+ unsigned long event, void *ptr)
+ {
++#ifdef HAVE_NETDEV_NOTIFIER_INFO
+ struct netdev_notifier_info *ni = ptr;
+ struct net_device *dev = ni->dev;
++#else
++ struct net_device *dev = ptr;
++#endif
+
+ if (dev->netdev_ops->ndo_open != ipoib_open)
+ return NOTIFY_DONE;
+@@ -258,14 +262,21 @@ static int ipoib_change_mtu(struct net_device *dev, int new_mtu)
"link layer MTU - 4 (%u)\n", priv->mcast_mtu);
new_mtu = min(priv->mcast_mtu, priv->admin_mtu);
if (carrier_status)
netif_carrier_on(dev);
-@@ -303,9 +310,21 @@ static bool ipoib_is_dev_match_addr_rcu(const struct sockaddr *addr,
+@@ -303,9 +314,21 @@ static bool ipoib_is_dev_match_addr_rcu(const struct sockaddr *addr,
if (!in_dev)
return false;
in_dev_put(in_dev);
if (ret_addr)
return true;
-@@ -1868,6 +1887,7 @@ static int ipoib_get_vf_config(struct net_device *dev, int vf,
+@@ -1868,6 +1891,7 @@ static int ipoib_get_vf_config(struct net_device *dev, int vf,
return 0;
}
static int ipoib_set_vf_guid(struct net_device *dev, int vf, u64 guid, int type)
{
struct ipoib_dev_priv *priv = ipoib_priv(dev);
-@@ -1877,6 +1897,7 @@ static int ipoib_set_vf_guid(struct net_device *dev, int vf, u64 guid, int type)
+@@ -1877,6 +1901,7 @@ static int ipoib_set_vf_guid(struct net_device *dev, int vf, u64 guid, int type)
return ib_set_vf_guid(priv->ca, vf, priv->port, guid, type);
}
static int ipoib_get_vf_stats(struct net_device *dev, int vf,
struct ifla_vf_stats *vf_stats)
-@@ -1894,7 +1915,11 @@ static const struct net_device_ops ipoib_netdev_ops_pf = {
+@@ -1894,7 +1919,11 @@ static const struct net_device_ops ipoib_netdev_ops_pf = {
.ndo_uninit = ipoib_uninit,
.ndo_open = ipoib_open,
.ndo_stop = ipoib_stop,
.ndo_fix_features = ipoib_fix_features,
.ndo_start_xmit = ipoib_start_xmit,
.ndo_tx_timeout = ipoib_timeout,
-@@ -1903,7 +1928,9 @@ static const struct net_device_ops ipoib_netdev_ops_pf = {
+@@ -1903,7 +1932,9 @@ static const struct net_device_ops ipoib_netdev_ops_pf = {
.ndo_set_vf_link_state = ipoib_set_vf_link_state,
.ndo_get_vf_config = ipoib_get_vf_config,
.ndo_get_vf_stats = ipoib_get_vf_stats,
.ndo_set_mac_address = ipoib_set_mac,
.ndo_get_stats64 = ipoib_get_stats,
.ndo_do_ioctl = ipoib_ioctl,
-@@ -1913,7 +1940,11 @@ static const struct net_device_ops ipoib_netdev_ops_vf = {
+@@ -1913,7 +1944,13 @@ static const struct net_device_ops ipoib_netdev_ops_vf = {
.ndo_uninit = ipoib_uninit,
.ndo_open = ipoib_open,
.ndo_stop = ipoib_stop,
-+#ifdef HAVE_NDO_CHANGE_MTU_EXTENDED
++#ifdef HAVE_NDO_CHANGE_MTU_RH74
++ .ndo_change_mtu_rh74 = ipoib_change_mtu,
++#elif defined(HAVE_NDO_CHANGE_MTU_EXTENDED)
+ .extended.ndo_change_mtu = ipoib_change_mtu,
+#else
.ndo_change_mtu = ipoib_change_mtu,
.ndo_fix_features = ipoib_fix_features,
.ndo_start_xmit = ipoib_start_xmit,
.ndo_tx_timeout = ipoib_timeout,
-@@ -1985,9 +2016,16 @@ static struct net_device
+@@ -1985,9 +2022,16 @@ static struct net_device
struct net_device *dev;
struct rdma_netdev *rn;
if (!dev)
return NULL;
-@@ -2012,14 +2050,22 @@ static struct net_device *ipoib_get_netdev(struct ib_device *hca, u8 port,
+@@ -2012,14 +2056,22 @@ static struct net_device *ipoib_get_netdev(struct ib_device *hca, u8 port,
if (hca->alloc_rdma_netdev) {
dev = hca->alloc_rdma_netdev(hca, port,
RDMA_NETDEV_IPOIB, name,
ipoib_setup_common);
return dev;
-@@ -2262,7 +2308,9 @@ static struct net_device *ipoib_add_port(const char *format,
+@@ -2262,7 +2314,9 @@ static struct net_device *ipoib_add_port(const char *format,
/* MTU will be reset when mcast join happens */
priv->dev->mtu = IPOIB_UD_MTU(priv->max_ib_mtu);
priv->mcast_mtu = priv->admin_mtu = priv->dev->mtu;
priv->dev->neigh_priv_len = sizeof(struct ipoib_neigh);
+@@ -2491,8 +2545,12 @@ static int __init ipoib_init_module(void)
+ goto err_client;
+
+ #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG
++#ifdef HAVE_REGISTER_NETDEVICE_NOTIFIER_RH
++ register_netdevice_notifier_rh(&ipoib_netdev_notifier);
++#else
+ register_netdevice_notifier(&ipoib_netdev_notifier);
+ #endif
++#endif
+ return 0;
+
+ err_client:
+@@ -2511,8 +2569,12 @@ err_fs:
+ static void __exit ipoib_cleanup_module(void)
+ {
+ #ifdef CONFIG_INFINIBAND_IPOIB_DEBUG
++#ifdef HAVE_REGISTER_NETDEVICE_NOTIFIER_RH
++ unregister_netdevice_notifier_rh(&ipoib_netdev_notifier);
++#else
+ unregister_netdevice_notifier(&ipoib_netdev_notifier);
+ #endif
++#endif
+ ipoib_netlink_fini();
+ ib_unregister_client(&ipoib_client);
+ ib_sa_unregister_client(&ipoib_sa_client);
diff --git a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c b/drivers/infiniband/ulp/ipoib/ipoib_netlink.c
index xxxxxxx..xxxxxxx xxxxxx
--- a/drivers/infiniband/ulp/ipoib/ipoib_netlink.c