master/fsm.c
branchstable-1.2
changeset 1739 5fcbd29151d2
parent 1738 bc89e3fba1a5
child 1740 fa0af75bfbe9
equal deleted inserted replaced
1738:bc89e3fba1a5 1739:5fcbd29151d2
     1 /******************************************************************************
       
     2  *
       
     3  *  $Id$
       
     4  *
       
     5  *  Copyright (C) 2006  Florian Pose, Ingenieurgemeinschaft IgH
       
     6  *
       
     7  *  This file is part of the IgH EtherCAT Master.
       
     8  *
       
     9  *  The IgH EtherCAT Master is free software; you can redistribute it
       
    10  *  and/or modify it under the terms of the GNU General Public License
       
    11  *  as published by the Free Software Foundation; either version 2 of the
       
    12  *  License, or (at your option) any later version.
       
    13  *
       
    14  *  The IgH EtherCAT Master is distributed in the hope that it will be
       
    15  *  useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       
    17  *  GNU General Public License for more details.
       
    18  *
       
    19  *  You should have received a copy of the GNU General Public License
       
    20  *  along with the IgH EtherCAT Master; if not, write to the Free Software
       
    21  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
       
    22  *
       
    23  *  The right to use EtherCAT Technology is granted and comes free of
       
    24  *  charge under condition of compatibility of product made by
       
    25  *  Licensee. People intending to distribute/sell products based on the
       
    26  *  code, have to sign an agreement to guarantee that products using
       
    27  *  software based on IgH EtherCAT master stay compatible with the actual
       
    28  *  EtherCAT specification (which are released themselves as an open
       
    29  *  standard) as the (only) precondition to have the right to use EtherCAT
       
    30  *  Technology, IP and trade marks.
       
    31  *
       
    32  *****************************************************************************/
       
    33 
       
    34 /**
       
    35    \file
       
    36    EtherCAT finite state machines.
       
    37 */
       
    38 
       
    39 /*****************************************************************************/
       
    40 
       
    41 #include "globals.h"
       
    42 #include "fsm.h"
       
    43 #include "master.h"
       
    44 #include "mailbox.h"
       
    45 
       
    46 /*****************************************************************************/
       
    47 
       
    48 void ec_fsm_master_start(ec_fsm_t *);
       
    49 void ec_fsm_master_broadcast(ec_fsm_t *);
       
    50 void ec_fsm_master_read_states(ec_fsm_t *);
       
    51 void ec_fsm_master_acknowledge(ec_fsm_t *);
       
    52 void ec_fsm_master_validate_vendor(ec_fsm_t *);
       
    53 void ec_fsm_master_validate_product(ec_fsm_t *);
       
    54 void ec_fsm_master_rewrite_addresses(ec_fsm_t *);
       
    55 void ec_fsm_master_configure_slave(ec_fsm_t *);
       
    56 void ec_fsm_master_scan_slaves(ec_fsm_t *);
       
    57 void ec_fsm_master_write_eeprom(ec_fsm_t *);
       
    58 void ec_fsm_master_sdodict(ec_fsm_t *);
       
    59 void ec_fsm_master_sdo_request(ec_fsm_t *);
       
    60 void ec_fsm_master_end(ec_fsm_t *);
       
    61 void ec_fsm_master_error(ec_fsm_t *);
       
    62 
       
    63 void ec_fsm_slavescan_start(ec_fsm_t *);
       
    64 void ec_fsm_slavescan_address(ec_fsm_t *);
       
    65 void ec_fsm_slavescan_state(ec_fsm_t *);
       
    66 void ec_fsm_slavescan_base(ec_fsm_t *);
       
    67 void ec_fsm_slavescan_datalink(ec_fsm_t *);
       
    68 void ec_fsm_slavescan_eeprom_size(ec_fsm_t *);
       
    69 void ec_fsm_slavescan_eeprom_data(ec_fsm_t *);
       
    70 
       
    71 void ec_fsm_slaveconf_state_start(ec_fsm_t *);
       
    72 void ec_fsm_slaveconf_state_init(ec_fsm_t *);
       
    73 void ec_fsm_slaveconf_state_clear_fmmus(ec_fsm_t *);
       
    74 void ec_fsm_slaveconf_state_sync(ec_fsm_t *);
       
    75 void ec_fsm_slaveconf_state_preop(ec_fsm_t *);
       
    76 void ec_fsm_slaveconf_state_sync2(ec_fsm_t *);
       
    77 void ec_fsm_slaveconf_state_fmmu(ec_fsm_t *);
       
    78 void ec_fsm_slaveconf_state_sdoconf(ec_fsm_t *);
       
    79 void ec_fsm_slaveconf_state_saveop(ec_fsm_t *);
       
    80 void ec_fsm_slaveconf_state_op(ec_fsm_t *);
       
    81 
       
    82 void ec_fsm_slaveconf_enter_sync(ec_fsm_t *);
       
    83 void ec_fsm_slaveconf_enter_preop(ec_fsm_t *);
       
    84 void ec_fsm_slaveconf_enter_sync2(ec_fsm_t *);
       
    85 void ec_fsm_slaveconf_enter_fmmu(ec_fsm_t *);
       
    86 void ec_fsm_slaveconf_enter_sdoconf(ec_fsm_t *);
       
    87 void ec_fsm_slaveconf_enter_saveop(ec_fsm_t *);
       
    88 
       
    89 void ec_fsm_slave_state_end(ec_fsm_t *);
       
    90 void ec_fsm_slave_state_error(ec_fsm_t *);
       
    91 
       
    92 /*****************************************************************************/
       
    93 
       
    94 /**
       
    95    Constructor.
       
    96 */
       
    97 
       
    98 int ec_fsm_init(ec_fsm_t *fsm, /**< finite state machine */
       
    99                 ec_master_t *master /**< EtherCAT master */
       
   100                 )
       
   101 {
       
   102     fsm->master = master;
       
   103     fsm->master_state = ec_fsm_master_start;
       
   104     fsm->master_slaves_responding = 0;
       
   105     fsm->master_slave_states = EC_SLAVE_STATE_UNKNOWN;
       
   106     fsm->master_validation = 0;
       
   107 
       
   108     ec_datagram_init(&fsm->datagram);
       
   109     if (ec_datagram_prealloc(&fsm->datagram, EC_MAX_DATA_SIZE)) {
       
   110         EC_ERR("Failed to allocate FSM datagram.\n");
       
   111         return -1;
       
   112     }
       
   113 
       
   114     // init sub-state-machines
       
   115     ec_fsm_sii_init(&fsm->fsm_sii, &fsm->datagram);
       
   116     ec_fsm_change_init(&fsm->fsm_change, &fsm->datagram);
       
   117     ec_fsm_coe_init(&fsm->fsm_coe, &fsm->datagram);
       
   118 
       
   119     return 0;
       
   120 }
       
   121 
       
   122 /*****************************************************************************/
       
   123 
       
   124 /**
       
   125    Destructor.
       
   126 */
       
   127 
       
   128 void ec_fsm_clear(ec_fsm_t *fsm /**< finite state machine */)
       
   129 {
       
   130     // clear sub-state machines
       
   131     ec_fsm_sii_clear(&fsm->fsm_sii);
       
   132     ec_fsm_change_clear(&fsm->fsm_change);
       
   133     ec_fsm_coe_clear(&fsm->fsm_coe);
       
   134 
       
   135     ec_datagram_clear(&fsm->datagram);
       
   136 }
       
   137 
       
   138 /*****************************************************************************/
       
   139 
       
   140 /**
       
   141    Executes the current state of the state machine.
       
   142    \return false, if state machine has terminated
       
   143 */
       
   144 
       
   145 int ec_fsm_exec(ec_fsm_t *fsm /**< finite state machine */)
       
   146 {
       
   147     fsm->master_state(fsm);
       
   148 
       
   149     return ec_fsm_running(fsm);
       
   150 }
       
   151 
       
   152 /*****************************************************************************/
       
   153 
       
   154 /**
       
   155    \return false, if state machine has terminated
       
   156 */
       
   157 
       
   158 int ec_fsm_running(ec_fsm_t *fsm /**< finite state machine */)
       
   159 {
       
   160     return fsm->master_state != ec_fsm_master_end
       
   161         && fsm->master_state != ec_fsm_master_error;
       
   162 }
       
   163 
       
   164 /*****************************************************************************/
       
   165 
       
   166 /**
       
   167    \return true, if the master state machine terminated gracefully
       
   168 */
       
   169 
       
   170 int ec_fsm_success(ec_fsm_t *fsm /**< finite state machine */)
       
   171 {
       
   172     return fsm->master_state == ec_fsm_master_end;
       
   173 }
       
   174 
       
   175 /******************************************************************************
       
   176  *  operation/idle state machine
       
   177  *****************************************************************************/
       
   178 
       
   179 /**
       
   180    Master state: START.
       
   181    Starts with getting slave count and slave states.
       
   182 */
       
   183 
       
   184 void ec_fsm_master_start(ec_fsm_t *fsm)
       
   185 {
       
   186     ec_datagram_brd(&fsm->datagram, 0x0130, 2);
       
   187     ec_master_queue_datagram(fsm->master, &fsm->datagram);
       
   188     fsm->master_state = ec_fsm_master_broadcast;
       
   189 }
       
   190 
       
   191 /*****************************************************************************/
       
   192 
       
   193 /**
       
   194    Master state: BROADCAST.
       
   195    Processes the broadcast read slave count and slaves states.
       
   196 */
       
   197 
       
   198 void ec_fsm_master_broadcast(ec_fsm_t *fsm /**< finite state machine */)
       
   199 {
       
   200     ec_datagram_t *datagram = &fsm->datagram;
       
   201     unsigned int topology_change, states_change, i;
       
   202     ec_slave_t *slave;
       
   203     ec_master_t *master = fsm->master;
       
   204 
       
   205     if (datagram->state != EC_DATAGRAM_RECEIVED) {
       
   206         if (!master->device->link_state) {
       
   207             fsm->master_slaves_responding = 0;
       
   208             list_for_each_entry(slave, &master->slaves, list) {
       
   209                 slave->online = 0;
       
   210             }
       
   211         }
       
   212         else {
       
   213             EC_ERR("Failed to receive broadcast datagram.\n");
       
   214         }
       
   215         fsm->master_state = ec_fsm_master_error;
       
   216         return;
       
   217     }
       
   218 
       
   219     topology_change = (datagram->working_counter !=
       
   220                        fsm->master_slaves_responding);
       
   221     states_change = (EC_READ_U8(datagram->data) != fsm->master_slave_states);
       
   222 
       
   223     fsm->master_slave_states = EC_READ_U8(datagram->data);
       
   224     fsm->master_slaves_responding = datagram->working_counter;
       
   225 
       
   226     if (topology_change) {
       
   227         EC_INFO("%i slave%s responding.\n",
       
   228                 fsm->master_slaves_responding,
       
   229                 fsm->master_slaves_responding == 1 ? "" : "s");
       
   230 
       
   231         if (master->mode == EC_MASTER_MODE_OPERATION) {
       
   232             if (fsm->master_slaves_responding == master->slave_count) {
       
   233                 fsm->master_validation = 1; // start validation later
       
   234             }
       
   235             else {
       
   236                 EC_WARN("Invalid slave count. Bus in tainted state.\n");
       
   237             }
       
   238         }
       
   239     }
       
   240 
       
   241     if (states_change) {
       
   242         char states[EC_STATE_STRING_SIZE];
       
   243         ec_state_string(fsm->master_slave_states, states);
       
   244         EC_INFO("Slave states: %s.\n", states);
       
   245     }
       
   246 
       
   247     // topology change in idle mode: clear all slaves and scan the bus
       
   248     if (topology_change && master->mode == EC_MASTER_MODE_IDLE) {
       
   249 
       
   250         ec_master_eoe_stop(master);
       
   251         ec_master_destroy_slaves(master);
       
   252 
       
   253         master->slave_count = datagram->working_counter;
       
   254 
       
   255         if (!master->slave_count) {
       
   256             // no slaves present -> finish state machine.
       
   257             fsm->master_state = ec_fsm_master_end;
       
   258             return;
       
   259         }
       
   260 
       
   261         // init slaves
       
   262         for (i = 0; i < master->slave_count; i++) {
       
   263             if (!(slave = (ec_slave_t *) kmalloc(sizeof(ec_slave_t),
       
   264                                                  GFP_ATOMIC))) {
       
   265                 EC_ERR("Failed to allocate slave %i!\n", i);
       
   266                 ec_master_destroy_slaves(master);
       
   267                 fsm->master_state = ec_fsm_master_error;
       
   268                 return;
       
   269             }
       
   270 
       
   271             if (ec_slave_init(slave, master, i, i + 1)) {
       
   272                 // freeing of "slave" already done
       
   273                 ec_master_destroy_slaves(master);
       
   274                 fsm->master_state = ec_fsm_master_error;
       
   275                 return;
       
   276             }
       
   277 
       
   278             list_add_tail(&slave->list, &master->slaves);
       
   279         }
       
   280 
       
   281         EC_INFO("Scanning bus.\n");
       
   282 
       
   283         // begin scanning of slaves
       
   284         fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
       
   285         fsm->slave_state = ec_fsm_slavescan_start;
       
   286         fsm->master_state = ec_fsm_master_scan_slaves;
       
   287         fsm->master_state(fsm); // execute immediately
       
   288         return;
       
   289     }
       
   290 
       
   291     // fetch state from each slave
       
   292     fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
       
   293     ec_datagram_nprd(&fsm->datagram, fsm->slave->station_address, 0x0130, 2);
       
   294     ec_master_queue_datagram(master, &fsm->datagram);
       
   295     fsm->master_state = ec_fsm_master_read_states;
       
   296 }
       
   297 
       
   298 /*****************************************************************************/
       
   299 
       
   300 /**
       
   301    Master action: PROC_STATES.
       
   302    Processes the slave states.
       
   303 */
       
   304 
       
   305 void ec_fsm_master_action_process_states(ec_fsm_t *fsm
       
   306                                          /**< finite state machine */
       
   307                                          )
       
   308 {
       
   309     ec_master_t *master = fsm->master;
       
   310     ec_slave_t *slave;
       
   311     char old_state[EC_STATE_STRING_SIZE], new_state[EC_STATE_STRING_SIZE];
       
   312 
       
   313     // check if any slaves are not in the state, they're supposed to be
       
   314     list_for_each_entry(slave, &master->slaves, list) {
       
   315         if (slave->error_flag
       
   316             || !slave->online
       
   317             || slave->requested_state == EC_SLAVE_STATE_UNKNOWN
       
   318             || (slave->current_state == slave->requested_state
       
   319                 && slave->configured)) continue;
       
   320 
       
   321         if (master->debug_level) {
       
   322             ec_state_string(slave->current_state, old_state);
       
   323             if (slave->current_state != slave->requested_state) {
       
   324                 ec_state_string(slave->requested_state, new_state);
       
   325                 EC_DBG("Changing state of slave %i (%s -> %s).\n",
       
   326                        slave->ring_position, old_state, new_state);
       
   327             }
       
   328             else if (!slave->configured) {
       
   329                 EC_DBG("Reconfiguring slave %i (%s).\n",
       
   330                        slave->ring_position, old_state);
       
   331             }
       
   332         }
       
   333 
       
   334         fsm->master_state = ec_fsm_master_configure_slave;
       
   335         fsm->slave = slave;
       
   336         fsm->slave_state = ec_fsm_slaveconf_state_start;
       
   337         fsm->slave_state(fsm); // execute immediately
       
   338         return;
       
   339     }
       
   340 
       
   341     // Check, if EoE processing has to be started
       
   342     ec_master_eoe_start(master);
       
   343 
       
   344     if (master->mode == EC_MASTER_MODE_IDLE) {
       
   345 
       
   346         // Check for a pending SDO request
       
   347         if (master->sdo_seq_master != master->sdo_seq_user) {
       
   348             if (master->debug_level)
       
   349                 EC_DBG("Processing SDO request...\n");
       
   350             slave = master->sdo_request->sdo->slave;
       
   351             if (slave->current_state == EC_SLAVE_STATE_INIT
       
   352                 || !slave->online) {
       
   353                 EC_ERR("Failed to process SDO request, slave %i not ready.\n",
       
   354                        slave->ring_position);
       
   355                 master->sdo_request->return_code = -1;
       
   356                 master->sdo_seq_master++;
       
   357             }
       
   358             else {
       
   359                 // start uploading SDO
       
   360                 fsm->slave = slave;
       
   361                 fsm->master_state = ec_fsm_master_sdo_request;
       
   362                 fsm->sdo_request = master->sdo_request;
       
   363                 ec_fsm_coe_upload(&fsm->fsm_coe, slave, fsm->sdo_request);
       
   364                 ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
       
   365                 return;
       
   366             }
       
   367         }
       
   368 
       
   369         // check, if slaves have an SDO dictionary to read out.
       
   370         list_for_each_entry(slave, &master->slaves, list) {
       
   371             if (!(slave->sii_mailbox_protocols & EC_MBOX_COE)
       
   372                 || slave->sdo_dictionary_fetched
       
   373                 || slave->current_state == EC_SLAVE_STATE_INIT
       
   374                 || jiffies - slave->jiffies_preop < EC_WAIT_SDO_DICT * HZ
       
   375                 || !slave->online
       
   376                 || slave->error_flag) continue;
       
   377 
       
   378             if (master->debug_level) {
       
   379                 EC_DBG("Fetching SDO dictionary from slave %i.\n",
       
   380                        slave->ring_position);
       
   381             }
       
   382 
       
   383             slave->sdo_dictionary_fetched = 1;
       
   384 
       
   385             // start fetching SDO dictionary
       
   386             fsm->slave = slave;
       
   387             fsm->master_state = ec_fsm_master_sdodict;
       
   388             ec_fsm_coe_dictionary(&fsm->fsm_coe, slave);
       
   389             ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
       
   390             return;
       
   391         }
       
   392 
       
   393         // check for pending EEPROM write operations.
       
   394         list_for_each_entry(slave, &master->slaves, list) {
       
   395             if (!slave->new_eeprom_data) continue;
       
   396 
       
   397             if (!slave->online || slave->error_flag) {
       
   398                 kfree(slave->new_eeprom_data);
       
   399                 slave->new_eeprom_data = NULL;
       
   400                 EC_ERR("Discarding EEPROM data, slave %i not ready.\n",
       
   401                        slave->ring_position);
       
   402                 continue;
       
   403             }
       
   404 
       
   405             // found pending EEPROM write operation. execute it!
       
   406             EC_INFO("Writing EEPROM of slave %i...\n", slave->ring_position);
       
   407             fsm->slave = slave;
       
   408             fsm->sii_offset = 0x0000;
       
   409             ec_fsm_sii_write(&fsm->fsm_sii, slave, fsm->sii_offset,
       
   410                              slave->new_eeprom_data, EC_FSM_SII_NODE);
       
   411             fsm->master_state = ec_fsm_master_write_eeprom;
       
   412             fsm->master_state(fsm); // execute immediately
       
   413             return;
       
   414         }
       
   415     }
       
   416 
       
   417     fsm->master_state = ec_fsm_master_end;
       
   418 }
       
   419 
       
   420 /*****************************************************************************/
       
   421 
       
   422 /**
       
   423    Master action: Get state of next slave.
       
   424 */
       
   425 
       
   426 void ec_fsm_master_action_next_slave_state(ec_fsm_t *fsm
       
   427                                            /**< finite state machine */)
       
   428 {
       
   429     ec_master_t *master = fsm->master;
       
   430     ec_slave_t *slave = fsm->slave;
       
   431 
       
   432     // is there another slave to query?
       
   433     if (slave->list.next != &master->slaves) {
       
   434         // process next slave
       
   435         fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
       
   436         ec_datagram_nprd(&fsm->datagram, fsm->slave->station_address,
       
   437                          0x0130, 2);
       
   438         ec_master_queue_datagram(master, &fsm->datagram);
       
   439         fsm->master_state = ec_fsm_master_read_states;
       
   440         return;
       
   441     }
       
   442 
       
   443     // all slave states read
       
   444 
       
   445     // check, if a bus validation has to be done
       
   446     if (fsm->master_validation) {
       
   447         fsm->master_validation = 0;
       
   448         list_for_each_entry(slave, &master->slaves, list) {
       
   449             if (slave->online) continue;
       
   450 
       
   451             // At least one slave is offline. validate!
       
   452             EC_INFO("Validating bus.\n");
       
   453             fsm->slave = list_entry(master->slaves.next, ec_slave_t, list);
       
   454             fsm->master_state = ec_fsm_master_validate_vendor;
       
   455             ec_fsm_sii_read(&fsm->fsm_sii, slave, 0x0008, EC_FSM_SII_POSITION);
       
   456             ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately
       
   457             return;
       
   458         }
       
   459     }
       
   460 
       
   461     ec_fsm_master_action_process_states(fsm);
       
   462 }
       
   463 
       
   464 /*****************************************************************************/
       
   465 
       
   466 /**
       
   467    Master state: READ STATES.
       
   468    Fetches the AL- and online state of a slave.
       
   469 */
       
   470 
       
   471 void ec_fsm_master_read_states(ec_fsm_t *fsm /**< finite state machine */)
       
   472 {
       
   473     ec_slave_t *slave = fsm->slave;
       
   474     ec_datagram_t *datagram = &fsm->datagram;
       
   475     uint8_t new_state;
       
   476 
       
   477     if (datagram->state != EC_DATAGRAM_RECEIVED) {
       
   478         EC_ERR("Failed to receive AL state datagram for slave %i!\n",
       
   479                slave->ring_position);
       
   480         fsm->master_state = ec_fsm_master_error;
       
   481         return;
       
   482     }
       
   483 
       
   484     // did the slave not respond to its station address?
       
   485     if (datagram->working_counter != 1) {
       
   486         if (slave->online) {
       
   487             slave->online = 0;
       
   488             if (slave->master->debug_level)
       
   489                 EC_DBG("Slave %i: offline.\n", slave->ring_position);
       
   490         }
       
   491         ec_fsm_master_action_next_slave_state(fsm);
       
   492         return;
       
   493     }
       
   494 
       
   495     // slave responded
       
   496     new_state = EC_READ_U8(datagram->data);
       
   497     if (!slave->online) { // slave was offline before
       
   498         slave->online = 1;
       
   499         slave->error_flag = 0; // clear error flag
       
   500         slave->current_state = new_state;
       
   501         if (slave->master->debug_level) {
       
   502             char cur_state[EC_STATE_STRING_SIZE];
       
   503             ec_state_string(slave->current_state, cur_state);
       
   504             EC_DBG("Slave %i: online (%s).\n",
       
   505                    slave->ring_position, cur_state);
       
   506         }
       
   507     }
       
   508     else if (new_state != slave->current_state) {
       
   509         if (slave->master->debug_level) {
       
   510             char old_state[EC_STATE_STRING_SIZE],
       
   511                 cur_state[EC_STATE_STRING_SIZE];
       
   512             ec_state_string(slave->current_state, old_state);
       
   513             ec_state_string(new_state, cur_state);
       
   514             EC_DBG("Slave %i: %s -> %s.\n",
       
   515                    slave->ring_position, old_state, cur_state);
       
   516         }
       
   517         slave->current_state = new_state;
       
   518     }
       
   519 
       
   520     // check, if new slave state has to be acknowledged
       
   521     if (slave->current_state & EC_SLAVE_STATE_ACK_ERR && !slave->error_flag) {
       
   522         ec_fsm_change_ack(&fsm->fsm_change, slave);
       
   523         ec_fsm_change_exec(&fsm->fsm_change);
       
   524         fsm->master_state = ec_fsm_master_acknowledge;
       
   525         return;
       
   526     }
       
   527 
       
   528     ec_fsm_master_action_next_slave_state(fsm);
       
   529 }
       
   530 
       
   531 /*****************************************************************************/
       
   532 
       
   533 /**
       
   534    Master state: ACKNOWLEDGE
       
   535 */
       
   536 
       
   537 void ec_fsm_master_acknowledge(ec_fsm_t *fsm /**< finite state machine */)
       
   538 {
       
   539     ec_slave_t *slave = fsm->slave;
       
   540 
       
   541     if (ec_fsm_change_exec(&fsm->fsm_change)) return;
       
   542 
       
   543     if (!ec_fsm_change_success(&fsm->fsm_change)) {
       
   544         fsm->slave->error_flag = 1;
       
   545         EC_ERR("Failed to acknowledge state change on slave %i.\n",
       
   546                slave->ring_position);
       
   547         fsm->master_state = ec_fsm_master_error;
       
   548         return;
       
   549     }
       
   550 
       
   551     ec_fsm_master_action_next_slave_state(fsm);
       
   552 }
       
   553 
       
   554 /*****************************************************************************/
       
   555 
       
   556 /**
       
   557    Master state: VALIDATE_VENDOR.
       
   558    Validates the vendor ID of a slave.
       
   559 */
       
   560 
       
   561 void ec_fsm_master_validate_vendor(ec_fsm_t *fsm /**< finite state machine */)
       
   562 {
       
   563     ec_slave_t *slave = fsm->slave;
       
   564 
       
   565     if (ec_fsm_sii_exec(&fsm->fsm_sii)) return;
       
   566 
       
   567     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
       
   568         fsm->slave->error_flag = 1;
       
   569         EC_ERR("Failed to validate vendor ID of slave %i.\n",
       
   570                slave->ring_position);
       
   571         fsm->master_state = ec_fsm_master_error;
       
   572         return;
       
   573     }
       
   574 
       
   575     if (EC_READ_U32(fsm->fsm_sii.value) != slave->sii_vendor_id) {
       
   576         EC_ERR("Slave %i has an invalid vendor ID!\n", slave->ring_position);
       
   577         fsm->master_state = ec_fsm_master_error;
       
   578         return;
       
   579     }
       
   580 
       
   581     // vendor ID is ok. check product code.
       
   582     fsm->master_state = ec_fsm_master_validate_product;
       
   583     ec_fsm_sii_read(&fsm->fsm_sii, slave, 0x000A, EC_FSM_SII_POSITION);
       
   584     ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately
       
   585 }
       
   586 
       
   587 /*****************************************************************************/
       
   588 
       
   589 /**
       
   590    Master action: ADDRESS.
       
   591    Looks for slave, that have lost their configuration and writes
       
   592    their station address, so that they can be reconfigured later.
       
   593 */
       
   594 
       
   595 void ec_fsm_master_action_addresses(ec_fsm_t *fsm /**< finite state machine */)
       
   596 {
       
   597     ec_datagram_t *datagram = &fsm->datagram;
       
   598 
       
   599     while (fsm->slave->online) {
       
   600         if (fsm->slave->list.next == &fsm->master->slaves) { // last slave?
       
   601             fsm->master_state = ec_fsm_master_start;
       
   602             fsm->master_state(fsm); // execute immediately
       
   603             return;
       
   604         }
       
   605         // check next slave
       
   606         fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
       
   607     }
       
   608 
       
   609     if (fsm->master->debug_level)
       
   610         EC_DBG("Reinitializing slave %i.\n", fsm->slave->ring_position);
       
   611 
       
   612     // write station address
       
   613     ec_datagram_apwr(datagram, fsm->slave->ring_position, 0x0010, 2);
       
   614     EC_WRITE_U16(datagram->data, fsm->slave->station_address);
       
   615     ec_master_queue_datagram(fsm->master, datagram);
       
   616     fsm->master_state = ec_fsm_master_rewrite_addresses;
       
   617 }
       
   618 
       
   619 /*****************************************************************************/
       
   620 
       
   621 /**
       
   622    Master state: VALIDATE_PRODUCT.
       
   623    Validates the product ID of a slave.
       
   624 */
       
   625 
       
   626 void ec_fsm_master_validate_product(ec_fsm_t *fsm /**< finite state machine */)
       
   627 {
       
   628     ec_slave_t *slave = fsm->slave;
       
   629 
       
   630     if (ec_fsm_sii_exec(&fsm->fsm_sii)) return;
       
   631 
       
   632     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
       
   633         fsm->slave->error_flag = 1;
       
   634         EC_ERR("Failed to validate product code of slave %i.\n",
       
   635                slave->ring_position);
       
   636         fsm->master_state = ec_fsm_master_error;
       
   637         return;
       
   638     }
       
   639 
       
   640     if (EC_READ_U32(fsm->fsm_sii.value) != slave->sii_product_code) {
       
   641         EC_ERR("Slave %i: invalid product code!\n", slave->ring_position);
       
   642         EC_ERR("expected 0x%08X, got 0x%08X.\n", slave->sii_product_code,
       
   643                EC_READ_U32(fsm->fsm_sii.value));
       
   644         fsm->master_state = ec_fsm_master_error;
       
   645         return;
       
   646     }
       
   647 
       
   648     // have all states been validated?
       
   649     if (slave->list.next == &fsm->master->slaves) {
       
   650         fsm->slave = list_entry(fsm->master->slaves.next, ec_slave_t, list);
       
   651         // start writing addresses to offline slaves
       
   652         ec_fsm_master_action_addresses(fsm);
       
   653         return;
       
   654     }
       
   655 
       
   656     // validate next slave
       
   657     fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
       
   658     fsm->master_state = ec_fsm_master_validate_vendor;
       
   659     ec_fsm_sii_read(&fsm->fsm_sii, slave, 0x0008, EC_FSM_SII_POSITION);
       
   660     ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately
       
   661 }
       
   662 
       
   663 /*****************************************************************************/
       
   664 
       
   665 /**
       
   666    Master state: REWRITE ADDRESS.
       
   667    Checks, if the new station address has been written to the slave.
       
   668 */
       
   669 
       
   670 void ec_fsm_master_rewrite_addresses(ec_fsm_t *fsm
       
   671                                      /**< finite state machine */
       
   672                                      )
       
   673 {
       
   674     ec_slave_t *slave = fsm->slave;
       
   675     ec_datagram_t *datagram = &fsm->datagram;
       
   676 
       
   677     if (datagram->state != EC_DATAGRAM_RECEIVED
       
   678         || datagram->working_counter != 1) {
       
   679         EC_ERR("Failed to write station address on slave %i.\n",
       
   680                slave->ring_position);
       
   681     }
       
   682 
       
   683     if (fsm->slave->list.next == &fsm->master->slaves) { // last slave?
       
   684         fsm->master_state = ec_fsm_master_start;
       
   685         fsm->master_state(fsm); // execute immediately
       
   686         return;
       
   687     }
       
   688 
       
   689     // check next slave
       
   690     fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
       
   691     // Write new station address to slave
       
   692     ec_fsm_master_action_addresses(fsm);
       
   693 }
       
   694 
       
   695 /*****************************************************************************/
       
   696 
       
   697 /**
       
   698    Master state: SCAN SLAVES.
       
   699    Executes the sub-statemachine for the scanning of a slave.
       
   700 */
       
   701 
       
   702 void ec_fsm_master_scan_slaves(ec_fsm_t *fsm /**< finite state machine */)
       
   703 {
       
   704     ec_master_t *master = fsm->master;
       
   705     ec_slave_t *slave = fsm->slave;
       
   706 
       
   707     fsm->slave_state(fsm); // execute slave state machine
       
   708 
       
   709     if (fsm->slave_state != ec_fsm_slave_state_end
       
   710         && fsm->slave_state != ec_fsm_slave_state_error) return;
       
   711 
       
   712     // another slave to fetch?
       
   713     if (slave->list.next != &master->slaves) {
       
   714         fsm->slave = list_entry(fsm->slave->list.next, ec_slave_t, list);
       
   715         fsm->slave_state = ec_fsm_slavescan_start;
       
   716         fsm->slave_state(fsm); // execute immediately
       
   717         return;
       
   718     }
       
   719 
       
   720     EC_INFO("Bus scanning completed.\n");
       
   721 
       
   722     ec_master_calc_addressing(master);
       
   723 
       
   724     // set initial states of all slaves to PREOP to make mailbox
       
   725     // communication possible
       
   726     list_for_each_entry(slave, &master->slaves, list) {
       
   727         ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
       
   728     }
       
   729 
       
   730     fsm->master_state = ec_fsm_master_end;
       
   731 }
       
   732 
       
   733 /*****************************************************************************/
       
   734 
       
   735 /**
       
   736    Master state: CONFIGURE SLAVES.
       
   737    Starts configuring a slave.
       
   738 */
       
   739 
       
   740 void ec_fsm_master_configure_slave(ec_fsm_t *fsm
       
   741                                    /**< finite state machine */
       
   742                                    )
       
   743 {
       
   744     fsm->slave_state(fsm); // execute slave's state machine
       
   745 
       
   746     if (fsm->slave_state != ec_fsm_slave_state_end
       
   747         && fsm->slave_state != ec_fsm_slave_state_error) return;
       
   748 
       
   749     ec_fsm_master_action_process_states(fsm);
       
   750 }
       
   751 
       
   752 /*****************************************************************************/
       
   753 
       
   754 /**
       
   755    Master state: WRITE EEPROM.
       
   756 */
       
   757 
       
   758 void ec_fsm_master_write_eeprom(ec_fsm_t *fsm /**< finite state machine */)
       
   759 {
       
   760     ec_slave_t *slave = fsm->slave;
       
   761 
       
   762     if (ec_fsm_sii_exec(&fsm->fsm_sii)) return;
       
   763 
       
   764     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
       
   765         fsm->slave->error_flag = 1;
       
   766         EC_ERR("Failed to write EEPROM contents to slave %i.\n",
       
   767                slave->ring_position);
       
   768         kfree(slave->new_eeprom_data);
       
   769         slave->new_eeprom_data = NULL;
       
   770         fsm->master_state = ec_fsm_master_error;
       
   771         return;
       
   772     }
       
   773 
       
   774     fsm->sii_offset++;
       
   775     if (fsm->sii_offset < slave->new_eeprom_size) {
       
   776         ec_fsm_sii_write(&fsm->fsm_sii, slave, fsm->sii_offset,
       
   777                          slave->new_eeprom_data + fsm->sii_offset,
       
   778                          EC_FSM_SII_NODE);
       
   779         ec_fsm_sii_exec(&fsm->fsm_sii); // execute immediately
       
   780         return;
       
   781     }
       
   782 
       
   783     // finished writing EEPROM
       
   784     EC_INFO("Finished writing EEPROM of slave %i.\n", slave->ring_position);
       
   785     kfree(slave->new_eeprom_data);
       
   786     slave->new_eeprom_data = NULL;
       
   787 
       
   788     // TODO: Evaluate new EEPROM contents!
       
   789 
       
   790     // restart master state machine.
       
   791     fsm->master_state = ec_fsm_master_start;
       
   792     fsm->master_state(fsm); // execute immediately
       
   793 }
       
   794 
       
   795 /*****************************************************************************/
       
   796 
       
   797 /**
       
   798    Master state: SDODICT.
       
   799 */
       
   800 
       
   801 void ec_fsm_master_sdodict(ec_fsm_t *fsm /**< finite state machine */)
       
   802 {
       
   803     ec_slave_t *slave = fsm->slave;
       
   804     ec_master_t *master = fsm->master;
       
   805 
       
   806     if (ec_fsm_coe_exec(&fsm->fsm_coe)) return;
       
   807 
       
   808     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
       
   809         fsm->master_state = ec_fsm_master_error;
       
   810         return;
       
   811     }
       
   812 
       
   813     // SDO dictionary fetching finished
       
   814 
       
   815     if (master->debug_level) {
       
   816         unsigned int sdo_count, entry_count;
       
   817         ec_slave_sdo_dict_info(slave, &sdo_count, &entry_count);
       
   818         EC_DBG("Fetched %i SDOs and %i entries from slave %i.\n",
       
   819                sdo_count, entry_count, slave->ring_position);
       
   820     }
       
   821 
       
   822     // restart master state machine.
       
   823     fsm->master_state = ec_fsm_master_start;
       
   824     fsm->master_state(fsm); // execute immediately
       
   825 }
       
   826 
       
   827 /*****************************************************************************/
       
   828 
       
   829 /**
       
   830    Master state: SDO REQUEST.
       
   831 */
       
   832 
       
   833 void ec_fsm_master_sdo_request(ec_fsm_t *fsm /**< finite state machine */)
       
   834 {
       
   835     ec_master_t *master = fsm->master;
       
   836     ec_sdo_request_t *request = fsm->sdo_request;
       
   837 
       
   838     if (ec_fsm_coe_exec(&fsm->fsm_coe)) return;
       
   839 
       
   840     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
       
   841         request->return_code = -1;
       
   842         master->sdo_seq_master++;
       
   843         fsm->master_state = ec_fsm_master_error;
       
   844         return;
       
   845     }
       
   846 
       
   847     // SDO dictionary fetching finished
       
   848 
       
   849     request->return_code = 1;
       
   850     master->sdo_seq_master++;
       
   851 
       
   852     // restart master state machine.
       
   853     fsm->master_state = ec_fsm_master_start;
       
   854     fsm->master_state(fsm); // execute immediately
       
   855 }
       
   856 
       
   857 /*****************************************************************************/
       
   858 
       
   859 /**
       
   860    State: ERROR.
       
   861 */
       
   862 
       
   863 void ec_fsm_master_error(ec_fsm_t *fsm /**< finite state machine */)
       
   864 {
       
   865     fsm->master_state = ec_fsm_master_start;
       
   866 }
       
   867 
       
   868 /*****************************************************************************/
       
   869 
       
   870 /**
       
   871    State: END.
       
   872 */
       
   873 
       
   874 void ec_fsm_master_end(ec_fsm_t *fsm /**< finite state machine */)
       
   875 {
       
   876     fsm->master_state = ec_fsm_master_start;
       
   877 }
       
   878 
       
   879 /******************************************************************************
       
   880  *  slave scan state machine
       
   881  *****************************************************************************/
       
   882 
       
   883 /**
       
   884    Slave scan state: START.
       
   885    First state of the slave state machine. Writes the station address to the
       
   886    slave, according to its ring position.
       
   887 */
       
   888 
       
   889 void ec_fsm_slavescan_start(ec_fsm_t *fsm /**< finite state machine */)
       
   890 {
       
   891     ec_datagram_t *datagram = &fsm->datagram;
       
   892 
       
   893     // write station address
       
   894     ec_datagram_apwr(datagram, fsm->slave->ring_position, 0x0010, 2);
       
   895     EC_WRITE_U16(datagram->data, fsm->slave->station_address);
       
   896     ec_master_queue_datagram(fsm->master, datagram);
       
   897     fsm->slave_state = ec_fsm_slavescan_address;
       
   898 }
       
   899 
       
   900 /*****************************************************************************/
       
   901 
       
   902 /**
       
   903    Slave scan state: ADDRESS.
       
   904 */
       
   905 
       
   906 void ec_fsm_slavescan_address(ec_fsm_t *fsm /**< finite state machine */)
       
   907 {
       
   908     ec_datagram_t *datagram = &fsm->datagram;
       
   909 
       
   910     if (datagram->state != EC_DATAGRAM_RECEIVED
       
   911         || datagram->working_counter != 1) {
       
   912         fsm->slave->error_flag = 1;
       
   913         fsm->slave_state = ec_fsm_slave_state_error;
       
   914         EC_ERR("Failed to write station address of slave %i.\n",
       
   915                fsm->slave->ring_position);
       
   916         return;
       
   917     }
       
   918 
       
   919     // Read AL state
       
   920     ec_datagram_nprd(datagram, fsm->slave->station_address, 0x0130, 2);
       
   921     ec_master_queue_datagram(fsm->master, datagram);
       
   922     fsm->slave_state = ec_fsm_slavescan_state;
       
   923 }
       
   924 
       
   925 /*****************************************************************************/
       
   926 
       
   927 /**
       
   928    Slave scan state: STATE.
       
   929 */
       
   930 
       
   931 void ec_fsm_slavescan_state(ec_fsm_t *fsm /**< finite state machine */)
       
   932 {
       
   933     ec_datagram_t *datagram = &fsm->datagram;
       
   934     ec_slave_t *slave = fsm->slave;
       
   935 
       
   936     if (datagram->state != EC_DATAGRAM_RECEIVED
       
   937         || datagram->working_counter != 1) {
       
   938         fsm->slave->error_flag = 1;
       
   939         fsm->slave_state = ec_fsm_slave_state_error;
       
   940         EC_ERR("Failed to read AL state of slave %i.\n",
       
   941                fsm->slave->ring_position);
       
   942         return;
       
   943     }
       
   944 
       
   945     slave->current_state = EC_READ_U8(datagram->data);
       
   946     if (slave->current_state & EC_SLAVE_STATE_ACK_ERR) {
       
   947         char state_str[EC_STATE_STRING_SIZE];
       
   948         ec_state_string(slave->current_state, state_str);
       
   949         EC_WARN("Slave %i has state error bit set (%s)!\n",
       
   950                 slave->ring_position, state_str);
       
   951     }
       
   952 
       
   953     // read base data
       
   954     ec_datagram_nprd(datagram, fsm->slave->station_address, 0x0000, 6);
       
   955     ec_master_queue_datagram(fsm->master, datagram);
       
   956     fsm->slave_state = ec_fsm_slavescan_base;
       
   957 }
       
   958 
       
   959 /*****************************************************************************/
       
   960 
       
   961 /**
       
   962    Slave scan state: BASE.
       
   963 */
       
   964 
       
   965 void ec_fsm_slavescan_base(ec_fsm_t *fsm /**< finite state machine */)
       
   966 {
       
   967     ec_datagram_t *datagram = &fsm->datagram;
       
   968     ec_slave_t *slave = fsm->slave;
       
   969 
       
   970     if (datagram->state != EC_DATAGRAM_RECEIVED
       
   971         || datagram->working_counter != 1) {
       
   972         fsm->slave->error_flag = 1;
       
   973         fsm->slave_state = ec_fsm_slave_state_error;
       
   974         EC_ERR("Failed to read base data of slave %i.\n",
       
   975                slave->ring_position);
       
   976         return;
       
   977     }
       
   978 
       
   979     slave->base_type       = EC_READ_U8 (datagram->data);
       
   980     slave->base_revision   = EC_READ_U8 (datagram->data + 1);
       
   981     slave->base_build      = EC_READ_U16(datagram->data + 2);
       
   982     slave->base_fmmu_count = EC_READ_U8 (datagram->data + 4);
       
   983     slave->base_sync_count = EC_READ_U8 (datagram->data + 5);
       
   984 
       
   985     if (slave->base_fmmu_count > EC_MAX_FMMUS)
       
   986         slave->base_fmmu_count = EC_MAX_FMMUS;
       
   987 
       
   988     // read data link status
       
   989     ec_datagram_nprd(datagram, slave->station_address, 0x0110, 2);
       
   990     ec_master_queue_datagram(slave->master, datagram);
       
   991     fsm->slave_state = ec_fsm_slavescan_datalink;
       
   992 }
       
   993 
       
   994 /*****************************************************************************/
       
   995 
       
   996 /**
       
   997    Slave scan state: DATALINK.
       
   998 */
       
   999 
       
  1000 void ec_fsm_slavescan_datalink(ec_fsm_t *fsm /**< finite state machine */)
       
  1001 {
       
  1002     ec_datagram_t *datagram = &fsm->datagram;
       
  1003     ec_slave_t *slave = fsm->slave;
       
  1004     uint16_t dl_status;
       
  1005     unsigned int i;
       
  1006 
       
  1007     if (datagram->state != EC_DATAGRAM_RECEIVED
       
  1008         || datagram->working_counter != 1) {
       
  1009         fsm->slave->error_flag = 1;
       
  1010         fsm->slave_state = ec_fsm_slave_state_error;
       
  1011         EC_ERR("Failed to read DL status of slave %i.\n",
       
  1012                slave->ring_position);
       
  1013         return;
       
  1014     }
       
  1015 
       
  1016     dl_status = EC_READ_U16(datagram->data);
       
  1017     for (i = 0; i < 4; i++) {
       
  1018         slave->dl_link[i] = dl_status & (1 << (4 + i)) ? 1 : 0;
       
  1019         slave->dl_loop[i] = dl_status & (1 << (8 + i * 2)) ? 1 : 0;
       
  1020         slave->dl_signal[i] = dl_status & (1 << (9 + i * 2)) ? 1 : 0;
       
  1021     }
       
  1022 
       
  1023     // Start fetching EEPROM size
       
  1024 
       
  1025     fsm->sii_offset = 0x0040; // first category header
       
  1026     ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, EC_FSM_SII_NODE);
       
  1027     fsm->slave_state = ec_fsm_slavescan_eeprom_size;
       
  1028     fsm->slave_state(fsm); // execute state immediately
       
  1029 }
       
  1030 
       
  1031 /*****************************************************************************/
       
  1032 
       
  1033 /**
       
  1034    Slave scan state: EEPROM SIZE.
       
  1035 */
       
  1036 
       
  1037 void ec_fsm_slavescan_eeprom_size(ec_fsm_t *fsm /**< finite state machine */)
       
  1038 {
       
  1039     ec_slave_t *slave = fsm->slave;
       
  1040     uint16_t cat_type, cat_size;
       
  1041 
       
  1042     if (ec_fsm_sii_exec(&fsm->fsm_sii)) return;
       
  1043 
       
  1044     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
       
  1045         fsm->slave->error_flag = 1;
       
  1046         fsm->slave_state = ec_fsm_slave_state_error;
       
  1047         EC_ERR("Failed to read EEPROM size of slave %i.\n",
       
  1048                slave->ring_position);
       
  1049         return;
       
  1050     }
       
  1051 
       
  1052     cat_type = EC_READ_U16(fsm->fsm_sii.value);
       
  1053     cat_size = EC_READ_U16(fsm->fsm_sii.value + 2);
       
  1054 
       
  1055     if (cat_type != 0xFFFF) { // not the last category
       
  1056         fsm->sii_offset += cat_size + 2;
       
  1057         ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset,
       
  1058                         EC_FSM_SII_NODE);
       
  1059         ec_fsm_sii_exec(&fsm->fsm_sii); // execute state immediately
       
  1060         return;
       
  1061     }
       
  1062 
       
  1063     slave->eeprom_size = (fsm->sii_offset + 1) * 2;
       
  1064 
       
  1065     if (slave->eeprom_data) {
       
  1066         EC_INFO("Freeing old EEPROM data on slave %i...\n",
       
  1067                 slave->ring_position);
       
  1068         kfree(slave->eeprom_data);
       
  1069     }
       
  1070 
       
  1071     if (!(slave->eeprom_data =
       
  1072           (uint8_t *) kmalloc(slave->eeprom_size, GFP_ATOMIC))) {
       
  1073         fsm->slave->error_flag = 1;
       
  1074         fsm->slave_state = ec_fsm_slave_state_error;
       
  1075         EC_ERR("Failed to allocate EEPROM data on slave %i.\n",
       
  1076                slave->ring_position);
       
  1077         return;
       
  1078     }
       
  1079 
       
  1080     // Start fetching EEPROM contents
       
  1081 
       
  1082     fsm->slave_state = ec_fsm_slavescan_eeprom_data;
       
  1083     fsm->sii_offset = 0x0000;
       
  1084     ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset, EC_FSM_SII_NODE);
       
  1085     ec_fsm_sii_exec(&fsm->fsm_sii); // execute state immediately
       
  1086 }
       
  1087 
       
  1088 /*****************************************************************************/
       
  1089 
       
  1090 /**
       
  1091    Slave scan state: EEPROM DATA.
       
  1092 */
       
  1093 
       
  1094 void ec_fsm_slavescan_eeprom_data(ec_fsm_t *fsm /**< finite state machine */)
       
  1095 {
       
  1096     ec_slave_t *slave = fsm->slave;
       
  1097     uint16_t *cat_word, cat_type, cat_size;
       
  1098 
       
  1099     if (ec_fsm_sii_exec(&fsm->fsm_sii)) return;
       
  1100 
       
  1101     if (!ec_fsm_sii_success(&fsm->fsm_sii)) {
       
  1102         fsm->slave->error_flag = 1;
       
  1103         fsm->slave_state = ec_fsm_slave_state_error;
       
  1104         EC_ERR("Failed to fetch EEPROM contents of slave %i.\n",
       
  1105                slave->ring_position);
       
  1106         return;
       
  1107     }
       
  1108 
       
  1109     // 2 words fetched
       
  1110 
       
  1111     if (fsm->sii_offset + 2 <= slave->eeprom_size / 2) { // 2 words fit
       
  1112         memcpy(slave->eeprom_data + fsm->sii_offset * 2,
       
  1113                fsm->fsm_sii.value, 4);
       
  1114     }
       
  1115     else { // copy the last word
       
  1116         memcpy(slave->eeprom_data + fsm->sii_offset * 2,
       
  1117                fsm->fsm_sii.value, 2);
       
  1118     }
       
  1119 
       
  1120     if (fsm->sii_offset + 2 < slave->eeprom_size / 2) {
       
  1121         // fetch the next 2 words
       
  1122         fsm->sii_offset += 2;
       
  1123         ec_fsm_sii_read(&fsm->fsm_sii, slave, fsm->sii_offset,
       
  1124                         EC_FSM_SII_NODE);
       
  1125         ec_fsm_sii_exec(&fsm->fsm_sii); // execute state immediately
       
  1126         return;
       
  1127     }
       
  1128 
       
  1129     // Evaluate EEPROM contents
       
  1130 
       
  1131     slave->sii_alias =
       
  1132         EC_READ_U16(slave->eeprom_data + 2 * 0x0004);
       
  1133     slave->sii_vendor_id =
       
  1134         EC_READ_U32(slave->eeprom_data + 2 * 0x0008);
       
  1135     slave->sii_product_code =
       
  1136         EC_READ_U32(slave->eeprom_data + 2 * 0x000A);
       
  1137     slave->sii_revision_number =
       
  1138         EC_READ_U32(slave->eeprom_data + 2 * 0x000C);
       
  1139     slave->sii_serial_number =
       
  1140         EC_READ_U32(slave->eeprom_data + 2 * 0x000E);
       
  1141     slave->sii_rx_mailbox_offset =
       
  1142         EC_READ_U16(slave->eeprom_data + 2 * 0x0018);
       
  1143     slave->sii_rx_mailbox_size =
       
  1144         EC_READ_U16(slave->eeprom_data + 2 * 0x0019);
       
  1145     slave->sii_tx_mailbox_offset =
       
  1146         EC_READ_U16(slave->eeprom_data + 2 * 0x001A);
       
  1147     slave->sii_tx_mailbox_size =
       
  1148         EC_READ_U16(slave->eeprom_data + 2 * 0x001B);
       
  1149     slave->sii_mailbox_protocols =
       
  1150         EC_READ_U16(slave->eeprom_data + 2 * 0x001C);
       
  1151 
       
  1152     // evaluate category data
       
  1153     cat_word = (uint16_t *) slave->eeprom_data + 0x0040;
       
  1154     while (EC_READ_U16(cat_word) != 0xFFFF) {
       
  1155         cat_type = EC_READ_U16(cat_word) & 0x7FFF;
       
  1156         cat_size = EC_READ_U16(cat_word + 1);
       
  1157 
       
  1158         switch (cat_type) {
       
  1159             case 0x000A:
       
  1160                 if (ec_slave_fetch_strings(slave, (uint8_t *) (cat_word + 2)))
       
  1161                     goto end;
       
  1162                 break;
       
  1163             case 0x001E:
       
  1164                 ec_slave_fetch_general(slave, (uint8_t *) (cat_word + 2));
       
  1165                 break;
       
  1166             case 0x0028:
       
  1167                 break;
       
  1168             case 0x0029:
       
  1169                 if (ec_slave_fetch_sync(slave, (uint8_t *) (cat_word + 2),
       
  1170                                         cat_size))
       
  1171                     goto end;
       
  1172                 break;
       
  1173             case 0x0032:
       
  1174                 if (ec_slave_fetch_pdo(slave, (uint8_t *) (cat_word + 2),
       
  1175                                        cat_size, EC_TX_PDO))
       
  1176                     goto end;
       
  1177                 break;
       
  1178             case 0x0033:
       
  1179                 if (ec_slave_fetch_pdo(slave, (uint8_t *) (cat_word + 2),
       
  1180                                        cat_size, EC_RX_PDO))
       
  1181                     goto end;
       
  1182                 break;
       
  1183             default:
       
  1184                 if (fsm->master->debug_level)
       
  1185                     EC_WARN("Unknown category type 0x%04X in slave %i.\n",
       
  1186                             cat_type, slave->ring_position);
       
  1187         }
       
  1188 
       
  1189         cat_word += cat_size + 2;
       
  1190     }
       
  1191 
       
  1192     fsm->slave_state = ec_fsm_slave_state_end;
       
  1193     return;
       
  1194 
       
  1195 end:
       
  1196     EC_ERR("Failed to analyze category data.\n");
       
  1197     fsm->slave->error_flag = 1;
       
  1198     fsm->slave_state = ec_fsm_slave_state_error;
       
  1199 }
       
  1200 
       
  1201 /******************************************************************************
       
  1202  *  slave configuration state machine
       
  1203  *****************************************************************************/
       
  1204 
       
  1205 /**
       
  1206    Slave configuration state: START.
       
  1207 */
       
  1208 
       
  1209 void ec_fsm_slaveconf_state_start(ec_fsm_t *fsm /**< finite state machine */)
       
  1210 {
       
  1211     if (fsm->master->debug_level) {
       
  1212         EC_DBG("Configuring slave %i...\n", fsm->slave->ring_position);
       
  1213     }
       
  1214 
       
  1215     ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_INIT);
       
  1216     ec_fsm_change_exec(&fsm->fsm_change);
       
  1217     fsm->slave_state = ec_fsm_slaveconf_state_init;
       
  1218 }
       
  1219 
       
  1220 /*****************************************************************************/
       
  1221 
       
  1222 /**
       
  1223    Slave configuration state: INIT.
       
  1224 */
       
  1225 
       
  1226 void ec_fsm_slaveconf_state_init(ec_fsm_t *fsm /**< finite state machine */)
       
  1227 {
       
  1228     ec_master_t *master = fsm->master;
       
  1229     ec_slave_t *slave = fsm->slave;
       
  1230     ec_datagram_t *datagram = &fsm->datagram;
       
  1231 
       
  1232     if (ec_fsm_change_exec(&fsm->fsm_change)) return;
       
  1233 
       
  1234     if (!ec_fsm_change_success(&fsm->fsm_change)) {
       
  1235         slave->error_flag = 1;
       
  1236         fsm->slave_state = ec_fsm_slave_state_error;
       
  1237         return;
       
  1238     }
       
  1239 
       
  1240     slave->configured = 1;
       
  1241 
       
  1242     if (master->debug_level) {
       
  1243         EC_DBG("Slave %i is now in INIT.\n", slave->ring_position);
       
  1244     }
       
  1245 
       
  1246     // check and reset CRC fault counters
       
  1247     //ec_slave_check_crc(slave);
       
  1248     // TODO: Implement state machine for CRC checking.
       
  1249 
       
  1250     if (!slave->base_fmmu_count) { // skip FMMU configuration
       
  1251         ec_fsm_slaveconf_enter_sync(fsm);
       
  1252         return;
       
  1253     }
       
  1254 
       
  1255     if (master->debug_level)
       
  1256         EC_DBG("Clearing FMMU configurations of slave %i...\n",
       
  1257                slave->ring_position);
       
  1258 
       
  1259     // clear FMMU configurations
       
  1260     ec_datagram_npwr(datagram, slave->station_address,
       
  1261                      0x0600, EC_FMMU_SIZE * slave->base_fmmu_count);
       
  1262     memset(datagram->data, 0x00, EC_FMMU_SIZE * slave->base_fmmu_count);
       
  1263     ec_master_queue_datagram(master, datagram);
       
  1264     fsm->slave_state = ec_fsm_slaveconf_state_clear_fmmus;
       
  1265 }
       
  1266 
       
  1267 /*****************************************************************************/
       
  1268 
       
  1269 /**
       
  1270    Slave configuration state: CLEAR FMMU.
       
  1271 */
       
  1272 
       
  1273 void ec_fsm_slaveconf_state_clear_fmmus(ec_fsm_t *fsm
       
  1274                                         /**< finite state machine */)
       
  1275 {
       
  1276     ec_datagram_t *datagram = &fsm->datagram;
       
  1277 
       
  1278     if (datagram->state != EC_DATAGRAM_RECEIVED
       
  1279         || datagram->working_counter != 1) {
       
  1280         fsm->slave->error_flag = 1;
       
  1281         fsm->slave_state = ec_fsm_slave_state_error;
       
  1282         EC_ERR("Failed to clear FMMUs on slave %i.\n",
       
  1283                fsm->slave->ring_position);
       
  1284         return;
       
  1285     }
       
  1286 
       
  1287     ec_fsm_slaveconf_enter_sync(fsm);
       
  1288 }
       
  1289 
       
  1290 /*****************************************************************************/
       
  1291 
       
  1292 /**
       
  1293 */
       
  1294 
       
  1295 void ec_fsm_slaveconf_enter_sync(ec_fsm_t *fsm /**< finite state machine */)
       
  1296 {
       
  1297     ec_master_t *master = fsm->master;
       
  1298     ec_slave_t *slave = fsm->slave;
       
  1299     ec_datagram_t *datagram = &fsm->datagram;
       
  1300     const ec_sii_sync_t *sync;
       
  1301     ec_sii_sync_t mbox_sync;
       
  1302 
       
  1303     // slave is now in INIT
       
  1304     if (slave->current_state == slave->requested_state) {
       
  1305         fsm->slave_state = ec_fsm_slave_state_end; // successful
       
  1306         if (master->debug_level) {
       
  1307             EC_DBG("Finished configuration of slave %i.\n",
       
  1308                    slave->ring_position);
       
  1309         }
       
  1310         return;
       
  1311     }
       
  1312 
       
  1313     if (!slave->base_sync_count) { // no sync managers
       
  1314         ec_fsm_slaveconf_enter_preop(fsm);
       
  1315         return;
       
  1316     }
       
  1317 
       
  1318     if (master->debug_level) {
       
  1319         EC_DBG("Configuring sync managers of slave %i.\n",
       
  1320                slave->ring_position);
       
  1321     }
       
  1322 
       
  1323     // configure sync managers
       
  1324     ec_datagram_npwr(datagram, slave->station_address, 0x0800,
       
  1325                      EC_SYNC_SIZE * slave->base_sync_count);
       
  1326     memset(datagram->data, 0x00, EC_SYNC_SIZE * slave->base_sync_count);
       
  1327 
       
  1328     if (list_empty(&slave->sii_syncs)) {
       
  1329         if (slave->sii_rx_mailbox_offset && slave->sii_tx_mailbox_offset) {
       
  1330             if (slave->master->debug_level)
       
  1331                 EC_DBG("Guessing sync manager settings for slave %i.\n",
       
  1332                        slave->ring_position);
       
  1333             mbox_sync.index = 0;
       
  1334             mbox_sync.physical_start_address = slave->sii_tx_mailbox_offset;
       
  1335             mbox_sync.length = slave->sii_tx_mailbox_size;
       
  1336             mbox_sync.control_register = 0x26;
       
  1337             mbox_sync.enable = 0x01;
       
  1338             mbox_sync.est_length = 0;
       
  1339             ec_sync_config(&mbox_sync, slave,
       
  1340                            datagram->data + EC_SYNC_SIZE * mbox_sync.index);
       
  1341             mbox_sync.index = 1;
       
  1342             mbox_sync.physical_start_address = slave->sii_rx_mailbox_offset;
       
  1343             mbox_sync.length = slave->sii_rx_mailbox_size;
       
  1344             mbox_sync.control_register = 0x22;
       
  1345             mbox_sync.enable = 0x01;
       
  1346             mbox_sync.est_length = 0;
       
  1347             ec_sync_config(&mbox_sync, slave,
       
  1348                            datagram->data + EC_SYNC_SIZE * mbox_sync.index);
       
  1349         }
       
  1350     }
       
  1351     else if (slave->sii_mailbox_protocols) { // mailboxes present
       
  1352         list_for_each_entry(sync, &slave->sii_syncs, list) {
       
  1353             // only configure mailbox sync-managers
       
  1354             if (sync->index != 0 && sync->index != 1) continue;
       
  1355             ec_sync_config(sync, slave,
       
  1356                            datagram->data + EC_SYNC_SIZE * sync->index);
       
  1357         }
       
  1358     }
       
  1359 
       
  1360     ec_master_queue_datagram(fsm->master, datagram);
       
  1361     fsm->slave_state = ec_fsm_slaveconf_state_sync;
       
  1362 }
       
  1363 
       
  1364 /*****************************************************************************/
       
  1365 
       
  1366 /**
       
  1367    Slave configuration state: SYNC.
       
  1368 */
       
  1369 
       
  1370 void ec_fsm_slaveconf_state_sync(ec_fsm_t *fsm /**< finite state machine */)
       
  1371 {
       
  1372     ec_datagram_t *datagram = &fsm->datagram;
       
  1373     ec_slave_t *slave = fsm->slave;
       
  1374 
       
  1375     if (datagram->state != EC_DATAGRAM_RECEIVED
       
  1376         || datagram->working_counter != 1) {
       
  1377         slave->error_flag = 1;
       
  1378         fsm->slave_state = ec_fsm_slave_state_error;
       
  1379         EC_ERR("Failed to set sync managers on slave %i.\n",
       
  1380                slave->ring_position);
       
  1381         return;
       
  1382     }
       
  1383 
       
  1384     ec_fsm_slaveconf_enter_preop(fsm);
       
  1385 }
       
  1386 
       
  1387 /*****************************************************************************/
       
  1388 
       
  1389 /**
       
  1390  */
       
  1391 
       
  1392 void ec_fsm_slaveconf_enter_preop(ec_fsm_t *fsm /**< finite state machine */)
       
  1393 {
       
  1394     fsm->slave_state = ec_fsm_slaveconf_state_preop;
       
  1395     ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_PREOP);
       
  1396     ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
       
  1397 }
       
  1398 
       
  1399 /*****************************************************************************/
       
  1400 
       
  1401 /**
       
  1402    Slave configuration state: PREOP.
       
  1403 */
       
  1404 
       
  1405 void ec_fsm_slaveconf_state_preop(ec_fsm_t *fsm /**< finite state machine */)
       
  1406 {
       
  1407     ec_slave_t *slave = fsm->slave;
       
  1408     ec_master_t *master = fsm->master;
       
  1409 
       
  1410     if (ec_fsm_change_exec(&fsm->fsm_change)) return;
       
  1411 
       
  1412     if (!ec_fsm_change_success(&fsm->fsm_change)) {
       
  1413         slave->error_flag = 1;
       
  1414         fsm->slave_state = ec_fsm_slave_state_error;
       
  1415         return;
       
  1416     }
       
  1417 
       
  1418     // slave is now in PREOP
       
  1419     slave->jiffies_preop = fsm->datagram.jiffies_received;
       
  1420 
       
  1421     if (master->debug_level) {
       
  1422         EC_DBG("Slave %i is now in PREOP.\n", slave->ring_position);
       
  1423     }
       
  1424 
       
  1425     if (slave->current_state == slave->requested_state) {
       
  1426         fsm->slave_state = ec_fsm_slave_state_end; // successful
       
  1427         if (master->debug_level) {
       
  1428             EC_DBG("Finished configuration of slave %i.\n",
       
  1429                    slave->ring_position);
       
  1430         }
       
  1431         return;
       
  1432     }
       
  1433 
       
  1434     ec_fsm_slaveconf_enter_sync2(fsm);
       
  1435 }
       
  1436 
       
  1437 /*****************************************************************************/
       
  1438 
       
  1439 /**
       
  1440 */
       
  1441 
       
  1442 void ec_fsm_slaveconf_enter_sync2(ec_fsm_t *fsm /**< finite state machine */)
       
  1443 {
       
  1444     ec_slave_t *slave = fsm->slave;
       
  1445     ec_datagram_t *datagram = &fsm->datagram;
       
  1446     ec_sii_sync_t *sync;
       
  1447 
       
  1448     if (list_empty(&slave->sii_syncs)) {
       
  1449         ec_fsm_slaveconf_enter_fmmu(fsm);
       
  1450         return;
       
  1451     }
       
  1452 
       
  1453     // configure sync managers for process data
       
  1454     ec_datagram_npwr(datagram, slave->station_address, 0x0800,
       
  1455                      EC_SYNC_SIZE * slave->base_sync_count);
       
  1456     memset(datagram->data, 0x00, EC_SYNC_SIZE * slave->base_sync_count);
       
  1457 
       
  1458     list_for_each_entry(sync, &slave->sii_syncs, list) {
       
  1459         ec_sync_config(sync, slave,
       
  1460                        datagram->data + EC_SYNC_SIZE * sync->index);
       
  1461     }
       
  1462 
       
  1463     ec_master_queue_datagram(fsm->master, datagram);
       
  1464     fsm->slave_state = ec_fsm_slaveconf_state_sync2;
       
  1465 }
       
  1466 
       
  1467 /*****************************************************************************/
       
  1468 
       
  1469 /**
       
  1470    Slave configuration state: SYNC2.
       
  1471 */
       
  1472 
       
  1473 void ec_fsm_slaveconf_state_sync2(ec_fsm_t *fsm /**< finite state machine */)
       
  1474 {
       
  1475     ec_datagram_t *datagram = &fsm->datagram;
       
  1476     ec_slave_t *slave = fsm->slave;
       
  1477 
       
  1478     if (datagram->state != EC_DATAGRAM_RECEIVED
       
  1479         || datagram->working_counter != 1) {
       
  1480         slave->error_flag = 1;
       
  1481         fsm->slave_state = ec_fsm_slave_state_error;
       
  1482         EC_ERR("Failed to set process data sync managers on slave %i.\n",
       
  1483                slave->ring_position);
       
  1484         return;
       
  1485     }
       
  1486 
       
  1487     ec_fsm_slaveconf_enter_fmmu(fsm);
       
  1488 }
       
  1489 
       
  1490 /*****************************************************************************/
       
  1491 
       
  1492 /**
       
  1493 */
       
  1494 
       
  1495 void ec_fsm_slaveconf_enter_fmmu(ec_fsm_t *fsm /**< finite state machine */)
       
  1496 {
       
  1497     ec_slave_t *slave = fsm->slave;
       
  1498     ec_master_t *master = slave->master;
       
  1499     ec_datagram_t *datagram = &fsm->datagram;
       
  1500     unsigned int j;
       
  1501 
       
  1502     if (!slave->base_fmmu_count) { // skip FMMU configuration
       
  1503         ec_fsm_slaveconf_enter_sdoconf(fsm);
       
  1504         return;
       
  1505     }
       
  1506 
       
  1507     // configure FMMUs
       
  1508     ec_datagram_npwr(datagram, slave->station_address,
       
  1509                      0x0600, EC_FMMU_SIZE * slave->base_fmmu_count);
       
  1510     memset(datagram->data, 0x00, EC_FMMU_SIZE * slave->base_fmmu_count);
       
  1511     for (j = 0; j < slave->fmmu_count; j++) {
       
  1512         ec_fmmu_config(&slave->fmmus[j], slave,
       
  1513                        datagram->data + EC_FMMU_SIZE * j);
       
  1514     }
       
  1515 
       
  1516     ec_master_queue_datagram(master, datagram);
       
  1517     fsm->slave_state = ec_fsm_slaveconf_state_fmmu;
       
  1518 }
       
  1519 
       
  1520 /*****************************************************************************/
       
  1521 
       
  1522 /**
       
  1523    Slave configuration state: FMMU.
       
  1524 */
       
  1525 
       
  1526 void ec_fsm_slaveconf_state_fmmu(ec_fsm_t *fsm /**< finite state machine */)
       
  1527 {
       
  1528     ec_datagram_t *datagram = &fsm->datagram;
       
  1529     ec_slave_t *slave = fsm->slave;
       
  1530 
       
  1531     if (datagram->state != EC_DATAGRAM_RECEIVED
       
  1532         || datagram->working_counter != 1) {
       
  1533         fsm->slave->error_flag = 1;
       
  1534         fsm->slave_state = ec_fsm_slave_state_error;
       
  1535         EC_ERR("Failed to set FMMUs on slave %i.\n",
       
  1536                fsm->slave->ring_position);
       
  1537         return;
       
  1538     }
       
  1539 
       
  1540     // No CoE configuration to be applied? Jump to SAVEOP state.
       
  1541     if (list_empty(&slave->sdo_confs)) { // skip SDO configuration
       
  1542         ec_fsm_slaveconf_enter_saveop(fsm);
       
  1543         return;
       
  1544     }
       
  1545 
       
  1546     ec_fsm_slaveconf_enter_sdoconf(fsm);
       
  1547 }
       
  1548 
       
  1549 /*****************************************************************************/
       
  1550 
       
  1551 /**
       
  1552  */
       
  1553 
       
  1554 void ec_fsm_slaveconf_enter_sdoconf(ec_fsm_t *fsm /**< finite state machine */)
       
  1555 {
       
  1556     ec_slave_t *slave = fsm->slave;
       
  1557 
       
  1558     if (list_empty(&slave->sdo_confs)) { // skip SDO configuration
       
  1559         ec_fsm_slaveconf_enter_saveop(fsm);
       
  1560         return;
       
  1561     }
       
  1562 
       
  1563     // start SDO configuration
       
  1564     fsm->slave_state = ec_fsm_slaveconf_state_sdoconf;
       
  1565     fsm->sdodata = list_entry(fsm->slave->sdo_confs.next, ec_sdo_data_t, list);
       
  1566     ec_fsm_coe_download(&fsm->fsm_coe, fsm->slave, fsm->sdodata);
       
  1567     ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
       
  1568 }
       
  1569 
       
  1570 /*****************************************************************************/
       
  1571 
       
  1572 /**
       
  1573    Slave configuration state: SDOCONF.
       
  1574 */
       
  1575 
       
  1576 void ec_fsm_slaveconf_state_sdoconf(ec_fsm_t *fsm /**< finite state machine */)
       
  1577 {
       
  1578     if (ec_fsm_coe_exec(&fsm->fsm_coe)) return;
       
  1579 
       
  1580     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
       
  1581         fsm->slave->error_flag = 1;
       
  1582         fsm->slave_state = ec_fsm_slave_state_error;
       
  1583         return;
       
  1584     }
       
  1585 
       
  1586     // Another SDO to configure?
       
  1587     if (fsm->sdodata->list.next != &fsm->slave->sdo_confs) {
       
  1588         fsm->sdodata = list_entry(fsm->sdodata->list.next,
       
  1589                                   ec_sdo_data_t, list);
       
  1590         ec_fsm_coe_download(&fsm->fsm_coe, fsm->slave, fsm->sdodata);
       
  1591         ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
       
  1592         return;
       
  1593     }
       
  1594 
       
  1595     // All SDOs are now configured.
       
  1596 
       
  1597     // set state to SAVEOP
       
  1598     ec_fsm_slaveconf_enter_saveop(fsm);
       
  1599 }
       
  1600 
       
  1601 /*****************************************************************************/
       
  1602 
       
  1603 /**
       
  1604  */
       
  1605 
       
  1606 void ec_fsm_slaveconf_enter_saveop(ec_fsm_t *fsm /**< finite state machine */)
       
  1607 {
       
  1608     fsm->slave_state = ec_fsm_slaveconf_state_saveop;
       
  1609     ec_fsm_change_start(&fsm->fsm_change, fsm->slave, EC_SLAVE_STATE_SAVEOP);
       
  1610     ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
       
  1611 }
       
  1612 
       
  1613 /*****************************************************************************/
       
  1614 
       
  1615 /**
       
  1616    Slave configuration state: SAVEOP.
       
  1617 */
       
  1618 
       
  1619 void ec_fsm_slaveconf_state_saveop(ec_fsm_t *fsm /**< finite state machine */)
       
  1620 {
       
  1621     ec_master_t *master = fsm->master;
       
  1622     ec_slave_t *slave = fsm->slave;
       
  1623 
       
  1624     if (ec_fsm_change_exec(&fsm->fsm_change)) return;
       
  1625 
       
  1626     if (!ec_fsm_change_success(&fsm->fsm_change)) {
       
  1627         fsm->slave->error_flag = 1;
       
  1628         fsm->slave_state = ec_fsm_slave_state_error;
       
  1629         return;
       
  1630     }
       
  1631 
       
  1632     // slave is now in SAVEOP
       
  1633 
       
  1634     if (master->debug_level) {
       
  1635         EC_DBG("Slave %i is now in SAVEOP.\n", slave->ring_position);
       
  1636     }
       
  1637 
       
  1638     if (fsm->slave->current_state == fsm->slave->requested_state) {
       
  1639         fsm->slave_state = ec_fsm_slave_state_end; // successful
       
  1640         if (master->debug_level) {
       
  1641             EC_DBG("Finished configuration of slave %i.\n",
       
  1642                    slave->ring_position);
       
  1643         }
       
  1644         return;
       
  1645     }
       
  1646 
       
  1647     // set state to OP
       
  1648     fsm->slave_state = ec_fsm_slaveconf_state_op;
       
  1649     ec_fsm_change_start(&fsm->fsm_change, slave, EC_SLAVE_STATE_OP);
       
  1650     ec_fsm_change_exec(&fsm->fsm_change); // execute immediately
       
  1651 }
       
  1652 
       
  1653 /*****************************************************************************/
       
  1654 
       
  1655 /**
       
  1656    Slave configuration state: OP
       
  1657 */
       
  1658 
       
  1659 void ec_fsm_slaveconf_state_op(ec_fsm_t *fsm /**< finite state machine */)
       
  1660 {
       
  1661     ec_master_t *master = fsm->master;
       
  1662     ec_slave_t *slave = fsm->slave;
       
  1663 
       
  1664     if (ec_fsm_change_exec(&fsm->fsm_change)) return;
       
  1665 
       
  1666     if (!ec_fsm_change_success(&fsm->fsm_change)) {
       
  1667         slave->error_flag = 1;
       
  1668         fsm->slave_state = ec_fsm_slave_state_error;
       
  1669         return;
       
  1670     }
       
  1671 
       
  1672     // slave is now in OP
       
  1673 
       
  1674     if (master->debug_level) {
       
  1675         EC_DBG("Slave %i is now in OP.\n", slave->ring_position);
       
  1676         EC_DBG("Finished configuration of slave %i.\n", slave->ring_position);
       
  1677     }
       
  1678 
       
  1679     fsm->slave_state = ec_fsm_slave_state_end; // successful
       
  1680 }
       
  1681 
       
  1682 /******************************************************************************
       
  1683  *  Common state functions
       
  1684  *****************************************************************************/
       
  1685 
       
  1686 /**
       
  1687    State: ERROR.
       
  1688 */
       
  1689 
       
  1690 void ec_fsm_slave_state_error(ec_fsm_t *fsm /**< finite state machine */)
       
  1691 {
       
  1692 }
       
  1693 
       
  1694 /*****************************************************************************/
       
  1695 
       
  1696 /**
       
  1697    State: END.
       
  1698 */
       
  1699 
       
  1700 void ec_fsm_slave_state_end(ec_fsm_t *fsm /**< finite state machine */)
       
  1701 {
       
  1702 }
       
  1703 
       
  1704 /*****************************************************************************/