From b4915777bfcef4c612bc1d759bd6bc493484acd8 Mon Sep 17 00:00:00 2001 From: Florian Pose <fp@igh-essen.com> Date: Fri, 2 Mar 2007 14:35:49 +0000 Subject: [PATCH] Fixed signal issue in EEPROM writing code. --- master/fsm_master.c | 7 ++++--- master/fsm_master.h | 1 + master/slave.c | 9 +++++---- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/master/fsm_master.c b/master/fsm_master.c index 25ace736..b0525b7a 100644 --- a/master/fsm_master.c +++ b/master/fsm_master.c @@ -298,6 +298,7 @@ int ec_fsm_master_action_process_eeprom( request = list_entry(master->eeprom_requests.next, ec_eeprom_write_request_t, list); list_del_init(&request->list); // dequeue + request->state = EC_EEPROM_REQ_BUSY; up(&master->eeprom_sem); slave = request->slave; @@ -305,7 +306,7 @@ int ec_fsm_master_action_process_eeprom( EC_ERR("Discarding EEPROM data, slave %i not ready.\n", slave->ring_position); request->state = EC_EEPROM_REQ_ERROR; - wake_up_interruptible(&master->eeprom_queue); + wake_up(&master->eeprom_queue); continue; } @@ -794,7 +795,7 @@ void ec_fsm_master_state_write_eeprom(ec_fsm_master_t *fsm /**< master state mac EC_ERR("Failed to write EEPROM contents to slave %i.\n", slave->ring_position); request->state = EC_EEPROM_REQ_ERROR; - wake_up_interruptible(&master->eeprom_queue); + wake_up(&master->eeprom_queue); fsm->state = ec_fsm_master_state_error; return; } @@ -812,7 +813,7 @@ void ec_fsm_master_state_write_eeprom(ec_fsm_master_t *fsm /**< master state mac // finished writing EEPROM EC_INFO("Finished writing EEPROM of slave %i.\n", slave->ring_position); request->state = EC_EEPROM_REQ_COMPLETED; - wake_up_interruptible(&master->eeprom_queue); + wake_up(&master->eeprom_queue); // TODO: Evaluate new EEPROM contents! diff --git a/master/fsm_master.h b/master/fsm_master.h index ad5399d6..1080b206 100644 --- a/master/fsm_master.h +++ b/master/fsm_master.h @@ -58,6 +58,7 @@ typedef enum { EC_EEPROM_REQ_QUEUED, + EC_EEPROM_REQ_BUSY, EC_EEPROM_REQ_COMPLETED, EC_EEPROM_REQ_ERROR } diff --git a/master/slave.c b/master/slave.c index 74ecf7d1..07db78a7 100644 --- a/master/slave.c +++ b/master/slave.c @@ -832,20 +832,21 @@ ssize_t ec_slave_write_eeprom(ec_slave_t *slave, /**< EtherCAT slave */ up(&master->eeprom_sem); // wait for processing through FSM - while (wait_event_interruptible(master->eeprom_queue, + if (wait_event_interruptible(master->eeprom_queue, request.state != EC_EEPROM_REQ_QUEUED)) { // interrupted by signal down(&master->eeprom_sem); - if (!list_empty(&request.list)) { - // still queued: safely dequeue + if (request.state == EC_EEPROM_REQ_QUEUED) { list_del(&request.list); up(&master->eeprom_sem); - return -EINTR; + return -EPERM; } // request processing: interrupt not possible. up(&master->eeprom_sem); } + wait_event(master->eeprom_queue, request.state != EC_EEPROM_REQ_BUSY); + return request.state == EC_EEPROM_REQ_COMPLETED ? size : -EIO; } -- GitLab