master/fsm_master.c
branchredundancy
changeset 2374 e898451c054a
parent 2301 01e4381ebd09
child 2379 6f100ee02e65
equal deleted inserted replaced
2373:593272e5a169 2374:e898451c054a
    65 void ec_fsm_master_state_write_sii(ec_fsm_master_t *);
    65 void ec_fsm_master_state_write_sii(ec_fsm_master_t *);
    66 void ec_fsm_master_state_sdo_dictionary(ec_fsm_master_t *);
    66 void ec_fsm_master_state_sdo_dictionary(ec_fsm_master_t *);
    67 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *);
    67 void ec_fsm_master_state_sdo_request(ec_fsm_master_t *);
    68 void ec_fsm_master_state_reg_request(ec_fsm_master_t *);
    68 void ec_fsm_master_state_reg_request(ec_fsm_master_t *);
    69 
    69 
       
    70 void ec_fsm_master_enter_clear_addresses(ec_fsm_master_t *);
    70 void ec_fsm_master_enter_write_system_times(ec_fsm_master_t *);
    71 void ec_fsm_master_enter_write_system_times(ec_fsm_master_t *);
    71 
    72 
    72 /*****************************************************************************/
    73 /*****************************************************************************/
    73 
    74 
    74 /** Constructor.
    75 /** Constructor.
    77         ec_fsm_master_t *fsm, /**< Master state machine. */
    78         ec_fsm_master_t *fsm, /**< Master state machine. */
    78         ec_master_t *master, /**< EtherCAT master. */
    79         ec_master_t *master, /**< EtherCAT master. */
    79         ec_datagram_t *datagram /**< Datagram object to use. */
    80         ec_datagram_t *datagram /**< Datagram object to use. */
    80         )
    81         )
    81 {
    82 {
       
    83     ec_device_index_t dev_idx;
       
    84 
    82     fsm->master = master;
    85     fsm->master = master;
    83     fsm->datagram = datagram;
    86     fsm->datagram = datagram;
    84     fsm->state = ec_fsm_master_state_start;
    87     fsm->state = ec_fsm_master_state_start;
    85     fsm->idle = 0;
    88     fsm->idle = 0;
    86     fsm->link_state = 0;
    89     fsm->dev_idx = EC_DEVICE_MAIN;
    87     fsm->slaves_responding = 0;
    90     for (dev_idx = EC_DEVICE_MAIN; dev_idx < EC_NUM_DEVICES; dev_idx++) {
       
    91         fsm->link_state[dev_idx] = 0;
       
    92         fsm->slaves_responding[dev_idx] = 0;
       
    93         fsm->slave_states[dev_idx] = EC_SLAVE_STATE_UNKNOWN;
       
    94     }
    88     fsm->rescan_required = 0;
    95     fsm->rescan_required = 0;
    89     fsm->slave_states = EC_SLAVE_STATE_UNKNOWN;
       
    90 
    96 
    91     // init sub-state-machines
    97     // init sub-state-machines
    92     ec_fsm_coe_init(&fsm->fsm_coe, fsm->datagram);
    98     ec_fsm_coe_init(&fsm->fsm_coe, fsm->datagram);
    93     ec_fsm_pdo_init(&fsm->fsm_pdo, &fsm->fsm_coe);
    99     ec_fsm_pdo_init(&fsm->fsm_pdo, &fsm->fsm_coe);
    94     ec_fsm_change_init(&fsm->fsm_change, fsm->datagram);
   100     ec_fsm_change_init(&fsm->fsm_change, fsm->datagram);
   157  */
   163  */
   158 void ec_fsm_master_restart(
   164 void ec_fsm_master_restart(
   159         ec_fsm_master_t *fsm /**< Master state machine. */
   165         ec_fsm_master_t *fsm /**< Master state machine. */
   160         )
   166         )
   161 {
   167 {
       
   168     fsm->dev_idx = EC_DEVICE_MAIN;
   162     fsm->state = ec_fsm_master_state_start;
   169     fsm->state = ec_fsm_master_state_start;
   163     fsm->state(fsm); // execute immediately
   170     fsm->state(fsm); // execute immediately
   164 }
   171 }
   165 
   172 
   166 /******************************************************************************
   173 /******************************************************************************
   176         )
   183         )
   177 {
   184 {
   178     fsm->idle = 1;
   185     fsm->idle = 1;
   179     ec_datagram_brd(fsm->datagram, 0x0130, 2);
   186     ec_datagram_brd(fsm->datagram, 0x0130, 2);
   180     ec_datagram_zero(fsm->datagram);
   187     ec_datagram_zero(fsm->datagram);
       
   188     fsm->datagram->device_index = fsm->dev_idx;
   181     fsm->state = ec_fsm_master_state_broadcast;
   189     fsm->state = ec_fsm_master_state_broadcast;
   182 }
   190 }
   183 
   191 
   184 /*****************************************************************************/
   192 /*****************************************************************************/
   185 
   193 
   194     ec_datagram_t *datagram = fsm->datagram;
   202     ec_datagram_t *datagram = fsm->datagram;
   195     unsigned int i, size;
   203     unsigned int i, size;
   196     ec_slave_t *slave;
   204     ec_slave_t *slave;
   197     ec_master_t *master = fsm->master;
   205     ec_master_t *master = fsm->master;
   198 
   206 
   199     if (datagram->state == EC_DATAGRAM_TIMED_OUT)
       
   200         return; // always retry
       
   201 
       
   202     // bus topology change?
   207     // bus topology change?
   203     if (datagram->working_counter != fsm->slaves_responding) {
   208     if (datagram->working_counter != fsm->slaves_responding[fsm->dev_idx]) {
   204         fsm->rescan_required = 1;
   209         fsm->rescan_required = 1;
   205         fsm->slaves_responding = datagram->working_counter;
   210         fsm->slaves_responding[fsm->dev_idx] = datagram->working_counter;
   206         EC_MASTER_INFO(master, "%u slave(s) responding.\n",
   211         EC_MASTER_INFO(master, "%u slave(s) responding on %s device.\n",
   207                 fsm->slaves_responding);
   212                 fsm->slaves_responding[fsm->dev_idx],
   208     }
   213                 ec_device_names[fsm->dev_idx]);
   209 
   214     }
   210     if (fsm->link_state && !master->devices[EC_DEVICE_MAIN].link_state) {
   215 
   211         // link went down
   216     if (fsm->link_state[fsm->dev_idx] &&
       
   217             !master->devices[fsm->dev_idx].link_state) {
       
   218         ec_device_index_t dev_idx;
       
   219 
   212         EC_MASTER_DBG(master, 1, "Master state machine detected "
   220         EC_MASTER_DBG(master, 1, "Master state machine detected "
   213                 "link down. Clearing slave list.\n");
   221                 "link down on %s device. Clearing slave list.\n",
       
   222                 ec_device_names[fsm->dev_idx]);
   214 
   223 
   215 #ifdef EC_EOE
   224 #ifdef EC_EOE
   216         ec_master_eoe_stop(master);
   225         ec_master_eoe_stop(master);
   217         ec_master_clear_eoe_handlers(master);
   226         ec_master_clear_eoe_handlers(master);
   218 #endif
   227 #endif
   219         ec_master_clear_slaves(master);
   228         ec_master_clear_slaves(master);
   220         fsm->slave_states = 0x00;
   229 
   221         fsm->slaves_responding = 0; /* reset to trigger rescan on next link
   230         for (dev_idx = EC_DEVICE_MAIN; dev_idx < EC_NUM_DEVICES; dev_idx++) {
   222                                        up. */
   231             fsm->slave_states[dev_idx] = 0x00;
   223     }
   232             fsm->slaves_responding[dev_idx] = 0; /* Reset to trigger rescan on
   224     fsm->link_state = master->devices[EC_DEVICE_MAIN].link_state;
   233                                                     next link up. */
   225 
   234         }
   226     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   235     }
   227         ec_fsm_master_restart(fsm);
   236     fsm->link_state[fsm->dev_idx] = master->devices[fsm->dev_idx].link_state;
   228         return;
   237 
   229     }
   238     if (datagram->state == EC_DATAGRAM_RECEIVED &&
   230 
   239             fsm->slaves_responding[fsm->dev_idx]) {
   231     if (fsm->slaves_responding) {
       
   232         uint8_t states = EC_READ_U8(datagram->data);
   240         uint8_t states = EC_READ_U8(datagram->data);
   233         if (states != fsm->slave_states) { // slave states changed?
   241         if (states != fsm->slave_states[fsm->dev_idx]) {
       
   242             // slave states changed
   234             char state_str[EC_STATE_STRING_SIZE];
   243             char state_str[EC_STATE_STRING_SIZE];
   235             fsm->slave_states = states;
   244             fsm->slave_states[fsm->dev_idx] = states;
   236             ec_state_string(fsm->slave_states, state_str, 1);
   245             ec_state_string(states, state_str, 1);
   237             EC_MASTER_INFO(master, "Slave states: %s.\n", state_str);
   246             EC_MASTER_INFO(master, "Slave states on %s device: %s.\n",
       
   247                     ec_device_names[fsm->dev_idx], state_str);
   238         }
   248         }
   239     } else {
   249     } else {
   240         fsm->slave_states = 0x00;
   250         fsm->slave_states[fsm->dev_idx] = 0x00;
       
   251     }
       
   252 
       
   253     fsm->dev_idx++;
       
   254     if (fsm->dev_idx < EC_NUM_DEVICES) {
       
   255         // check number of responding slaves on next device
       
   256         fsm->state = ec_fsm_master_state_start;
       
   257         fsm->state(fsm); // execute immediately
       
   258         return;
   241     }
   259     }
   242 
   260 
   243     if (fsm->rescan_required) {
   261     if (fsm->rescan_required) {
   244         down(&master->scan_sem);
   262         down(&master->scan_sem);
   245         if (!master->allow_scan) {
   263         if (!master->allow_scan) {
   246             up(&master->scan_sem);
   264             up(&master->scan_sem);
   247         } else {
   265         } else {
       
   266             unsigned int count = 0, next_dev_slave, ring_position;
       
   267             ec_device_index_t dev_idx;
       
   268 
   248             master->scan_busy = 1;
   269             master->scan_busy = 1;
   249             up(&master->scan_sem);
   270             up(&master->scan_sem);
   250 
   271 
   251             // clear all slaves and scan the bus
   272             // clear all slaves and scan the bus
   252             fsm->rescan_required = 0;
   273             fsm->rescan_required = 0;
   257             ec_master_eoe_stop(master);
   278             ec_master_eoe_stop(master);
   258             ec_master_clear_eoe_handlers(master);
   279             ec_master_clear_eoe_handlers(master);
   259 #endif
   280 #endif
   260             ec_master_clear_slaves(master);
   281             ec_master_clear_slaves(master);
   261 
   282 
   262             master->slave_count = fsm->slaves_responding;
   283             for (dev_idx = EC_DEVICE_MAIN; dev_idx < EC_NUM_DEVICES;
   263 
   284                     dev_idx++) {
   264             if (!master->slave_count) {
   285                 count += fsm->slaves_responding[dev_idx];
       
   286             }
       
   287 
       
   288             if (!count) {
   265                 // no slaves present -> finish state machine.
   289                 // no slaves present -> finish state machine.
   266                 master->scan_busy = 0;
   290                 master->scan_busy = 0;
   267                 wake_up_interruptible(&master->scan_queue);
   291                 wake_up_interruptible(&master->scan_queue);
   268                 ec_fsm_master_restart(fsm);
   292                 ec_fsm_master_restart(fsm);
   269                 return;
   293                 return;
   270             }
   294             }
   271 
   295 
   272             size = sizeof(ec_slave_t) * master->slave_count;
   296             size = sizeof(ec_slave_t) * count;
   273             if (!(master->slaves =
   297             if (!(master->slaves =
   274                         (ec_slave_t *) kmalloc(size, GFP_KERNEL))) {
   298                         (ec_slave_t *) kmalloc(size, GFP_KERNEL))) {
   275                 EC_MASTER_ERR(master, "Failed to allocate %u bytes"
   299                 EC_MASTER_ERR(master, "Failed to allocate %u bytes"
   276                         " of slave memory!\n", size);
   300                         " of slave memory!\n", size);
   277                 master->slave_count = 0; // TODO avoid retrying scan!
       
   278                 master->scan_busy = 0;
   301                 master->scan_busy = 0;
   279                 wake_up_interruptible(&master->scan_queue);
   302                 wake_up_interruptible(&master->scan_queue);
   280                 ec_fsm_master_restart(fsm);
   303                 ec_fsm_master_restart(fsm);
   281                 return;
   304                 return;
   282             }
   305             }
   283 
   306 
   284             // init slaves
   307             // init slaves
   285             for (i = 0; i < master->slave_count; i++) {
   308             dev_idx = EC_DEVICE_MAIN;
       
   309             next_dev_slave = fsm->slaves_responding[dev_idx];
       
   310             ring_position = 0;
       
   311             for (i = 0; i < count; i++, ring_position++) {
   286                 slave = master->slaves + i;
   312                 slave = master->slaves + i;
   287                 ec_slave_init(slave, master, i, i + 1);
   313                 while (i >= next_dev_slave) {
       
   314                     dev_idx++;
       
   315                     next_dev_slave += fsm->slaves_responding[dev_idx];
       
   316                     ring_position = 0;
       
   317                 }
       
   318 
       
   319                 ec_slave_init(slave, master, dev_idx, ring_position, i + 1);
   288 
   320 
   289                 // do not force reconfiguration in operation phase to avoid
   321                 // do not force reconfiguration in operation phase to avoid
   290                 // unnecesssary process data interruptions
   322                 // unnecesssary process data interruptions
   291                 if (master->phase != EC_OPERATION)
   323                 if (master->phase != EC_OPERATION) {
   292                     slave->force_config = 1;
   324                     slave->force_config = 1;
       
   325                 }
   293             }
   326             }
   294 
   327             master->slave_count = count;
   295             // broadcast clear all station addresses
   328 
   296             ec_datagram_bwr(datagram, 0x0010, 2);
   329             /* start with first device with slaves responding; at least one
   297             EC_WRITE_U16(datagram->data, 0x0000);
   330              * has responding slaves, otherwise count would be zero. */
   298             fsm->retries = EC_FSM_RETRIES;
   331             fsm->dev_idx = EC_DEVICE_MAIN;
   299             fsm->state = ec_fsm_master_state_clear_addresses;
   332             while (!fsm->slaves_responding[fsm->dev_idx]) {
       
   333                 fsm->dev_idx++;
       
   334             }
       
   335 
       
   336             ec_fsm_master_enter_clear_addresses(fsm);
   300             return;
   337             return;
   301         }
   338         }
   302     }
   339     }
   303 
   340 
   304     if (master->slave_count) {
   341     if (master->slave_count) {
   316             // fetch state from first slave
   353             // fetch state from first slave
   317             fsm->slave = master->slaves;
   354             fsm->slave = master->slaves;
   318             ec_datagram_fprd(fsm->datagram, fsm->slave->station_address,
   355             ec_datagram_fprd(fsm->datagram, fsm->slave->station_address,
   319                     0x0130, 2);
   356                     0x0130, 2);
   320             ec_datagram_zero(datagram);
   357             ec_datagram_zero(datagram);
       
   358             fsm->datagram->device_index = fsm->slave->device_index;
   321             fsm->retries = EC_FSM_RETRIES;
   359             fsm->retries = EC_FSM_RETRIES;
   322             fsm->state = ec_fsm_master_state_read_state;
   360             fsm->state = ec_fsm_master_state_read_state;
   323         }
   361         }
   324     } else {
   362     } else {
   325         ec_fsm_master_restart(fsm);
   363         ec_fsm_master_restart(fsm);
   409         } else {
   447         } else {
   410             ec_datagram_fpwr(fsm->datagram, request->slave->station_address,
   448             ec_datagram_fpwr(fsm->datagram, request->slave->station_address,
   411                     request->offset, request->length);
   449                     request->offset, request->length);
   412             memcpy(fsm->datagram->data, request->data, request->length);
   450             memcpy(fsm->datagram->data, request->data, request->length);
   413         }
   451         }
       
   452         fsm->datagram->device_index = request->slave->device_index;
   414         fsm->retries = EC_FSM_RETRIES;
   453         fsm->retries = EC_FSM_RETRIES;
   415         fsm->state = ec_fsm_master_state_reg_request;
   454         fsm->state = ec_fsm_master_state_reg_request;
   416         return 1;
   455         return 1;
   417     }
   456     }
   418 
   457 
   516         fsm->idle = 0;
   555         fsm->idle = 0;
   517         fsm->slave = slave;
   556         fsm->slave = slave;
   518         fsm->state = ec_fsm_master_state_sdo_dictionary;
   557         fsm->state = ec_fsm_master_state_sdo_dictionary;
   519         ec_fsm_coe_dictionary(&fsm->fsm_coe, slave);
   558         ec_fsm_coe_dictionary(&fsm->fsm_coe, slave);
   520         ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
   559         ec_fsm_coe_exec(&fsm->fsm_coe); // execute immediately
       
   560         fsm->datagram->device_index = fsm->slave->device_index;
   521         return;
   561         return;
   522     }
   562     }
   523 
   563 
   524     // check for pending SII write operations.
   564     // check for pending SII write operations.
   525     if (ec_fsm_master_action_process_sii(fsm))
   565     if (ec_fsm_master_action_process_sii(fsm))
   548         // fetch state from next slave
   588         // fetch state from next slave
   549         fsm->idle = 1;
   589         fsm->idle = 1;
   550         ec_datagram_fprd(fsm->datagram,
   590         ec_datagram_fprd(fsm->datagram,
   551                 fsm->slave->station_address, 0x0130, 2);
   591                 fsm->slave->station_address, 0x0130, 2);
   552         ec_datagram_zero(fsm->datagram);
   592         ec_datagram_zero(fsm->datagram);
       
   593         fsm->datagram->device_index = fsm->slave->device_index;
   553         fsm->retries = EC_FSM_RETRIES;
   594         fsm->retries = EC_FSM_RETRIES;
   554         fsm->state = ec_fsm_master_state_read_state;
   595         fsm->state = ec_fsm_master_state_read_state;
   555         return;
   596         return;
   556     }
   597     }
   557 
   598 
   605 
   646 
   606         fsm->idle = 0;
   647         fsm->idle = 0;
   607         fsm->state = ec_fsm_master_state_configure_slave;
   648         fsm->state = ec_fsm_master_state_configure_slave;
   608         ec_fsm_slave_config_start(&fsm->fsm_slave_config, slave);
   649         ec_fsm_slave_config_start(&fsm->fsm_slave_config, slave);
   609         fsm->state(fsm); // execute immediately
   650         fsm->state(fsm); // execute immediately
       
   651         fsm->datagram->device_index = fsm->slave->device_index;
   610         return;
   652         return;
   611     }
   653     }
   612 
   654 
   613     // slave has error flag set; process next one
   655     // slave has error flag set; process next one
   614     ec_fsm_master_action_next_slave_state(fsm);
   656     ec_fsm_master_action_next_slave_state(fsm);
   678         ec_fsm_master_t *fsm /**< Master state machine. */
   720         ec_fsm_master_t *fsm /**< Master state machine. */
   679         )
   721         )
   680 {
   722 {
   681     ec_slave_t *slave = fsm->slave;
   723     ec_slave_t *slave = fsm->slave;
   682 
   724 
   683     if (ec_fsm_change_exec(&fsm->fsm_change))
   725     if (ec_fsm_change_exec(&fsm->fsm_change)) {
   684         return;
   726         return;
       
   727     }
   685 
   728 
   686     if (!ec_fsm_change_success(&fsm->fsm_change)) {
   729     if (!ec_fsm_change_success(&fsm->fsm_change)) {
   687         fsm->slave->error_flag = 1;
   730         fsm->slave->error_flag = 1;
   688         EC_SLAVE_ERR(slave, "Failed to acknowledge state change.\n");
   731         EC_SLAVE_ERR(slave, "Failed to acknowledge state change.\n");
   689     }
   732     }
   691     ec_fsm_master_action_configure(fsm);
   734     ec_fsm_master_action_configure(fsm);
   692 }
   735 }
   693 
   736 
   694 /*****************************************************************************/
   737 /*****************************************************************************/
   695 
   738 
       
   739 /** Start clearing slave addresses.
       
   740  */
       
   741 void ec_fsm_master_enter_clear_addresses(
       
   742         ec_fsm_master_t *fsm /**< Master state machine. */
       
   743         )
       
   744 {
       
   745     // broadcast clear all station addresses
       
   746     ec_datagram_bwr(fsm->datagram, 0x0010, 2);
       
   747     EC_WRITE_U16(fsm->datagram->data, 0x0000);
       
   748     fsm->datagram->device_index = fsm->dev_idx;
       
   749     fsm->retries = EC_FSM_RETRIES;
       
   750     fsm->state = ec_fsm_master_state_clear_addresses;
       
   751 }
       
   752 
       
   753 /*****************************************************************************/
       
   754 
   696 /** Master state: CLEAR ADDRESSES.
   755 /** Master state: CLEAR ADDRESSES.
   697  */
   756  */
   698 void ec_fsm_master_state_clear_addresses(
   757 void ec_fsm_master_state_clear_addresses(
   699         ec_fsm_master_t *fsm /**< Master state machine. */
   758         ec_fsm_master_t *fsm /**< Master state machine. */
   700         )
   759         )
   701 {
   760 {
   702     ec_master_t *master = fsm->master;
   761     ec_master_t *master = fsm->master;
   703     ec_datagram_t *datagram = fsm->datagram;
   762     ec_datagram_t *datagram = fsm->datagram;
   704 
   763 
   705     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   764     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--) {
   706         return;
   765         return;
       
   766     }
   707 
   767 
   708     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   768     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   709         EC_MASTER_ERR(master, "Failed to receive address"
   769         EC_MASTER_ERR(master, "Failed to receive address"
   710                 " clearing datagram: ");
   770                 " clearing datagram on %s link: ",
       
   771                 ec_device_names[fsm->dev_idx]);
   711         ec_datagram_print_state(datagram);
   772         ec_datagram_print_state(datagram);
   712         master->scan_busy = 0;
   773         master->scan_busy = 0;
   713         wake_up_interruptible(&master->scan_queue);
   774         wake_up_interruptible(&master->scan_queue);
   714         ec_fsm_master_restart(fsm);
   775         ec_fsm_master_restart(fsm);
   715         return;
   776         return;
   716     }
   777     }
   717 
   778 
   718     if (datagram->working_counter != master->slave_count) {
   779     if (datagram->working_counter != fsm->slaves_responding[fsm->dev_idx]) {
   719         EC_MASTER_WARN(master, "Failed to clear all station addresses:"
   780         EC_MASTER_WARN(master, "Failed to clear station addresses on %s link:"
   720                 " Cleared %u of %u",
   781                 " Cleared %u of %u",
   721                 datagram->working_counter, master->slave_count);
   782                 ec_device_names[fsm->dev_idx], datagram->working_counter,
       
   783                 fsm->slaves_responding[fsm->dev_idx]);
   722     }
   784     }
   723 
   785 
   724     EC_MASTER_DBG(master, 1, "Sending broadcast-write"
   786     EC_MASTER_DBG(master, 1, "Sending broadcast-write"
   725             " to measure transmission delays.\n");
   787             " to measure transmission delays on %s link.\n",
       
   788             ec_device_names[fsm->dev_idx]);
   726 
   789 
   727     ec_datagram_bwr(datagram, 0x0900, 1);
   790     ec_datagram_bwr(datagram, 0x0900, 1);
   728     ec_datagram_zero(datagram);
   791     ec_datagram_zero(datagram);
       
   792     fsm->datagram->device_index = fsm->dev_idx;
   729     fsm->retries = EC_FSM_RETRIES;
   793     fsm->retries = EC_FSM_RETRIES;
   730     fsm->state = ec_fsm_master_state_dc_measure_delays;
   794     fsm->state = ec_fsm_master_state_dc_measure_delays;
   731 }
   795 }
   732 
   796 
   733 /*****************************************************************************/
   797 /*****************************************************************************/
   743 
   807 
   744     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   808     if (datagram->state == EC_DATAGRAM_TIMED_OUT && fsm->retries--)
   745         return;
   809         return;
   746 
   810 
   747     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   811     if (datagram->state != EC_DATAGRAM_RECEIVED) {
   748         EC_MASTER_ERR(master, "Failed to receive delay measuring datagram: ");
   812         EC_MASTER_ERR(master, "Failed to receive delay measuring datagram"
       
   813                 " on %s link: ", ec_device_names[fsm->dev_idx]);
   749         ec_datagram_print_state(datagram);
   814         ec_datagram_print_state(datagram);
   750         master->scan_busy = 0;
   815         master->scan_busy = 0;
   751         wake_up_interruptible(&master->scan_queue);
   816         wake_up_interruptible(&master->scan_queue);
   752         ec_fsm_master_restart(fsm);
   817         ec_fsm_master_restart(fsm);
   753         return;
   818         return;
   754     }
   819     }
   755 
   820 
   756     EC_MASTER_DBG(master, 1, "%u slaves responded to delay measuring.\n",
   821     EC_MASTER_DBG(master, 1, "%u slaves responded to delay measuring"
   757             datagram->working_counter);
   822             " on %s link.\n",
       
   823             datagram->working_counter, ec_device_names[fsm->dev_idx]);
       
   824 
       
   825     do {
       
   826         fsm->dev_idx++;
       
   827     } while (fsm->dev_idx < EC_NUM_DEVICES &&
       
   828             !fsm->slaves_responding[fsm->dev_idx]);
       
   829     if (fsm->dev_idx < EC_NUM_DEVICES) {
       
   830         ec_fsm_master_enter_clear_addresses(fsm);
       
   831         return;
       
   832     }
   758 
   833 
   759     EC_MASTER_INFO(master, "Scanning bus.\n");
   834     EC_MASTER_INFO(master, "Scanning bus.\n");
   760 
   835 
   761     // begin scanning of slaves
   836     // begin scanning of slaves
   762     fsm->slave = master->slaves;
   837     fsm->slave = master->slaves;
       
   838     EC_MASTER_DBG(master, 1, "Scanning slave %u on %s link.\n",
       
   839             fsm->slave->ring_position,
       
   840             ec_device_names[fsm->slave->device_index]);
   763     fsm->state = ec_fsm_master_state_scan_slave;
   841     fsm->state = ec_fsm_master_state_scan_slave;
   764     ec_fsm_slave_scan_start(&fsm->fsm_slave_scan, fsm->slave);
   842     ec_fsm_slave_scan_start(&fsm->fsm_slave_scan, fsm->slave);
   765     ec_fsm_slave_scan_exec(&fsm->fsm_slave_scan); // execute immediately
   843     ec_fsm_slave_scan_exec(&fsm->fsm_slave_scan); // execute immediately
       
   844     fsm->datagram->device_index = fsm->slave->device_index;
   766 }
   845 }
   767 
   846 
   768 /*****************************************************************************/
   847 /*****************************************************************************/
   769 
   848 
   770 /** Master state: SCAN SLAVE.
   849 /** Master state: SCAN SLAVE.
   777 {
   856 {
   778     ec_master_t *master = fsm->master;
   857     ec_master_t *master = fsm->master;
   779 #ifdef EC_EOE
   858 #ifdef EC_EOE
   780     ec_slave_t *slave = fsm->slave;
   859     ec_slave_t *slave = fsm->slave;
   781 #endif
   860 #endif
   782     if (ec_fsm_slave_scan_exec(&fsm->fsm_slave_scan))
   861 
   783         return;
   862     if (ec_fsm_slave_scan_exec(&fsm->fsm_slave_scan)) {
       
   863         return;
       
   864     }
   784 
   865 
   785 #ifdef EC_EOE
   866 #ifdef EC_EOE
   786     if (slave->sii.mailbox_protocols & EC_MBOX_EOE) {
   867     if (slave->sii.mailbox_protocols & EC_MBOX_EOE) {
   787         // create EoE handler for this slave
   868         // create EoE handler for this slave
   788         ec_eoe_t *eoe;
   869         ec_eoe_t *eoe;
   798 #endif
   879 #endif
   799 
   880 
   800     // another slave to fetch?
   881     // another slave to fetch?
   801     fsm->slave++;
   882     fsm->slave++;
   802     if (fsm->slave < master->slaves + master->slave_count) {
   883     if (fsm->slave < master->slaves + master->slave_count) {
       
   884         EC_MASTER_DBG(master, 1, "Scanning slave %u on %s link.\n",
       
   885                 fsm->slave->ring_position,
       
   886                 ec_device_names[fsm->slave->device_index]);
   803         ec_fsm_slave_scan_start(&fsm->fsm_slave_scan, fsm->slave);
   887         ec_fsm_slave_scan_start(&fsm->fsm_slave_scan, fsm->slave);
   804         ec_fsm_slave_scan_exec(&fsm->fsm_slave_scan); // execute immediately
   888         ec_fsm_slave_scan_exec(&fsm->fsm_slave_scan); // execute immediately
       
   889         fsm->datagram->device_index = fsm->slave->device_index;
   805         return;
   890         return;
   806     }
   891     }
   807 
   892 
   808     EC_MASTER_INFO(master, "Bus scanning completed in %lu ms.\n",
   893     EC_MASTER_INFO(master, "Bus scanning completed in %lu ms.\n",
   809             (jiffies - fsm->scan_jiffies) * 1000 / HZ);
   894             (jiffies - fsm->scan_jiffies) * 1000 / HZ);
   841         ec_fsm_master_t *fsm /**< Master state machine. */
   926         ec_fsm_master_t *fsm /**< Master state machine. */
   842         )
   927         )
   843 {
   928 {
   844     ec_master_t *master = fsm->master;
   929     ec_master_t *master = fsm->master;
   845 
   930 
   846     if (ec_fsm_slave_config_exec(&fsm->fsm_slave_config))
   931     if (ec_fsm_slave_config_exec(&fsm->fsm_slave_config)) {
   847         return;
   932         return;
       
   933     }
   848 
   934 
   849     fsm->slave->force_config = 0;
   935     fsm->slave->force_config = 0;
   850 
   936 
   851     // configuration finished
   937     // configuration finished
   852     master->config_busy = 0;
   938     master->config_busy = 0;
   884             // read DC system time (0x0910, 64 bit)
   970             // read DC system time (0x0910, 64 bit)
   885             //                         gap (64 bit)
   971             //                         gap (64 bit)
   886             //     and time offset (0x0920, 64 bit)
   972             //     and time offset (0x0920, 64 bit)
   887             ec_datagram_fprd(fsm->datagram, fsm->slave->station_address,
   973             ec_datagram_fprd(fsm->datagram, fsm->slave->station_address,
   888                     0x0910, 24);
   974                     0x0910, 24);
       
   975             fsm->datagram->device_index = fsm->slave->device_index;
   889             fsm->retries = EC_FSM_RETRIES;
   976             fsm->retries = EC_FSM_RETRIES;
   890             fsm->state = ec_fsm_master_state_dc_read_offset;
   977             fsm->state = ec_fsm_master_state_dc_read_offset;
   891             return;
   978             return;
   892         }
   979         }
   893 
   980 
  1029 
  1116 
  1030     // set DC system time offset and transmission delay
  1117     // set DC system time offset and transmission delay
  1031     ec_datagram_fpwr(datagram, slave->station_address, 0x0920, 12);
  1118     ec_datagram_fpwr(datagram, slave->station_address, 0x0920, 12);
  1032     EC_WRITE_U64(datagram->data, new_offset);
  1119     EC_WRITE_U64(datagram->data, new_offset);
  1033     EC_WRITE_U32(datagram->data + 8, slave->transmission_delay);
  1120     EC_WRITE_U32(datagram->data + 8, slave->transmission_delay);
       
  1121     fsm->datagram->device_index = slave->device_index;
  1034     fsm->retries = EC_FSM_RETRIES;
  1122     fsm->retries = EC_FSM_RETRIES;
  1035     fsm->state = ec_fsm_master_state_dc_write_offset;
  1123     fsm->state = ec_fsm_master_state_dc_write_offset;
  1036 }
  1124 }
  1037 
  1125 
  1038 /*****************************************************************************/
  1126 /*****************************************************************************/
  1133         )
  1221         )
  1134 {
  1222 {
  1135     ec_slave_t *slave = fsm->slave;
  1223     ec_slave_t *slave = fsm->slave;
  1136     ec_master_t *master = fsm->master;
  1224     ec_master_t *master = fsm->master;
  1137 
  1225 
  1138     if (ec_fsm_coe_exec(&fsm->fsm_coe)) return;
  1226     if (ec_fsm_coe_exec(&fsm->fsm_coe)) {
       
  1227         return;
       
  1228     }
  1139 
  1229 
  1140     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
  1230     if (!ec_fsm_coe_success(&fsm->fsm_coe)) {
  1141         ec_fsm_master_restart(fsm);
  1231         ec_fsm_master_restart(fsm);
  1142         return;
  1232         return;
  1143     }
  1233     }