master/frame.c
changeset 89 e91ef35c36db
parent 84 b4ae98855cea
child 90 044e97bce4bd
--- a/master/frame.c	Sun Feb 26 12:26:23 2006 +0000
+++ b/master/frame.c	Tue Feb 28 09:09:08 2006 +0000
@@ -405,6 +405,12 @@
 /**
    Sendet einen einzeln Rahmen und wartet auf dessen Empfang.
 
+   Wenn der Working-Counter nicht gesetzt wurde, wird der Rahmen
+   nochmals gesendet.
+
+   \todo Das ist noch nicht schön, da hier zwei Protokollschichten
+   vermischt werden.
+
    \return 0 bei Erfolg, sonst < 0
 */
 
@@ -412,32 +418,49 @@
                           /**< Rahmen zum Senden/Empfangen */
                           )
 {
-    unsigned int tries_left;
-
-    if (unlikely(ec_frame_send(frame) < 0)) {
-        EC_ERR("Frame sending failed!\n");
-        return -1;
-    }
-
-    tries_left = 20;
+    unsigned int timeout_tries_left, response_tries_left;
+    unsigned int tries;
+
+    tries = 0;
+    response_tries_left = 10;
     do
     {
-        udelay(1);
-        ec_device_call_isr(&frame->master->device);
-        tries_left--;
-    }
-    while (unlikely(!ec_device_received(&frame->master->device)
-                    && tries_left));
-
-    if (unlikely(!tries_left)) {
-        EC_ERR("Frame timeout!\n");
-        return -1;
-    }
-
-    if (unlikely(ec_frame_receive(frame) < 0)) {
-        EC_ERR("Frame receiving failed!\n");
-        return -1;
-    }
+        tries++;
+        if (unlikely(ec_frame_send(frame) < 0)) {
+            EC_ERR("Frame sending failed!\n");
+            return -1;
+        }
+
+        timeout_tries_left = 20;
+        do
+        {
+            udelay(1);
+            ec_device_call_isr(&frame->master->device);
+            timeout_tries_left--;
+        }
+        while (unlikely(!ec_device_received(&frame->master->device)
+                        && timeout_tries_left));
+
+        if (unlikely(!timeout_tries_left)) {
+            EC_ERR("Frame timeout!\n");
+            return -1;
+        }
+
+        if (unlikely(ec_frame_receive(frame) < 0)) {
+            EC_ERR("Frame receiving failed!\n");
+            return -1;
+        }
+
+        response_tries_left--;
+    }
+    while (unlikely(!frame->working_counter && response_tries_left));
+
+    if (unlikely(!response_tries_left)) {
+        EC_ERR("No response!");
+        return -1;
+    }
+
+    if (tries > 1) EC_WARN("%i tries necessary...\n", tries);
 
     return 0;
 }