master/fsm_coe.c
changeset 1035 7fafc1a7451e
parent 998 05a24788f3b2
child 1037 59f191c9185b
--- a/master/fsm_coe.c	Wed Jun 18 15:03:03 2008 +0000
+++ b/master/fsm_coe.c	Thu Jun 19 07:54:45 2008 +0000
@@ -1024,6 +1024,7 @@
         ec_print_data(data, 10 + request->data_size);
     }
 
+    fsm->request->jiffies_sent = jiffies;
     fsm->retries = EC_FSM_RETRIES;
     fsm->state = ec_fsm_coe_down_request;
 }
@@ -1052,6 +1053,19 @@
     }
 
     if (datagram->working_counter != 1) {
+        if (!datagram->working_counter) {
+            unsigned long diff_ms =
+                (jiffies - fsm->request->jiffies_sent) * 1000 / HZ;
+            if (diff_ms < fsm->request->response_timeout) {
+                if (fsm->slave->master->debug_level) {
+                    EC_DBG("Slave %u did no respond to Sdo download request. "
+                            "Retrying after %u ms...\n",
+                            slave->ring_position, (u32) diff_ms);
+                    // no response; send request datagram again
+                    return;
+                }
+            }
+        }
         fsm->state = ec_fsm_coe_error;
         EC_ERR("Reception of CoE download request failed on slave %u: ",
                 slave->ring_position);
@@ -1253,6 +1267,7 @@
         ec_print_data(data, 10);
     }
 
+    fsm->request->jiffies_sent = jiffies;
     fsm->retries = EC_FSM_RETRIES;
     fsm->state = ec_fsm_coe_up_request;
 }
@@ -1281,6 +1296,19 @@
     }
 
     if (datagram->working_counter != 1) {
+        if (!datagram->working_counter) {
+            unsigned long diff_ms =
+                (jiffies - fsm->request->jiffies_sent) * 1000 / HZ;
+            if (diff_ms < fsm->request->response_timeout) {
+                if (fsm->slave->master->debug_level) {
+                    EC_DBG("Slave %u did no respond to Sdo upload request. "
+                            "Retrying after %u ms...\n",
+                            slave->ring_position, (u32) diff_ms);
+                    // no response; send request datagram again
+                    return;
+                }
+            }
+        }
         fsm->state = ec_fsm_coe_error;
         EC_ERR("Reception of CoE upload request failed on slave %u: ",
                 slave->ring_position);