master/master.c
branchstable-1.5
changeset 2467 74ede087bc85
parent 2465 35611452b785
child 2476 9a0d30056e70
--- a/master/master.c	Tue Dec 04 14:54:12 2012 +0100
+++ b/master/master.c	Tue Dec 04 16:05:23 2012 +0100
@@ -220,7 +220,8 @@
     master->app_cb_data = NULL;
 
     INIT_LIST_HEAD(&master->sii_requests);
-    init_waitqueue_head(&master->sii_queue);
+
+    init_waitqueue_head(&master->request_queue);
 
     // init devices
     for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
@@ -434,8 +435,8 @@
 
     master->dc_ref_clock = NULL;
 
-    // external requests are obsolete, so we wake pending waiters and remove
-    // them from the list
+    // External requests are obsolete, so we wake pending waiters and remove
+    // them from the list.
 
     while (!list_empty(&master->sii_requests)) {
         ec_sii_write_request_t *request =
@@ -445,7 +446,7 @@
         EC_MASTER_WARN(master, "Discarding SII request, slave %u about"
                 " to be deleted.\n", request->slave->ring_position);
         request->state = EC_INT_REQUEST_FAILURE;
-        wake_up(&master->sii_queue);
+        wake_up(&master->request_queue);
     }
 
     for (slave = master->slaves;
@@ -2667,6 +2668,7 @@
 {
     ec_sdo_request_t request;
     ec_slave_t *slave;
+    int ret;
 
     EC_MASTER_DBG(master, 1, "%s(master = 0x%p,"
             " slave_position = %u, index = 0x%04X, subindex = 0x%02X,"
@@ -2681,9 +2683,10 @@
 
     ec_sdo_request_init(&request);
     ecrt_sdo_request_index(&request, index, subindex);
-    if (ec_sdo_request_alloc(&request, data_size)) {
+    ret = ec_sdo_request_alloc(&request, data_size);
+    if (ret) {
         ec_sdo_request_clear(&request);
-        return -ENOMEM;
+        return ret;
     }
 
     memcpy(request.data, data, data_size);
@@ -2702,7 +2705,7 @@
         return -EINVAL;
     }
 
-    EC_SLAVE_DBG(slave, 1, "Schedule SDO download request.\n");
+    EC_SLAVE_DBG(slave, 1, "Scheduling SDO download request.\n");
 
     // schedule request.
     list_add_tail(&request.list, &slave->sdo_requests);
@@ -2710,7 +2713,7 @@
     up(&master->master_sem);
 
     // wait for processing through FSM
-    if (wait_event_interruptible(slave->sdo_queue,
+    if (wait_event_interruptible(master->request_queue,
                 request.state != EC_INT_REQUEST_QUEUED)) {
         // interrupted by signal
         down(&master->master_sem);
@@ -2724,22 +2727,21 @@
         up(&master->master_sem);
     }
 
-    // FIXME slave may become invalid!
-
     // wait until master FSM has finished processing
-    wait_event(slave->sdo_queue, request.state != EC_INT_REQUEST_BUSY);
-
-    EC_SLAVE_DBG(slave, 1, "Finished SDO download request.\n");
+    wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
 
     *abort_code = request.abort_code;
 
     if (request.state == EC_INT_REQUEST_SUCCESS) {
-        return 0;
+        ret = 0;
     } else if (request.errno) {
-        return -request.errno;
+        ret = -request.errno;
     } else {
-        return -EIO;
-    }
+        ret = -EIO;
+    }
+
+    ec_sdo_request_clear(&request);
+    return ret;
 }
 
 /*****************************************************************************/
@@ -2750,6 +2752,7 @@
 {
     ec_sdo_request_t request;
     ec_slave_t *slave;
+    int ret;
 
     EC_MASTER_DBG(master, 1, "%s(master = 0x%p,"
             " slave_position = %u, index = 0x%04X,"
@@ -2764,9 +2767,10 @@
 
     ec_sdo_request_init(&request);
     ecrt_sdo_request_index(&request, index, 0);
-    if (ec_sdo_request_alloc(&request, data_size)) {
+    ret = ec_sdo_request_alloc(&request, data_size);
+    if (ret) {
         ec_sdo_request_clear(&request);
-        return -ENOMEM;
+        return ret;
     }
 
     request.complete_access = 1;
@@ -2786,7 +2790,7 @@
         return -EINVAL;
     }
 
-    EC_SLAVE_DBG(slave, 1, "Schedule SDO download request"
+    EC_SLAVE_DBG(slave, 1, "Scheduling SDO download request"
             " (complete access).\n");
 
     // schedule request.
@@ -2795,7 +2799,7 @@
     up(&master->master_sem);
 
     // wait for processing through FSM
-    if (wait_event_interruptible(slave->sdo_queue,
+    if (wait_event_interruptible(master->request_queue,
                 request.state != EC_INT_REQUEST_QUEUED)) {
         // interrupted by signal
         down(&master->master_sem);
@@ -2809,23 +2813,21 @@
         up(&master->master_sem);
     }
 
-    // FIXME slave may become invalid!
-
     // wait until master FSM has finished processing
-    wait_event(slave->sdo_queue, request.state != EC_INT_REQUEST_BUSY);
-
-    EC_SLAVE_DBG(slave, 1, "Finished SDO download request"
-            " (complete access).\n");
+    wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
 
     *abort_code = request.abort_code;
 
     if (request.state == EC_INT_REQUEST_SUCCESS) {
-        return 0;
+        ret = 0;
     } else if (request.errno) {
-        return -request.errno;
+        ret = -request.errno;
     } else {
-        return -EIO;
-    }
+        ret = -EIO;
+    }
+
+    ec_sdo_request_clear(&request);
+    return ret;
 }
 
 /*****************************************************************************/
@@ -2836,7 +2838,7 @@
 {
     ec_sdo_request_t request;
     ec_slave_t *slave;
-    int retval = 0;
+    int ret = 0;
 
     EC_MASTER_DBG(master, 1, "%s(master = 0x%p,"
             " slave_position = %u, index = 0x%04X, subindex = 0x%02X,"
@@ -2861,7 +2863,7 @@
         return -EINVAL;
     }
 
-    EC_SLAVE_DBG(slave, 1, "Schedule SDO upload request.\n");
+    EC_SLAVE_DBG(slave, 1, "Scheduling SDO upload request.\n");
 
     // schedule request.
     list_add_tail(&request.list, &slave->sdo_requests);
@@ -2869,7 +2871,7 @@
     up(&master->master_sem);
 
     // wait for processing through FSM
-    if (wait_event_interruptible(slave->sdo_queue,
+    if (wait_event_interruptible(master->request_queue,
                 request.state != EC_INT_REQUEST_QUEUED)) {
         // interrupted by signal
         down(&master->master_sem);
@@ -2883,34 +2885,32 @@
         up(&master->master_sem);
     }
 
-    // FIXME slave may become invalid!
-
     // wait until master FSM has finished processing
-    wait_event(slave->sdo_queue, request.state != EC_INT_REQUEST_BUSY);
-
-    EC_SLAVE_DBG(slave, 1, "Finished SDO upload request.\n");
+    wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
 
     *abort_code = request.abort_code;
 
     if (request.state != EC_INT_REQUEST_SUCCESS) {
         *result_size = 0;
         if (request.errno) {
-            retval = -request.errno;
+            ret = -request.errno;
         } else {
-            retval = -EIO;
+            ret = -EIO;
         }
     } else {
         if (request.data_size > target_size) {
             EC_MASTER_ERR(master, "Buffer too small.\n");
-            ec_sdo_request_clear(&request);
-            return -EOVERFLOW;
-        }
-        memcpy(target, request.data, request.data_size);
-        *result_size = request.data_size;
+            ret = -EOVERFLOW;
+        }
+        else {
+            memcpy(target, request.data, request.data_size);
+            *result_size = request.data_size;
+            ret = 0;
+        }
     }
 
     ec_sdo_request_clear(&request);
-    return retval;
+    return ret;
 }
 
 /*****************************************************************************/
@@ -2963,7 +2963,7 @@
     up(&master->master_sem);
 
     // wait for processing through FSM
-    if (wait_event_interruptible(slave->soe_queue,
+    if (wait_event_interruptible(master->request_queue,
                 request.state != EC_INT_REQUEST_QUEUED)) {
         // interrupted by signal
         down(&master->master_sem);
@@ -2977,10 +2977,8 @@
         up(&master->master_sem);
     }
 
-    // FIXME slave may become invalid
-
     // wait until master FSM has finished processing
-    wait_event(slave->soe_queue, request.state != EC_INT_REQUEST_BUSY);
+    wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
 
     if (error_code) {
         *error_code = request.error_code;
@@ -3023,15 +3021,15 @@
         return -EINVAL;
     }
 
+    EC_SLAVE_DBG(slave, 1, "Scheduling SoE read request.\n");
+
     // schedule request.
     list_add_tail(&request.list, &slave->soe_requests);
 
     up(&master->master_sem);
 
-    EC_SLAVE_DBG(slave, 1, "Scheduled SoE read request.\n");
-
     // wait for processing through FSM
-    if (wait_event_interruptible(slave->soe_queue,
+    if (wait_event_interruptible(master->request_queue,
                 request.state != EC_INT_REQUEST_QUEUED)) {
         // interrupted by signal
         down(&master->master_sem);
@@ -3045,17 +3043,13 @@
         up(&master->master_sem);
     }
 
-    // FIXME slave may become invalid
-
     // wait until master FSM has finished processing
-    wait_event(slave->soe_queue, request.state != EC_INT_REQUEST_BUSY);
+    wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
 
     if (error_code) {
         *error_code = request.error_code;
     }
 
-    EC_SLAVE_DBG(slave, 1, "Read %zd bytes via SoE.\n", request.data_size);
-
     if (request.state != EC_INT_REQUEST_SUCCESS) {
         if (result_size) {
             *result_size = 0;