Allow bus configuration when link is down.
authorFlorian Pose <fp@igh-essen.com>
Tue, 19 Feb 2008 09:58:48 +0000
changeset 794 684dea874956
parent 793 3b297ff8284f
child 795 c695e53940d4
Allow bus configuration when link is down.
examples/mini/mini.c
master/fsm_master.c
master/master.c
master/module.c
--- a/examples/mini/mini.c	Tue Feb 19 09:21:13 2008 +0000
+++ b/examples/mini/mini.c	Tue Feb 19 09:58:48 2008 +0000
@@ -86,7 +86,7 @@
 
 const static ec_pdo_entry_reg_t domain1_regs[] = {
     {0, 1, Beckhoff_EL3162, 0x3101, 2, &off_ana_in},
-    {0, 2, Beckhoff_EL4102, 0x3001, 1, &off_ana_out},
+    //{0, 2, Beckhoff_EL4102, 0x3001, 1, &off_ana_out},
     {}
 };
 #endif
--- a/master/fsm_master.c	Tue Feb 19 09:21:13 2008 +0000
+++ b/master/fsm_master.c	Tue Feb 19 09:58:48 2008 +0000
@@ -845,6 +845,8 @@
     if (datagram->state != EC_DATAGRAM_RECEIVED) {
         EC_ERR("Failed to receive address clearing datagram (state %i).\n",
                 datagram->state);
+        master->scan_state = EC_REQUEST_FAILURE;
+        wake_up_interruptible(&master->scan_queue);
         fsm->state = ec_fsm_master_state_error;
         return;
     }
--- a/master/master.c	Tue Feb 19 09:21:13 2008 +0000
+++ b/master/master.c	Tue Feb 19 09:58:48 2008 +0000
@@ -126,7 +126,7 @@
     
     INIT_LIST_HEAD(&master->configs);
 
-    master->scan_state = EC_REQUEST_IN_PROGRESS;
+    master->scan_state = EC_REQUEST_COMPLETE;
     master->allow_scan = 1;
     init_MUTEX(&master->scan_sem);
     init_waitqueue_head(&master->scan_queue);
@@ -454,15 +454,20 @@
     if (master->debug_level)
         EC_DBG("Waiting for pending slave configuration returned.\n");
 
+    if (master->debug_level)
+        EC_DBG("Disable scanning, current scan state: %u\n",
+                master->scan_state);
     down(&master->scan_sem);
     master->allow_scan = 0; // 'lock' the slave list
     up(&master->scan_sem);
 
-    // wait for slave scan to complete
-    if (wait_event_interruptible(master->scan_queue,
-                master->scan_state != EC_REQUEST_IN_PROGRESS)) {
-        EC_INFO("Waiting for slave scan interrupted by signal.\n");
-        goto out_allow;
+    if (master->scan_state == EC_REQUEST_IN_PROGRESS) {
+        // wait for slave scan to complete
+        if (wait_event_interruptible(master->scan_queue,
+                    master->scan_state != EC_REQUEST_IN_PROGRESS)) {
+            EC_INFO("Waiting for slave scan interrupted by signal.\n");
+            goto out_allow;
+        }
     }
 
     if (master->debug_level)
@@ -1347,19 +1352,21 @@
     // request slave configuration
     down(&master->config_sem);
     master->allow_config = 1; // request the current configuration
-    master->config_state = EC_REQUEST_IN_PROGRESS;
     up(&master->config_sem);
 
-    // wait for configuration to complete
-    if (wait_event_interruptible(master->config_queue,
-                master->config_state != EC_REQUEST_IN_PROGRESS)) {
-        EC_INFO("Waiting for configuration interrupted by signal.\n");
-        return -1;
-    }
-
-    if (master->config_state != EC_REQUEST_COMPLETE) {
-        EC_ERR("Failed to configure slaves.\n");
-        return -1;
+    if (master->main_device.link_state) {
+        // wait for configuration to complete
+        master->config_state = EC_REQUEST_IN_PROGRESS;
+        if (wait_event_interruptible(master->config_queue,
+                    master->config_state != EC_REQUEST_IN_PROGRESS)) {
+            EC_INFO("Waiting for configuration interrupted by signal.\n");
+            return -1;
+        }
+
+        if (master->config_state != EC_REQUEST_COMPLETE) {
+            EC_ERR("Failed to configure slaves.\n");
+            return -1;
+        }
     }
     
     // restart EoE process and master thread with new locking
--- a/master/module.c	Tue Feb 19 09:21:13 2008 +0000
+++ b/master/module.c	Tue Feb 19 09:58:48 2008 +0000
@@ -577,11 +577,6 @@
 
     up(&master->device_sem);
 
-    if (!master->main_device.link_state) {
-        EC_ERR("Link is DOWN.\n");
-        goto out_module_put;
-    }
-
     if (ec_master_enter_operation_mode(master)) {
         EC_ERR("Failed to enter OPERATION mode!\n");
         goto out_module_put;