master/master.c
branchstable-1.2
changeset 1739 5fcbd29151d2
parent 1732 1cc865ba17c2
child 1742 9195107c9441
equal deleted inserted replaced
1738:bc89e3fba1a5 1739:5fcbd29151d2
    55 /*****************************************************************************/
    55 /*****************************************************************************/
    56 
    56 
    57 void ec_master_clear(struct kobject *);
    57 void ec_master_clear(struct kobject *);
    58 void ec_master_destroy_domains(ec_master_t *);
    58 void ec_master_destroy_domains(ec_master_t *);
    59 void ec_master_sync_io(ec_master_t *);
    59 void ec_master_sync_io(ec_master_t *);
    60 void ec_master_idle_run(void *);
    60 static int ec_master_thread(void *);
    61 void ec_master_eoe_run(unsigned long);
    61 void ec_master_eoe_run(unsigned long);
    62 void ec_master_check_sdo(unsigned long);
    62 void ec_master_check_sdo(unsigned long);
    63 int ec_master_measure_bus_time(ec_master_t *);
    63 int ec_master_measure_bus_time(ec_master_t *);
    64 ssize_t ec_show_master_attribute(struct kobject *, struct attribute *, char *);
    64 ssize_t ec_show_master_attribute(struct kobject *, struct attribute *, char *);
    65 ssize_t ec_store_master_attribute(struct kobject *, struct attribute *,
    65 ssize_t ec_store_master_attribute(struct kobject *, struct attribute *,
   130     master->stats.timeouts = 0;
   130     master->stats.timeouts = 0;
   131     master->stats.corrupted = 0;
   131     master->stats.corrupted = 0;
   132     master->stats.skipped = 0;
   132     master->stats.skipped = 0;
   133     master->stats.unmatched = 0;
   133     master->stats.unmatched = 0;
   134     master->stats.output_jiffies = 0;
   134     master->stats.output_jiffies = 0;
   135 
       
   136     INIT_WORK(&master->idle_work, ec_master_idle_run, (void *) master);
       
   137 
   135 
   138     for (i = 0; i < HZ; i++) {
   136     for (i = 0; i < HZ; i++) {
   139         master->idle_cycle_times[i] = 0;
   137         master->idle_cycle_times[i] = 0;
   140         master->eoe_cycle_times[i] = 0;
   138         master->eoe_cycle_times[i] = 0;
   141     }
   139     }
   163     init_timer(&master->sdo_timer);
   161     init_timer(&master->sdo_timer);
   164     master->sdo_timer.function = ec_master_check_sdo;
   162     master->sdo_timer.function = ec_master_check_sdo;
   165     master->sdo_timer.data = (unsigned long) master;
   163     master->sdo_timer.data = (unsigned long) master;
   166     init_completion(&master->sdo_complete);
   164     init_completion(&master->sdo_complete);
   167 
   165 
   168     // create workqueue
       
   169     if (!(master->workqueue = create_singlethread_workqueue("EtherCAT"))) {
       
   170         EC_ERR("Failed to create master workqueue.\n");
       
   171         goto out_return;
       
   172     }
       
   173 
       
   174     // create EoE handlers
   166     // create EoE handlers
   175     for (i = 0; i < eoeif_count; i++) {
   167     for (i = 0; i < eoeif_count; i++) {
   176         if (!(eoe = (ec_eoe_t *) kmalloc(sizeof(ec_eoe_t), GFP_KERNEL))) {
   168         if (!(eoe = (ec_eoe_t *) kmalloc(sizeof(ec_eoe_t), GFP_KERNEL))) {
   177             EC_ERR("Failed to allocate EoE-Object.\n");
   169             EC_ERR("Failed to allocate EoE-Object.\n");
   178             goto out_clear_eoe;
   170             goto out_clear_eoe;
   182             goto out_clear_eoe;
   174             goto out_clear_eoe;
   183         }
   175         }
   184         list_add_tail(&eoe->list, &master->eoe_handlers);
   176         list_add_tail(&eoe->list, &master->eoe_handlers);
   185     }
   177     }
   186 
   178 
       
   179     // init state machine datagram
       
   180     ec_datagram_init(&master->fsm_datagram);
       
   181     if (ec_datagram_prealloc(&master->fsm_datagram, EC_MAX_DATA_SIZE)) {
       
   182         EC_ERR("Failed to allocate FSM datagram.\n");
       
   183         goto out_clear_eoe;
       
   184     }
       
   185 
   187     // create state machine object
   186     // create state machine object
   188     if (ec_fsm_init(&master->fsm, master)) goto out_clear_eoe;
   187     ec_fsm_master_init(&master->fsm, master, &master->fsm_datagram);
   189 
   188 
   190     // init kobject and add it to the hierarchy
   189     // init kobject and add it to the hierarchy
   191     memset(&master->kobj, 0x00, sizeof(struct kobject));
   190     memset(&master->kobj, 0x00, sizeof(struct kobject));
   192     kobject_init(&master->kobj);
   191     kobject_init(&master->kobj);
   193     master->kobj.ktype = &ktype_ec_master;
   192     master->kobj.ktype = &ktype_ec_master;
   202         return -1;
   201         return -1;
   203     }
   202     }
   204 
   203 
   205     return 0;
   204     return 0;
   206 
   205 
   207  out_clear_eoe:
   206 out_clear_eoe:
   208     list_for_each_entry_safe(eoe, next_eoe, &master->eoe_handlers, list) {
   207     list_for_each_entry_safe(eoe, next_eoe, &master->eoe_handlers, list) {
   209         list_del(&eoe->list);
   208         list_del(&eoe->list);
   210         ec_eoe_clear(eoe);
   209         ec_eoe_clear(eoe);
   211         kfree(eoe);
   210         kfree(eoe);
   212     }
   211     }
   213     destroy_workqueue(master->workqueue);
       
   214  out_return:
   212  out_return:
   215     return -1;
   213     return -1;
   216 }
   214 }
   217 
   215 
   218 /*****************************************************************************/
   216 /*****************************************************************************/
   251                              &master->datagram_queue, queue) {
   249                              &master->datagram_queue, queue) {
   252         datagram->state = EC_DATAGRAM_ERROR;
   250         datagram->state = EC_DATAGRAM_ERROR;
   253         list_del_init(&datagram->queue);
   251         list_del_init(&datagram->queue);
   254     }
   252     }
   255 
   253 
   256     ec_fsm_clear(&master->fsm);
   254     ec_fsm_master_clear(&master->fsm);
   257     destroy_workqueue(master->workqueue);
   255     ec_datagram_clear(&master->fsm_datagram);
   258 
   256 
   259     // clear EoE objects
   257     // clear EoE objects
   260     list_for_each_entry_safe(eoe, next_eoe, &master->eoe_handlers, list) {
   258     list_for_each_entry_safe(eoe, next_eoe, &master->eoe_handlers, list) {
   261         list_del(&eoe->list);
   259         list_del(&eoe->list);
   262         ec_eoe_clear(eoe);
   260         ec_eoe_clear(eoe);
   318 }
   316 }
   319 
   317 
   320 /*****************************************************************************/
   318 /*****************************************************************************/
   321 
   319 
   322 /**
   320 /**
       
   321    Internal locking callback.
       
   322 */
       
   323 
       
   324 int ec_master_request_cb(void *master /**< callback data */)
       
   325 {
       
   326     spin_lock(&((ec_master_t *) master)->internal_lock);
       
   327     return 0;
       
   328 }
       
   329 
       
   330 /*****************************************************************************/
       
   331 
       
   332 /**
       
   333    Internal unlocking callback.
       
   334 */
       
   335 
       
   336 void ec_master_release_cb(void *master /**< callback data */)
       
   337 {
       
   338     spin_unlock(&((ec_master_t *) master)->internal_lock);
       
   339 }
       
   340 
       
   341 /*****************************************************************************/
       
   342 
       
   343 /**
       
   344  * Starts the master thread.
       
   345 */
       
   346 
       
   347 int ec_master_thread_start(ec_master_t *master /**< EtherCAT master */)
       
   348 {
       
   349     init_completion(&master->thread_exit);
       
   350     
       
   351     EC_INFO("Starting master thread.\n");
       
   352     if (!(master->thread_id =
       
   353                 kernel_thread(ec_master_thread, master, CLONE_KERNEL)))
       
   354         return -1;
       
   355     
       
   356     return 0;
       
   357 }
       
   358 
       
   359 /*****************************************************************************/
       
   360 
       
   361 /**
       
   362  * Stops the master thread.
       
   363 */
       
   364 
       
   365 void ec_master_thread_stop(ec_master_t *master /**< EtherCAT master */)
       
   366 {
       
   367     if (master->thread_id) {
       
   368         kill_proc(master->thread_id, SIGTERM, 1);
       
   369         wait_for_completion(&master->thread_exit);
       
   370         EC_INFO("Master thread exited.\n");
       
   371     }    
       
   372 }
       
   373 
       
   374 /*****************************************************************************/
       
   375 
       
   376 /**
       
   377  * Transition function from ORPHANED to IDLE mode.
   323 */
   378 */
   324 
   379 
   325 int ec_master_enter_idle_mode(ec_master_t *master /**< EtherCAT master */)
   380 int ec_master_enter_idle_mode(ec_master_t *master /**< EtherCAT master */)
   326 {
   381 {
       
   382     master->request_cb = ec_master_request_cb;
       
   383     master->release_cb = ec_master_release_cb;
       
   384     master->cb_data = master;
       
   385 	
   327     master->mode = EC_MASTER_MODE_IDLE;
   386     master->mode = EC_MASTER_MODE_IDLE;
   328     queue_delayed_work(master->workqueue, &master->idle_work, 1);
   387     if (ec_master_thread_start(master)) {
       
   388         master->mode = EC_MASTER_MODE_ORPHANED;
       
   389         return -1;
       
   390     }
       
   391 
   329     return 0;
   392     return 0;
   330 }
   393 }
   331 
   394 
   332 /*****************************************************************************/
   395 /*****************************************************************************/
   333 
   396 
   334 /**
   397 /**
       
   398  * Transition function from IDLE to ORPHANED mode.
   335 */
   399 */
   336 
   400 
   337 void ec_master_leave_idle_mode(ec_master_t *master /**< EtherCAT master */)
   401 void ec_master_leave_idle_mode(ec_master_t *master /**< EtherCAT master */)
   338 {
   402 {
       
   403     master->mode = EC_MASTER_MODE_ORPHANED;
       
   404     
   339     ec_master_eoe_stop(master);
   405     ec_master_eoe_stop(master);
   340 
   406     ec_master_thread_stop(master);
   341     master->mode = EC_MASTER_MODE_ORPHANED;
       
   342     while (!cancel_delayed_work(&master->idle_work)) {
       
   343         flush_workqueue(master->workqueue);
       
   344     }
       
   345 
       
   346     ec_master_flush_sdo_requests(master);
   407     ec_master_flush_sdo_requests(master);
   347 }
   408 }
   348 
   409 
   349 /*****************************************************************************/
   410 /*****************************************************************************/
   350 
   411 
   351 /**
   412 /**
       
   413  * Transition function from IDLE to OPERATION mode.
   352 */
   414 */
   353 
   415 
   354 int ec_master_enter_operation_mode(ec_master_t *master /**< EtherCAT master */)
   416 int ec_master_enter_operation_mode(ec_master_t *master /**< EtherCAT master */)
   355 {
   417 {
   356     ec_slave_t *slave;
   418     ec_slave_t *slave;
   357     ec_datagram_t *datagram = &master->fsm.datagram;
   419 
       
   420     ec_master_eoe_stop(master); // stop EoE timer
       
   421     master->eoe_checked = 1; // prevent from starting again by FSM
       
   422     ec_master_thread_stop(master);
   358 
   423 
   359     master->mode = EC_MASTER_MODE_OPERATION;
   424     master->mode = EC_MASTER_MODE_OPERATION;
   360     while (!cancel_delayed_work(&master->idle_work)) {
       
   361         flush_workqueue(master->workqueue);
       
   362     }
       
   363 
   425 
   364     // wait for FSM datagram
   426     // wait for FSM datagram
   365     if (datagram->state == EC_DATAGRAM_SENT) {;
   427     if (master->fsm_datagram.state == EC_DATAGRAM_SENT) {
   366         while (get_cycles() - datagram->cycles_sent
   428         while (get_cycles() - master->fsm_datagram.cycles_sent
   367                < (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000)) {}
   429                < (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000)) {}
   368         ecrt_master_receive(master);
   430         ecrt_master_receive(master);
   369     }
   431     }
   370 
   432 
   371     // finish running master FSM
   433     // finish running master FSM
   372     if (ec_fsm_running(&master->fsm)) {
   434     if (ec_fsm_master_running(&master->fsm)) {
   373         while (ec_fsm_exec(&master->fsm)) {
   435         while (ec_fsm_master_exec(&master->fsm)) {
   374             ec_master_sync_io(master);
   436             ec_master_sync_io(master);
   375         }
   437         }
   376     }
   438     }
   377 
   439 
   378     if (master->debug_level) {
   440     if (master->debug_level) {
   390         else {
   452         else {
   391             ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
   453             ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
   392         }
   454         }
   393     }
   455     }
   394 
   456 
       
   457     master->eoe_checked = 0; // allow starting EoE again
       
   458 
   395     return 0;
   459     return 0;
   396 
   460 
   397  out_idle:
   461  out_idle:
   398     master->mode = EC_MASTER_MODE_IDLE;
   462     master->mode = EC_MASTER_MODE_IDLE;
   399     queue_delayed_work(master->workqueue, &master->idle_work, 1);
   463     if (ec_master_thread_start(master)) {
       
   464         EC_WARN("Failed to start master thread again!\n");
       
   465     }
   400     return -1;
   466     return -1;
   401 }
   467 }
   402 
   468 
   403 /*****************************************************************************/
   469 /*****************************************************************************/
   404 
   470 
   405 /**
   471 /**
       
   472  * Transition function from OPERATION to IDLE mode.
   406 */
   473 */
   407 
   474 
   408 void ec_master_leave_operation_mode(ec_master_t *master
   475 void ec_master_leave_operation_mode(ec_master_t *master
   409                                     /**< EtherCAT master */)
   476                                     /**< EtherCAT master */)
   410 {
   477 {
   411     ec_slave_t *slave;
   478     ec_slave_t *slave;
   412     ec_fsm_t *fsm = &master->fsm;
   479     ec_fsm_master_t *fsm = &master->fsm;
   413     ec_datagram_t *datagram = &master->fsm.datagram;
   480     ec_fsm_slave_t fsm_slave;
       
   481 
       
   482     ec_master_eoe_stop(master); // stop EoE timer
       
   483     master->eoe_checked = 1; // prevent from starting again by FSM
   414 
   484 
   415     // wait for FSM datagram
   485     // wait for FSM datagram
   416     if (datagram->state == EC_DATAGRAM_SENT) {
   486     if (master->fsm_datagram.state == EC_DATAGRAM_SENT) {
   417         while (get_cycles() - datagram->cycles_sent
   487         // active waiting
   418                < (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000)) {}
   488         while (get_cycles() - master->fsm_datagram.cycles_sent
       
   489                < (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000));
   419         ecrt_master_receive(master);
   490         ecrt_master_receive(master);
   420     }
   491     }
   421 
   492 
   422     // finish running master FSM
   493     // finish running master FSM
   423     if (ec_fsm_running(fsm)) {
   494     if (ec_fsm_master_running(fsm)) {
   424         while (ec_fsm_exec(fsm)) {
   495         while (ec_fsm_master_exec(fsm)) {
   425             ec_master_sync_io(master);
   496             ec_master_sync_io(master);
   426         }
   497         }
   427     }
   498     }
   428 
   499 
       
   500     ec_fsm_slave_init(&fsm_slave, &master->fsm_datagram);
       
   501     
   429     // set states for all slaves
   502     // set states for all slaves
   430     list_for_each_entry(slave, &master->slaves, list) {
   503     list_for_each_entry(slave, &master->slaves, list) {
   431         ec_slave_reset(slave);
   504         ec_slave_reset(slave);
   432         ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
   505         ec_slave_request_state(slave, EC_SLAVE_STATE_PREOP);
   433 
   506 
   434         fsm->slave = slave;
   507         // don't try to set PREOP for slaves that don't respond,
   435         fsm->slave_state = ec_fsm_slaveconf_state_start;
   508         // because of 3 second timeout.
   436 
   509         if (!slave->online) {
   437         do {
   510             if (master->debug_level)
   438             fsm->slave_state(fsm);
   511                 EC_DBG("Skipping to configure offline slave %i.\n",
       
   512                         slave->ring_position);
       
   513             continue;
       
   514         }
       
   515 
       
   516         ec_fsm_slave_start_conf(&fsm_slave, slave);
       
   517         while (ec_fsm_slave_exec(&fsm_slave)) {
   439             ec_master_sync_io(master);
   518             ec_master_sync_io(master);
   440         }
   519         }
   441         while (fsm->slave_state != ec_fsm_slave_state_end
   520     }
   442                && fsm->slave_state != ec_fsm_slave_state_error);
   521 
   443     }
   522     ec_fsm_slave_clear(&fsm_slave);
   444 
   523 
   445     ec_master_destroy_domains(master);
   524     ec_master_destroy_domains(master);
   446 
   525 
   447     master->request_cb = NULL;
   526     master->request_cb = ec_master_request_cb;
   448     master->release_cb = NULL;
   527     master->release_cb = ec_master_release_cb;
   449     master->cb_data = NULL;
   528     master->cb_data = master;
       
   529 
       
   530     master->eoe_checked = 0; // allow EoE again
   450 
   531 
   451     master->mode = EC_MASTER_MODE_IDLE;
   532     master->mode = EC_MASTER_MODE_IDLE;
   452     queue_delayed_work(master->workqueue, &master->idle_work, 1);
   533     if (ec_master_thread_start(master)) {
       
   534         EC_WARN("Failed to start master thread!\n");
       
   535     }
   453 }
   536 }
   454 
   537 
   455 /*****************************************************************************/
   538 /*****************************************************************************/
   456 
   539 
   457 /**
   540 /**
   474         }
   557         }
   475     }
   558     }
   476 
   559 
   477     list_add_tail(&datagram->queue, &master->datagram_queue);
   560     list_add_tail(&datagram->queue, &master->datagram_queue);
   478     datagram->state = EC_DATAGRAM_QUEUED;
   561     datagram->state = EC_DATAGRAM_QUEUED;
   479     datagram->cycles_queued = get_cycles();
       
   480 }
   562 }
   481 
   563 
   482 /*****************************************************************************/
   564 /*****************************************************************************/
   483 
   565 
   484 /**
   566 /**
   674         datagram->working_counter = EC_READ_U16(cur_data);
   756         datagram->working_counter = EC_READ_U16(cur_data);
   675         cur_data += EC_DATAGRAM_FOOTER_SIZE;
   757         cur_data += EC_DATAGRAM_FOOTER_SIZE;
   676 
   758 
   677         // dequeue the received datagram
   759         // dequeue the received datagram
   678         datagram->state = EC_DATAGRAM_RECEIVED;
   760         datagram->state = EC_DATAGRAM_RECEIVED;
   679         datagram->cycles_received = master->device->cycles_isr;
   761         datagram->cycles_received = master->device->cycles_poll;
   680         datagram->jiffies_received = master->device->jiffies_isr;
   762         datagram->jiffies_received = master->device->jiffies_poll;
   681         list_del_init(&datagram->queue);
   763         list_del_init(&datagram->queue);
   682     }
   764     }
   683 }
   765 }
   684 
   766 
   685 /*****************************************************************************/
   767 /*****************************************************************************/
   719 }
   801 }
   720 
   802 
   721 /*****************************************************************************/
   803 /*****************************************************************************/
   722 
   804 
   723 /**
   805 /**
   724    Idle mode function.
   806    Master kernel thread function.
   725 */
   807 */
   726 
   808 
   727 void ec_master_idle_run(void *data /**< master pointer */)
   809 static int ec_master_thread(void *data)
   728 {
   810 {
   729     ec_master_t *master = (ec_master_t *) data;
   811     ec_master_t *master = (ec_master_t *) data;
   730     cycles_t cycles_start, cycles_end;
   812     cycles_t cycles_start, cycles_end;
   731 
   813 
   732     // aquire master lock
   814     daemonize("EtherCAT");
   733     spin_lock_bh(&master->internal_lock);
   815     allow_signal(SIGTERM);
   734 
   816 
   735     cycles_start = get_cycles();
   817     while (!signal_pending(current) && master->mode == EC_MASTER_MODE_IDLE) {
   736     ecrt_master_receive(master);
   818         cycles_start = get_cycles();
   737 
   819 
   738     // execute master state machine
   820         // receive
   739     ec_fsm_exec(&master->fsm);
   821         spin_lock_bh(&master->internal_lock);
   740 
   822         ecrt_master_receive(master);
   741     ecrt_master_send(master);
   823         spin_unlock_bh(&master->internal_lock);
   742     cycles_end = get_cycles();
   824 
   743 
   825         // execute master state machine
   744     // release master lock
   826         ec_fsm_master_exec(&master->fsm);
   745     spin_unlock_bh(&master->internal_lock);
   827 
   746 
   828         // send
   747     master->idle_cycle_times[master->idle_cycle_time_pos]
   829         spin_lock_bh(&master->internal_lock);
   748         = (u32) (cycles_end - cycles_start) * 1000 / cpu_khz;
   830         ecrt_master_send(master);
   749     master->idle_cycle_time_pos++;
   831         spin_unlock_bh(&master->internal_lock);
   750     master->idle_cycle_time_pos %= HZ;
   832         
   751 
   833         cycles_end = get_cycles();
   752     if (master->mode == EC_MASTER_MODE_IDLE)
   834         master->idle_cycle_times[master->idle_cycle_time_pos]
   753         queue_delayed_work(master->workqueue, &master->idle_work, 1);
   835             = (u32) (cycles_end - cycles_start) * 1000 / cpu_khz;
   754 }
   836         master->idle_cycle_time_pos++;
   755 
   837         master->idle_cycle_time_pos %= HZ;
   756 /*****************************************************************************/
   838 
   757 
   839         set_current_state(TASK_INTERRUPTIBLE);
   758 /**
   840         schedule_timeout(1);
   759    Initializes a sync manager configuration page with EEPROM data.
   841     }
   760    The referenced memory (\a data) must be at least EC_SYNC_SIZE bytes.
   842     
   761 */
   843     master->thread_id = 0;
   762 
   844     complete_and_exit(&master->thread_exit, 0);
   763 void ec_sync_config(const ec_sii_sync_t *sync, /**< sync manager */
       
   764                     const ec_slave_t *slave, /**< EtherCAT slave */
       
   765                     uint8_t *data /**> configuration memory */
       
   766                     )
       
   767 {
       
   768     size_t sync_size;
       
   769 
       
   770     sync_size = ec_slave_calc_sync_size(slave, sync);
       
   771 
       
   772     if (slave->master->debug_level) {
       
   773         EC_DBG("Slave %3i, SM %i: Addr 0x%04X, Size %3i, Ctrl 0x%02X, En %i\n",
       
   774                slave->ring_position, sync->index, sync->physical_start_address,
       
   775                sync_size, sync->control_register, sync->enable);
       
   776     }
       
   777 
       
   778     EC_WRITE_U16(data,     sync->physical_start_address);
       
   779     EC_WRITE_U16(data + 2, sync_size);
       
   780     EC_WRITE_U8 (data + 4, sync->control_register);
       
   781     EC_WRITE_U8 (data + 5, 0x00); // status byte (read only)
       
   782     EC_WRITE_U16(data + 6, sync->enable ? 0x0001 : 0x0000); // enable
       
   783 }
       
   784 
       
   785 /*****************************************************************************/
       
   786 
       
   787 /**
       
   788    Initializes an FMMU configuration page.
       
   789    The referenced memory (\a data) must be at least EC_FMMU_SIZE bytes.
       
   790 */
       
   791 
       
   792 void ec_fmmu_config(const ec_fmmu_t *fmmu, /**< FMMU */
       
   793                     const ec_slave_t *slave, /**< EtherCAT slave */
       
   794                     uint8_t *data /**> configuration memory */
       
   795                     )
       
   796 {
       
   797     size_t sync_size;
       
   798 
       
   799     sync_size = ec_slave_calc_sync_size(slave, fmmu->sync);
       
   800 
       
   801     if (slave->master->debug_level) {
       
   802         EC_DBG("Slave %3i, FMMU %2i:"
       
   803                " LogAddr 0x%08X, Size %3i, PhysAddr 0x%04X, Dir %s\n",
       
   804                slave->ring_position, fmmu->index, fmmu->logical_start_address,
       
   805                sync_size, fmmu->sync->physical_start_address,
       
   806                ((fmmu->sync->control_register & 0x04) ? "out" : "in"));
       
   807     }
       
   808 
       
   809     EC_WRITE_U32(data,      fmmu->logical_start_address);
       
   810     EC_WRITE_U16(data + 4,  sync_size); // size of fmmu
       
   811     EC_WRITE_U8 (data + 6,  0x00); // logical start bit
       
   812     EC_WRITE_U8 (data + 7,  0x07); // logical end bit
       
   813     EC_WRITE_U16(data + 8,  fmmu->sync->physical_start_address);
       
   814     EC_WRITE_U8 (data + 10, 0x00); // physical start bit
       
   815     EC_WRITE_U8 (data + 11, ((fmmu->sync->control_register & 0x04)
       
   816                              ? 0x02 : 0x01));
       
   817     EC_WRITE_U16(data + 12, 0x0001); // enable
       
   818     EC_WRITE_U16(data + 14, 0x0000); // reserved
       
   819 }
   845 }
   820 
   846 
   821 /*****************************************************************************/
   847 /*****************************************************************************/
   822 
   848 
   823 /**
   849 /**
   830                        )
   856                        )
   831 {
   857 {
   832     off_t off = 0;
   858     off_t off = 0;
   833     ec_eoe_t *eoe;
   859     ec_eoe_t *eoe;
   834     uint32_t cur, sum, min, max, pos, i;
   860     uint32_t cur, sum, min, max, pos, i;
       
   861     unsigned int frames_lost;
   835 
   862 
   836     off += sprintf(buffer + off, "\nVersion: %s", ec_master_version_str);
   863     off += sprintf(buffer + off, "\nVersion: %s", ec_master_version_str);
   837     off += sprintf(buffer + off, "\nMode: ");
   864     off += sprintf(buffer + off, "\nMode: ");
   838     switch (master->mode) {
   865     switch (master->mode) {
   839         case EC_MASTER_MODE_ORPHANED:
   866         case EC_MASTER_MODE_ORPHANED:
   847             break;
   874             break;
   848     }
   875     }
   849 
   876 
   850     off += sprintf(buffer + off, "\nSlaves: %i\n",
   877     off += sprintf(buffer + off, "\nSlaves: %i\n",
   851                    master->slave_count);
   878                    master->slave_count);
       
   879     off += sprintf(buffer + off, "\nDevice:\n");
       
   880     off += sprintf(buffer + off, "  Frames sent:     %u\n",
       
   881 		   master->device->tx_count);
       
   882     off += sprintf(buffer + off, "  Frames received: %u\n",
       
   883 		   master->device->rx_count);
       
   884     frames_lost = master->device->tx_count - master->device->rx_count;
       
   885     if (frames_lost) frames_lost--;
       
   886     off += sprintf(buffer + off, "  Frames lost:     %u\n", frames_lost);
   852 
   887 
   853     off += sprintf(buffer + off, "\nTiming (min/avg/max) [us]:\n");
   888     off += sprintf(buffer + off, "\nTiming (min/avg/max) [us]:\n");
   854 
   889 
   855     sum = 0;
   890     sum = 0;
   856     min = 0xFFFFFFFF;
   891     min = 0xFFFFFFFF;
   987     unsigned int coupled, found;
  1022     unsigned int coupled, found;
   988 
  1023 
   989     if (master->eoe_running || master->eoe_checked) return;
  1024     if (master->eoe_running || master->eoe_checked) return;
   990 
  1025 
   991     master->eoe_checked = 1;
  1026     master->eoe_checked = 1;
   992 
       
   993     // if the locking callbacks are not set in operation mode,
       
   994     // the EoE timer my not be started.
       
   995     if (master->mode == EC_MASTER_MODE_OPERATION
       
   996         && (!master->request_cb || !master->release_cb)) {
       
   997         EC_INFO("No EoE processing because of missing locking callbacks.\n");
       
   998         return;
       
   999     }
       
  1000 
  1027 
  1001     // decouple all EoE handlers
  1028     // decouple all EoE handlers
  1002     list_for_each_entry(eoe, &master->eoe_handlers, list)
  1029     list_for_each_entry(eoe, &master->eoe_handlers, list)
  1003         eoe->slave = NULL;
  1030         eoe->slave = NULL;
  1004 
  1031 
  1090     list_for_each_entry(eoe, &master->eoe_handlers, list) {
  1117     list_for_each_entry(eoe, &master->eoe_handlers, list) {
  1091         if (ec_eoe_active(eoe)) active++;
  1118         if (ec_eoe_active(eoe)) active++;
  1092     }
  1119     }
  1093     if (!active) goto queue_timer;
  1120     if (!active) goto queue_timer;
  1094 
  1121 
  1095     // aquire master lock...
  1122     // receive datagrams
  1096     if (master->mode == EC_MASTER_MODE_OPERATION) {
  1123     if (master->request_cb(master->cb_data)) goto queue_timer;
  1097         // request_cb must return 0, if the lock has been aquired!
       
  1098         if (master->request_cb(master->cb_data))
       
  1099             goto queue_timer;
       
  1100     }
       
  1101     else if (master->mode == EC_MASTER_MODE_IDLE) {
       
  1102         spin_lock(&master->internal_lock);
       
  1103     }
       
  1104     else
       
  1105         goto queue_timer;
       
  1106 
       
  1107     // actual EoE processing
       
  1108     cycles_start = get_cycles();
  1124     cycles_start = get_cycles();
  1109     ecrt_master_receive(master);
  1125     ecrt_master_receive(master);
  1110 
  1126     master->release_cb(master->cb_data);
       
  1127 
       
  1128     // actual EoE processing
  1111     list_for_each_entry(eoe, &master->eoe_handlers, list) {
  1129     list_for_each_entry(eoe, &master->eoe_handlers, list) {
  1112         ec_eoe_run(eoe);
  1130         ec_eoe_run(eoe);
  1113     }
  1131     }
  1114 
  1132 
       
  1133     // send datagrams
       
  1134     if (master->request_cb(master->cb_data)) goto queue_timer;
  1115     ecrt_master_send(master);
  1135     ecrt_master_send(master);
  1116     cycles_end = get_cycles();
  1136     cycles_end = get_cycles();
  1117 
  1137     master->release_cb(master->cb_data);
  1118     // release lock...
       
  1119     if (master->mode == EC_MASTER_MODE_OPERATION) {
       
  1120         master->release_cb(master->cb_data);
       
  1121     }
       
  1122     else if (master->mode == EC_MASTER_MODE_IDLE) {
       
  1123         spin_unlock(&master->internal_lock);
       
  1124     }
       
  1125 
  1138 
  1126     master->eoe_cycle_times[master->eoe_cycle_time_pos]
  1139     master->eoe_cycle_times[master->eoe_cycle_time_pos]
  1127         = (u32) (cycles_end - cycles_start) * 1000 / cpu_khz;
  1140         = (u32) (cycles_end - cycles_start) * 1000 / cpu_khz;
  1128     master->eoe_cycle_time_pos++;
  1141     master->eoe_cycle_time_pos++;
  1129     master->eoe_cycle_time_pos %= HZ;
  1142     master->eoe_cycle_time_pos %= HZ;
  1247   error:
  1260   error:
  1248     ec_datagram_clear(&datagram);
  1261     ec_datagram_clear(&datagram);
  1249     return -1;
  1262     return -1;
  1250 }
  1263 }
  1251 
  1264 
       
  1265 /*****************************************************************************/
       
  1266 
       
  1267 /**
       
  1268    Prepares synchronous IO.
       
  1269    Queues all domain datagrams and sends them. Then waits a certain time, so
       
  1270    that ecrt_master_receive() can be called securely.
       
  1271 */
       
  1272 
       
  1273 void ec_master_prepare(ec_master_t *master /**< EtherCAT master */)
       
  1274 {
       
  1275     ec_domain_t *domain;
       
  1276     cycles_t cycles_start, cycles_end, cycles_timeout;
       
  1277 
       
  1278     // queue datagrams of all domains
       
  1279     list_for_each_entry(domain, &master->domains, list)
       
  1280         ecrt_domain_queue(domain);
       
  1281 
       
  1282     ecrt_master_send(master);
       
  1283 
       
  1284     cycles_start = get_cycles();
       
  1285     cycles_timeout = (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000);
       
  1286 
       
  1287     // active waiting
       
  1288     while (1) {
       
  1289         udelay(100);
       
  1290         cycles_end = get_cycles();
       
  1291         if (cycles_end - cycles_start >= cycles_timeout) break;
       
  1292     }
       
  1293 }
       
  1294 
  1252 /******************************************************************************
  1295 /******************************************************************************
  1253  *  Realtime interface
  1296  *  Realtime interface
  1254  *****************************************************************************/
  1297  *****************************************************************************/
  1255 
  1298 
  1256 /**
  1299 /**
  1298 
  1341 
  1299 int ecrt_master_activate(ec_master_t *master /**< EtherCAT master */)
  1342 int ecrt_master_activate(ec_master_t *master /**< EtherCAT master */)
  1300 {
  1343 {
  1301     uint32_t domain_offset;
  1344     uint32_t domain_offset;
  1302     ec_domain_t *domain;
  1345     ec_domain_t *domain;
  1303     ec_fsm_t *fsm = &master->fsm;
  1346     ec_fsm_slave_t fsm_slave;
  1304     ec_slave_t *slave;
  1347     ec_slave_t *slave;
  1305 
  1348 
  1306     // allocate all domains
  1349     // allocate all domains
  1307     domain_offset = 0;
  1350     domain_offset = 0;
  1308     list_for_each_entry(domain, &master->domains, list) {
  1351     list_for_each_entry(domain, &master->domains, list) {
  1311             return -1;
  1354             return -1;
  1312         }
  1355         }
  1313         domain_offset += domain->data_size;
  1356         domain_offset += domain->data_size;
  1314     }
  1357     }
  1315 
  1358 
       
  1359     ec_fsm_slave_init(&fsm_slave, &master->fsm_datagram);
       
  1360 
  1316     // configure all slaves
  1361     // configure all slaves
  1317     list_for_each_entry(slave, &master->slaves, list) {
  1362     list_for_each_entry(slave, &master->slaves, list) {
  1318         fsm->slave = slave;
  1363         ec_fsm_slave_start_conf(&fsm_slave, slave);
  1319         fsm->slave_state = ec_fsm_slaveconf_state_start;
  1364         while (ec_fsm_slave_exec(&fsm_slave)) { 
  1320 
       
  1321         do {
       
  1322             fsm->slave_state(fsm);
       
  1323             ec_master_sync_io(master);
  1365             ec_master_sync_io(master);
  1324         }
  1366         }
  1325         while (fsm->slave_state != ec_fsm_slave_state_end
  1367 
  1326                && fsm->slave_state != ec_fsm_slave_state_error);
  1368         if (!ec_fsm_slave_success(&fsm_slave)) {
  1327 
  1369             ec_fsm_slave_clear(&fsm_slave);
  1328         if (fsm->slave_state == ec_fsm_slave_state_error) {
       
  1329             EC_ERR("Failed to configure slave %i!\n", slave->ring_position);
  1370             EC_ERR("Failed to configure slave %i!\n", slave->ring_position);
  1330             return -1;
  1371             return -1;
  1331         }
  1372         }
  1332     }
  1373     }
  1333 
  1374 
       
  1375     ec_fsm_slave_clear(&fsm_slave);
       
  1376     ec_master_prepare(master); // prepare asynchronous IO
       
  1377 
  1334     return 0;
  1378     return 0;
  1335 }
  1379 }
  1336 
  1380 
  1337 /*****************************************************************************/
  1381 /*****************************************************************************/
  1338 
  1382 
  1339 /**
  1383 /**
  1340    Resets all slaves to INIT state.
       
  1341    This method is deprecated and will disappear in the next version
       
  1342    of the realtime interface. The functionality is moved to
       
  1343    ecrt_master_release().
       
  1344    \ingroup RealtimeInterface
       
  1345 */
       
  1346 
       
  1347 void ecrt_master_deactivate(ec_master_t *master /**< EtherCAT master */)
       
  1348 {
       
  1349 }
       
  1350 
       
  1351 /*****************************************************************************/
       
  1352 
       
  1353 /**
       
  1354    Sends queued datagrams and waits for their reception.
  1384    Sends queued datagrams and waits for their reception.
  1355 */
  1385 */
  1356 
  1386 
  1357 void ec_master_sync_io(ec_master_t *master /**< EtherCAT master */)
  1387 void ec_master_sync_io(ec_master_t *master /**< EtherCAT master */)
  1358 {
  1388 {
  1359     ec_datagram_t *datagram;
  1389     ec_datagram_t *datagram;
  1360     unsigned int datagrams_waiting;
  1390     unsigned int datagrams_sent;
  1361 
  1391 
  1362     // send datagrams
  1392     // send all datagrams
  1363     ecrt_master_send(master);
  1393     ecrt_master_send(master);
  1364 
  1394 
  1365     while (1) { // active waiting
  1395     while (1) { // active waiting
       
  1396         schedule(); // schedule other processes while waiting.
  1366         ecrt_master_receive(master); // receive and dequeue datagrams
  1397         ecrt_master_receive(master); // receive and dequeue datagrams
  1367 
  1398 
  1368         // count number of datagrams still waiting for response
  1399         // count number of datagrams still waiting for response
  1369         datagrams_waiting = 0;
  1400         datagrams_sent = 0;
  1370         list_for_each_entry(datagram, &master->datagram_queue, queue) {
  1401         list_for_each_entry(datagram, &master->datagram_queue, queue) {
  1371             datagrams_waiting++;
  1402             // there may be another process that queued commands
  1372         }
  1403             // in the meantime.
  1373 
  1404             if (datagram->state == EC_DATAGRAM_QUEUED) continue;
  1374         // if there are no more datagrams waiting, abort loop.
  1405             datagrams_sent++;
  1375         if (!datagrams_waiting) break;
  1406         }
       
  1407 
       
  1408         // abort loop if there are no more datagrams marked as sent.
       
  1409         if (!datagrams_sent) break;
  1376     }
  1410     }
  1377 }
  1411 }
  1378 
  1412 
  1379 /*****************************************************************************/
  1413 /*****************************************************************************/
  1380 
  1414 
  1393             datagram->state = EC_DATAGRAM_ERROR;
  1427             datagram->state = EC_DATAGRAM_ERROR;
  1394             list_del_init(&datagram->queue);
  1428             list_del_init(&datagram->queue);
  1395         }
  1429         }
  1396 
  1430 
  1397         // query link state
  1431         // query link state
  1398         ec_device_call_isr(master->device);
  1432         ec_device_poll(master->device);
  1399         return;
  1433         return;
  1400     }
  1434     }
  1401 
  1435 
  1402     // send frames
  1436     // send frames
  1403     ec_master_send_datagrams(master);
  1437     ec_master_send_datagrams(master);
  1414 {
  1448 {
  1415     ec_datagram_t *datagram, *next;
  1449     ec_datagram_t *datagram, *next;
  1416     cycles_t cycles_timeout;
  1450     cycles_t cycles_timeout;
  1417 
  1451 
  1418     // receive datagrams
  1452     // receive datagrams
  1419     ec_device_call_isr(master->device);
  1453     ec_device_poll(master->device);
  1420 
  1454 
  1421     cycles_timeout = (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000);
  1455     cycles_timeout = (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000);
  1422 
  1456 
  1423     // dequeue all datagrams that timed out
  1457     // dequeue all datagrams that timed out
  1424     list_for_each_entry_safe(datagram, next, &master->datagram_queue, queue) {
  1458     list_for_each_entry_safe(datagram, next, &master->datagram_queue, queue) {
  1425         switch (datagram->state) {
  1459         if (datagram->state != EC_DATAGRAM_SENT) continue;
  1426             case EC_DATAGRAM_QUEUED:
  1460 
  1427                 if (master->device->cycles_isr
  1461         if (master->device->cycles_poll - datagram->cycles_sent
  1428                     - datagram->cycles_queued > cycles_timeout) {
  1462             > cycles_timeout) {
  1429                     list_del_init(&datagram->queue);
  1463             list_del_init(&datagram->queue);
  1430                     datagram->state = EC_DATAGRAM_TIMED_OUT;
  1464             datagram->state = EC_DATAGRAM_TIMED_OUT;
  1431                     master->stats.timeouts++;
  1465             master->stats.timeouts++;
  1432                     ec_master_output_stats(master);
  1466             ec_master_output_stats(master);
  1433                 }
  1467         }
  1434                 break;
       
  1435             case EC_DATAGRAM_SENT:
       
  1436                 if (master->device->cycles_isr
       
  1437                     - datagram->cycles_sent > cycles_timeout) {
       
  1438                     list_del_init(&datagram->queue);
       
  1439                     datagram->state = EC_DATAGRAM_TIMED_OUT;
       
  1440                     master->stats.timeouts++;
       
  1441                     ec_master_output_stats(master);
       
  1442                 }
       
  1443                 break;
       
  1444             default:
       
  1445                 break;
       
  1446         }
       
  1447     }
       
  1448 }
       
  1449 
       
  1450 /*****************************************************************************/
       
  1451 
       
  1452 /**
       
  1453    Prepares synchronous IO.
       
  1454    Queues all domain datagrams and sends them. Then waits a certain time, so
       
  1455    that ecrt_master_receive() can be called securely.
       
  1456    \ingroup RealtimeInterface
       
  1457 */
       
  1458 
       
  1459 void ecrt_master_prepare(ec_master_t *master /**< EtherCAT master */)
       
  1460 {
       
  1461     ec_domain_t *domain;
       
  1462     cycles_t cycles_start, cycles_end, cycles_timeout;
       
  1463 
       
  1464     // queue datagrams of all domains
       
  1465     list_for_each_entry(domain, &master->domains, list)
       
  1466         ec_domain_queue_datagrams(domain);
       
  1467 
       
  1468     ecrt_master_send(master);
       
  1469 
       
  1470     cycles_start = get_cycles();
       
  1471     cycles_timeout = (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000);
       
  1472 
       
  1473     // active waiting
       
  1474     while (1) {
       
  1475         udelay(100);
       
  1476         cycles_end = get_cycles();
       
  1477         if (cycles_end - cycles_start >= cycles_timeout) break;
       
  1478     }
  1468     }
  1479 }
  1469 }
  1480 
  1470 
  1481 /*****************************************************************************/
  1471 /*****************************************************************************/
  1482 
  1472 
  1489 {
  1479 {
  1490     // output statistics
  1480     // output statistics
  1491     ec_master_output_stats(master);
  1481     ec_master_output_stats(master);
  1492 
  1482 
  1493     // execute master state machine in a loop
  1483     // execute master state machine in a loop
  1494     ec_fsm_exec(&master->fsm);
  1484     ec_fsm_master_exec(&master->fsm);
  1495 }
  1485 }
  1496 
  1486 
  1497 /*****************************************************************************/
  1487 /*****************************************************************************/
  1498 
  1488 
  1499 /**
  1489 /**
  1513                                   const char *address /**< address string */
  1503                                   const char *address /**< address string */
  1514                                   )
  1504                                   )
  1515 {
  1505 {
  1516     unsigned long first, second;
  1506     unsigned long first, second;
  1517     char *remainder, *remainder2;
  1507     char *remainder, *remainder2;
       
  1508     const char *original;
  1518     unsigned int alias_requested, alias_found;
  1509     unsigned int alias_requested, alias_found;
  1519     ec_slave_t *alias_slave = NULL, *slave;
  1510     ec_slave_t *alias_slave = NULL, *slave;
       
  1511 
       
  1512     original = address;
  1520 
  1513 
  1521     if (!address || address[0] == 0) return NULL;
  1514     if (!address || address[0] == 0) return NULL;
  1522 
  1515 
  1523     alias_requested = 0;
  1516     alias_requested = 0;
  1524     if (address[0] == '#') {
  1517     if (address[0] == '#') {
  1526         address++;
  1519         address++;
  1527     }
  1520     }
  1528 
  1521 
  1529     first = simple_strtoul(address, &remainder, 0);
  1522     first = simple_strtoul(address, &remainder, 0);
  1530     if (remainder == address) {
  1523     if (remainder == address) {
  1531         EC_ERR("Slave address \"%s\" - First number empty!\n", address);
  1524         EC_ERR("Slave address \"%s\" - First number empty!\n", original);
  1532         return NULL;
  1525         return NULL;
  1533     }
  1526     }
  1534 
  1527 
  1535     if (alias_requested) {
  1528     if (alias_requested) {
  1536         alias_found = 0;
  1529         alias_found = 0;
  1539                 alias_found = 1;
  1532                 alias_found = 1;
  1540                 break;
  1533                 break;
  1541             }
  1534             }
  1542         }
  1535         }
  1543         if (!alias_found) {
  1536         if (!alias_found) {
  1544             EC_ERR("Slave address \"%s\" - Alias not found!\n", address);
  1537             EC_ERR("Slave address \"%s\" - Alias not found!\n", original);
  1545             return NULL;
  1538             return NULL;
  1546         }
  1539         }
  1547     }
  1540     }
  1548 
  1541 
  1549     if (!remainder[0]) { // absolute position
  1542     if (!remainder[0]) { // absolute position
  1553         else {
  1546         else {
  1554             list_for_each_entry(slave, &master->slaves, list) {
  1547             list_for_each_entry(slave, &master->slaves, list) {
  1555                 if (slave->ring_position == first) return slave;
  1548                 if (slave->ring_position == first) return slave;
  1556             }
  1549             }
  1557             EC_ERR("Slave address \"%s\" - Absolute position invalid!\n",
  1550             EC_ERR("Slave address \"%s\" - Absolute position invalid!\n",
  1558                    address);
  1551                    original);
  1559         }
  1552         }
  1560     }
  1553     }
  1561     else if (remainder[0] == ':') { // field position
  1554     else if (remainder[0] == ':') { // field position
  1562         remainder++;
  1555         remainder++;
  1563         second = simple_strtoul(remainder, &remainder2, 0);
  1556         second = simple_strtoul(remainder, &remainder2, 0);
  1564 
  1557 
  1565         if (remainder2 == remainder) {
  1558         if (remainder2 == remainder) {
  1566             EC_ERR("Slave address \"%s\" - Second number empty!\n", address);
  1559             EC_ERR("Slave address \"%s\" - Second number empty!\n", original);
  1567             return NULL;
  1560             return NULL;
  1568         }
  1561         }
  1569 
  1562 
  1570         if (remainder2[0]) {
  1563         if (remainder2[0]) {
  1571             EC_ERR("Slave address \"%s\" - Invalid trailer!\n", address);
  1564             EC_ERR("Slave address \"%s\" - Invalid trailer!\n", original);
  1572             return NULL;
  1565             return NULL;
  1573         }
  1566         }
  1574 
  1567 
  1575         if (alias_requested) {
  1568         if (alias_requested) {
  1576             if (!ec_slave_is_coupler(alias_slave)) {
  1569             if (!ec_slave_is_coupler(alias_slave)) {
  1577                 EC_ERR("Slave address \"%s\": Alias slave must be bus coupler"
  1570                 EC_ERR("Slave address \"%s\": Alias slave must be bus coupler"
  1578                        " in colon mode.\n", address);
  1571                        " in colon mode.\n", original);
  1579                 return NULL;
  1572                 return NULL;
  1580             }
  1573             }
  1581             list_for_each_entry(slave, &master->slaves, list) {
  1574             list_for_each_entry(slave, &master->slaves, list) {
  1582                 if (slave->coupler_index == alias_slave->coupler_index
  1575                 if (slave->coupler_index == alias_slave->coupler_index
  1583                     && slave->coupler_subindex == second)
  1576                     && slave->coupler_subindex == second)
  1584                     return slave;
  1577                     return slave;
  1585             }
  1578             }
  1586             EC_ERR("Slave address \"%s\" - Bus coupler %i has no %lu. slave"
  1579             EC_ERR("Slave address \"%s\" - Bus coupler %i has no %lu. slave"
  1587                    " following!\n", address, alias_slave->ring_position,
  1580                    " following!\n", original, alias_slave->ring_position,
  1588                    second);
  1581                    second);
  1589             return NULL;
  1582             return NULL;
  1590         }
  1583         }
  1591         else {
  1584         else {
  1592             list_for_each_entry(slave, &master->slaves, list) {
  1585             list_for_each_entry(slave, &master->slaves, list) {
  1594                     && slave->coupler_subindex == second) return slave;
  1587                     && slave->coupler_subindex == second) return slave;
  1595             }
  1588             }
  1596         }
  1589         }
  1597     }
  1590     }
  1598     else
  1591     else
  1599         EC_ERR("Slave address \"%s\" - Invalid format!\n", address);
  1592         EC_ERR("Slave address \"%s\" - Invalid format!\n", original);
  1600 
  1593 
  1601     return NULL;
  1594     return NULL;
  1602 }
  1595 }
  1603 
  1596 
  1604 /*****************************************************************************/
  1597 /*****************************************************************************/
  1626 
  1619 
  1627 /** \cond */
  1620 /** \cond */
  1628 
  1621 
  1629 EXPORT_SYMBOL(ecrt_master_create_domain);
  1622 EXPORT_SYMBOL(ecrt_master_create_domain);
  1630 EXPORT_SYMBOL(ecrt_master_activate);
  1623 EXPORT_SYMBOL(ecrt_master_activate);
  1631 EXPORT_SYMBOL(ecrt_master_deactivate);
       
  1632 EXPORT_SYMBOL(ecrt_master_prepare);
       
  1633 EXPORT_SYMBOL(ecrt_master_send);
  1624 EXPORT_SYMBOL(ecrt_master_send);
  1634 EXPORT_SYMBOL(ecrt_master_receive);
  1625 EXPORT_SYMBOL(ecrt_master_receive);
  1635 EXPORT_SYMBOL(ecrt_master_run);
  1626 EXPORT_SYMBOL(ecrt_master_run);
  1636 EXPORT_SYMBOL(ecrt_master_callbacks);
  1627 EXPORT_SYMBOL(ecrt_master_callbacks);
  1637 EXPORT_SYMBOL(ecrt_master_get_slave);
  1628 EXPORT_SYMBOL(ecrt_master_get_slave);