From 9e624ee0f8c0840f810d369956bc71d7e158028d Mon Sep 17 00:00:00 2001 From: Florian Pose <fp@igh-essen.com> Date: Tue, 9 Jan 2007 12:56:03 +0000 Subject: [PATCH] Fixed race: Stop EoE processing when entering or leaving operation mode. --- master/master.c | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/master/master.c b/master/master.c index 2e271917..82bc6c57 100644 --- a/master/master.c +++ b/master/master.c @@ -393,6 +393,9 @@ int ec_master_enter_operation_mode(ec_master_t *master /**< EtherCAT master */) ec_slave_t *slave; ec_datagram_t *datagram = &master->fsm.datagram; + ec_master_eoe_stop(master); // stop EoE timer + master->eoe_checked = 0; // prevent from starting again by FSM + master->mode = EC_MASTER_MODE_OPERATION; while (!cancel_delayed_work(&master->idle_work)) { flush_workqueue(master->workqueue); @@ -429,6 +432,8 @@ int ec_master_enter_operation_mode(ec_master_t *master /**< EtherCAT master */) } } + master->eoe_checked = 1; // allow starting EoE again + return 0; out_idle: @@ -449,6 +454,9 @@ void ec_master_leave_operation_mode(ec_master_t *master ec_fsm_t *fsm = &master->fsm; ec_datagram_t *datagram = &master->fsm.datagram; + ec_master_eoe_stop(master); // stop EoE timer + master->eoe_checked = 0; // prevent from starting again by FSM + // wait for FSM datagram if (datagram->state == EC_DATAGRAM_SENT) { // active waiting @@ -486,6 +494,8 @@ void ec_master_leave_operation_mode(ec_master_t *master master->release_cb = ec_master_release_cb; master->cb_data = master; + master->eoe_checked = 0; // allow EoE again + master->mode = EC_MASTER_MODE_IDLE; queue_delayed_work(master->workqueue, &master->idle_work, 1); } @@ -766,6 +776,8 @@ void ec_master_idle_run(void *data /**< master pointer */) ec_master_t *master = (ec_master_t *) data; cycles_t cycles_start, cycles_end; + if (master->mode != EC_MASTER_MODE_IDLE) return; + cycles_start = get_cycles(); // receive @@ -1037,14 +1049,6 @@ void ec_master_eoe_start(ec_master_t *master /**< EtherCAT master */) master->eoe_checked = 1; - // if the locking callbacks are not set in operation mode, - // the EoE timer my not be started. - if (master->mode == EC_MASTER_MODE_OPERATION - && (!master->request_cb || !master->release_cb)) { - EC_INFO("No EoE processing because of missing locking callbacks.\n"); - return; - } - // decouple all EoE handlers list_for_each_entry(eoe, &master->eoe_handlers, list) eoe->slave = NULL; -- GitLab