From 928469a35722add3db6a927100266e3eaa9617c8 Mon Sep 17 00:00:00 2001
From: Florian Pose <fp@igh-essen.com>
Date: Thu, 3 May 2007 14:29:21 +0000
Subject: [PATCH] Introduced frames_timed_out flag to notice bus failure when
 link down is not detected.

---
 master/master.c | 8 +++++++-
 master/master.h | 2 ++
 2 files changed, 9 insertions(+), 1 deletion(-)

diff --git a/master/master.c b/master/master.c
index 79ab1ed6..eebb3c4b 100644
--- a/master/master.c
+++ b/master/master.c
@@ -453,6 +453,7 @@ int ec_master_enter_operation_mode(ec_master_t *master /**< EtherCAT master */)
 
     master->mode = EC_MASTER_MODE_OPERATION;
     master->pdo_slaves_offline = 0; // assume all PDO slaves online
+    master->frames_timed_out = 0;
     master->ext_request_cb = NULL;
     master->ext_release_cb = NULL;
     master->ext_cb_data = NULL;
@@ -1485,6 +1486,7 @@ void ecrt_master_receive(ec_master_t *master /**< EtherCAT master */)
 {
     ec_datagram_t *datagram, *next;
     cycles_t cycles_timeout;
+    unsigned int frames_timed_out = 0;
 
     // receive datagrams
     ec_device_poll(&master->main_device);
@@ -1497,12 +1499,15 @@ void ecrt_master_receive(ec_master_t *master /**< EtherCAT master */)
 
         if (master->main_device.cycles_poll - datagram->cycles_sent
             > cycles_timeout) {
+            frames_timed_out = 1;
             list_del_init(&datagram->queue);
             datagram->state = EC_DATAGRAM_TIMED_OUT;
             master->stats.timeouts++;
             ec_master_output_stats(master);
         }
     }
+
+    master->frames_timed_out = frames_timed_out;
 }
 
 /*****************************************************************************/
@@ -1563,7 +1568,8 @@ void ecrt_master_get_status(const ec_master_t *master, /**< EtherCAT master */
         )
 {
     status->bus_status =
-        master->pdo_slaves_offline ? EC_BUS_FAILURE : EC_BUS_OK;
+        (master->pdo_slaves_offline || master->frames_timed_out)
+        ? EC_BUS_FAILURE : EC_BUS_OK;
     status->bus_tainted = master->fsm.tainted; 
     status->slaves_responding = master->fsm.slaves_responding;
 }
diff --git a/master/master.h b/master/master.h
index 9d7d2397..11b51325 100644
--- a/master/master.h
+++ b/master/master.h
@@ -137,6 +137,8 @@ struct ec_master
     unsigned int pdo_slaves_offline; /** number of slaves, for which PDOs
                                        were registered and that are offline
                                        (used for bus status) */
+    unsigned int frames_timed_out; /**< there were frame timeouts in the last
+                                     call to ecrt_master_receive() */
 
     int thread_id; /**< master thread PID */
     struct completion thread_exit; /**< thread completion object */
-- 
GitLab