# HG changeset patch
# User Florian Pose <fp@igh-essen.com>
# Date 1224234832 0
# Node ID dd648d1786e93bdf64254dadbfd8eb07d62c3b8c
# Parent  c887af3c92b32bbadaa41a76ce4bc52268a78fe2
Fixed race concerning ec_slave_config_state->operational.

diff -r c887af3c92b3 -r dd648d1786e9 TODO
--- a/TODO	Thu Oct 02 08:52:48 2008 +0000
+++ b/TODO	Fri Oct 17 09:13:52 2008 +0000
@@ -9,7 +9,6 @@
 Version 1.4.0:
 
 * Check for possible race condition in jiffy-based frame timeout calculation.
-* Remove race condition concerning the operational-Flag.
 * Update documentation.
 
 Future issues:
diff -r c887af3c92b3 -r dd648d1786e9 master/fsm_master.c
--- a/master/fsm_master.c	Thu Oct 02 08:52:48 2008 +0000
+++ b/master/fsm_master.c	Fri Oct 17 09:13:52 2008 +0000
@@ -728,6 +728,8 @@
     if (ec_fsm_slave_config_exec(&fsm->fsm_slave_config))
         return;
 
+    fsm->slave->force_config = 0;
+
     // configuration finished
     master->config_busy = 0;
     wake_up_interruptible(&master->config_queue);
diff -r c887af3c92b3 -r dd648d1786e9 master/fsm_slave_config.c
--- a/master/fsm_slave_config.c	Thu Oct 02 08:52:48 2008 +0000
+++ b/master/fsm_slave_config.c	Fri Oct 17 09:13:52 2008 +0000
@@ -172,10 +172,6 @@
         EC_DBG("Configuring slave %u...\n", fsm->slave->ring_position);
     }
     
-    // configuration will be done immediately; therefore reset the
-    // force flag
-    fsm->slave->force_config = 0;
-
     ec_fsm_change_start(fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT);
     ec_fsm_change_exec(fsm->fsm_change);
     fsm->state = ec_fsm_slave_config_state_init;
diff -r c887af3c92b3 -r dd648d1786e9 master/slave_config.c
--- a/master/slave_config.c	Thu Oct 02 08:52:48 2008 +0000
+++ b/master/slave_config.c	Fri Oct 17 09:13:52 2008 +0000
@@ -748,7 +748,8 @@
     state->online = sc->slave ? 1 : 0;
     if (state->online) {
         state->operational =
-            sc->slave->current_state == EC_SLAVE_STATE_OP;
+            sc->slave->current_state == EC_SLAVE_STATE_OP
+            && !sc->slave->force_config;
         state->al_state = sc->slave->current_state;
     } else {
         state->operational = 0;