master/slave.c
changeset 419 cf724fc82a00
parent 418 7a43437bc48b
child 421 2b3ce4f51bd6
equal deleted inserted replaced
418:7a43437bc48b 419:cf724fc82a00
    81     .release = ec_slave_clear,
    81     .release = ec_slave_clear,
    82     .sysfs_ops = &sysfs_ops,
    82     .sysfs_ops = &sysfs_ops,
    83     .default_attrs = def_attrs
    83     .default_attrs = def_attrs
    84 };
    84 };
    85 
    85 
       
    86 static struct kobj_type ktype_ec_slave_sdos = {};
       
    87 
    86 /** \endcond */
    88 /** \endcond */
    87 
    89 
    88 /*****************************************************************************/
    90 /*****************************************************************************/
    89 
    91 
    90 /**
    92 /**
   108     kobject_init(&slave->kobj);
   110     kobject_init(&slave->kobj);
   109     slave->kobj.ktype = &ktype_ec_slave;
   111     slave->kobj.ktype = &ktype_ec_slave;
   110     slave->kobj.parent = &master->kobj;
   112     slave->kobj.parent = &master->kobj;
   111     if (kobject_set_name(&slave->kobj, "slave%03i", slave->ring_position)) {
   113     if (kobject_set_name(&slave->kobj, "slave%03i", slave->ring_position)) {
   112         EC_ERR("Failed to set kobject name.\n");
   114         EC_ERR("Failed to set kobject name.\n");
       
   115         kobject_put(&slave->kobj);
       
   116         return -1;
       
   117     }
       
   118 
       
   119     // init SDO kobject and add it to the hierarchy
       
   120     memset(&slave->sdo_kobj, 0x00, sizeof(struct kobject));
       
   121     kobject_init(&slave->sdo_kobj);
       
   122     slave->sdo_kobj.ktype = &ktype_ec_slave_sdos;
       
   123     slave->sdo_kobj.parent = &slave->kobj;
       
   124     if (kobject_set_name(&slave->sdo_kobj, "sdos")) {
       
   125         EC_ERR("Failed to set kobject name.\n");
       
   126         kobject_put(&slave->sdo_kobj);
   113         kobject_put(&slave->kobj);
   127         kobject_put(&slave->kobj);
   114         return -1;
   128         return -1;
   115     }
   129     }
   116 
   130 
   117     slave->master = master;
   131     slave->master = master;
   156     INIT_LIST_HEAD(&slave->sii_syncs);
   170     INIT_LIST_HEAD(&slave->sii_syncs);
   157     INIT_LIST_HEAD(&slave->sii_pdos);
   171     INIT_LIST_HEAD(&slave->sii_pdos);
   158     INIT_LIST_HEAD(&slave->sdo_dictionary);
   172     INIT_LIST_HEAD(&slave->sdo_dictionary);
   159     INIT_LIST_HEAD(&slave->sdo_confs);
   173     INIT_LIST_HEAD(&slave->sdo_confs);
   160 
   174 
       
   175     slave->sdo_dictionary_fetched = 0;
       
   176     slave->jiffies_preop = 0;
       
   177 
   161     for (i = 0; i < 4; i++) {
   178     for (i = 0; i < 4; i++) {
   162         slave->dl_link[i] = 0;
   179         slave->dl_link[i] = 0;
   163         slave->dl_loop[i] = 0;
   180         slave->dl_loop[i] = 0;
   164         slave->dl_signal[i] = 0;
   181         slave->dl_signal[i] = 0;
   165         slave->sii_physical_layer[i] = 0xFF;
   182         slave->sii_physical_layer[i] = 0xFF;
   222     list_for_each_entry_safe(sdo, next_sdo, &slave->sdo_dictionary, list) {
   239     list_for_each_entry_safe(sdo, next_sdo, &slave->sdo_dictionary, list) {
   223         list_del(&sdo->list);
   240         list_del(&sdo->list);
   224         kobject_del(&sdo->kobj);
   241         kobject_del(&sdo->kobj);
   225         kobject_put(&sdo->kobj);
   242         kobject_put(&sdo->kobj);
   226     }
   243     }
       
   244 
       
   245     // free SDO kobject
       
   246     if (slave->sdo_dictionary_fetched) kobject_del(&slave->sdo_kobj);
       
   247     kobject_put(&slave->sdo_kobj);
   227 
   248 
   228     // free all SDO configurations
   249     // free all SDO configurations
   229     list_for_each_entry_safe(sdodata, next_sdodata, &slave->sdo_confs, list) {
   250     list_for_each_entry_safe(sdodata, next_sdodata, &slave->sdo_confs, list) {
   230         list_del(&sdodata->list);
   251         list_del(&sdodata->list);
   231         kfree(sdodata->data);
   252         kfree(sdodata->data);