From cd98fe51c1094c8783af08c86bf943570762980c Mon Sep 17 00:00:00 2001 From: Florian Pose Date: Thu, 3 Aug 2006 16:14:26 +0000 Subject: [PATCH] Fixed bug with ec_master_eoe_start() does new coupling all the time. --- master/master.c | 14 +++++++++++--- master/master.h | 2 ++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/master/master.c b/master/master.c index b76bde87..3699ba2d 100644 --- a/master/master.c +++ b/master/master.c @@ -121,6 +121,7 @@ int ec_master_init(ec_master_t *master, /**< EtherCAT master */ master->eoe_timer.data = (unsigned long) master; master->internal_lock = SPIN_LOCK_UNLOCKED; master->eoe_running = 0; + master->eoe_checked = 0; // create workqueue if (!(master->workqueue = create_singlethread_workqueue("EtherCAT"))) { @@ -773,7 +774,7 @@ ssize_t ec_store_master_attribute(struct kobject *kobj, /**< slave's kobject */ /*****************************************************************************/ /** - Starts/Stops Ethernet-over-EtherCAT processing on demand. + Starts Ethernet-over-EtherCAT processing on demand. */ void ec_master_eoe_start(ec_master_t *master /**< EtherCAT master */) @@ -782,12 +783,17 @@ void ec_master_eoe_start(ec_master_t *master /**< EtherCAT master */) ec_slave_t *slave; unsigned int coupled, found; - if (master->eoe_running) return; + if (master->eoe_running || master->eoe_checked) return; + + master->eoe_checked = 1; // if the locking callbacks are not set in operation mode, // the EoE timer my not be started. if (master->mode == EC_MASTER_MODE_OPERATION - && (!master->request_cb || !master->release_cb)) return; + && (!master->request_cb || !master->release_cb)) { + EC_INFO("No EoE processing because of missing locking callbacks.\n"); + return; + } // decouple all EoE handlers list_for_each_entry(eoe, &master->eoe_handlers, list) @@ -843,6 +849,8 @@ void ec_master_eoe_stop(ec_master_t *master /**< EtherCAT master */) { ec_eoe_t *eoe; + master->eoe_checked = 0; + if (!master->eoe_running) return; EC_INFO("Stopping EoE processing.\n"); diff --git a/master/master.h b/master/master.h index c6fdc7cd..3a7f3e69 100644 --- a/master/master.h +++ b/master/master.h @@ -114,6 +114,8 @@ struct ec_master struct timer_list eoe_timer; /**< EoE timer object */ unsigned int eoe_running; /**< non-zero, if EoE processing is active. */ + unsigned int eoe_checked; /**< non-zero, if EoE processing is not + necessary. */ struct list_head eoe_handlers; /**< Ethernet-over-EtherCAT handlers */ spinlock_t internal_lock; /**< spinlock used in idle mode */ int (*request_cb)(void *); /**< lock request callback */