--- a/master/fsm.c Tue Oct 24 12:06:59 2006 +0000
+++ b/master/fsm.c Tue Oct 24 15:14:25 2006 +0000
@@ -523,7 +523,6 @@
ec_master_t *master = fsm->master;
ec_slave_t *slave;
char old_state[EC_STATE_STRING_SIZE], new_state[EC_STATE_STRING_SIZE];
- ec_sdo_request_t *request, *next_request;
// check if any slaves are not in the state, they're supposed to be
list_for_each_entry(slave, &master->slaves, list) {
@@ -558,29 +557,28 @@
// Check, if EoE processing has to be started
ec_master_eoe_start(master);
- // check, if there are pending SDO requests
- list_for_each_entry_safe(request, next_request,
- &master->sdo_requests, queue) {
- // TODO: critical section!
- list_del_init(&request->queue);
-
- slave = request->sdo->slave;
-
+ // Check for a pending SDO request
+ if (master->sdo_seq_master != master->sdo_seq_user) {
+ if (master->debug_level)
+ EC_DBG("Processing SDO request...\n");
+ slave = master->sdo_request->sdo->slave;
if (slave->current_state == EC_SLAVE_STATE_INIT
|| !slave->online
|| slave->error_flag) {
- request->return_code = -1;
- wake_up_interruptible(&master->sdo_wait_queue);
- continue;
- }
-
- // start uploading SDO
- fsm->slave = slave;
- fsm->master_state = ec_fsm_master_sdo_request;
- fsm->sdo_request = request;
- ec_fsm_coe_upload(&fsm->fsm_coe, slave, request);
- ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
- return;
+ EC_ERR("Failed to process SDO request, slave %i not ready.\n",
+ slave->ring_position);
+ master->sdo_request->return_code = -1;
+ master->sdo_seq_master++;
+ }
+ else {
+ // start uploading SDO
+ fsm->slave = slave;
+ fsm->master_state = ec_fsm_master_sdo_request;
+ fsm->sdo_request = master->sdo_request;
+ ec_fsm_coe_upload(&fsm->fsm_coe, slave, fsm->sdo_request);
+ ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
+ return;
+ }
}
// check, if slaves have an SDO dictionary to read out.
@@ -1034,7 +1032,7 @@
if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
request->return_code = -1;
- wake_up_interruptible(&master->sdo_wait_queue);
+ master->sdo_seq_master++;
fsm->master_state = ec_fsm_master_start;
fsm->master_state(fsm); // execute immediately
return;
@@ -1043,7 +1041,7 @@
// SDO dictionary fetching finished
request->return_code = 1;
- wake_up_interruptible(&master->sdo_wait_queue);
+ master->sdo_seq_master++;
// restart master state machine.
fsm->master_state = ec_fsm_master_start;