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