From 02b27f9fbc9f44072d02bebbce18fa3c5fd68149 Mon Sep 17 00:00:00 2001 From: Florian Pose Date: Tue, 27 Apr 2010 13:40:44 +0200 Subject: [PATCH] Fixed possible bug in EoE code: Only restart EoE process, when it was running before (not while scanning). --- master/master.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/master/master.c b/master/master.c index 16da3566..4a82124a 100644 --- a/master/master.c +++ b/master/master.c @@ -1941,6 +1941,9 @@ int ecrt_master_activate(ec_master_t *master) uint32_t domain_offset; ec_domain_t *domain; int ret; +#ifdef EC_EOE + int eoe_was_running; +#endif if (master->debug_level) EC_DBG("ecrt_master_activate(master = 0x%p)\n", master); @@ -1972,10 +1975,12 @@ int ecrt_master_activate(ec_master_t *master) up(&master->master_sem); // restart EoE process and master thread with new locking + + ec_master_thread_stop(master); #ifdef EC_EOE + eoe_was_running = master->eoe_thread != NULL; ec_master_eoe_stop(master); #endif - ec_master_thread_stop(master); if (master->debug_level) EC_DBG("FSM datagram is %p.\n", &master->fsm_datagram); @@ -1987,15 +1992,17 @@ int ecrt_master_activate(ec_master_t *master) master->receive_cb = master->app_receive_cb; master->cb_data = master->app_cb_data; +#ifdef EC_EOE + if (eoe_was_running) { + ec_master_eoe_start(master); + } +#endif ret = ec_master_thread_start(master, ec_master_operation_thread, "EtherCAT-OP"); if (ret < 0) { EC_ERR("Failed to start master thread!\n"); return ret; } -#ifdef EC_EOE - ec_master_eoe_start(master); -#endif master->allow_config = 1; // request the current configuration master->allow_scan = 1; // allow re-scanning on topology change @@ -2010,6 +2017,7 @@ void ecrt_master_deactivate(ec_master_t *master) ec_slave_t *slave; #ifdef EC_EOE ec_eoe_t *eoe; + int eoe_was_running; #endif if (master->debug_level) @@ -2020,10 +2028,11 @@ void ecrt_master_deactivate(ec_master_t *master) return; } + ec_master_thread_stop(master); #ifdef EC_EOE + eoe_was_running = master->eoe_thread != NULL; ec_master_eoe_stop(master); #endif - ec_master_thread_stop(master); master->send_cb = ec_master_internal_send_cb; master->receive_cb = ec_master_internal_receive_cb; @@ -2059,12 +2068,14 @@ void ecrt_master_deactivate(ec_master_t *master) master->app_start_time = 0ULL; master->has_start_time = 0; +#ifdef EC_EOE + if (eoe_was_running) { + ec_master_eoe_start(master); + } +#endif if (ec_master_thread_start(master, ec_master_idle_thread, "EtherCAT-IDLE")) EC_WARN("Failed to restart master thread!\n"); -#ifdef EC_EOE - ec_master_eoe_start(master); -#endif master->allow_scan = 1; master->allow_config = 1;