master/master.c
changeset 995 54149a703c47
parent 994 e29edcced328
child 997 652180478e95
equal deleted inserted replaced
994:e29edcced328 995:54149a703c47
    55 #endif
    55 #endif
    56 #include "master.h"
    56 #include "master.h"
    57 
    57 
    58 /*****************************************************************************/
    58 /*****************************************************************************/
    59 
    59 
    60 void ec_master_destroy_slave_configs(ec_master_t *);
    60 void ec_master_clear_slave_configs(ec_master_t *);
    61 void ec_master_clear_domains(ec_master_t *);
    61 void ec_master_clear_domains(ec_master_t *);
    62 static int ec_master_idle_thread(ec_master_t *);
    62 static int ec_master_idle_thread(ec_master_t *);
    63 static int ec_master_operation_thread(ec_master_t *);
    63 static int ec_master_operation_thread(ec_master_t *);
    64 #ifdef EC_EOE
    64 #ifdef EC_EOE
    65 void ec_master_eoe_run(unsigned long);
    65 void ec_master_eoe_run(unsigned long);
   224 
   224 
   225 void ec_master_clear(
   225 void ec_master_clear(
   226         ec_master_t *master /**< EtherCAT master */
   226         ec_master_t *master /**< EtherCAT master */
   227         )
   227         )
   228 {
   228 {
       
   229     ec_cdev_clear(&master->cdev);
   229 #ifdef EC_EOE
   230 #ifdef EC_EOE
   230     ec_master_clear_eoe_handlers(master);
   231     ec_master_clear_eoe_handlers(master);
   231 #endif
   232 #endif
   232     ec_master_clear_domains(master);
   233     ec_master_clear_domains(master);
   233     ec_master_destroy_slave_configs(master);
   234     ec_master_clear_slave_configs(master);
   234     ec_master_clear_slaves(master);
   235     ec_master_clear_slaves(master);
   235     ec_fsm_master_clear(&master->fsm);
   236     ec_fsm_master_clear(&master->fsm);
   236     ec_datagram_clear(&master->fsm_datagram);
   237     ec_datagram_clear(&master->fsm_datagram);
   237     ec_device_clear(&master->backup_device);
   238     ec_device_clear(&master->backup_device);
   238     ec_device_clear(&master->main_device);
   239     ec_device_clear(&master->main_device);
   239     ec_cdev_clear(&master->cdev);
       
   240 
   240 
   241     // destroy self
   241     // destroy self
   242     kobject_del(&master->kobj);
   242     kobject_del(&master->kobj);
   243     kobject_put(&master->kobj);
   243     kobject_put(&master->kobj);
   244 }
   244 }
   262 }
   262 }
   263 #endif
   263 #endif
   264 
   264 
   265 /*****************************************************************************/
   265 /*****************************************************************************/
   266 
   266 
   267 /** Destroy all slave configurations.
   267 /** Clear all slave configurations.
   268  */
   268  */
   269 void ec_master_destroy_slave_configs(ec_master_t *master)
   269 void ec_master_clear_slave_configs(ec_master_t *master)
   270 {
   270 {
   271     ec_slave_config_t *sc, *next;
   271     ec_slave_config_t *sc, *next;
   272 
   272 
   273     list_for_each_entry_safe(sc, next, &master->configs, list) {
   273     list_for_each_entry_safe(sc, next, &master->configs, list) {
   274         list_del(&sc->list);
   274         list_del(&sc->list);
   275         ec_slave_config_destroy(sc);
   275         ec_slave_config_clear(sc);
       
   276         kfree(sc);
   276     }
   277     }
   277 }
   278 }
   278 
   279 
   279 /*****************************************************************************/
   280 /*****************************************************************************/
   280 
   281 
   515     
   516     
   516     master->request_cb = ec_master_request_cb;
   517     master->request_cb = ec_master_request_cb;
   517     master->release_cb = ec_master_release_cb;
   518     master->release_cb = ec_master_release_cb;
   518     master->cb_data = master;
   519     master->cb_data = master;
   519     
   520     
   520     ec_master_destroy_slave_configs(master);
       
   521     ec_master_clear_domains(master);
   521     ec_master_clear_domains(master);
       
   522     ec_master_clear_slave_configs(master);
   522 
   523 
   523     // set states for all slaves
   524     // set states for all slaves
   524     list_for_each_entry(slave, &master->slaves, list) {
   525     list_for_each_entry(slave, &master->slaves, list) {
   525         ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
   526         ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
   526     }
   527     }
  1365                         GFP_KERNEL))) {
  1366                         GFP_KERNEL))) {
  1366             EC_ERR("Failed to allocate memory for slave configuration.\n");
  1367             EC_ERR("Failed to allocate memory for slave configuration.\n");
  1367             return NULL;
  1368             return NULL;
  1368         }
  1369         }
  1369 
  1370 
  1370         if (ec_slave_config_init(sc, master, alias, position, vendor_id,
  1371         ec_slave_config_init(sc, master,
  1371                     product_code)) {
  1372                 alias, position, vendor_id, product_code);
  1372             EC_ERR("Failed to init slave configuration.\n");
       
  1373             return NULL;
       
  1374         }
       
  1375 
  1373 
  1376         // try to find the addressed slave
  1374         // try to find the addressed slave
  1377         ec_slave_config_attach(sc);
  1375         ec_slave_config_attach(sc);
  1378         ec_slave_config_load_default_assignment(sc);
  1376         ec_slave_config_load_default_assignment(sc);
  1379 
  1377