@@ -69,7 +69,7 @@ struct ib_pd *rvt_alloc_pd(struct ib_device *ibdev,
*/
spin_lock(&dev->n_pds_lock);
- if (dev->n_pds_allocated == dev->dparms.max_pds) {
+ if (dev->n_pds_allocated == dev->dparms.props.max_pd) {
spin_unlock(&dev->n_pds_lock);
kfree(pd);
ret = ERR_PTR(-ENOMEM);
@@ -59,7 +59,45 @@
* Things that are driver specific, module parameters in hfi1 and qib
*/
struct rvt_driver_params {
- int max_pds;
+ /*
+ * driver required fields:
+ * node_guid
+ * phys_port_cnt
+ * dma_device
+ * owner
+ * driver optional fields (rvt will provide generic value if blank):
+ * name
+ * node_desc
+ * rvt fields, driver value ignored:
+ * uverbs_abi_ver
+ * node_type
+ * num_comp_vectors
+ * uverbs_cmd_mask
+ */
+ struct ib_device_attr props;
+
+ /*
+ * Drivers will need to support a number of notifications to rvt in
+ * accordance with certain events. This structure should contain a mask
+ * of the supported events. Such events that the rvt may need to know
+ * about include:
+ * port errors
+ * port active
+ * lid change
+ * sm change
+ * client reregister
+ * pkey change
+ *
+ * There may also be other events that the rvt layers needs to know
+ * about this is not an exhaustive list. Some events though rvt does not
+ * need to rely on the driver for such as completion queue error.
+ */
+ int rvt_signal_supported;
+
+ /*
+ * Anything driver specific that is not covered by props
+ * For instance special module parameters. Goes here.
+ */
};
/* Protection domain */
@@ -69,10 +107,25 @@ struct rvt_pd {
};
struct rvt_dev_info {
+ /*
+ * Prior to calling for registration the driver will be responsible for
+ * allocating space for this structure.
+ *
+ * The driver will also be responsible for filling in certain members of
+ * dparms.props
+ */
+
struct ib_device ibdev;
- /* Driver specific */
+ /* Driver specific properties */
struct rvt_driver_params dparms;
+
+ /*
+ * 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 *);
/* Internal use */