IB/ipoib: Enable ioctl for to IPoIB rdma netdevs
authorFeras Daoud <ferasda@mellanox.com>
Wed, 23 Aug 2017 05:37:21 +0000 (08:37 +0300)
committerDoug Ledford <dledford@redhat.com>
Thu, 24 Aug 2017 21:34:57 +0000 (17:34 -0400)
Adds support for ioctl callback in the RDMA netdevs to allow
supporting functions not handled by the generic interface code.

Signed-off-by: Feras Daoud <ferasda@mellanox.com>
Signed-off-by: Eitan Rabin <rabin@mellanox.com>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
Reviewed-by: Yuval Shaia <yuval.shaia@oracle.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
drivers/infiniband/ulp/ipoib/ipoib_main.c

index ee9f5d281b37c72ca4cc6fcedb7776fd160cd149..4c7a4887077fdef740f4c03ffd7dd51cf3d6f5e7 100644 (file)
@@ -99,6 +99,8 @@ static struct net_device *ipoib_get_net_dev_by_params(
                const union ib_gid *gid, const struct sockaddr *addr,
                void *client_data);
 static int ipoib_set_mac(struct net_device *dev, void *addr);
+static int ipoib_ioctl(struct net_device *dev, struct ifreq *ifr,
+                      int cmd);
 
 static struct ib_client ipoib_client = {
        .name   = "ipoib",
@@ -1680,6 +1682,17 @@ out:
        return -ENOMEM;
 }
 
+static int ipoib_ioctl(struct net_device *dev, struct ifreq *ifr,
+                      int cmd)
+{
+       struct ipoib_dev_priv *priv = ipoib_priv(dev);
+
+       if (!priv->rn_ops->ndo_do_ioctl)
+               return -EOPNOTSUPP;
+
+       return priv->rn_ops->ndo_do_ioctl(dev, ifr, cmd);
+}
+
 int ipoib_dev_init(struct net_device *dev, struct ib_device *ca, int port)
 {
        struct ipoib_dev_priv *priv = ipoib_priv(dev);
@@ -1834,6 +1847,7 @@ static const struct net_device_ops ipoib_netdev_ops_pf = {
        .ndo_set_vf_guid         = ipoib_set_vf_guid,
        .ndo_set_mac_address     = ipoib_set_mac,
        .ndo_get_stats64         = ipoib_get_stats,
+       .ndo_do_ioctl            = ipoib_ioctl,
 };
 
 static const struct net_device_ops ipoib_netdev_ops_vf = {
@@ -1847,6 +1861,7 @@ static const struct net_device_ops ipoib_netdev_ops_vf = {
        .ndo_set_rx_mode         = ipoib_set_mcast_list,
        .ndo_get_iflink          = ipoib_get_iflink,
        .ndo_get_stats64         = ipoib_get_stats,
+       .ndo_do_ioctl            = ipoib_ioctl,
 };
 
 void ipoib_setup_common(struct net_device *dev)