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);
 
 
         */
 };
 
+/*
+ * 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;
 
        /* 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;