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