master/fsm.c
changeset 441 ffa13db95e10
parent 437 ef80f2faa2c5
child 442 6607875255d9
--- a/master/fsm.c	Tue Oct 24 12:06:59 2006 +0000
+++ b/master/fsm.c	Tue Oct 24 15:14:25 2006 +0000
@@ -523,7 +523,6 @@
     ec_master_t *master = fsm->master;
     ec_slave_t *slave;
     char old_state[EC_STATE_STRING_SIZE], new_state[EC_STATE_STRING_SIZE];
-    ec_sdo_request_t *request, *next_request;
 
     // check if any slaves are not in the state, they're supposed to be
     list_for_each_entry(slave, &master->slaves, list) {
@@ -558,29 +557,28 @@
     // Check, if EoE processing has to be started
     ec_master_eoe_start(master);
 
-    // check, if there are pending SDO requests
-    list_for_each_entry_safe(request, next_request,
-                             &master->sdo_requests, queue) {
-        // TODO: critical section!
-        list_del_init(&request->queue);
-
-        slave = request->sdo->slave;
-
+    // Check for a pending SDO request
+    if (master->sdo_seq_master != master->sdo_seq_user) {
+        if (master->debug_level)
+            EC_DBG("Processing SDO request...\n");
+        slave = master->sdo_request->sdo->slave;
         if (slave->current_state == EC_SLAVE_STATE_INIT
             || !slave->online
             || slave->error_flag) {
-            request->return_code = -1;
-            wake_up_interruptible(&master->sdo_wait_queue);
-            continue;
-        }
-
-        // start uploading SDO
-        fsm->slave = slave;
-        fsm->master_state = ec_fsm_master_sdo_request;
-        fsm->sdo_request = request;
-        ec_fsm_coe_upload(&fsm->fsm_coe, slave, request);
-        ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
-        return;
+            EC_ERR("Failed to process SDO request, slave %i not ready.\n",
+                   slave->ring_position);
+            master->sdo_request->return_code = -1;
+            master->sdo_seq_master++;
+        }
+        else {
+            // start uploading SDO
+            fsm->slave = slave;
+            fsm->master_state = ec_fsm_master_sdo_request;
+            fsm->sdo_request = master->sdo_request;
+            ec_fsm_coe_upload(&fsm->fsm_coe, slave, fsm->sdo_request);
+            ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
+            return;
+        }
     }
 
     // check, if slaves have an SDO dictionary to read out.
@@ -1034,7 +1032,7 @@
 
     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
         request->return_code = -1;
-        wake_up_interruptible(&master->sdo_wait_queue);
+        master->sdo_seq_master++;
         fsm->master_state = ec_fsm_master_start;
         fsm->master_state(fsm); // execute immediately
         return;
@@ -1043,7 +1041,7 @@
     // SDO dictionary fetching finished
 
     request->return_code = 1;
-    wake_up_interruptible(&master->sdo_wait_queue);
+    master->sdo_seq_master++;
 
     // restart master state machine.
     fsm->master_state = ec_fsm_master_start;