struct list_head qp_list;
};
+extern const struct attribute_group ib_dev_attr_group;
+
int ib_device_register_sysfs(struct ib_device *device);
void ib_device_unregister_sysfs(struct ib_device *device);
int ib_device_rename(struct ib_device *ibdev, const char *name);
rdma_restrack_init(device);
device->dev.class = &ib_class;
+ device->groups[0] = &ib_dev_attr_group;
+ device->dev.groups = device->groups;
device_initialize(&device->dev);
INIT_LIST_HEAD(&device->event_handler_list);
ib_device_register_rdmacg(device);
+ ret = device_add(&device->dev);
+ if (ret)
+ goto cg_cleanup;
+
ret = ib_device_register_sysfs(device);
if (ret) {
dev_warn(&device->dev,
"Couldn't register device with driver model\n");
- goto cg_cleanup;
+ goto dev_cleanup;
}
ret = enable_device(device);
sysfs_cleanup:
ib_device_unregister_sysfs(device);
+dev_cleanup:
+ device_del(&device->dev);
cg_cleanup:
ib_device_unregister_rdmacg(device);
ib_cache_cleanup_one(device);
{
disable_device(device);
ib_device_unregister_sysfs(device);
+ device_del(&device->dev);
ib_device_unregister_rdmacg(device);
ib_cache_cleanup_one(device);
release_name(device);
NULL,
};
-static const struct attribute_group dev_attr_group = {
+const struct attribute_group ib_dev_attr_group = {
.attrs = ib_dev_attrs,
};
{
int ret;
- device->groups[0] = &dev_attr_group;
- device->dev.groups = device->groups;
-
- ret = device_add(&device->dev);
+ ret = ib_setup_port_attrs(device);
if (ret)
return ret;
- ret = ib_setup_port_attrs(device);
- if (ret) {
- device_del(&device->dev);
- return ret;
- }
if (device->ops.alloc_hw_stats)
setup_hw_stats(device, NULL, 0);
kfree(device->hw_stats);
ib_free_port_attrs(device);
- /* Balances with device_add */
- device_del(&device->dev);
}