--- a/master/slave.c Mon Nov 06 14:21:35 2006 +0000
+++ b/master/slave.c Mon Nov 06 14:22:35 2006 +0000
@@ -108,29 +108,6 @@
slave->ring_position = ring_position;
slave->station_address = station_address;
- // init kobject and add it to the hierarchy
- memset(&slave->kobj, 0x00, sizeof(struct kobject));
- kobject_init(&slave->kobj);
- slave->kobj.ktype = &ktype_ec_slave;
- slave->kobj.parent = &master->kobj;
- if (kobject_set_name(&slave->kobj, "slave%03i", slave->ring_position)) {
- EC_ERR("Failed to set kobject name.\n");
- kobject_put(&slave->kobj);
- return -1;
- }
-
- // init SDO kobject and add it to the hierarchy
- memset(&slave->sdo_kobj, 0x00, sizeof(struct kobject));
- kobject_init(&slave->sdo_kobj);
- slave->sdo_kobj.ktype = &ktype_ec_slave_sdos;
- slave->sdo_kobj.parent = &slave->kobj;
- if (kobject_set_name(&slave->sdo_kobj, "sdos")) {
- EC_ERR("Failed to set kobject name.\n");
- kobject_put(&slave->sdo_kobj);
- kobject_put(&slave->kobj);
- return -1;
- }
-
slave->master = master;
slave->requested_state = EC_SLAVE_STATE_UNKNOWN;
@@ -185,7 +162,42 @@
slave->sii_physical_layer[i] = 0xFF;
}
+ // init kobject and add it to the hierarchy
+ memset(&slave->kobj, 0x00, sizeof(struct kobject));
+ kobject_init(&slave->kobj);
+ slave->kobj.ktype = &ktype_ec_slave;
+ slave->kobj.parent = &master->kobj;
+ if (kobject_set_name(&slave->kobj, "slave%03i", slave->ring_position)) {
+ EC_ERR("Failed to set kobject name.\n");
+ goto out_slave_put;
+ }
+ if (kobject_add(&slave->kobj)) {
+ EC_ERR("Failed to add slave's kobject.\n");
+ goto out_slave_put;
+ }
+
+ // init SDO kobject and add it to the hierarchy
+ memset(&slave->sdo_kobj, 0x00, sizeof(struct kobject));
+ kobject_init(&slave->sdo_kobj);
+ slave->sdo_kobj.ktype = &ktype_ec_slave_sdos;
+ slave->sdo_kobj.parent = &slave->kobj;
+ if (kobject_set_name(&slave->sdo_kobj, "sdos")) {
+ EC_ERR("Failed to set kobject name.\n");
+ goto out_sdo_put;
+ }
+ if (kobject_add(&slave->sdo_kobj)) {
+ EC_ERR("Failed to add SDOs kobject.\n");
+ goto out_sdo_put;
+ }
+
return 0;
+
+ out_sdo_put:
+ kobject_put(&slave->sdo_kobj);
+ kobject_del(&slave->kobj);
+ out_slave_put:
+ kobject_put(&slave->kobj);
+ return -1;
}
/*****************************************************************************/
@@ -206,7 +218,7 @@
}
// free SDO kobject
- if (slave->sdo_dictionary_fetched) kobject_del(&slave->sdo_kobj);
+ kobject_del(&slave->sdo_kobj);
kobject_put(&slave->sdo_kobj);
// destroy self