From 6324af44e17140228583810261c0953efde407b0 Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Mon, 20 Mar 2006 13:36:10 +0000
Subject: [PATCH] Do-Schleifen ersetzt.

---
 master/canopen.c | 14 ++++++++------
 master/master.c  | 28 ++++++++++++++-------------
 master/slave.c   | 49 +++++++++++++++++++++++-------------------------
 3 files changed, 46 insertions(+), 45 deletions(-)

diff --git a/master/canopen.c b/master/canopen.c
index 3b3a5a24..373bde48 100644
--- a/master/canopen.c
+++ b/master/canopen.c
@@ -194,8 +194,10 @@ int ecrt_slave_sdo_read(ec_slave_t *slave, /**< EtherCAT-Slave */
     start = get_cycles();
     timeout = cpu_khz; // 1ms
 
-    do
+    while (1)
     {
+        udelay(10);
+
         ec_command_init_nprd(&command, slave->station_address, 0x808, 8);
         if (unlikely(ec_master_simple_io(master, &command))) {
             EC_ERR("Mailbox checking failed on slave %i!\n",
@@ -208,12 +210,12 @@ int ecrt_slave_sdo_read(ec_slave_t *slave, /**< EtherCAT-Slave */
         if (EC_READ_U8(command.data + 5) & 8) { // Written bit is high
             break;
         }
-    }
-    while (likely((end - start) < timeout));
 
-    if (unlikely((end - start) >= timeout)) {
-        EC_ERR("Mailbox check on slave %i timed out.\n", slave->ring_position);
-        return -1;
+        if (unlikely((end - start) >= timeout)) {
+            EC_ERR("Mailbox check on slave %i timed out.\n",
+                   slave->ring_position);
+            return -1;
+        }
     }
 
     ec_command_init_nprd(&command, slave->station_address, 0x18F6, 0xF6);
diff --git a/master/master.c b/master/master.c
index c9233c04..6e294108 100644
--- a/master/master.c
+++ b/master/master.c
@@ -369,13 +369,15 @@ int ec_master_simple_io(ec_master_t *master, /**< EtherCAT-Master */
     unsigned int response_tries_left;
 
     response_tries_left = 10;
-    do
+
+    while (1)
     {
         ec_master_queue_command(master, command);
         ecrt_master_sync_io(master);
 
         if (command->state == EC_CMD_RECEIVED) {
-            break;
+            if (likely(command->working_counter))
+                return 0;
         }
         else if (command->state == EC_CMD_TIMEOUT) {
             EC_ERR("Simple-IO TIMEOUT!\n");
@@ -388,15 +390,12 @@ int ec_master_simple_io(ec_master_t *master, /**< EtherCAT-Master */
 
         // Keine direkte Antwort. Dem Slave Zeit lassen...
         udelay(10);
-    }
-    while (unlikely(!command->working_counter && --response_tries_left));
 
-    if (unlikely(!response_tries_left)) {
-        EC_ERR("No response in simple-IO!\n");
-        return -1;
+        if (unlikely(--response_tries_left)) {
+            EC_ERR("No response in simple-IO!\n");
+            return -1;
+        }
     }
-
-    return 0;
 }
 
 /*****************************************************************************/
@@ -860,7 +859,8 @@ void ecrt_master_sync_io(ec_master_t *master)
     t_start = get_cycles(); // Sendezeit nehmen
     t_timeout = master->timeout * cpu_khz / 1000;
 
-    do {
+    while (1)
+    {
         ec_device_call_isr(master->device);
 
         t_end = get_cycles(); // Aktuelle Zeit nehmen
@@ -873,7 +873,9 @@ void ecrt_master_sync_io(ec_master_t *master)
             else if (command->state == EC_CMD_SENT)
                 commands_sent++;
         }
-    } while (commands_sent);
+
+        if (!commands_sent) break;
+    }
 
     // Zeit abgelaufen. Alle verbleibenden Kommandos entfernen.
     list_for_each_entry_safe(command, next, &master->commands, list) {
@@ -983,10 +985,10 @@ void ecrt_master_prepare_async_io(ec_master_t *master)
     t_timeout = master->timeout * cpu_khz / 1000;
 
     // Aktiv warten!
-    do {
+    while (1) {
         t_end = get_cycles();
+        if (t_end - t_start >= t_timeout) break;
     }
-    while (t_end - t_start < t_timeout);
 }
 
 /*****************************************************************************/
diff --git a/master/slave.c b/master/slave.c
index 98d95457..69f7f347 100644
--- a/master/slave.c
+++ b/master/slave.c
@@ -152,8 +152,10 @@ int ec_slave_sii_read(ec_slave_t *slave,
     start = get_cycles();
     timeout = cpu_khz; // 1ms
 
-    do
+    while (1)
     {
+        udelay(10);
+
         ec_command_init_nprd(&command, slave->station_address, 0x502, 10);
         if (unlikely(ec_master_simple_io(slave->master, &command))) {
             EC_ERR("Getting SII-read status failed on slave %i!\n",
@@ -165,17 +167,14 @@ int ec_slave_sii_read(ec_slave_t *slave,
 
         if (likely((EC_READ_U8(command.data + 1) & 0x81) == 0)) {
             memcpy(target, command.data + 6, 4);
-            break;
+            return 0;
         }
-    }
-    while (likely((end - start) < timeout));
 
-    if (unlikely((end - start) >= timeout)) {
-        EC_ERR("SSI-read. Slave %i timed out!\n", slave->ring_position);
-        return -1;
+        if (unlikely((end - start) >= timeout)) {
+            EC_ERR("SSI-read. Slave %i timed out!\n", slave->ring_position);
+            return -1;
+        }
     }
-
-    return 0;
 }
 
 /*****************************************************************************/
@@ -208,8 +207,10 @@ void ec_slave_state_ack(ec_slave_t *slave,
     start = get_cycles();
     timeout = cpu_khz; // 1ms
 
-    do
+    while (1)
     {
+        udelay(100); // Dem Slave etwas Zeit lassen...
+
         ec_command_init_nprd(&command, slave->station_address, 0x0130, 2);
         if (unlikely(ec_master_simple_io(slave->master, &command))) {
             EC_WARN("State %02X acknowledge checking failed on slave %i!\n",
@@ -231,13 +232,12 @@ void ec_slave_state_ack(ec_slave_t *slave,
                     slave->ring_position);
             return;
         }
-    }
-    while (likely((end - start) < timeout));
 
-    if (unlikely((end - start) >= timeout)) {
-        EC_WARN("Could not check state acknowledgement %02X of slave %i -"
-                " Timeout while checking!\n", state, slave->ring_position);
-        return;
+        if (unlikely((end - start) >= timeout)) {
+            EC_WARN("Could not check state acknowledgement %02X of slave %i -"
+                    " Timeout while checking!\n", state, slave->ring_position);
+            return;
+        }
     }
 }
 
@@ -271,7 +271,7 @@ int ec_slave_state_change(ec_slave_t *slave,
     start = get_cycles();
     timeout = cpu_khz; // 1ms
 
-    do
+    while (1)
     {
         udelay(100); // Dem Slave etwas Zeit lassen...
 
@@ -294,18 +294,15 @@ int ec_slave_state_change(ec_slave_t *slave,
 
         if (likely(EC_READ_U8(command.data) == (state & 0x0F))) {
             // State change successful
-            break;
+            return 0;
         }
-    }
-    while (likely((end - start) < timeout));
 
-    if (unlikely((end - start) >= timeout)) {
-        EC_ERR("Could not check state %02X of slave %i - Timeout!\n", state,
-               slave->ring_position);
-        return -1;
+        if (unlikely((end - start) >= timeout)) {
+            EC_ERR("Could not check state %02X of slave %i - Timeout!\n",
+                   state, slave->ring_position);
+            return -1;
+        }
     }
-
-    return 0;
 }
 
 /*****************************************************************************/
-- 
GitLab