master/fsm_coe.c
changeset 1800 5bfbb7be5400
parent 1794 94e0e1756dec
child 1822 74e6ac2369f4
--- a/master/fsm_coe.c	Thu Jan 21 11:10:22 2010 +0100
+++ b/master/fsm_coe.c	Sun Jan 31 14:50:37 2010 +0100
@@ -43,12 +43,15 @@
 
 /** Maximum time in ms to wait for responses when reading out the dictionary.
  */
-#define EC_FSM_COE_DICT_TIMEOUT 3000
+#define EC_FSM_COE_DICT_TIMEOUT 1000
 
 #define EC_COE_DOWN_REQ_HEADER_SIZE      10
 #define EC_COE_DOWN_SEG_REQ_HEADER_SIZE  3
 #define EC_COE_DOWN_SEG_MIN_DATA_SIZE    7
 
+#define DEBUG_RETRIES 0
+#define DEBUG_LONG 0
+
 /*****************************************************************************/
 
 void ec_fsm_coe_dict_start(ec_fsm_coe_t *);
@@ -624,8 +627,9 @@
             (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ;
         if (diff_ms >= EC_FSM_COE_DICT_TIMEOUT) {
             fsm->state = ec_fsm_coe_error;
-            EC_ERR("Timeout while waiting for SDO object description "
-                    "response on slave %u.\n", slave->ring_position);
+            EC_ERR("Timeout while waiting for SDO 0x%04x object description "
+                    "response on slave %u.\n", fsm->sdo->index,
+                    slave->ring_position);
             return;
         }
 
@@ -860,8 +864,9 @@
             (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ;
         if (diff_ms >= EC_FSM_COE_DICT_TIMEOUT) {
             fsm->state = ec_fsm_coe_error;
-            EC_ERR("Timeout while waiting for SDO entry description response "
-                    "on slave %u.\n", slave->ring_position);
+            EC_ERR("Timeout while waiting for SDO entry 0x%04x:%x"
+                    " description response on slave %u.\n",
+                    fsm->sdo->index, fsm->subindex, slave->ring_position);
             return;
         }
 
@@ -1196,6 +1201,7 @@
 {
     ec_datagram_t *datagram = fsm->datagram;
     ec_slave_t *slave = fsm->slave;
+    unsigned long diff_ms;
 
     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
         return; // FIXME: check for response first?
@@ -1208,27 +1214,39 @@
         return;
     }
 
+    diff_ms = (jiffies - fsm->request->jiffies_sent) * 1000 / HZ;
+
     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 DEBUG_RETRIES
                 if (fsm->slave->master->debug_level) {
                     EC_DBG("Slave %u did not respond to SDO download request. "
                             "Retrying after %u ms...\n",
                             slave->ring_position, (u32) diff_ms);
                 }
+#endif
                 // 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);
+        EC_ERR("Reception of CoE download request for SDO 0x%04x:%x failed"
+                " with timeout after %u ms on slave %u: ",
+                fsm->request->index, fsm->request->subindex, (u32) diff_ms,
+                fsm->slave->ring_position);
         ec_datagram_print_wc_error(datagram);
         return;
     }
 
+#if DEBUG_LONG
+    if (diff_ms > 200) {
+        EC_WARN("SDO 0x%04x:%x download took %u ms on slave %u.\n",
+                fsm->request->index, fsm->request->subindex, (u32) diff_ms,
+                fsm->slave->ring_position);
+    }
+#endif
+
     fsm->jiffies_start = datagram->jiffies_sent;
 
     ec_slave_mbox_prepare_check(slave, datagram); // can not fail.
@@ -1271,8 +1289,10 @@
             (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ;
         if (diff_ms >= fsm->request->response_timeout) {
             fsm->state = ec_fsm_coe_error;
-            EC_ERR("Timeout while waiting for SDO download response on "
-                    "slave %u.\n", slave->ring_position);
+            EC_ERR("Timeout after %u ms while waiting for SDO 0x%04x:%x"
+                    " download response on slave %u.\n", (u32) diff_ms,
+                    fsm->request->index, fsm->request->subindex, 
+                    slave->ring_position);
             return;
         }
 
@@ -1689,6 +1709,7 @@
 {
     ec_datagram_t *datagram = fsm->datagram;
     ec_slave_t *slave = fsm->slave;
+    unsigned long diff_ms;
 
     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
         return; // FIXME: check for response first?
@@ -1701,27 +1722,39 @@
         return;
     }
 
+    diff_ms = (jiffies - fsm->request->jiffies_sent) * 1000 / HZ;
+
     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 DEBUG_RETRIES
                 if (fsm->slave->master->debug_level) {
                     EC_DBG("Slave %u did not respond to SDO upload request. "
                             "Retrying after %u ms...\n",
                             slave->ring_position, (u32) diff_ms);
                 }
+#endif
                 // 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);
+        EC_ERR("Reception of CoE upload request for SDO 0x%04x:%x failed"
+                " with timeout after %u ms on slave %u: ",
+                fsm->request->index, fsm->request->subindex, (u32) diff_ms,
+                fsm->slave->ring_position);
         ec_datagram_print_wc_error(datagram);
         return;
     }
 
+#if DEBUG_LONG
+    if (diff_ms > 200) {
+        EC_WARN("SDO 0x%04x:%x upload took %u ms on slave %u.\n",
+                fsm->request->index, fsm->request->subindex, (u32) diff_ms,
+                fsm->slave->ring_position);
+    }
+#endif
+
     fsm->jiffies_start = datagram->jiffies_sent;
 
     ec_slave_mbox_prepare_check(slave, datagram); // can not fail.
@@ -1764,8 +1797,10 @@
             (datagram->jiffies_received - fsm->jiffies_start) * 1000 / HZ;
         if (diff_ms >= fsm->request->response_timeout) {
             fsm->state = ec_fsm_coe_error;
-            EC_ERR("Timeout while waiting for SDO upload response on "
-                    "slave %u.\n", slave->ring_position);
+            EC_ERR("Timeout after %u ms while waiting for SDO 0x%04x:%x"
+                    " upload response on slave %u.\n", (u32) diff_ms,
+                    fsm->request->index, fsm->request->subindex,
+                    slave->ring_position);
             return;
         }