@@ -281,8 +281,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);
@@ -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;