# HG changeset patch # User Florian Pose # Date 1213255598 0 # Node ID 8c32564252fd8b934ac62c7d18892abd89c6fb7c # Parent 50a44cbd30af40e96410ab35f349ecafd632cccc Removed kobject from domain. diff -r 50a44cbd30af -r 8c32564252fd TODO --- a/TODO Thu Jun 12 07:15:54 2008 +0000 +++ b/TODO Thu Jun 12 07:26:38 2008 +0000 @@ -26,6 +26,7 @@ * Remove configs_attached flag. * Remove EC_IOCTL_DOMAIN_COUNT. * Remove ATOMIC allocations. +* Clear FMMU configs. Future issues: diff -r 50a44cbd30af -r 8c32564252fd master/domain.c --- a/master/domain.c Thu Jun 12 07:15:54 2008 +0000 +++ b/master/domain.c Thu Jun 12 07:26:38 2008 +0000 @@ -48,41 +48,13 @@ /*****************************************************************************/ -void ec_domain_clear(struct kobject *); void ec_domain_clear_data(ec_domain_t *); -ssize_t ec_show_domain_attribute(struct kobject *, struct attribute *, char *); - -/*****************************************************************************/ - -/** \cond */ - -EC_SYSFS_READ_ATTR(image_size); - -static struct attribute *def_attrs[] = { - &attr_image_size, - NULL, -}; - -static struct sysfs_ops sysfs_ops = { - .show = &ec_show_domain_attribute, - .store = NULL -}; - -static struct kobj_type ktype_ec_domain = { - .release = ec_domain_clear, - .sysfs_ops = &sysfs_ops, - .default_attrs = def_attrs -}; - -/** \endcond */ /*****************************************************************************/ /** Domain constructor. - * - * \return 0 in case of success, else < 0 - */ -int ec_domain_init( + */ +void ec_domain_init( ec_domain_t *domain, /**< EtherCAT domain. */ ec_master_t *master, /**< Parent master. */ unsigned int index /**< Index. */ @@ -100,69 +72,25 @@ domain->expected_working_counter = 0x0000; domain->working_counter_changes = 0; domain->notify_jiffies = 0; - - // init kobject and add it to the hierarchy - memset(&domain->kobj, 0x00, sizeof(struct kobject)); - kobject_init(&domain->kobj); - domain->kobj.ktype = &ktype_ec_domain; - domain->kobj.parent = &master->kobj; - if (kobject_set_name(&domain->kobj, "domain%u", 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; - } - - return 0; } /*****************************************************************************/ /** Domain destructor. - * - * Clears and frees a domain object. - */ -void ec_domain_destroy(ec_domain_t *domain /**< EtherCAT domain */) -{ - ec_datagram_t *datagram; - - // dequeue datagrams - list_for_each_entry(datagram, &domain->datagrams, list) { + */ +void ec_domain_clear(ec_domain_t *domain /**< EtherCAT domain */) +{ + ec_datagram_t *datagram, *next; + + // dequeue and free datagrams + list_for_each_entry_safe(datagram, next, &domain->datagrams, list) { if (!list_empty(&datagram->queue)) // datagram queued? - list_del_init(&datagram->queue); - } - - // destroy self - kobject_del(&domain->kobj); - kobject_put(&domain->kobj); -} - -/*****************************************************************************/ - -/** Clear and free domain. - * - * This method is called by the kobject, once there are no more references - * to it. - */ -void ec_domain_clear(struct kobject *kobj /**< kobject of the domain */) -{ - ec_domain_t *domain; - ec_datagram_t *datagram, *next; - - domain = container_of(kobj, ec_domain_t, kobj); - - list_for_each_entry_safe(datagram, next, &domain->datagrams, list) { + list_del(&datagram->queue); ec_datagram_clear(datagram); kfree(datagram); } ec_domain_clear_data(domain); - - kfree(domain); } /*****************************************************************************/ @@ -323,7 +251,8 @@ datagram_size += fmmu->data_size; } - // allocate last datagram, if data are left + // Allocate last datagram, if data are left (this is also the case if the + // process data fit into a single datagram) if (datagram_size) { if (ec_domain_add_datagram(domain, domain->logical_base_address + datagram_offset, @@ -348,27 +277,6 @@ /*****************************************************************************/ -/** - Formats attribute data for SysFS reading. - \return number of bytes to read -*/ - -ssize_t ec_show_domain_attribute(struct kobject *kobj, /**< kobject */ - struct attribute *attr, /**< attribute */ - char *buffer /**< memory to store data in */ - ) -{ - ec_domain_t *domain = container_of(kobj, ec_domain_t, kobj); - - if (attr == &attr_image_size) { - return sprintf(buffer, "%u\n", domain->data_size); - } - - return 0; -} - -/*****************************************************************************/ - unsigned int ec_domain_fmmu_count(const ec_domain_t *domain) { const ec_fmmu_config_t *fmmu; @@ -477,9 +385,10 @@ domain->index, domain->working_counter, domain->expected_working_counter); } else { - EC_INFO("Domain %u: %u working counter changes. Currently %u/%u.\n", - domain->index, domain->working_counter_changes, - domain->working_counter, domain->expected_working_counter); + EC_INFO("Domain %u: %u working counter changes. " + "Currently %u/%u.\n", domain->index, + domain->working_counter_changes, domain->working_counter, + domain->expected_working_counter); } domain->working_counter_changes = 0; } diff -r 50a44cbd30af -r 8c32564252fd master/domain.h --- a/master/domain.h Thu Jun 12 07:15:54 2008 +0000 +++ b/master/domain.h Thu Jun 12 07:26:38 2008 +0000 @@ -42,7 +42,6 @@ #define __EC_DOMAIN_H__ #include -#include #include "globals.h" #include "datagram.h" @@ -51,15 +50,13 @@ /*****************************************************************************/ -/** - EtherCAT domain. - Handles the process data and the therefore needed datagrams of a certain - group of slaves. -*/ - +/** EtherCAT domain. + * + * Handles the process data and the therefore needed datagrams of a certain + * group of slaves. + */ struct ec_domain { - struct kobject kobj; /**< kobject. */ struct list_head list; /**< List item. */ ec_master_t *master; /**< EtherCAT master owning the domain. */ unsigned int index; /**< Index (just a number). */ @@ -81,8 +78,8 @@ /*****************************************************************************/ -int ec_domain_init(ec_domain_t *, ec_master_t *, unsigned int); -void ec_domain_destroy(ec_domain_t *); +void ec_domain_init(ec_domain_t *, ec_master_t *, unsigned int); +void ec_domain_clear(ec_domain_t *); void ec_domain_add_fmmu_config(ec_domain_t *, ec_fmmu_config_t *); int ec_domain_finish(ec_domain_t *, uint32_t); diff -r 50a44cbd30af -r 8c32564252fd master/master.c --- a/master/master.c Thu Jun 12 07:15:54 2008 +0000 +++ b/master/master.c Thu Jun 12 07:26:38 2008 +0000 @@ -58,7 +58,7 @@ /*****************************************************************************/ void ec_master_destroy_slave_configs(ec_master_t *); -void ec_master_destroy_domains(ec_master_t *); +void ec_master_clear_domains(ec_master_t *); static int ec_master_idle_thread(ec_master_t *); static int ec_master_operation_thread(ec_master_t *); #ifdef EC_EOE @@ -231,7 +231,7 @@ #endif ec_master_destroy_slave_configs(master); ec_master_clear_slaves(master); - ec_master_destroy_domains(master); + ec_master_clear_domains(master); ec_fsm_master_clear(&master->fsm); ec_datagram_clear(&master->fsm_datagram); ec_device_clear(&master->backup_device); @@ -299,13 +299,14 @@ Destroy all domains. */ -void ec_master_destroy_domains(ec_master_t *master) +void ec_master_clear_domains(ec_master_t *master) { ec_domain_t *domain, *next; list_for_each_entry_safe(domain, next, &master->domains, list) { list_del(&domain->list); - ec_domain_destroy(domain); + ec_domain_clear(domain); + kfree(domain); } } @@ -517,7 +518,7 @@ master->cb_data = master; ec_master_destroy_slave_configs(master); - ec_master_destroy_domains(master); + ec_master_clear_domains(master); // set states for all slaves list_for_each_entry(slave, &master->slaves, list) { @@ -1202,17 +1203,14 @@ return NULL; } - if (list_empty(&master->domains)) index = 0; - else { + if (list_empty(&master->domains)) { + index = 0; + } else { last_domain = list_entry(master->domains.prev, ec_domain_t, list); index = last_domain->index + 1; } - if (ec_domain_init(domain, master, index)) { - EC_ERR("Failed to init domain.\n"); - return NULL; - } - + ec_domain_init(domain, master, index); list_add_tail(&domain->list, &master->domains); return domain;