master/fsm.c
changeset 446 8fede404c01f
parent 442 6607875255d9
child 448 e4b76dc7910c
equal deleted inserted replaced
445:3b7eec329112 446:8fede404c01f
    54 void ec_fsm_master_configure_slave(ec_fsm_t *);
    54 void ec_fsm_master_configure_slave(ec_fsm_t *);
    55 void ec_fsm_master_scan_slaves(ec_fsm_t *);
    55 void ec_fsm_master_scan_slaves(ec_fsm_t *);
    56 void ec_fsm_master_write_eeprom(ec_fsm_t *);
    56 void ec_fsm_master_write_eeprom(ec_fsm_t *);
    57 void ec_fsm_master_sdodict(ec_fsm_t *);
    57 void ec_fsm_master_sdodict(ec_fsm_t *);
    58 void ec_fsm_master_sdo_request(ec_fsm_t *);
    58 void ec_fsm_master_sdo_request(ec_fsm_t *);
    59 
    59 void ec_fsm_master_end(ec_fsm_t *);
    60 void ec_fsm_startup_start(ec_fsm_t *);
    60 void ec_fsm_master_error(ec_fsm_t *);
    61 void ec_fsm_startup_broadcast(ec_fsm_t *);
       
    62 void ec_fsm_startup_scan(ec_fsm_t *);
       
    63 
       
    64 void ec_fsm_configuration_start(ec_fsm_t *);
       
    65 void ec_fsm_configuration_conf(ec_fsm_t *);
       
    66 
    61 
    67 void ec_fsm_slavescan_start(ec_fsm_t *);
    62 void ec_fsm_slavescan_start(ec_fsm_t *);
    68 void ec_fsm_slavescan_address(ec_fsm_t *);
    63 void ec_fsm_slavescan_address(ec_fsm_t *);
    69 void ec_fsm_slavescan_state(ec_fsm_t *);
    64 void ec_fsm_slavescan_state(ec_fsm_t *);
    70 void ec_fsm_slavescan_base(ec_fsm_t *);
    65 void ec_fsm_slavescan_base(ec_fsm_t *);
    78 void ec_fsm_slaveconf_fmmu(ec_fsm_t *);
    73 void ec_fsm_slaveconf_fmmu(ec_fsm_t *);
    79 void ec_fsm_slaveconf_sdoconf(ec_fsm_t *);
    74 void ec_fsm_slaveconf_sdoconf(ec_fsm_t *);
    80 void ec_fsm_slaveconf_saveop(ec_fsm_t *);
    75 void ec_fsm_slaveconf_saveop(ec_fsm_t *);
    81 void ec_fsm_slaveconf_op(ec_fsm_t *);
    76 void ec_fsm_slaveconf_op(ec_fsm_t *);
    82 
    77 
    83 void ec_fsm_end(ec_fsm_t *);
    78 void ec_fsm_slave_end(ec_fsm_t *);
    84 void ec_fsm_error(ec_fsm_t *);
    79 void ec_fsm_slave_error(ec_fsm_t *);
    85 
    80 
    86 /*****************************************************************************/
    81 /*****************************************************************************/
    87 
    82 
    88 /**
    83 /**
    89    Constructor.
    84    Constructor.
   130 }
   125 }
   131 
   126 
   132 /*****************************************************************************/
   127 /*****************************************************************************/
   133 
   128 
   134 /**
   129 /**
   135    Resets the state machine.
       
   136 */
       
   137 
       
   138 void ec_fsm_reset(ec_fsm_t *fsm /**< finite state machine */)
       
   139 {
       
   140     fsm->master_state = ec_fsm_master_start;
       
   141     fsm->master_slaves_responding = 0;
       
   142     fsm->master_slave_states = EC_SLAVE_STATE_UNKNOWN;
       
   143 }
       
   144 
       
   145 /*****************************************************************************/
       
   146 
       
   147 /**
       
   148    Executes the current state of the state machine.
   130    Executes the current state of the state machine.
   149    \return false, if state machine has terminated
   131    \return false, if state machine has terminated
   150 */
   132 */
   151 
   133 
   152 int ec_fsm_exec(ec_fsm_t *fsm /**< finite state machine */)
   134 int ec_fsm_exec(ec_fsm_t *fsm /**< finite state machine */)
   153 {
   135 {
   154     fsm->master_state(fsm);
   136     fsm->master_state(fsm);
   155 
   137 
   156     return fsm->master_state != ec_fsm_end &&
   138     return fsm->master_state != ec_fsm_master_end
   157         fsm->master_state != ec_fsm_error;
   139         && fsm->master_state != ec_fsm_master_error;
   158 }
   140 }
   159 
   141 
   160 /*****************************************************************************/
   142 /*****************************************************************************/
   161 
   143 
   162 /**
   144 /**
   163    Initializes the master startup state machine.
   145    \return true, if the master state machine terminated gracefully
   164 */
   146 */
   165 
   147 
   166 void ec_fsm_startup(ec_fsm_t *fsm)
   148 int ec_fsm_success(ec_fsm_t *fsm /**< finite state machine */)
   167 {
   149 {
   168     fsm->master_state = ec_fsm_startup_start;
   150     return fsm->master_state == ec_fsm_master_end;
   169 }
       
   170 
       
   171 /*****************************************************************************/
       
   172 
       
   173 /**
       
   174    Returns, if the master startup state machine terminated with success.
       
   175    \return non-zero if successful.
       
   176 */
       
   177 
       
   178 int ec_fsm_startup_success(ec_fsm_t *fsm /**< Finite state machine */)
       
   179 {
       
   180     return fsm->master_state == ec_fsm_end;
       
   181 }
       
   182 
       
   183 /*****************************************************************************/
       
   184 
       
   185 /**
       
   186    Initializes the master configuration state machine.
       
   187 */
       
   188 
       
   189 void ec_fsm_configuration(ec_fsm_t *fsm)
       
   190 {
       
   191     fsm->master_state = ec_fsm_configuration_start;
       
   192 }
       
   193 
       
   194 /*****************************************************************************/
       
   195 
       
   196 /**
       
   197    Returns, if the master confuguration state machine terminated with success.
       
   198    \return non-zero if successful.
       
   199 */
       
   200 
       
   201 int ec_fsm_configuration_success(ec_fsm_t *fsm /**< Finite state machine */)
       
   202 {
       
   203     return fsm->master_state == ec_fsm_end;
       
   204 }
   151 }
   205 
   152 
   206 /******************************************************************************
   153 /******************************************************************************
   207  *  master startup state machine
   154  *  operation/idle state machine
   208  *****************************************************************************/
       
   209 
       
   210 /**
       
   211    Master state: START.
       
   212    Starts with getting slave count and slave states.
       
   213 */
       
   214 
       
   215 void ec_fsm_startup_start(ec_fsm_t *fsm)
       
   216 {
       
   217     ec_datagram_brd(&fsm->datagram, 0x0130, 2);
       
   218     ec_master_queue_datagram(fsm->master, &fsm->datagram);
       
   219     fsm->master_state = ec_fsm_startup_broadcast;
       
   220 }
       
   221 
       
   222 /*****************************************************************************/
       
   223 
       
   224 /**
       
   225    Master state: BROADCAST.
       
   226    Processes the broadcast read slave count and slaves states.
       
   227 */
       
   228 
       
   229 void ec_fsm_startup_broadcast(ec_fsm_t *fsm /**< finite state machine */)
       
   230 {
       
   231     ec_datagram_t *datagram = &fsm->datagram;
       
   232     unsigned int i;
       
   233     ec_slave_t *slave;
       
   234     ec_master_t *master = fsm->master;
       
   235 
       
   236     if (datagram->state != EC_DATAGRAM_RECEIVED) {
       
   237         EC_ERR("Failed to receive broadcast datagram.\n");
       
   238         fsm->master_state = ec_fsm_error;
       
   239         return;
       
   240     }
       
   241 
       
   242     EC_INFO("Scanning bus.\n");
       
   243 
       
   244     ec_master_clear_slaves(master);
       
   245 
       
   246     master->slave_count = datagram->working_counter;
       
   247 
       
   248     if (!master->slave_count) {
       
   249         // no slaves present -> finish state machine.
       
   250         fsm->master_state = ec_fsm_end;
       
   251         return;
       
   252     }
       
   253 
       
   254     // init slaves
       
   255     for (i = 0; i < master->slave_count; i++) {
       
   256         if (!(slave = (ec_slave_t *) kmalloc(sizeof(ec_slave_t),
       
   257                                              GFP_KERNEL))) {
       
   258             EC_ERR("Failed to allocate slave %i!\n", i);
       
   259             fsm->master_state = ec_fsm_error;
       
   260             return;
       
   261         }
       
   262 
       
   263         if (ec_slave_init(slave, master, i, i + 1)) {
       
   264             fsm->master_state = ec_fsm_error;
       
   265             return;
       
   266         }
       
   267 
       
   268         if (kobject_add(&slave->kobj)) {
       
   269             EC_ERR("Failed to add kobject.\n");
       
   270             kobject_put(&slave->kobj); // free
       
   271             fsm->master_state = ec_fsm_error;
       
   272             return;
       
   273         }
       
   274 
       
   275         list_add_tail(&slave->list, &master->slaves);
       
   276     }
       
   277 
       
   278     // begin scanning of slaves
       
   279     fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
       
   280     fsm->slave_state = ec_fsm_slavescan_start;
       
   281     fsm->master_state = ec_fsm_startup_scan;
       
   282     fsm->master_state(fsm); // execute immediately
       
   283     return;
       
   284 }
       
   285 
       
   286 /*****************************************************************************/
       
   287 
       
   288 /**
       
   289    Master state: SCAN.
       
   290    Executes the sub-statemachine for the scanning of a slave.
       
   291 */
       
   292 
       
   293 void ec_fsm_startup_scan(ec_fsm_t *fsm /**< finite state machine */)
       
   294 {
       
   295     ec_master_t *master = fsm->master;
       
   296     ec_slave_t *slave = fsm->slave;
       
   297 
       
   298     fsm->slave_state(fsm); // execute slave state machine
       
   299 
       
   300     if (fsm->slave_state == ec_fsm_error) {
       
   301         EC_ERR("Slave scanning failed.\n");
       
   302         fsm->master_state = ec_fsm_error;
       
   303         return;
       
   304     }
       
   305 
       
   306     if (fsm->slave_state != ec_fsm_end) return;
       
   307 
       
   308     // another slave to scan?
       
   309     if (slave->list.next != &master->slaves) {
       
   310         fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
       
   311         fsm->slave_state = ec_fsm_slavescan_start;
       
   312         fsm->slave_state(fsm); // execute immediately
       
   313         return;
       
   314     }
       
   315 
       
   316     EC_INFO("Bus scanning completed.\n");
       
   317 
       
   318     ec_master_calc_addressing(master);
       
   319 
       
   320     fsm->master_state = ec_fsm_end;
       
   321 }
       
   322 
       
   323 /******************************************************************************
       
   324  *  master configuration state machine
       
   325  *****************************************************************************/
       
   326 
       
   327 /**
       
   328    Master configuration state machine: START.
       
   329 */
       
   330 
       
   331 void ec_fsm_configuration_start(ec_fsm_t *fsm /**< finite state machine */)
       
   332 {
       
   333     ec_master_t *master = fsm->master;
       
   334 
       
   335     if (list_empty(&master->slaves)) {
       
   336         fsm->master_state = ec_fsm_end;
       
   337         return;
       
   338     }
       
   339 
       
   340     // begin configuring slaves
       
   341     fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
       
   342     fsm->slave_state = ec_fsm_slaveconf_init;
       
   343     ec_fsm_change(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT);
       
   344     fsm->master_state = ec_fsm_configuration_conf;
       
   345     fsm->master_state(fsm); // execute immediately
       
   346 }
       
   347 
       
   348 /*****************************************************************************/
       
   349 
       
   350 /**
       
   351    Master state: CONF.
       
   352 */
       
   353 
       
   354 void ec_fsm_configuration_conf(ec_fsm_t *fsm /**< finite state machine */)
       
   355 {
       
   356     ec_master_t *master = fsm->master;
       
   357     ec_slave_t *slave = fsm->slave;
       
   358 
       
   359     fsm->slave_state(fsm); // execute slave's state machine
       
   360 
       
   361     if (fsm->slave_state == ec_fsm_error) {
       
   362         fsm->master_state = ec_fsm_error;
       
   363         return;
       
   364     }
       
   365 
       
   366     if (fsm->slave_state != ec_fsm_end) return;
       
   367 
       
   368     // another slave to configure?
       
   369     if (slave->list.next != &master->slaves) {
       
   370         fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
       
   371         fsm->slave_state = ec_fsm_slaveconf_init;
       
   372         ec_fsm_change(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT);
       
   373         fsm->master_state(fsm); // execute immediately
       
   374         return;
       
   375     }
       
   376 
       
   377     fsm->master_state = ec_fsm_end;
       
   378 }
       
   379 
       
   380 /******************************************************************************
       
   381  *  operation / idle state machine
       
   382  *****************************************************************************/
   155  *****************************************************************************/
   383 
   156 
   384 /**
   157 /**
   385    Master state: START.
   158    Master state: START.
   386    Starts with getting slave count and slave states.
   159    Starts with getting slave count and slave states.
   412             fsm->master_slaves_responding = 0;
   185             fsm->master_slaves_responding = 0;
   413             list_for_each_entry(slave, &master->slaves, list) {
   186             list_for_each_entry(slave, &master->slaves, list) {
   414                 slave->online = 0;
   187                 slave->online = 0;
   415             }
   188             }
   416         }
   189         }
   417         fsm->master_state = ec_fsm_master_start;
   190         else {
   418         fsm->master_state(fsm); // execute immediately
   191             EC_ERR("Failed to receive broadcast datagram.\n");
       
   192         }
       
   193         fsm->master_state = ec_fsm_master_error;
   419         return;
   194         return;
   420     }
   195     }
   421 
   196 
   422     topology_change = (datagram->working_counter !=
   197     topology_change = (datagram->working_counter !=
   423                        fsm->master_slaves_responding);
   198                        fsm->master_slaves_responding);
   447         EC_INFO("Slave states: %s.\n", states);
   222         EC_INFO("Slave states: %s.\n", states);
   448     }
   223     }
   449 
   224 
   450     // topology change in idle mode: clear all slaves and scan the bus
   225     // topology change in idle mode: clear all slaves and scan the bus
   451     if (topology_change && master->mode == EC_MASTER_MODE_IDLE) {
   226     if (topology_change && master->mode == EC_MASTER_MODE_IDLE) {
   452         EC_INFO("Scanning bus.\n");
       
   453 
   227 
   454         ec_master_eoe_stop(master);
   228         ec_master_eoe_stop(master);
   455         ec_master_clear_slaves(master);
   229         ec_master_clear_slaves(master);
   456 
   230 
   457         master->slave_count = datagram->working_counter;
   231         master->slave_count = datagram->working_counter;
   458 
   232 
   459         if (!master->slave_count) {
   233         if (!master->slave_count) {
   460             // no slaves present -> finish state machine.
   234             // no slaves present -> finish state machine.
   461             fsm->master_state = ec_fsm_master_start;
   235             fsm->master_state = ec_fsm_master_end;
   462             fsm->master_state(fsm); // execute immediately
       
   463             return;
   236             return;
   464         }
   237         }
   465 
   238 
   466         // init slaves
   239         // init slaves
   467         for (i = 0; i < master->slave_count; i++) {
   240         for (i = 0; i < master->slave_count; i++) {
   468             if (!(slave = (ec_slave_t *) kmalloc(sizeof(ec_slave_t),
   241             if (!(slave = (ec_slave_t *) kmalloc(sizeof(ec_slave_t),
   469                                                  GFP_ATOMIC))) {
   242                                                  GFP_ATOMIC))) {
   470                 EC_ERR("Failed to allocate slave %i!\n", i);
   243                 EC_ERR("Failed to allocate slave %i!\n", i);
   471                 ec_master_clear_slaves(master);
   244                 ec_master_clear_slaves(master);
   472                 fsm->master_state = ec_fsm_master_start;
   245                 fsm->master_state = ec_fsm_master_error;
   473                 fsm->master_state(fsm); // execute immediately
       
   474                 return;
   246                 return;
   475             }
   247             }
   476 
   248 
   477             if (ec_slave_init(slave, master, i, i + 1)) {
   249             if (ec_slave_init(slave, master, i, i + 1)) {
   478                 // freeing of "slave" already done
   250                 // freeing of "slave" already done
   479                 ec_master_clear_slaves(master);
   251                 ec_master_clear_slaves(master);
   480                 fsm->master_state = ec_fsm_master_start;
   252                 fsm->master_state = ec_fsm_master_error;
   481                 fsm->master_state(fsm); // execute immediately
       
   482                 return;
   253                 return;
   483             }
   254             }
   484 
   255 
   485             if (kobject_add(&slave->kobj)) {
   256             if (kobject_add(&slave->kobj)) {
   486                 EC_ERR("Failed to add kobject.\n");
   257                 EC_ERR("Failed to add kobject.\n");
   487                 kobject_put(&slave->kobj); // free
   258                 kobject_put(&slave->kobj); // free
   488                 ec_master_clear_slaves(master);
   259                 ec_master_clear_slaves(master);
   489                 fsm->master_state = ec_fsm_master_start;
   260                 fsm->master_state = ec_fsm_master_error;
   490                 fsm->master_state(fsm); // execute immediately
       
   491                 return;
   261                 return;
   492             }
   262             }
   493 
   263 
   494             list_add_tail(&slave->list, &master->slaves);
   264             list_add_tail(&slave->list, &master->slaves);
   495         }
   265         }
       
   266 
       
   267         EC_INFO("Scanning bus.\n");
   496 
   268 
   497         // begin scanning of slaves
   269         // begin scanning of slaves
   498         fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
   270         fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
   499         fsm->slave_state = ec_fsm_slavescan_start;
   271         fsm->slave_state = ec_fsm_slavescan_start;
   500         fsm->master_state = ec_fsm_master_scan_slaves;
   272         fsm->master_state = ec_fsm_master_scan_slaves;
   531             || slave->requested_state == EC_SLAVE_STATE_UNKNOWN
   303             || slave->requested_state == EC_SLAVE_STATE_UNKNOWN
   532             || (slave->current_state == slave->requested_state
   304             || (slave->current_state == slave->requested_state
   533                 && (slave->configured
   305                 && (slave->configured
   534                     || slave->current_state == EC_SLAVE_STATE_INIT))) continue;
   306                     || slave->current_state == EC_SLAVE_STATE_INIT))) continue;
   535 
   307 
   536         ec_state_string(slave->current_state, old_state);
   308         if (master->debug_level) {
   537         ec_state_string(slave->requested_state, new_state);
   309             ec_state_string(slave->current_state, old_state);
   538 
   310             if (!slave->configured
   539         if (!slave->configured
   311                 && slave->current_state != EC_SLAVE_STATE_INIT) {
   540             && slave->current_state != EC_SLAVE_STATE_INIT) {
   312                 EC_INFO("Reconfiguring slave %i (%s).\n",
   541             EC_INFO("Reconfiguring slave %i (%s -> %s).\n",
   313                         slave->ring_position, old_state);
   542                     slave->ring_position, old_state, new_state);
   314             }
   543         }
   315             else if (slave->current_state != slave->requested_state) {
   544         else if (slave->current_state != slave->requested_state) {
   316                 ec_state_string(slave->requested_state, new_state);
   545             EC_INFO("Changing state of slave %i (%s -> %s).\n",
   317                 EC_INFO("Changing state of slave %i (%s -> %s).\n",
   546                     slave->ring_position, old_state, new_state);
   318                         slave->ring_position, old_state, new_state);
       
   319             }
   547         }
   320         }
   548 
   321 
   549         fsm->slave = slave;
   322         fsm->slave = slave;
   550         fsm->slave_state = ec_fsm_slaveconf_init;
   323         fsm->slave_state = ec_fsm_slaveconf_init;
   551         ec_fsm_change(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT);
   324         ec_fsm_change(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT);
   599 
   372 
   600             if (kobject_add(&slave->sdo_kobj)) {
   373             if (kobject_add(&slave->sdo_kobj)) {
   601                 EC_ERR("Failed to add SDO kobj of slave %i.\n",
   374                 EC_ERR("Failed to add SDO kobj of slave %i.\n",
   602                        slave->ring_position);
   375                        slave->ring_position);
   603                 slave->error_flag = 1;
   376                 slave->error_flag = 1;
   604                 fsm->master_state = ec_fsm_master_start;
   377                 fsm->master_state = ec_fsm_master_error;
   605                 fsm->master_state(fsm); // execute immediately
       
   606                 return;
   378                 return;
   607             }
   379             }
   608 
   380 
   609             slave->sdo_dictionary_fetched = 1;
   381             slave->sdo_dictionary_fetched = 1;
   610 
   382 
   637             fsm->master_state(fsm); // execute immediately
   409             fsm->master_state(fsm); // execute immediately
   638             return;
   410             return;
   639         }
   411         }
   640     }
   412     }
   641 
   413 
   642     // nothing to do. restart master state machine.
   414     fsm->master_state = ec_fsm_master_end;
   643     fsm->master_state = ec_fsm_master_start;
       
   644     fsm->master_state(fsm); // execute immediately
       
   645 }
   415 }
   646 
   416 
   647 /*****************************************************************************/
   417 /*****************************************************************************/
   648 
   418 
   649 /**
   419 /**
   700     ec_slave_t *slave = fsm->slave;
   470     ec_slave_t *slave = fsm->slave;
   701     ec_datagram_t *datagram = &fsm->datagram;
   471     ec_datagram_t *datagram = &fsm->datagram;
   702     uint8_t new_state;
   472     uint8_t new_state;
   703 
   473 
   704     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   474     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   705         fsm->master_state = ec_fsm_master_start;
   475         EC_ERR("Failed to receive AL state datagram for slave %i!\n",
   706         fsm->master_state(fsm); // execute immediately
   476                slave->ring_position);
       
   477         fsm->master_state = ec_fsm_master_error;
   707         return;
   478         return;
   708     }
   479     }
   709 
   480 
   710     // did the slave not respond to its station address?
   481     // did the slave not respond to its station address?
   711     if (datagram->working_counter != 1) {
   482     if (datagram->working_counter != 1) {
   754 
   525 
   755     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
   526     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
   756         fsm->slave->error_flag = 1;
   527         fsm->slave->error_flag = 1;
   757         EC_ERR("Failed to validate vendor ID of slave %i.\n",
   528         EC_ERR("Failed to validate vendor ID of slave %i.\n",
   758                slave->ring_position);
   529                slave->ring_position);
   759         fsm->master_state = ec_fsm_master_start;
   530         fsm->master_state = ec_fsm_master_error;
   760         fsm->master_state(fsm); // execute immediately
       
   761         return;
   531         return;
   762     }
   532     }
   763 
   533 
   764     if (EC_READ_U32(fsm->fsm_sii.value) != slave->sii_vendor_id) {
   534     if (EC_READ_U32(fsm->fsm_sii.value) != slave->sii_vendor_id) {
   765         EC_ERR("Slave %i: invalid vendor ID!\n", slave->ring_position);
   535         EC_ERR("Slave %i has an invalid vendor ID!\n", slave->ring_position);
   766         fsm->master_state = ec_fsm_master_start;
   536         fsm->master_state = ec_fsm_master_error;
   767         fsm->master_state(fsm); // execute immediately
       
   768         return;
   537         return;
   769     }
   538     }
   770 
   539 
   771     // vendor ID is ok. check product code.
   540     // vendor ID is ok. check product code.
   772     fsm->master_state = ec_fsm_master_validate_product;
   541     fsm->master_state = ec_fsm_master_validate_product;
   794         }
   563         }
   795         // check next slave
   564         // check next slave
   796         fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
   565         fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
   797     }
   566     }
   798 
   567 
   799     EC_INFO("Reinitializing slave %i.\n", fsm->slave->ring_position);
   568     if (fsm->master->debug_level)
       
   569         EC_DBG("Reinitializing slave %i.\n", fsm->slave->ring_position);
   800 
   570 
   801     // write station address
   571     // write station address
   802     ec_datagram_apwr(datagram, fsm->slave->ring_position, 0x0010, 2);
   572     ec_datagram_apwr(datagram, fsm->slave->ring_position, 0x0010, 2);
   803     EC_WRITE_U16(datagram->data, fsm->slave->station_address);
   573     EC_WRITE_U16(datagram->data, fsm->slave->station_address);
   804     ec_master_queue_datagram(fsm->master, datagram);
   574     ec_master_queue_datagram(fsm->master, datagram);
   820 
   590 
   821     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
   591     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
   822         fsm->slave->error_flag = 1;
   592         fsm->slave->error_flag = 1;
   823         EC_ERR("Failed to validate product code of slave %i.\n",
   593         EC_ERR("Failed to validate product code of slave %i.\n",
   824                slave->ring_position);
   594                slave->ring_position);
   825         fsm->master_state = ec_fsm_master_start;
   595         fsm->master_state = ec_fsm_master_error;
   826         fsm->master_state(fsm); // execute immediately
       
   827         return;
   596         return;
   828     }
   597     }
   829 
   598 
   830     if (EC_READ_U32(fsm->fsm_sii.value) != slave->sii_product_code) {
   599     if (EC_READ_U32(fsm->fsm_sii.value) != slave->sii_product_code) {
   831         EC_ERR("Slave %i: invalid product code!\n", slave->ring_position);
   600         EC_ERR("Slave %i: invalid product code!\n", slave->ring_position);
   832         EC_ERR("expected 0x%08X, got 0x%08X.\n", slave->sii_product_code,
   601         EC_ERR("expected 0x%08X, got 0x%08X.\n", slave->sii_product_code,
   833                EC_READ_U32(fsm->fsm_sii.value));
   602                EC_READ_U32(fsm->fsm_sii.value));
   834         fsm->master_state = ec_fsm_master_start;
   603         fsm->master_state = ec_fsm_master_error;
   835         fsm->master_state(fsm); // execute immediately
       
   836         return;
   604         return;
   837     }
   605     }
   838 
   606 
   839     // have all states been validated?
   607     // have all states been validated?
   840     if (slave->list.next == &fsm->master->slaves) {
   608     if (slave->list.next == &fsm->master->slaves) {
   895     ec_master_t *master = fsm->master;
   663     ec_master_t *master = fsm->master;
   896     ec_slave_t *slave = fsm->slave;
   664     ec_slave_t *slave = fsm->slave;
   897 
   665 
   898     fsm->slave_state(fsm); // execute slave state machine
   666     fsm->slave_state(fsm); // execute slave state machine
   899 
   667 
   900     if (fsm->slave_state != ec_fsm_end
   668     if (fsm->slave_state != ec_fsm_slave_end
   901         && fsm->slave_state != ec_fsm_error) return;
   669         && fsm->slave_state != ec_fsm_slave_error) return;
   902 
   670 
   903     // another slave to fetch?
   671     // another slave to fetch?
   904     if (slave->list.next != &master->slaves) {
   672     if (slave->list.next != &master->slaves) {
   905         fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
   673         fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
   906         fsm->slave_state = ec_fsm_slavescan_start;
   674         fsm->slave_state = ec_fsm_slavescan_start;
   913     ec_master_calc_addressing(master);
   681     ec_master_calc_addressing(master);
   914 
   682 
   915     // set initial states of all slaves to PREOP to make mailbox
   683     // set initial states of all slaves to PREOP to make mailbox
   916     // communication possible
   684     // communication possible
   917     list_for_each_entry(slave, &master->slaves, list) {
   685     list_for_each_entry(slave, &master->slaves, list) {
   918         slave->requested_state = EC_SLAVE_STATE_PREOP;
   686         ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
   919     }
   687     }
   920 
   688 
   921     fsm->master_state = ec_fsm_master_start;
   689     fsm->master_state = ec_fsm_master_end;
   922     fsm->master_state(fsm); // execute immediately
       
   923 }
   690 }
   924 
   691 
   925 /*****************************************************************************/
   692 /*****************************************************************************/
   926 
   693 
   927 /**
   694 /**
   933                                    /**< finite state machine */
   700                                    /**< finite state machine */
   934                                    )
   701                                    )
   935 {
   702 {
   936     fsm->slave_state(fsm); // execute slave's state machine
   703     fsm->slave_state(fsm); // execute slave's state machine
   937 
   704 
   938     if (fsm->slave_state != ec_fsm_end
   705     if (fsm->slave_state != ec_fsm_slave_end
   939         && fsm->slave_state != ec_fsm_error) return;
   706         && fsm->slave_state != ec_fsm_slave_error) return;
   940 
   707 
   941     ec_fsm_master_action_process_states(fsm);
   708     ec_fsm_master_action_process_states(fsm);
   942 }
   709 }
   943 
   710 
   944 /*****************************************************************************/
   711 /*****************************************************************************/
   957         fsm->slave->error_flag = 1;
   724         fsm->slave->error_flag = 1;
   958         EC_ERR("Failed to write EEPROM contents to slave %i.\n",
   725         EC_ERR("Failed to write EEPROM contents to slave %i.\n",
   959                slave->ring_position);
   726                slave->ring_position);
   960         kfree(slave->new_eeprom_data);
   727         kfree(slave->new_eeprom_data);
   961         slave->new_eeprom_data = NULL;
   728         slave->new_eeprom_data = NULL;
   962         fsm->master_state = ec_fsm_master_start;
   729         fsm->master_state = ec_fsm_master_error;
   963         fsm->master_state(fsm); // execute immediately
       
   964         return;
   730         return;
   965     }
   731     }
   966 
   732 
   967     fsm->sii_offset++;
   733     fsm->sii_offset++;
   968     if (fsm->sii_offset < slave->new_eeprom_size) {
   734     if (fsm->sii_offset < slave->new_eeprom_size) {
   997     ec_master_t *master = fsm->master;
   763     ec_master_t *master = fsm->master;
   998 
   764 
   999     if (ec_fsm_coe_exec(&fsm->fsm_coe)) return;
   765     if (ec_fsm_coe_exec(&fsm->fsm_coe)) return;
  1000 
   766 
  1001     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
   767     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
  1002         fsm->master_state = ec_fsm_master_start;
   768         fsm->master_state = ec_fsm_master_error;
  1003         fsm->master_state(fsm); // execute immediately
       
  1004         return;
   769         return;
  1005     }
   770     }
  1006 
   771 
  1007     // SDO dictionary fetching finished
   772     // SDO dictionary fetching finished
  1008 
   773 
  1032     if (ec_fsm_coe_exec(&fsm->fsm_coe)) return;
   797     if (ec_fsm_coe_exec(&fsm->fsm_coe)) return;
  1033 
   798 
  1034     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
   799     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
  1035         request->return_code = -1;
   800         request->return_code = -1;
  1036         master->sdo_seq_master++;
   801         master->sdo_seq_master++;
  1037         fsm->master_state = ec_fsm_master_start;
   802         fsm->master_state = ec_fsm_master_error;
  1038         fsm->master_state(fsm); // execute immediately
       
  1039         return;
   803         return;
  1040     }
   804     }
  1041 
   805 
  1042     // SDO dictionary fetching finished
   806     // SDO dictionary fetching finished
  1043 
   807 
  1045     master->sdo_seq_master++;
   809     master->sdo_seq_master++;
  1046 
   810 
  1047     // restart master state machine.
   811     // restart master state machine.
  1048     fsm->master_state = ec_fsm_master_start;
   812     fsm->master_state = ec_fsm_master_start;
  1049     fsm->master_state(fsm); // execute immediately
   813     fsm->master_state(fsm); // execute immediately
       
   814 }
       
   815 
       
   816 /*****************************************************************************/
       
   817 
       
   818 /**
       
   819    State: ERROR.
       
   820 */
       
   821 
       
   822 void ec_fsm_master_error(ec_fsm_t *fsm /**< finite state machine */)
       
   823 {
       
   824     fsm->master_state = ec_fsm_master_start;
       
   825 }
       
   826 
       
   827 /*****************************************************************************/
       
   828 
       
   829 /**
       
   830    State: END.
       
   831 */
       
   832 
       
   833 void ec_fsm_master_end(ec_fsm_t *fsm /**< finite state machine */)
       
   834 {
       
   835     fsm->master_state = ec_fsm_master_start;
  1050 }
   836 }
  1051 
   837 
  1052 /******************************************************************************
   838 /******************************************************************************
  1053  *  slave scan state machine
   839  *  slave scan state machine
  1054  *****************************************************************************/
   840  *****************************************************************************/
  1081     ec_datagram_t *datagram = &fsm->datagram;
   867     ec_datagram_t *datagram = &fsm->datagram;
  1082 
   868 
  1083     if (datagram->state != EC_DATAGRAM_RECEIVED
   869     if (datagram->state != EC_DATAGRAM_RECEIVED
  1084         || datagram->working_counter != 1) {
   870         || datagram->working_counter != 1) {
  1085         fsm->slave->error_flag = 1;
   871         fsm->slave->error_flag = 1;
  1086         fsm->slave_state = ec_fsm_error;
   872         fsm->slave_state = ec_fsm_slave_error;
  1087         EC_ERR("Failed to write station address of slave %i.\n",
   873         EC_ERR("Failed to write station address of slave %i.\n",
  1088                fsm->slave->ring_position);
   874                fsm->slave->ring_position);
  1089         return;
   875         return;
  1090     }
   876     }
  1091 
   877 
  1107     ec_slave_t *slave = fsm->slave;
   893     ec_slave_t *slave = fsm->slave;
  1108 
   894 
  1109     if (datagram->state != EC_DATAGRAM_RECEIVED
   895     if (datagram->state != EC_DATAGRAM_RECEIVED
  1110         || datagram->working_counter != 1) {
   896         || datagram->working_counter != 1) {
  1111         fsm->slave->error_flag = 1;
   897         fsm->slave->error_flag = 1;
  1112         fsm->slave_state = ec_fsm_error;
   898         fsm->slave_state = ec_fsm_slave_error;
  1113         EC_ERR("Failed to read AL state of slave %i.\n",
   899         EC_ERR("Failed to read AL state of slave %i.\n",
  1114                fsm->slave->ring_position);
   900                fsm->slave->ring_position);
  1115         return;
   901         return;
  1116     }
   902     }
  1117 
   903 
  1139     ec_slave_t *slave = fsm->slave;
   925     ec_slave_t *slave = fsm->slave;
  1140 
   926 
  1141     if (datagram->state != EC_DATAGRAM_RECEIVED
   927     if (datagram->state != EC_DATAGRAM_RECEIVED
  1142         || datagram->working_counter != 1) {
   928         || datagram->working_counter != 1) {
  1143         fsm->slave->error_flag = 1;
   929         fsm->slave->error_flag = 1;
  1144         fsm->slave_state = ec_fsm_error;
   930         fsm->slave_state = ec_fsm_slave_error;
  1145         EC_ERR("Failed to read base data of slave %i.\n",
   931         EC_ERR("Failed to read base data of slave %i.\n",
  1146                slave->ring_position);
   932                slave->ring_position);
  1147         return;
   933         return;
  1148     }
   934     }
  1149 
   935 
  1176     unsigned int i;
   962     unsigned int i;
  1177 
   963 
  1178     if (datagram->state != EC_DATAGRAM_RECEIVED
   964     if (datagram->state != EC_DATAGRAM_RECEIVED
  1179         || datagram->working_counter != 1) {
   965         || datagram->working_counter != 1) {
  1180         fsm->slave->error_flag = 1;
   966         fsm->slave->error_flag = 1;
  1181         fsm->slave_state = ec_fsm_error;
   967         fsm->slave_state = ec_fsm_slave_error;
  1182         EC_ERR("Failed to read DL status of slave %i.\n",
   968         EC_ERR("Failed to read DL status of slave %i.\n",
  1183                slave->ring_position);
   969                slave->ring_position);
  1184         return;
   970         return;
  1185     }
   971     }
  1186 
   972 
  1212 
   998 
  1213     if (ec_fsm_sii_exec(&fsm->fsm_sii)) return;
   999     if (ec_fsm_sii_exec(&fsm->fsm_sii)) return;
  1214 
  1000 
  1215     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
  1001     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
  1216         fsm->slave->error_flag = 1;
  1002         fsm->slave->error_flag = 1;
  1217         fsm->slave_state = ec_fsm_error;
  1003         fsm->slave_state = ec_fsm_slave_error;
  1218         EC_ERR("Failed to read EEPROM size of slave %i.\n",
  1004         EC_ERR("Failed to read EEPROM size of slave %i.\n",
  1219                slave->ring_position);
  1005                slave->ring_position);
  1220         return;
  1006         return;
  1221     }
  1007     }
  1222 
  1008 
  1240     }
  1026     }
  1241 
  1027 
  1242     if (!(slave->eeprom_data =
  1028     if (!(slave->eeprom_data =
  1243           (uint8_t *) kmalloc(slave->eeprom_size, GFP_ATOMIC))) {
  1029           (uint8_t *) kmalloc(slave->eeprom_size, GFP_ATOMIC))) {
  1244         fsm->slave->error_flag = 1;
  1030         fsm->slave->error_flag = 1;
  1245         fsm->slave_state = ec_fsm_error;
  1031         fsm->slave_state = ec_fsm_slave_error;
  1246         EC_ERR("Failed to allocate EEPROM data on slave %i.\n",
  1032         EC_ERR("Failed to allocate EEPROM data on slave %i.\n",
  1247                slave->ring_position);
  1033                slave->ring_position);
  1248         return;
  1034         return;
  1249     }
  1035     }
  1250 
  1036 
  1269 
  1055 
  1270     if (ec_fsm_sii_exec(&fsm->fsm_sii)) return;
  1056     if (ec_fsm_sii_exec(&fsm->fsm_sii)) return;
  1271 
  1057 
  1272     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
  1058     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
  1273         fsm->slave->error_flag = 1;
  1059         fsm->slave->error_flag = 1;
  1274         fsm->slave_state = ec_fsm_error;
  1060         fsm->slave_state = ec_fsm_slave_error;
  1275         EC_ERR("Failed to fetch EEPROM contents of slave %i.\n",
  1061         EC_ERR("Failed to fetch EEPROM contents of slave %i.\n",
  1276                slave->ring_position);
  1062                slave->ring_position);
  1277         return;
  1063         return;
  1278     }
  1064     }
  1279 
  1065 
  1357         }
  1143         }
  1358 
  1144 
  1359         cat_word += cat_size + 2;
  1145         cat_word += cat_size + 2;
  1360     }
  1146     }
  1361 
  1147 
  1362     fsm->slave_state = ec_fsm_end;
  1148     fsm->slave_state = ec_fsm_slave_end;
  1363     return;
  1149     return;
  1364 
  1150 
  1365 end:
  1151 end:
  1366     EC_ERR("Failed to analyze category data.\n");
  1152     EC_ERR("Failed to analyze category data.\n");
  1367     fsm->slave->error_flag = 1;
  1153     fsm->slave->error_flag = 1;
  1368     fsm->slave_state = ec_fsm_error;
  1154     fsm->slave_state = ec_fsm_slave_error;
  1369 }
  1155 }
  1370 
  1156 
  1371 /******************************************************************************
  1157 /******************************************************************************
  1372  *  slave configuration state machine
  1158  *  slave configuration state machine
  1373  *****************************************************************************/
  1159  *****************************************************************************/
  1386 
  1172 
  1387     if (ec_fsm_change_exec(&fsm->fsm_change)) return;
  1173     if (ec_fsm_change_exec(&fsm->fsm_change)) return;
  1388 
  1174 
  1389     if (!ec_fsm_change_success(&fsm->fsm_change)) {
  1175     if (!ec_fsm_change_success(&fsm->fsm_change)) {
  1390         slave->error_flag = 1;
  1176         slave->error_flag = 1;
  1391         fsm->slave_state = ec_fsm_error;
  1177         fsm->slave_state = ec_fsm_slave_error;
  1392         return;
  1178         return;
  1393     }
  1179     }
  1394 
  1180 
  1395     slave->configured = 1;
  1181     slave->configured = 1;
  1396 
  1182 
  1398         EC_DBG("Slave %i is now in INIT.\n", slave->ring_position);
  1184         EC_DBG("Slave %i is now in INIT.\n", slave->ring_position);
  1399     }
  1185     }
  1400 
  1186 
  1401     // slave is now in INIT
  1187     // slave is now in INIT
  1402     if (slave->current_state == slave->requested_state) {
  1188     if (slave->current_state == slave->requested_state) {
  1403         fsm->slave_state = ec_fsm_end; // successful
  1189         fsm->slave_state = ec_fsm_slave_end; // successful
  1404         if (master->debug_level) {
  1190         if (master->debug_level) {
  1405             EC_DBG("Finished configuration of slave %i.\n",
  1191             EC_DBG("Finished configuration of slave %i.\n",
  1406                    slave->ring_position);
  1192                    slave->ring_position);
  1407         }
  1193         }
  1408         return;
  1194         return;
  1455     else {
  1241     else {
  1456         list_for_each_entry(sync, &slave->sii_syncs, list) {
  1242         list_for_each_entry(sync, &slave->sii_syncs, list) {
  1457             if (sync->index >= slave->base_sync_count) {
  1243             if (sync->index >= slave->base_sync_count) {
  1458                 EC_ERR("Invalid sync manager configuration found!");
  1244                 EC_ERR("Invalid sync manager configuration found!");
  1459                 fsm->slave->error_flag = 1;
  1245                 fsm->slave->error_flag = 1;
  1460                 fsm->slave_state = ec_fsm_error;
  1246                 fsm->slave_state = ec_fsm_slave_error;
  1461                 return;
  1247                 return;
  1462             }
  1248             }
  1463             ec_sync_config(sync, slave,
  1249             ec_sync_config(sync, slave,
  1464                            datagram->data + EC_SYNC_SIZE * sync->index);
  1250                            datagram->data + EC_SYNC_SIZE * sync->index);
  1465         }
  1251         }
  1481     ec_slave_t *slave = fsm->slave;
  1267     ec_slave_t *slave = fsm->slave;
  1482 
  1268 
  1483     if (datagram->state != EC_DATAGRAM_RECEIVED
  1269     if (datagram->state != EC_DATAGRAM_RECEIVED
  1484         || datagram->working_counter != 1) {
  1270         || datagram->working_counter != 1) {
  1485         slave->error_flag = 1;
  1271         slave->error_flag = 1;
  1486         fsm->slave_state = ec_fsm_error;
  1272         fsm->slave_state = ec_fsm_slave_error;
  1487         EC_ERR("Failed to set sync managers on slave %i.\n",
  1273         EC_ERR("Failed to set sync managers on slave %i.\n",
  1488                slave->ring_position);
  1274                slave->ring_position);
  1489         return;
  1275         return;
  1490     }
  1276     }
  1491 
  1277 
  1509 
  1295 
  1510     if (ec_fsm_change_exec(&fsm->fsm_change)) return;
  1296     if (ec_fsm_change_exec(&fsm->fsm_change)) return;
  1511 
  1297 
  1512     if (!ec_fsm_change_success(&fsm->fsm_change)) {
  1298     if (!ec_fsm_change_success(&fsm->fsm_change)) {
  1513         slave->error_flag = 1;
  1299         slave->error_flag = 1;
  1514         fsm->slave_state = ec_fsm_error;
  1300         fsm->slave_state = ec_fsm_slave_error;
  1515         return;
  1301         return;
  1516     }
  1302     }
  1517 
  1303 
  1518     // slave is now in PREOP
  1304     // slave is now in PREOP
  1519     slave->jiffies_preop = fsm->datagram.jiffies_received;
  1305     slave->jiffies_preop = fsm->datagram.jiffies_received;
  1521     if (master->debug_level) {
  1307     if (master->debug_level) {
  1522         EC_DBG("Slave %i is now in PREOP.\n", slave->ring_position);
  1308         EC_DBG("Slave %i is now in PREOP.\n", slave->ring_position);
  1523     }
  1309     }
  1524 
  1310 
  1525     if (slave->current_state == slave->requested_state) {
  1311     if (slave->current_state == slave->requested_state) {
  1526         fsm->slave_state = ec_fsm_end; // successful
  1312         fsm->slave_state = ec_fsm_slave_end; // successful
  1527         if (master->debug_level) {
  1313         if (master->debug_level) {
  1528             EC_DBG("Finished configuration of slave %i.\n",
  1314             EC_DBG("Finished configuration of slave %i.\n",
  1529                    slave->ring_position);
  1315                    slave->ring_position);
  1530         }
  1316         }
  1531         return;
  1317         return;
  1572     ec_slave_t *slave = fsm->slave;
  1358     ec_slave_t *slave = fsm->slave;
  1573 
  1359 
  1574     if (datagram->state != EC_DATAGRAM_RECEIVED
  1360     if (datagram->state != EC_DATAGRAM_RECEIVED
  1575         || datagram->working_counter != 1) {
  1361         || datagram->working_counter != 1) {
  1576         fsm->slave->error_flag = 1;
  1362         fsm->slave->error_flag = 1;
  1577         fsm->slave_state = ec_fsm_error;
  1363         fsm->slave_state = ec_fsm_slave_error;
  1578         EC_ERR("Failed to set FMMUs on slave %i.\n",
  1364         EC_ERR("Failed to set FMMUs on slave %i.\n",
  1579                fsm->slave->ring_position);
  1365                fsm->slave->ring_position);
  1580         return;
  1366         return;
  1581     }
  1367     }
  1582 
  1368 
  1606 {
  1392 {
  1607     if (ec_fsm_coe_exec(&fsm->fsm_coe)) return;
  1393     if (ec_fsm_coe_exec(&fsm->fsm_coe)) return;
  1608 
  1394 
  1609     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
  1395     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
  1610         fsm->slave->error_flag = 1;
  1396         fsm->slave->error_flag = 1;
  1611         fsm->slave_state = ec_fsm_error;
  1397         fsm->slave_state = ec_fsm_slave_error;
  1612         return;
  1398         return;
  1613     }
  1399     }
  1614 
  1400 
  1615     // Another SDO to configure?
  1401     // Another SDO to configure?
  1616     if (fsm->sdodata->list.next != &fsm->slave->sdo_confs) {
  1402     if (fsm->sdodata->list.next != &fsm->slave->sdo_confs) {
  1642 
  1428 
  1643     if (ec_fsm_change_exec(&fsm->fsm_change)) return;
  1429     if (ec_fsm_change_exec(&fsm->fsm_change)) return;
  1644 
  1430 
  1645     if (!ec_fsm_change_success(&fsm->fsm_change)) {
  1431     if (!ec_fsm_change_success(&fsm->fsm_change)) {
  1646         fsm->slave->error_flag = 1;
  1432         fsm->slave->error_flag = 1;
  1647         fsm->slave_state = ec_fsm_error;
  1433         fsm->slave_state = ec_fsm_slave_error;
  1648         return;
  1434         return;
  1649     }
  1435     }
  1650 
  1436 
  1651     // slave is now in SAVEOP
  1437     // slave is now in SAVEOP
  1652 
  1438 
  1653     if (master->debug_level) {
  1439     if (master->debug_level) {
  1654         EC_DBG("Slave %i is now in SAVEOP.\n", slave->ring_position);
  1440         EC_DBG("Slave %i is now in SAVEOP.\n", slave->ring_position);
  1655     }
  1441     }
  1656 
  1442 
  1657     if (fsm->slave->current_state == fsm->slave->requested_state) {
  1443     if (fsm->slave->current_state == fsm->slave->requested_state) {
  1658         fsm->slave_state = ec_fsm_end; // successful
  1444         fsm->slave_state = ec_fsm_slave_end; // successful
  1659         if (master->debug_level) {
  1445         if (master->debug_level) {
  1660             EC_DBG("Finished configuration of slave %i.\n",
  1446             EC_DBG("Finished configuration of slave %i.\n",
  1661                    slave->ring_position);
  1447                    slave->ring_position);
  1662         }
  1448         }
  1663         return;
  1449         return;
  1682 
  1468 
  1683     if (ec_fsm_change_exec(&fsm->fsm_change)) return;
  1469     if (ec_fsm_change_exec(&fsm->fsm_change)) return;
  1684 
  1470 
  1685     if (!ec_fsm_change_success(&fsm->fsm_change)) {
  1471     if (!ec_fsm_change_success(&fsm->fsm_change)) {
  1686         slave->error_flag = 1;
  1472         slave->error_flag = 1;
  1687         fsm->slave_state = ec_fsm_error;
  1473         fsm->slave_state = ec_fsm_slave_error;
  1688         return;
  1474         return;
  1689     }
  1475     }
  1690 
  1476 
  1691     // slave is now in OP
  1477     // slave is now in OP
  1692 
  1478 
  1693     if (master->debug_level) {
  1479     if (master->debug_level) {
  1694         EC_DBG("Slave %i is now in OP.\n", slave->ring_position);
  1480         EC_DBG("Slave %i is now in OP.\n", slave->ring_position);
  1695         EC_DBG("Finished configuration of slave %i.\n", slave->ring_position);
  1481         EC_DBG("Finished configuration of slave %i.\n", slave->ring_position);
  1696     }
  1482     }
  1697 
  1483 
  1698     fsm->slave_state = ec_fsm_end; // successful
  1484     fsm->slave_state = ec_fsm_slave_end; // successful
  1699 }
  1485 }
  1700 
  1486 
  1701 /******************************************************************************
  1487 /******************************************************************************
  1702  *  Common state functions
  1488  *  Common state functions
  1703  *****************************************************************************/
  1489  *****************************************************************************/
  1704 
  1490 
  1705 /**
  1491 /**
  1706    State: ERROR.
  1492    State: ERROR.
  1707 */
  1493 */
  1708 
  1494 
  1709 void ec_fsm_error(ec_fsm_t *fsm /**< finite state machine */)
  1495 void ec_fsm_slave_error(ec_fsm_t *fsm /**< finite state machine */)
  1710 {
  1496 {
  1711 }
  1497 }
  1712 
  1498 
  1713 /*****************************************************************************/
  1499 /*****************************************************************************/
  1714 
  1500 
  1715 /**
  1501 /**
  1716    State: END.
  1502    State: END.
  1717 */
  1503 */
  1718 
  1504 
  1719 void ec_fsm_end(ec_fsm_t *fsm /**< finite state machine */)
  1505 void ec_fsm_slave_end(ec_fsm_t *fsm /**< finite state machine */)
  1720 {
  1506 {
  1721 }
  1507 }
  1722 
  1508 
  1723 /*****************************************************************************/
  1509 /*****************************************************************************/