master/slave.c
changeset 484 9fde4a17b820
parent 482 fbaaaf2a6234
child 499 fb005e975181
--- 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