From 6bed186e61f11c76e9d917ee19bcee67e19ec357 Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Tue, 9 Aug 2011 22:10:45 +0200
Subject: [PATCH] Improved DC sync at startup: Abort iterating though slaves
 and first correct system time offsets, then begin configuring at slave 0.

--HG--
branch : stable-1.5
---
 documentation/graphs/fsm_master.dot |  1 +
 master/fsm_master.c                 | 20 +++++++++++++++++++-
 2 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/documentation/graphs/fsm_master.dot b/documentation/graphs/fsm_master.dot
index 3affed7f..79997703 100644
--- a/documentation/graphs/fsm_master.dot
+++ b/documentation/graphs/fsm_master.dot
@@ -37,6 +37,7 @@ digraph master {
     action_configure [shape=point,label=""]
     action_configure -> configure_slave [weight=10]
     action_configure -> action_next_slave_state
+    action_configure -> write_system_times
 
     read_state -> acknowledge [weight=10]
     read_state -> action_configure
diff --git a/master/fsm_master.c b/master/fsm_master.c
index 9dd461c3..6bdbfa4a 100644
--- a/master/fsm_master.c
+++ b/master/fsm_master.c
@@ -566,6 +566,17 @@ void ec_fsm_master_action_configure(
     ec_master_t *master = fsm->master;
     ec_slave_t *slave = fsm->slave;
 
+    if (master->config_changed) {
+        // abort iterating through slaves,
+        // first compensate DC system time offsets,
+        // then begin configuring at slave 0
+        EC_MASTER_DBG(master, 1, "Configuration changed"
+                " (aborting state check).\n");
+
+        fsm->slave = master->slaves; // begin with first slave
+        ec_fsm_master_enter_write_system_times(fsm);
+    }
+
     // Does the slave have to be configured?
     if ((slave->current_state != slave->requested_state
                 || slave->force_config) && !slave->error_flag) {
@@ -857,6 +868,7 @@ void ec_fsm_master_enter_write_system_times(
     EC_MASTER_DBG(master, 1, "Writing system time offsets...\n");
 
     if (master->has_app_time) {
+
         while (fsm->slave < master->slaves + master->slave_count) {
             if (!fsm->slave->base_dc_supported
                     || !fsm->slave->has_dc_system_time) {
@@ -873,8 +885,14 @@ void ec_fsm_master_enter_write_system_times(
             fsm->state = ec_fsm_master_state_dc_read_offset;
             return;
         }
+
     } else {
-        EC_MASTER_DBG(master, 1, "No app_time received up to now.\n");
+        if (master->active) {
+            EC_MASTER_ERR(master, "No app_time received up to now,"
+                    " but master already active).\n");
+        } else {
+            EC_MASTER_DBG(master, 1, "No app_time received up to now.\n");
+        }
     }
 
     ec_master_request_op(master);
-- 
GitLab