From 1d35113c8583d33467a978b3717dc4e1bd2f4053 Mon Sep 17 00:00:00 2001 From: Gavin Lambert Date: Tue, 14 Apr 2015 09:35:15 -0400 Subject: [PATCH] Abort requests started for slave_configs that don't have any actual slaves. --- master/fsm_master.c | 3 +++ master/master.c | 15 +++++++++++++++ master/master.h | 1 + master/slave_config.c | 30 ++++++++++++++++++++++++++++++ master/slave_config.h | 1 + 5 files changed, 50 insertions(+) diff --git a/master/fsm_master.c b/master/fsm_master.c index eec11a44..2988ecd2 100644 --- a/master/fsm_master.c +++ b/master/fsm_master.c @@ -246,6 +246,9 @@ void ec_fsm_master_state_start( return; } + // check for detached config requests + ec_master_expire_slave_config_requests(fsm->master); + ec_datagram_brd(fsm->datagram, 0x0130, 2); ec_datagram_zero(fsm->datagram); fsm->datagram->device_index = fsm->dev_idx; diff --git a/master/master.c b/master/master.c index d58e7161..943be201 100644 --- a/master/master.c +++ b/master/master.c @@ -1785,6 +1785,21 @@ void ec_master_attach_slave_configs( /*****************************************************************************/ +/** Abort active requests for slave configs without attached slaves. + */ +void ec_master_expire_slave_config_requests( + ec_master_t *master /**< EtherCAT master. */ + ) +{ + ec_slave_config_t *sc; + + list_for_each_entry(sc, &master->configs, list) { + ec_slave_config_expire_disconnected_requests(sc); + } +} + +/*****************************************************************************/ + /** Common implementation for ec_master_find_slave() * and ec_master_find_slave_const(). */ diff --git a/master/master.h b/master/master.h index ddd7c8d7..1446a81e 100644 --- a/master/master.h +++ b/master/master.h @@ -351,6 +351,7 @@ void ec_master_queue_datagram_ext(ec_master_t *, ec_datagram_t *); // misc. void ec_master_set_send_interval(ec_master_t *, unsigned int); void ec_master_attach_slave_configs(ec_master_t *); +void ec_master_expire_slave_config_requests(ec_master_t *); ec_slave_t *ec_master_find_slave(ec_master_t *, uint16_t, uint16_t); const ec_slave_t *ec_master_find_slave_const(const ec_master_t *, uint16_t, uint16_t); diff --git a/master/slave_config.c b/master/slave_config.c index 32b02b70..bb48423b 100755 --- a/master/slave_config.c +++ b/master/slave_config.c @@ -553,6 +553,36 @@ ec_voe_handler_t *ec_slave_config_find_voe_handler( return NULL; } +/*****************************************************************************/ + +/** Expires any requests that have been started on a detached slave. + */ +void ec_slave_config_expire_disconnected_requests( + ec_slave_config_t *sc /**< Slave configuration. */ + ) +{ + ec_sdo_request_t *sdo_req; + ec_reg_request_t *reg_req; + + if (sc->slave) { return; } + + list_for_each_entry(sdo_req, &sc->sdo_requests, list) { + if (sdo_req->state == EC_INT_REQUEST_QUEUED || + sdo_req->state == EC_INT_REQUEST_BUSY) { + EC_CONFIG_DBG(sc, 1, "Aborting SDO request; no slave attached.\n"); + sdo_req->state = EC_INT_REQUEST_FAILURE; + } + } + + list_for_each_entry(reg_req, &sc->reg_requests, list) { + if (reg_req->state == EC_INT_REQUEST_QUEUED || + reg_req->state == EC_INT_REQUEST_BUSY) { + EC_CONFIG_DBG(sc, 1, "Aborting register request; no slave attached.\n"); + reg_req->state = EC_INT_REQUEST_FAILURE; + } + } +} + /****************************************************************************** * Application interface *****************************************************************************/ diff --git a/master/slave_config.h b/master/slave_config.h index a68b79a0..4974f2a9 100755 --- a/master/slave_config.h +++ b/master/slave_config.h @@ -174,6 +174,7 @@ ec_reg_request_t *ec_slave_config_find_reg_request(ec_slave_config_t *, unsigned int); ec_voe_handler_t *ec_slave_config_find_voe_handler(ec_slave_config_t *, unsigned int); +void ec_slave_config_expire_disconnected_requests(ec_slave_config_t *); ec_sdo_request_t *ecrt_slave_config_create_sdo_request_err( ec_slave_config_t *, uint16_t, uint8_t, size_t);