258 master->scan_busy = 0; |
258 master->scan_busy = 0; |
259 wake_up_interruptible(&master->scan_queue); |
259 wake_up_interruptible(&master->scan_queue); |
260 fsm->state = ec_fsm_master_state_error; |
260 fsm->state = ec_fsm_master_state_error; |
261 return; |
261 return; |
262 } |
262 } |
|
263 |
|
264 // do not force reconfiguration in operation mode to avoid |
|
265 // unnecesssary process data interruptions |
|
266 if (master->mode != EC_MASTER_MODE_OPERATION) |
|
267 slave->force_config = 1; |
263 |
268 |
264 list_add_tail(&slave->list, &master->slaves); |
269 list_add_tail(&slave->list, &master->slaves); |
265 } |
270 } |
266 |
271 |
267 // broadcast clear all station addresses |
272 // broadcast clear all station addresses |
512 ec_slave_t *slave = fsm->slave; |
517 ec_slave_t *slave = fsm->slave; |
513 |
518 |
514 // Does the slave have to be configured? |
519 // Does the slave have to be configured? |
515 if (!slave->error_flag |
520 if (!slave->error_flag |
516 && (slave->current_state != slave->requested_state |
521 && (slave->current_state != slave->requested_state |
517 || !slave->self_configured)) { |
522 || slave->force_config)) { |
518 // Start slave configuration, if it is allowed. |
523 // Start slave configuration, if it is allowed. |
519 down(&master->config_sem); |
524 down(&master->config_sem); |
520 if (!master->allow_config) { |
525 if (!master->allow_config) { |
521 up(&master->config_sem); |
526 up(&master->config_sem); |
522 } else { |
527 } else { |
523 master->config_busy = 1; |
528 master->config_busy = 1; |
524 up(&master->config_sem); |
529 up(&master->config_sem); |
525 |
530 |
526 if (master->debug_level) { |
531 if (master->debug_level) { |
527 char old_state[EC_STATE_STRING_SIZE]; |
532 char old_state[EC_STATE_STRING_SIZE], |
|
533 new_state[EC_STATE_STRING_SIZE]; |
528 ec_state_string(slave->current_state, old_state); |
534 ec_state_string(slave->current_state, old_state); |
529 if (slave->current_state != slave->requested_state) { |
535 ec_state_string(slave->requested_state, new_state); |
530 char new_state[EC_STATE_STRING_SIZE]; |
536 EC_DBG("Changing state of slave %u from %s to %s%s.\n", |
531 ec_state_string(slave->requested_state, new_state); |
537 slave->ring_position, old_state, new_state, |
532 EC_DBG("Changing state of slave %u (%s -> %s).\n", |
538 slave->force_config ? " (forced)" : ""); |
533 slave->ring_position, old_state, new_state); |
|
534 } else if (!slave->self_configured) { |
|
535 EC_DBG("Reconfiguring slave %u (%s).\n", |
|
536 slave->ring_position, old_state); |
|
537 } |
|
538 } |
539 } |
|
540 |
|
541 // configuration will be done immediately; therefore reset the |
|
542 // force flag |
|
543 slave->force_config = 0; |
539 |
544 |
540 fsm->idle = 0; |
545 fsm->idle = 0; |
541 fsm->state = ec_fsm_master_state_configure_slave; |
546 fsm->state = ec_fsm_master_state_configure_slave; |
542 ec_fsm_slave_config_start(&fsm->fsm_slave_config, slave); |
547 ec_fsm_slave_config_start(&fsm->fsm_slave_config, slave); |
543 fsm->state(fsm); // execute immediately |
548 fsm->state(fsm); // execute immediately |