diff -r 505cf41488a4 -r 9cdd7669dc0b master/fsm_master.c --- a/master/fsm_master.c Thu Jan 10 12:34:58 2013 +0100 +++ b/master/fsm_master.c Thu Jan 10 17:36:41 2013 +0100 @@ -85,8 +85,8 @@ ec_fsm_master_reset(fsm); // init sub-state-machines - ec_fsm_coe_init(&fsm->fsm_coe, fsm->datagram); - ec_fsm_soe_init(&fsm->fsm_soe, fsm->datagram); + ec_fsm_coe_init(&fsm->fsm_coe); + ec_fsm_soe_init(&fsm->fsm_soe); ec_fsm_pdo_init(&fsm->fsm_pdo, &fsm->fsm_coe); ec_fsm_change_init(&fsm->fsm_change, fsm->datagram); ec_fsm_slave_config_init(&fsm->fsm_slave_config, fsm->datagram, @@ -342,6 +342,7 @@ } } master->slave_count = count; + master->fsm_slave = master->slaves; /* start with first device with slaves responding; at least one * has responding slaves, otherwise count would be zero. */ @@ -465,7 +466,7 @@ fsm->slave = slave; fsm->state = ec_fsm_master_state_sdo_request; ec_fsm_coe_transfer(&fsm->fsm_coe, slave, req); - ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately + ec_fsm_coe_exec(&fsm->fsm_coe, fsm->datagram); return 1; } } @@ -495,7 +496,7 @@ for (slave = master->slaves; slave < master->slaves + master->slave_count; slave++) { - ec_fsm_slave_ready(&slave->fsm); + ec_fsm_slave_set_ready(&slave->fsm); } // check, if slaves have an SDO dictionary to read out. @@ -520,7 +521,7 @@ fsm->slave = slave; fsm->state = ec_fsm_master_state_sdo_dictionary; ec_fsm_coe_dictionary(&fsm->fsm_coe, slave); - ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately + ec_fsm_coe_exec(&fsm->fsm_coe, fsm->datagram); // execute immediately fsm->datagram->device_index = fsm->slave->device_index; return; } @@ -1138,7 +1139,7 @@ if (!ec_fsm_sii_success(&fsm->fsm_sii)) { EC_SLAVE_ERR(slave, "Failed to write SII data.\n"); request->state = EC_INT_REQUEST_FAILURE; - wake_up(&master->request_queue); + wake_up_all(&master->request_queue); ec_fsm_master_restart(fsm); return; } @@ -1166,7 +1167,7 @@ // TODO: Evaluate other SII contents! request->state = EC_INT_REQUEST_SUCCESS; - wake_up(&master->request_queue); + wake_up_all(&master->request_queue); // check for another SII write request if (ec_fsm_master_action_process_sii(fsm)) @@ -1186,7 +1187,7 @@ ec_slave_t *slave = fsm->slave; ec_master_t *master = fsm->master; - if (ec_fsm_coe_exec(&fsm->fsm_coe)) { + if (ec_fsm_coe_exec(&fsm->fsm_coe, fsm->datagram)) { return; } @@ -1226,7 +1227,7 @@ return; } - if (ec_fsm_coe_exec(&fsm->fsm_coe)) { + if (ec_fsm_coe_exec(&fsm->fsm_coe, fsm->datagram)) { return; } @@ -1234,14 +1235,14 @@ EC_SLAVE_DBG(fsm->slave, 1, "Failed to process internal SDO request.\n"); request->state = EC_INT_REQUEST_FAILURE; - wake_up(&fsm->master->request_queue); + wake_up_all(&fsm->master->request_queue); ec_fsm_master_restart(fsm); return; } // SDO request finished request->state = EC_INT_REQUEST_SUCCESS; - wake_up(&fsm->master->request_queue); + wake_up_all(&fsm->master->request_queue); EC_SLAVE_DBG(fsm->slave, 1, "Finished internal SDO request.\n");