From 4dcc0f009efc766a82a2c9af099150e67e049ba4 Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Fri, 16 Mar 2007 14:42:04 +0000
Subject: [PATCH] Completely lock master while an EoE cycle is executing.

---
 TODO            | 2 +-
 master/master.c | 6 +++---
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/TODO b/TODO
index 4c144d7b..5c20749f 100644
--- a/TODO
+++ b/TODO
@@ -28,7 +28,7 @@ $Id$
   - Interrupt master state machines state scan for other jobs.
   - Master state machine, slave configuration: Do not check every slave on
     a cycle.
-  - Fix problem when lock ist not required for EoE sending.
+  - Do only execute one EoE handler per EoE cycle.
 
 * Less important issues:
   - Implement all EtherCAT datagram types.
diff --git a/master/master.c b/master/master.c
index 0338a7c0..79ab1ed6 100644
--- a/master/master.c
+++ b/master/master.c
@@ -1129,11 +1129,11 @@ void ec_master_eoe_run(unsigned long data /**< master pointer */)
     if (none_open)
         goto queue_timer;
 
-    // receive datagrams
     if (master->request_cb(master->cb_data)) goto queue_timer;
+
+    // receive datagrams
     cycles_start = get_cycles();
     ecrt_master_receive(master);
-    master->release_cb(master->cb_data);
 
     // actual EoE processing
     list_for_each_entry(eoe, &master->eoe_handlers, list) {
@@ -1141,9 +1141,9 @@ void ec_master_eoe_run(unsigned long data /**< master pointer */)
     }
 
     // send datagrams
-    if (master->request_cb(master->cb_data)) goto queue_timer;
     ecrt_master_send(master);
     cycles_end = get_cycles();
+
     master->release_cb(master->cb_data);
 
     master->eoe_cycle_times[master->eoe_cycle_time_pos]
-- 
GitLab