diff --git a/TODO b/TODO index e69774124715ed3521f6462352afc611d5ce62e1..8e25a8b371d9463ced8cd225f86a246e0ba2d8b2 100644 --- a/TODO +++ b/TODO @@ -8,33 +8,19 @@ $Id$ Important things to do: -* Add Kobjects in constructors. - * Read AL Status Code with AL Control Response (if possible?) - * Coupling of EoE handlers before configuring slaves. (avoiding duplicate configuration) - -* SysFS interface - - Add secondary slave address - - Add SDO dictionary - * Implement all EtherCAT commands - * Determine number of frames the NIC can handle - -* Implement eepro100 driver - -* Progress bar in ecrt. +* Implement e100 driver ------------------------------------------------------------------------------- Not-so-important things to do: * Calculate bus topology - * File access over EtherCAT (FoE) - * Allow VLAN tagging ------------------------------------------------------------------------------- diff --git a/master/canopen.c b/master/canopen.c index ad144d8b9500e9b29f0e63fff94651c9b62a1ce1..6edfc447127eef5949eba989bad6e01e7becc8b4 100644 --- a/master/canopen.c +++ b/master/canopen.c @@ -122,6 +122,12 @@ int ec_sdo_init(ec_sdo_t *sdo, /**< SDO */ sdo->kobj.parent = &slave->sdo_kobj; if (kobject_set_name(&sdo->kobj, "%4X", sdo->index)) { EC_ERR("Failed to set kobj name.\n"); + kobject_put(&sdo->kobj); + return -1; + } + if (kobject_add(&sdo->kobj)) { + EC_ERR("Failed to add SDO kobject.\n"); + kobject_put(&sdo->kobj); return -1; } @@ -222,6 +228,12 @@ int ec_sdo_entry_init(ec_sdo_entry_t *entry, /**< SDO entry */ entry->kobj.parent = &sdo->kobj; if (kobject_set_name(&entry->kobj, "%i", entry->subindex)) { EC_ERR("Failed to set kobj name.\n"); + kobject_put(&entry->kobj); + return -1; + } + if (kobject_add(&entry->kobj)) { + EC_ERR("Failed to add entry kobject.\n"); + kobject_put(&entry->kobj); return -1; } diff --git a/master/domain.c b/master/domain.c index f15fcf6bf38209df44387bdd664709d701ef2b52..e409a97ed8acf710f5918c43e624b8e8896eb6d9 100644 --- a/master/domain.c +++ b/master/domain.c @@ -120,6 +120,12 @@ int ec_domain_init(ec_domain_t *domain, /**< EtherCAT domain */ domain->kobj.parent = &master->kobj; if (kobject_set_name(&domain->kobj, "domain%i", index)) { EC_ERR("Failed to set kobj name.\n"); + kobject_put(&domain->kobj); + return -1; + } + if (kobject_add(&domain->kobj)) { + EC_ERR("Failed to add domain kobject.\n"); + kobject_put(&domain->kobj); return -1; } diff --git a/master/fsm.c b/master/fsm.c index f9bff44c102d95342dde74368187240d58e9d218..d48aeb3a95cf674a6de4bee1bf98a5566e9186ca 100644 --- a/master/fsm.c +++ b/master/fsm.c @@ -275,14 +275,6 @@ void ec_fsm_master_broadcast(ec_fsm_t *fsm /**< finite state machine */) return; } - if (kobject_add(&slave->kobj)) { - EC_ERR("Failed to add kobject.\n"); - kobject_put(&slave->kobj); // free - ec_master_destroy_slaves(master); - fsm->master_state = ec_fsm_master_error; - return; - } - list_add_tail(&slave->list, &master->slaves); } @@ -388,14 +380,6 @@ void ec_fsm_master_action_process_states(ec_fsm_t *fsm slave->ring_position); } - if (kobject_add(&slave->sdo_kobj)) { - EC_ERR("Failed to add SDO kobj of slave %i.\n", - slave->ring_position); - slave->error_flag = 1; - fsm->master_state = ec_fsm_master_error; - return; - } - slave->sdo_dictionary_fetched = 1; // start fetching SDO dictionary diff --git a/master/fsm_coe.c b/master/fsm_coe.c index 589b2dd498ef1559fe0cab58f029b1bc017c120c..7d92b6a09424822bb62d55c588026f27b5eaf473 100644 --- a/master/fsm_coe.c +++ b/master/fsm_coe.c @@ -413,13 +413,6 @@ void ec_fsm_coe_dict_response(ec_fsm_coe_t *fsm /**< finite state machine */) return; } - if (kobject_add(&sdo->kobj)) { - EC_ERR("Failed to add kobject.\n"); - kobject_put(&sdo->kobj); // free - fsm->state = ec_fsm_coe_error; - return; - } - list_add_tail(&sdo->list, &slave->sdo_dictionary); } @@ -776,20 +769,15 @@ void ec_fsm_coe_dict_entry_response(ec_fsm_coe_t *fsm entry->bit_length = EC_READ_U16(data + 12); if (data_size) { - if (!(entry->description = kmalloc(data_size + 1, GFP_ATOMIC))) { + uint8_t *desc; + if (!(desc = kmalloc(data_size + 1, GFP_ATOMIC))) { EC_ERR("Failed to allocate SDO entry name!\n"); fsm->state = ec_fsm_coe_error; return; } - memcpy(entry->description, data + 16, data_size); - entry->description[data_size] = 0; - } - - if (kobject_add(&entry->kobj)) { - EC_ERR("Failed to add kobject.\n"); - kobject_put(&entry->kobj); // free - fsm->state = ec_fsm_coe_error; - return; + memcpy(desc, data + 16, data_size); + desc[data_size] = 0; + entry->description = desc; } list_add_tail(&entry->list, &sdo->entries); diff --git a/master/master.c b/master/master.c index 9f9f528b3ffb80c2e8333d3a58dc4d7bfecbb2ca..d2b954495b5a924d4f500c0a8cc34fc890476495 100644 --- a/master/master.c +++ b/master/master.c @@ -203,6 +203,11 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */ kobject_put(&master->kobj); return -1; } + if (kobject_add(&master->kobj)) { + EC_ERR("Failed to add master kobj.\n"); + kobject_put(&master->kobj); + return -1; + } return 0; @@ -1271,7 +1276,7 @@ ec_domain_t *ecrt_master_create_domain(ec_master_t *master /**< master */) if (!(domain = (ec_domain_t *) kmalloc(sizeof(ec_domain_t), GFP_KERNEL))) { EC_ERR("Error allocating domain memory!\n"); - goto out_return; + return NULL; } if (list_empty(&master->domains)) index = 0; @@ -1282,21 +1287,12 @@ ec_domain_t *ecrt_master_create_domain(ec_master_t *master /**< master */) if (ec_domain_init(domain, master, index)) { EC_ERR("Failed to init domain.\n"); - goto out_return; - } - - if (kobject_add(&domain->kobj)) { - EC_ERR("Failed to add domain kobject.\n"); - goto out_put; + return NULL; } list_add_tail(&domain->list, &master->domains); - return domain; - out_put: - kobject_put(&domain->kobj); - out_return: - return NULL; + return domain; } /*****************************************************************************/ diff --git a/master/module.c b/master/module.c index 7083cb0c017fab104cae3275e3e41e343e76f297..1d2ea6b1358dbe95e5f6eebe17494701927e769d 100644 --- a/master/module.c +++ b/master/module.c @@ -115,12 +115,6 @@ int __init ec_init_module(void) if (ec_master_init(master, i, ec_eoeif_count, device_number)) goto out_free; - if (kobject_add(&master->kobj)) { - EC_ERR("Failed to add kobj.\n"); - kobject_put(&master->kobj); // free master - goto out_free; - } - list_add_tail(&master->list, &ec_masters); } diff --git a/master/slave.c b/master/slave.c index e388e45d5457694bb8438742a9dedc59bd798056..c64104a07b6f6dbd26f19df371ace3c44a0d291e 100644 --- a/master/slave.c +++ b/master/slave.c @@ -108,29 +108,6 @@ int ec_slave_init(ec_slave_t *slave, /**< EtherCAT slave */ 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 @@ int ec_slave_init(ec_slave_t *slave, /**< EtherCAT slave */ 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 @@ void ec_slave_destroy(ec_slave_t *slave /**< EtherCAT slave */) } // 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