On Mon, Mar 13, 2017 at 08:31:16PM +0200, Erez Shitrit wrote:
+static struct net_device *ipoib_create_netdev_default(struct ib_device *hca,
+                                                     const char *name,
+                                                     void (*setup)(struct 
net_device *))
{
        struct net_device *dev;
+       struct rdma_netdev *rn;

-       dev = alloc_netdev((int)sizeof(struct ipoib_dev_priv), name,
-                          NET_NAME_UNKNOWN, ipoib_setup);
+       dev = alloc_netdev((int)sizeof(struct ipoib_rdma_netdev),
+                          name,
+                          NET_NAME_UNKNOWN, setup);
        if (!dev)
                return NULL;

-       return netdev_priv(dev);
+       rn = netdev_priv(dev);
+
+       rn->ib_dev_init = ipoib_dev_init_default;
+       rn->ib_dev_cleanup = ipoib_dev_uninit_default;
+       rn->send = ipoib_send;
+       rn->attach_mcast = ipoib_mcast_attach;
+       rn->detach_mcast = ipoib_mcast_detach;
+
+       dev->netdev_ops = &ipoib_netdev_default_pf;
+

Probably no need to set netdev_ops here as it gets overwritten.

+       return dev;
+}
+
+struct ipoib_dev_priv *ipoib_intf_alloc(struct ib_device *hca, u8 port,
+                                       const char *name)
+{
+       struct net_device *dev;
+       struct ipoib_dev_priv *priv;
+       struct rdma_netdev *rn;
+
+       priv = kzalloc(sizeof(*priv), GFP_KERNEL);
+       if (!priv) {
+               pr_err("%s failed allocting priv\n", __func__);
+               return NULL;
+       }
+
+       if (!hca->alloc_rdma_netdev)
+               dev = ipoib_create_netdev_default(hca, name, 
ipoib_setup_common);
+       else
+               dev = hca->alloc_rdma_netdev(hca, port, RDMA_NETDEV_IPOIB,
+                                            name, NET_NAME_UNKNOWN,
+                                            ipoib_setup_common);
+       if (!dev) {
+               kfree(priv);
+               return NULL;
+       }

This will break ipoib on hfi1 as hfi1 will define alloc_rdma_netdev for OPA_VNIC type. We should probably look for a dedicated return type (-ENODEV?) to determine of the driver supports specified rdma netdev type. Or use a ib device attribute to suggest driver support ipoib rdma netdev.

Niranjana

Reply via email to