diff -r e6cc33cac6a2 -r 35611452b785 master/fsm_slave.c --- a/master/fsm_slave.c Tue Dec 04 14:26:30 2012 +0100 +++ b/master/fsm_slave.c Tue Dec 04 14:49:23 2012 +0100 @@ -457,43 +457,43 @@ ) { ec_slave_t *slave = fsm->slave; - ec_master_soe_request_t *req, *next; - - // search the first request to be processed - list_for_each_entry_safe(req, next, &slave->soe_requests, list) { - - list_del_init(&req->list); // dequeue - if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) { - EC_SLAVE_WARN(slave, "Aborting SoE request," - " slave has error flag set.\n"); - req->req.state = EC_INT_REQUEST_FAILURE; - wake_up(&slave->soe_queue); - fsm->state = ec_fsm_slave_state_idle; - return 0; - } - - if (slave->current_state == EC_SLAVE_STATE_INIT) { - EC_SLAVE_WARN(slave, "Aborting SoE request, slave is in INIT.\n"); - req->req.state = EC_INT_REQUEST_FAILURE; - wake_up(&slave->soe_queue); - fsm->state = ec_fsm_slave_state_idle; - return 0; - } - - req->req.state = EC_INT_REQUEST_BUSY; - - // Found pending request. Execute it! - EC_SLAVE_DBG(slave, 1, "Processing SoE request...\n"); - - // Start SoE transfer - fsm->soe_request = &req->req; - fsm->state = ec_fsm_slave_state_soe_request; - ec_fsm_soe_transfer(&fsm->fsm_soe, slave, &req->req); - ec_fsm_soe_exec(&fsm->fsm_soe); // execute immediately - ec_master_queue_external_datagram(fsm->slave->master, fsm->datagram); - return 1; - } - return 0; + ec_soe_request_t *req; + + if (list_empty(&slave->soe_requests)) { + return 0; + } + + // take the first request to be processed + req = list_entry(slave->soe_requests.next, ec_soe_request_t, list); + list_del_init(&req->list); // dequeue + + if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) { + EC_SLAVE_WARN(slave, "Aborting SoE request," + " slave has error flag set.\n"); + req->state = EC_INT_REQUEST_FAILURE; + wake_up(&slave->soe_queue); + return 0; + } + + if (slave->current_state == EC_SLAVE_STATE_INIT) { + EC_SLAVE_WARN(slave, "Aborting SoE request, slave is in INIT.\n"); + req->state = EC_INT_REQUEST_FAILURE; + wake_up(&slave->soe_queue); + return 0; + } + + req->state = EC_INT_REQUEST_BUSY; + + // Found pending request. Execute it! + EC_SLAVE_DBG(slave, 1, "Processing SoE request...\n"); + + // Start SoE transfer + fsm->soe_request = req; + fsm->state = ec_fsm_slave_state_soe_request; + ec_fsm_soe_transfer(&fsm->fsm_soe, slave, req); + ec_fsm_soe_exec(&fsm->fsm_soe); // execute immediately + ec_master_queue_external_datagram(fsm->slave->master, fsm->datagram); + return 1; } /*****************************************************************************/