449 slave->sii.boot_tx_mailbox_offset; |
449 slave->sii.boot_tx_mailbox_offset; |
450 slave->configured_tx_mailbox_size = |
450 slave->configured_tx_mailbox_size = |
451 slave->sii.boot_tx_mailbox_size; |
451 slave->sii.boot_tx_mailbox_size; |
452 } |
452 } |
453 |
453 |
|
454 fsm->take_time = 1; |
|
455 |
454 fsm->retries = EC_FSM_RETRIES; |
456 fsm->retries = EC_FSM_RETRIES; |
455 fsm->state = ec_fsm_slave_config_state_mbox_sync; |
457 fsm->state = ec_fsm_slave_config_state_mbox_sync; |
456 } |
458 } |
457 |
459 |
458 /*****************************************************************************/ |
460 /*****************************************************************************/ |
477 " slave %u (datagram state %u).\n", |
479 " slave %u (datagram state %u).\n", |
478 slave->ring_position, datagram->state); |
480 slave->ring_position, datagram->state); |
479 return; |
481 return; |
480 } |
482 } |
481 |
483 |
482 if (datagram->working_counter != 1) { |
484 if (fsm->take_time) { |
|
485 fsm->take_time = 0; |
|
486 fsm->jiffies_start = datagram->jiffies_sent; |
|
487 } |
|
488 |
|
489 /* Because the sync manager configurations are cleared during the last |
|
490 * cycle, some slaves do not immediately respond to the mailbox sync |
|
491 * manager configuration datagram. Therefore, resend the datagram for |
|
492 * a certain time, if the slave does not respond. |
|
493 */ |
|
494 if (datagram->working_counter == 0) { |
|
495 unsigned long diff = datagram->jiffies_received - fsm->jiffies_start; |
|
496 |
|
497 if (diff >= HZ) { |
|
498 slave->error_flag = 1; |
|
499 fsm->state = ec_fsm_slave_config_state_error; |
|
500 EC_ERR("Timeout while configuring mailbox sync managers of" |
|
501 " slave %u.\n", slave->ring_position); |
|
502 return; |
|
503 } |
|
504 else if (slave->master->debug_level) { |
|
505 EC_DBG("Resending after %u ms...\n", |
|
506 (unsigned int) diff * 1000 / HZ); |
|
507 } |
|
508 |
|
509 // send configuration datagram again |
|
510 fsm->retries = EC_FSM_RETRIES; |
|
511 return; |
|
512 } |
|
513 else if (datagram->working_counter != 1) { |
483 slave->error_flag = 1; |
514 slave->error_flag = 1; |
484 fsm->state = ec_fsm_slave_config_state_error; |
515 fsm->state = ec_fsm_slave_config_state_error; |
485 EC_ERR("Failed to set sync managers of slave %u: ", |
516 EC_ERR("Failed to set sync managers of slave %u: ", |
486 slave->ring_position); |
517 slave->ring_position); |
487 ec_datagram_print_wc_error(datagram); |
518 ec_datagram_print_wc_error(datagram); |