# HG changeset patch # User Florian Pose # Date 1213256727 0 # Node ID 54149a703c475ad3f7bd5d5e9cbed538e82709c4 # Parent e29edcced328f1e83aba8a802659238a36c4ba63 Removed kobject from slave_config. diff -r e29edcced328 -r 54149a703c47 TODO --- a/TODO Thu Jun 12 07:32:05 2008 +0000 +++ b/TODO Thu Jun 12 07:45:27 2008 +0000 @@ -27,6 +27,7 @@ * Remove EC_IOCTL_DOMAIN_COUNT. * Remove ATOMIC allocations. * Clear FMMU configs. +* Rename master MODE to STATE. Future issues: diff -r e29edcced328 -r 54149a703c47 master/master.c --- a/master/master.c Thu Jun 12 07:32:05 2008 +0000 +++ b/master/master.c Thu Jun 12 07:45:27 2008 +0000 @@ -57,7 +57,7 @@ /*****************************************************************************/ -void ec_master_destroy_slave_configs(ec_master_t *); +void ec_master_clear_slave_configs(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 *); @@ -226,17 +226,17 @@ ec_master_t *master /**< EtherCAT master */ ) { + ec_cdev_clear(&master->cdev); #ifdef EC_EOE ec_master_clear_eoe_handlers(master); #endif ec_master_clear_domains(master); - ec_master_destroy_slave_configs(master); + ec_master_clear_slave_configs(master); ec_master_clear_slaves(master); ec_fsm_master_clear(&master->fsm); ec_datagram_clear(&master->fsm_datagram); ec_device_clear(&master->backup_device); ec_device_clear(&master->main_device); - ec_cdev_clear(&master->cdev); // destroy self kobject_del(&master->kobj); @@ -264,15 +264,16 @@ /*****************************************************************************/ -/** Destroy all slave configurations. +/** Clear all slave configurations. */ -void ec_master_destroy_slave_configs(ec_master_t *master) +void ec_master_clear_slave_configs(ec_master_t *master) { ec_slave_config_t *sc, *next; list_for_each_entry_safe(sc, next, &master->configs, list) { list_del(&sc->list); - ec_slave_config_destroy(sc); + ec_slave_config_clear(sc); + kfree(sc); } } @@ -517,8 +518,8 @@ master->release_cb = ec_master_release_cb; master->cb_data = master; - ec_master_destroy_slave_configs(master); ec_master_clear_domains(master); + ec_master_clear_slave_configs(master); // set states for all slaves list_for_each_entry(slave, &master->slaves, list) { @@ -1367,11 +1368,8 @@ return NULL; } - if (ec_slave_config_init(sc, master, alias, position, vendor_id, - product_code)) { - EC_ERR("Failed to init slave configuration.\n"); - return NULL; - } + ec_slave_config_init(sc, master, + alias, position, vendor_id, product_code); // try to find the addressed slave ec_slave_config_attach(sc); diff -r e29edcced328 -r 54149a703c47 master/slave_config.c --- a/master/slave_config.c Thu Jun 12 07:32:05 2008 +0000 +++ b/master/slave_config.c Thu Jun 12 07:45:27 2008 +0000 @@ -38,7 +38,7 @@ /*****************************************************************************/ -#include +#include #include "globals.h" #include "master.h" @@ -47,44 +47,13 @@ /*****************************************************************************/ -void ec_slave_config_clear(struct kobject *); -ssize_t ec_show_slave_config_attribute(struct kobject *, struct attribute *, - char *); - -/*****************************************************************************/ - -/** \cond */ - -EC_SYSFS_READ_ATTR(info); - -static struct attribute *def_attrs[] = { - &attr_info, - NULL, -}; - -static struct sysfs_ops sysfs_ops = { - .show = ec_show_slave_config_attribute -}; - -static struct kobj_type ktype_ec_slave_config = { - .release = ec_slave_config_clear, - .sysfs_ops = &sysfs_ops, - .default_attrs = def_attrs -}; - -/** \endcond */ - -/*****************************************************************************/ - /** Slave configuration constructor. * * See ecrt_master_slave_config() for the usage of the \a alias and \a * position parameters. - * - * \retval 0 Success. - * \retval <0 Failure. - */ -int ec_slave_config_init(ec_slave_config_t *sc, /**< Slave configuration. */ + */ +void ec_slave_config_init( + ec_slave_config_t *sc, /**< Slave configuration. */ ec_master_t *master, /**< EtherCAT master. */ uint16_t alias, /**< Slave alias. */ uint16_t position, /**< Slave position. */ @@ -108,28 +77,6 @@ INIT_LIST_HEAD(&sc->sdo_requests); sc->used_fmmus = 0; - - // init kobject and add it to the hierarchy - memset(&sc->kobj, 0x00, sizeof(struct kobject)); - kobject_init(&sc->kobj); - sc->kobj.ktype = &ktype_ec_slave_config; - sc->kobj.parent = &master->kobj; - if (kobject_set_name(&sc->kobj, "config-%u-%u", sc->alias, sc->position)) { - EC_ERR("Failed to set kobject name for slave config %u:%u.\n", - sc->alias, sc->position); - goto out_put; - } - if (kobject_add(&sc->kobj)) { - EC_ERR("Failed to add kobject for slave config %u:%u.\n", - sc->alias, sc->position); - goto out_put; - } - - return 0; - - out_put: - kobject_put(&sc->kobj); - return -1; } /*****************************************************************************/ @@ -138,31 +85,14 @@ * * Clears and frees a slave configuration object. */ -void ec_slave_config_destroy( +void ec_slave_config_clear( ec_slave_config_t *sc /**< Slave configuration. */ ) { - ec_slave_config_detach(sc); - - // destroy self - kobject_del(&sc->kobj); - kobject_put(&sc->kobj); -} - -/*****************************************************************************/ - -/** Clear and free the slave configuration. - * - * This method is called by the kobject, once there are no more references to - * it. - */ -void ec_slave_config_clear(struct kobject *kobj /**< kobject of the config. */) -{ - ec_slave_config_t *sc; ec_direction_t dir; ec_sdo_request_t *req, *next_req; - sc = container_of(kobj, ec_slave_config_t, kobj); + ec_slave_config_detach(sc); // Free Pdo mappings for (dir = EC_DIR_OUTPUT; dir <= EC_DIR_INPUT; dir++) @@ -181,8 +111,6 @@ ec_sdo_request_clear(req); kfree(req); } - - kfree(sc); } /*****************************************************************************/ @@ -228,99 +156,6 @@ /*****************************************************************************/ -/** Outputs all information about a certain slave configuration. -*/ -ssize_t ec_slave_config_info( - const ec_slave_config_t *sc, /**< Slave configuration. */ - char *buffer /**< Output buffer */ - ) -{ - char *buf = buffer; - ec_direction_t dir; - const ec_pdo_list_t *pdos; - const ec_pdo_t *pdo; - const ec_pdo_entry_t *entry; - char str[20]; - const ec_sdo_request_t *req; - - buf += sprintf(buf, "Alias: 0x%04X (%u)\n", sc->alias, sc->alias); - buf += sprintf(buf, "Position: %u\n", sc->position); - - for (dir = EC_DIR_OUTPUT; dir <= EC_DIR_INPUT; dir++) { - pdos = &sc->pdos[dir]; - - if (!list_empty(&pdos->list)) { - buf += sprintf(buf, "%s Pdo assignment / mapping:\n", - dir == EC_DIR_OUTPUT ? "Output" : "Input"); - - list_for_each_entry(pdo, &pdos->list, list) { - buf += sprintf(buf, " %s 0x%04X \"%s\"\n", - pdo->dir == EC_DIR_OUTPUT ? "RxPdo" : "TxPdo", - pdo->index, pdo->name ? pdo->name : "???"); - - list_for_each_entry(entry, &pdo->entries, list) { - buf += sprintf(buf, " 0x%04X:%02X \"%s\", %u bit\n", - entry->index, entry->subindex, - entry->name ? entry->name : "???", - entry->bit_length); - } - } - } - } - - // type-cast to avoid warnings on some compilers - if (!list_empty((struct list_head *) &sc->sdo_configs)) { - buf += sprintf(buf, "\nSdo configurations:\n"); - - list_for_each_entry(req, &sc->sdo_configs, list) { - switch (req->data_size) { - case 1: sprintf(str, "%u", EC_READ_U8(req->data)); break; - case 2: sprintf(str, "%u", EC_READ_U16(req->data)); break; - case 4: sprintf(str, "%u", EC_READ_U32(req->data)); break; - default: sprintf(str, "(invalid size)"); break; - } - buf += sprintf(buf, " 0x%04X:%02X -> %s\n", - req->index, req->subindex, str); - } - buf += sprintf(buf, "\n"); - } - - // type-cast to avoid warnings on some compilers - if (!list_empty((struct list_head *) &sc->sdo_requests)) { - buf += sprintf(buf, "\nSdo requests:\n"); - - list_for_each_entry(req, &sc->sdo_requests, list) { - buf += sprintf(buf, " 0x%04X:%02X\n", req->index, req->subindex); - } - buf += sprintf(buf, "\n"); - } - - return buf - buffer; -} - -/*****************************************************************************/ - -/** Formats attribute data for SysFS read access. - * - * \return number of bytes to read - */ -ssize_t ec_show_slave_config_attribute( - struct kobject *kobj, /**< Slave configuration's kobject */ - struct attribute *attr, /**< Requested attribute. */ - char *buffer /**< Memory to store data. */ - ) -{ - ec_slave_config_t *sc = container_of(kobj, ec_slave_config_t, kobj); - - if (attr == &attr_info) { - return ec_slave_config_info(sc, buffer); - } - - return 0; -} - -/*****************************************************************************/ - /** Attaches the configuration to the addressed slave object. * * \retval 0 Success. @@ -464,8 +299,6 @@ /*****************************************************************************/ -/** - */ unsigned int ec_slave_config_sdo_count( const ec_slave_config_t *sc /**< Slave configuration. */ ) diff -r e29edcced328 -r 54149a703c47 master/slave_config.h --- a/master/slave_config.h Thu Jun 12 07:32:05 2008 +0000 +++ b/master/slave_config.h Thu Jun 12 07:45:27 2008 +0000 @@ -42,7 +42,6 @@ #define __EC_SLAVE_CONFIG_H__ #include -#include #include "../include/ecrt.h" @@ -57,7 +56,6 @@ */ struct ec_slave_config { struct list_head list; /**< List item. */ - struct kobject kobj; /**< kobject. */ ec_master_t *master; /**< Master owning the slave configuration. */ uint16_t alias; /**< Slave alias. */ @@ -80,9 +78,9 @@ /*****************************************************************************/ -int ec_slave_config_init(ec_slave_config_t *, ec_master_t *, uint16_t, +void ec_slave_config_init(ec_slave_config_t *, ec_master_t *, uint16_t, uint16_t, uint32_t, uint32_t); -void ec_slave_config_destroy(ec_slave_config_t *); +void ec_slave_config_clear(ec_slave_config_t *); int ec_slave_config_attach(ec_slave_config_t *); void ec_slave_config_detach(ec_slave_config_t *);