master/fsm_slave_config.c
changeset 1347 41360ffdcb14
parent 1345 b715e719eeea
child 1363 11c0b2caa253
equal deleted inserted replaced
1346:eecc75468e08 1347:41360ffdcb14
   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);