From 515a66aa8ea8ea4c8cffb70c27d39d384cb91b06 Mon Sep 17 00:00:00 2001 From: Florian Pose Date: Fri, 17 Apr 2009 12:41:57 +0000 Subject: [PATCH] Clear slave list on link down. --- NEWS | 1 + TODO | 1 - master/fsm_master.c | 11 +++++++++++ master/fsm_master.h | 1 + 4 files changed, 13 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index afe5ebd6..316ee76e 100644 --- a/NEWS +++ b/NEWS @@ -32,6 +32,7 @@ Changes since 1.4.0: * Added 64-bit data access macros to application header. * Added debug level for all masters as a module parameter. Thanks to Erwin Burgstaller. +* Clear slave list on link down. Changes in 1.4.0: diff --git a/TODO b/TODO index 50129619..6afd5b32 100644 --- a/TODO +++ b/TODO @@ -19,7 +19,6 @@ Version 1.5.0: * Re-work EoE code. * Replace locking callbacks. * Implement EoE callbacks for library. -* Clear slave list on link down. * Rescan command. * Override sync manager size? * Remove ecrt_domain_state()? diff --git a/master/fsm_master.c b/master/fsm_master.c index 00f8d1f5..5fa85ba3 100644 --- a/master/fsm_master.c +++ b/master/fsm_master.c @@ -73,6 +73,7 @@ void ec_fsm_master_init( fsm->datagram = datagram; fsm->state = ec_fsm_master_state_start; fsm->idle = 0; + fsm->link_state = 0; fsm->slaves_responding = 0; fsm->topology_change_pending = 0; fsm->slave_states = EC_SLAVE_STATE_UNKNOWN; @@ -194,6 +195,16 @@ void ec_fsm_master_state_broadcast( EC_INFO("%u slave(s) responding.\n", fsm->slaves_responding); } + if (fsm->link_state && !master->main_device.link_state) { // link went down + // clear slave list +#ifdef EC_EOE + ec_master_eoe_stop(master); + ec_master_clear_eoe_handlers(master); +#endif + ec_master_clear_slaves(master); + } + fsm->link_state = master->main_device.link_state; + if (datagram->state != EC_DATAGRAM_RECEIVED) { // link is down ec_fsm_master_restart(fsm); return; diff --git a/master/fsm_master.h b/master/fsm_master.h index c6bf7a51..8588301c 100644 --- a/master/fsm_master.h +++ b/master/fsm_master.h @@ -107,6 +107,7 @@ struct ec_fsm_master { void (*state)(ec_fsm_master_t *); /**< master state function */ int idle; /**< state machine is in idle phase */ unsigned long scan_jiffies; /**< beginning of slave scanning */ + uint8_t link_state; /**< Last main device link state. */ unsigned int slaves_responding; /**< number of responding slaves */ unsigned int topology_change_pending; /**< bus topology changed */ ec_slave_state_t slave_states; /**< states of responding slaves */