kobject_add() in constructors.

This commit is contained in:
Florian Pose 2006-11-06 14:22:35 +00:00
parent 1999d5d4a0
commit e3b241a79a
8 changed files with 68 additions and 90 deletions

16
TODO
View File

@ -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
-------------------------------------------------------------------------------

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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

View File

@ -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);

View File

@ -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;
}
/*****************************************************************************/

View File

@ -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);
}

View File

@ -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