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