IB/opa-vnic: RDMA NETDEV interface
authorVishwanathapura, Niranjana <niranjana.vishwanathapura@intel.com>
Thu, 13 Apr 2017 03:29:20 +0000 (20:29 -0700)
committerDoug Ledford <dledford@redhat.com>
Thu, 20 Apr 2017 16:01:38 +0000 (12:01 -0400)
Add rdma netdev interface to ib device structure allowing rdma netdev
devices to be allocated by ib clients.

Reviewed-by: Dennis Dalessandro <dennis.dalessandro@intel.com>
Reviewed-by: Ira Weiny <ira.weiny@intel.com>
Signed-off-by: Niranjana Vishwanathapura <niranjana.vishwanathapura@intel.com>
Signed-off-by: Doug Ledford <dledford@redhat.com>
include/rdma/ib_verbs.h

index 4ce7c20fe219aaf53a39328d0b5c0a5bccd19929..dd02ba53fd1f1b1f4130c130524b7274714488d5 100644 (file)
@@ -55,6 +55,7 @@
 #include <net/ip.h>
 #include <linux/string.h>
 #include <linux/slab.h>
+#include <linux/netdevice.h>
 
 #include <linux/if_link.h>
 #include <linux/atomic.h>
@@ -1877,6 +1878,24 @@ struct ib_port_immutable {
        u32                           max_mad_size;
 };
 
+/* rdma netdev type - specifies protocol type */
+enum rdma_netdev_t {
+       RDMA_NETDEV_OPA_VNIC
+};
+
+/**
+ * struct rdma_netdev - rdma netdev
+ * For cases where netstack interfacing is required.
+ */
+struct rdma_netdev {
+       void              *clnt_priv;
+       struct ib_device  *hca;
+       u8                 port_num;
+
+       /* control functions */
+       void (*set_id)(struct net_device *netdev, int id);
+};
+
 struct ib_device {
        /* Do not access @dma_device directly from ULP nor from HW drivers. */
        struct device                *dma_device;
@@ -2130,6 +2149,20 @@ struct ib_device {
                                                           struct ib_rwq_ind_table_init_attr *init_attr,
                                                           struct ib_udata *udata);
        int                        (*destroy_rwq_ind_table)(struct ib_rwq_ind_table *wq_ind_table);
+       /**
+        * rdma netdev operations
+        *
+        * Driver implementing alloc_rdma_netdev must return -EOPNOTSUPP if it
+        * doesn't support the specified rdma netdev type.
+        */
+       struct net_device *(*alloc_rdma_netdev)(
+                                       struct ib_device *device,
+                                       u8 port_num,
+                                       enum rdma_netdev_t type,
+                                       const char *name,
+                                       unsigned char name_assign_type,
+                                       void (*setup)(struct net_device *));
+       void (*free_rdma_netdev)(struct net_device *netdev);
 
        struct module               *owner;
        struct device                dev;