summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--drivers/infiniband/sw/rdmavt/vt.c6
-rw-r--r--include/rdma/rdma_vt.h22
2 files changed, 20 insertions, 8 deletions
diff --git a/drivers/infiniband/sw/rdmavt/vt.c b/drivers/infiniband/sw/rdmavt/vt.c
index 367bc45e06e7..b4ce97e6ff12 100644
--- a/drivers/infiniband/sw/rdmavt/vt.c
+++ b/drivers/infiniband/sw/rdmavt/vt.c
@@ -280,8 +280,12 @@ int rvt_register_device(struct rvt_dev_info *rdi)
spin_lock_init(&rdi->n_pds_lock);
rdi->n_pds_allocated = 0;
+ /* Validate that drivers have provided the right functions */
+ if (!rdi->driver_f.port_callback)
+ return -EINVAL;
+
/* We are now good to announce we exist */
- return ib_register_device(&rdi->ibdev, rdi->port_callback);
+ return ib_register_device(&rdi->ibdev, rdi->driver_f.port_callback);
}
EXPORT_SYMBOL(rvt_register_device);
diff --git a/include/rdma/rdma_vt.h b/include/rdma/rdma_vt.h
index 9baa7f04e8d0..e0beedc6110e 100644
--- a/include/rdma/rdma_vt.h
+++ b/include/rdma/rdma_vt.h
@@ -383,6 +383,19 @@ struct rvt_driver_params {
*/
};
+/*
+ * Functions that drivers are required to support
+ */
+struct rvt_driver_provided {
+ /*
+ * The work to create port files in /sys/class Infiniband is different
+ * depending on the driver. This should not be extracted away and
+ * instead drivers are responsible for setting the correct callback for
+ * this.
+ */
+ int (*port_callback)(struct ib_device *, u8, struct kobject *);
+};
+
/* Protection domain */
struct rvt_pd {
struct ib_pd ibpd;
@@ -407,13 +420,8 @@ struct rvt_dev_info {
/* PKey Table goes here */
- /*
- * The work to create port files in /sys/class Infiniband is different
- * depending on the driver. This should not be extracted away and
- * instead drivers are responsible for setting the correct callback for
- * this.
- */
- int (*port_callback)(struct ib_device *, u8, struct kobject *);
+ /* Driver specific helper functions */
+ struct rvt_driver_provided driver_f;
/* Internal use */
int n_pds_allocated;