IgH EtherCAT Master  1.6.0-rc1
master.c
Go to the documentation of this file.
1 /******************************************************************************
2  *
3  * Copyright (C) 2006-2020 Florian Pose, Ingenieurgemeinschaft IgH
4  *
5  * This file is part of the IgH EtherCAT Master.
6  *
7  * The IgH EtherCAT Master is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License version 2, as
9  * published by the Free Software Foundation.
10  *
11  * The IgH EtherCAT Master is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
14  * Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with the IgH EtherCAT Master; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19  *
20  * ---
21  *
22  * The license mentioned above concerns the source code only. Using the
23  * EtherCAT technology and brand is only permitted in compliance with the
24  * industrial property and similar rights of Beckhoff Automation GmbH.
25  *
26  * vim: expandtab
27  *
28  *****************************************************************************/
29 
35 /*****************************************************************************/
36 
37 #include <linux/module.h>
38 #include <linux/kernel.h>
39 #include <linux/string.h>
40 #include <linux/slab.h>
41 #include <linux/delay.h>
42 #include <linux/device.h>
43 #include <linux/version.h>
44 #include <linux/hrtimer.h>
45 
46 #include "globals.h"
47 #include "slave.h"
48 #include "slave_config.h"
49 #include "device.h"
50 #include "datagram.h"
51 #include "mailbox.h"
52 
53 #ifdef EC_EOE
54 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
55 #include <uapi/linux/sched/types.h> // struct sched_param
56 #include <linux/sched/types.h> // sched_setscheduler
57 #endif
58 #include "ethernet.h"
59 #endif
60 
61 #include "master.h"
62 
63 /*****************************************************************************/
64 
67 #define DEBUG_INJECT 0
68 
71 #define FORCE_OUTPUT_CORRUPTED 0
72 
74 #define EC_SDO_INJECTION_TIMEOUT 10000
75 
76 #ifdef EC_HAVE_CYCLES
77 
80 static cycles_t timeout_cycles;
81 
84 static cycles_t ext_injection_timeout_cycles;
85 
86 #else
87 
90 static unsigned long timeout_jiffies;
91 
94 static unsigned long ext_injection_timeout_jiffies;
95 
96 #endif
97 
100 const unsigned int rate_intervals[] = {
101  1, 10, 60
102 };
103 
104 /*****************************************************************************/
105 
108 static int ec_master_idle_thread(void *);
109 static int ec_master_operation_thread(void *);
110 #ifdef EC_EOE
111 static int ec_master_eoe_thread(void *);
112 #endif
116 
117 /*****************************************************************************/
118 
122 {
123 #ifdef EC_HAVE_CYCLES
124  timeout_cycles = (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000);
125  ext_injection_timeout_cycles =
126  (cycles_t) EC_SDO_INJECTION_TIMEOUT /* us */ * (cpu_khz / 1000);
127 #else
128  // one jiffy may always elapse between time measurement
129  timeout_jiffies = max(EC_IO_TIMEOUT * HZ / 1000000, 1);
131  max(EC_SDO_INJECTION_TIMEOUT * HZ / 1000000, 1);
132 #endif
133 }
134 
135 /*****************************************************************************/
136 
143  unsigned int index,
144  const uint8_t *main_mac,
145  const uint8_t *backup_mac,
146  dev_t device_number,
147  struct class *class,
148  unsigned int debug_level
149  )
150 {
151  int ret;
152  unsigned int dev_idx, i;
153 
154  master->index = index;
155  master->reserved = 0;
156 
157  ec_lock_init(&master->master_sem);
158 
159  for (dev_idx = EC_DEVICE_MAIN; dev_idx < EC_MAX_NUM_DEVICES; dev_idx++) {
160  master->macs[dev_idx] = NULL;
161  }
162 
163  master->macs[EC_DEVICE_MAIN] = main_mac;
164 
165 #if EC_MAX_NUM_DEVICES > 1
166  master->macs[EC_DEVICE_BACKUP] = backup_mac;
167  master->num_devices = 1 + !ec_mac_is_zero(backup_mac);
168 #else
169  if (!ec_mac_is_zero(backup_mac)) {
170  EC_MASTER_WARN(master, "Ignoring backup MAC address!");
171  }
172 #endif
173 
175 
176  ec_lock_init(&master->device_sem);
177 
178  master->phase = EC_ORPHANED;
179  master->active = 0;
180  master->config_changed = 0;
181  master->injection_seq_fsm = 0;
182  master->injection_seq_rt = 0;
183 
184  master->slaves = NULL;
185  master->slave_count = 0;
186 
187  INIT_LIST_HEAD(&master->configs);
188  INIT_LIST_HEAD(&master->domains);
189  ec_lock_init(&master->domains_lock);
190 
191  master->app_time = 0ULL;
192  master->dc_ref_time = 0ULL;
193  master->dc_offset_valid = 0;
194 
195  master->scan_busy = 0;
196  master->allow_scan = 1;
197  ec_lock_init(&master->scan_sem);
198  init_waitqueue_head(&master->scan_queue);
199 
200  master->config_busy = 0;
201  ec_lock_init(&master->config_sem);
202  init_waitqueue_head(&master->config_queue);
203 
204  INIT_LIST_HEAD(&master->datagram_queue);
205  master->datagram_index = 0;
206 
207  INIT_LIST_HEAD(&master->ext_datagram_queue);
208  ec_lock_init(&master->ext_queue_sem);
209 
210  master->ext_ring_idx_rt = 0;
211  master->ext_ring_idx_fsm = 0;
212 
213  // init external datagram ring
214  for (i = 0; i < EC_EXT_RING_SIZE; i++) {
215  ec_datagram_t *datagram = &master->ext_datagram_ring[i];
216  ec_datagram_init(datagram);
217  snprintf(datagram->name, EC_DATAGRAM_NAME_SIZE, "ext-%u", i);
218  }
219 
220  // send interval in IDLE phase
221  ec_master_set_send_interval(master, 1000000 / HZ);
222 
223  master->fsm_slave = NULL;
224  INIT_LIST_HEAD(&master->fsm_exec_list);
225  master->fsm_exec_count = 0U;
226 
227  master->debug_level = debug_level;
228  master->stats.timeouts = 0;
229  master->stats.corrupted = 0;
230  master->stats.unmatched = 0;
231  master->stats.output_jiffies = 0;
232 
233  master->thread = NULL;
234 
235 #ifdef EC_EOE
236  master->eoe_thread = NULL;
237  INIT_LIST_HEAD(&master->eoe_handlers);
238 #endif
239 
240  ec_lock_init(&master->io_sem);
241  master->send_cb = NULL;
242  master->receive_cb = NULL;
243  master->cb_data = NULL;
244  master->app_send_cb = NULL;
245  master->app_receive_cb = NULL;
246  master->app_cb_data = NULL;
247 
248  INIT_LIST_HEAD(&master->sii_requests);
249  INIT_LIST_HEAD(&master->emerg_reg_requests);
250 
251  init_waitqueue_head(&master->request_queue);
252 
253  // init devices
254  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
255  dev_idx++) {
256  ret = ec_device_init(&master->devices[dev_idx], master);
257  if (ret < 0) {
258  goto out_clear_devices;
259  }
260  }
261 
262  // init state machine datagram
263  ec_datagram_init(&master->fsm_datagram);
264  snprintf(master->fsm_datagram.name, EC_DATAGRAM_NAME_SIZE, "master-fsm");
266  if (ret < 0) {
268  EC_MASTER_ERR(master, "Failed to allocate FSM datagram.\n");
269  goto out_clear_devices;
270  }
271 
272  // create state machine object
273  ec_fsm_master_init(&master->fsm, master, &master->fsm_datagram);
274 
275  // alloc external datagram ring
276  for (i = 0; i < EC_EXT_RING_SIZE; i++) {
277  ec_datagram_t *datagram = &master->ext_datagram_ring[i];
278  ret = ec_datagram_prealloc(datagram, EC_MAX_DATA_SIZE);
279  if (ret) {
280  EC_MASTER_ERR(master, "Failed to allocate external"
281  " datagram %u.\n", i);
282  goto out_clear_ext_datagrams;
283  }
284  }
285 
286  // init reference sync datagram
288  snprintf(master->ref_sync_datagram.name, EC_DATAGRAM_NAME_SIZE,
289  "refsync");
290  ret = ec_datagram_prealloc(&master->ref_sync_datagram, 4);
291  if (ret < 0) {
293  EC_MASTER_ERR(master, "Failed to allocate reference"
294  " synchronisation datagram.\n");
295  goto out_clear_ext_datagrams;
296  }
297 
298  // init sync datagram
300  snprintf(master->sync_datagram.name, EC_DATAGRAM_NAME_SIZE, "sync");
301  ret = ec_datagram_prealloc(&master->sync_datagram, 4);
302  if (ret < 0) {
304  EC_MASTER_ERR(master, "Failed to allocate"
305  " synchronisation datagram.\n");
306  goto out_clear_ref_sync;
307  }
308 
309  // init sync64 datagram
311  snprintf(master->sync64_datagram.name, EC_DATAGRAM_NAME_SIZE, "sync64");
312  ret = ec_datagram_prealloc(&master->sync64_datagram, 8);
313  if (ret < 0) {
315  EC_MASTER_ERR(master, "Failed to allocate 64bit ref slave"
316  " system clock datagram.\n");
317  goto out_clear_sync;
318  }
319 
320  // init sync monitor datagram
322  snprintf(master->sync_mon_datagram.name, EC_DATAGRAM_NAME_SIZE,
323  "syncmon");
324  ret = ec_datagram_brd(&master->sync_mon_datagram, 0x092c, 4);
325  if (ret < 0) {
327  EC_MASTER_ERR(master, "Failed to allocate sync"
328  " monitoring datagram.\n");
329  goto out_clear_sync64;
330  }
331 
332  master->dc_ref_config = NULL;
333  master->dc_ref_clock = NULL;
334 
335  // init character device
336  ret = ec_cdev_init(&master->cdev, master, device_number);
337  if (ret)
338  goto out_clear_sync_mon;
339 
340 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 27)
341  master->class_device = device_create(class, NULL,
342  MKDEV(MAJOR(device_number), master->index), NULL,
343  "EtherCAT%u", master->index);
344 #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26)
345  master->class_device = device_create(class, NULL,
346  MKDEV(MAJOR(device_number), master->index),
347  "EtherCAT%u", master->index);
348 #elif LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 15)
349  master->class_device = class_device_create(class, NULL,
350  MKDEV(MAJOR(device_number), master->index), NULL,
351  "EtherCAT%u", master->index);
352 #else
353  master->class_device = class_device_create(class,
354  MKDEV(MAJOR(device_number), master->index), NULL,
355  "EtherCAT%u", master->index);
356 #endif
357  if (IS_ERR(master->class_device)) {
358  EC_MASTER_ERR(master, "Failed to create class device!\n");
359  ret = PTR_ERR(master->class_device);
360  goto out_clear_cdev;
361  }
362 
363 #ifdef EC_RTDM
364  // init RTDM device
365  ret = ec_rtdm_dev_init(&master->rtdm_dev, master);
366  if (ret) {
367  goto out_unregister_class_device;
368  }
369 #endif
370 
371  return 0;
372 
373 #ifdef EC_RTDM
374 out_unregister_class_device:
375 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26)
376  device_unregister(master->class_device);
377 #else
378  class_device_unregister(master->class_device);
379 #endif
380 #endif
381 out_clear_cdev:
382  ec_cdev_clear(&master->cdev);
383 out_clear_sync_mon:
385 out_clear_sync64:
387 out_clear_sync:
389 out_clear_ref_sync:
391 out_clear_ext_datagrams:
392  for (i = 0; i < EC_EXT_RING_SIZE; i++) {
394  }
395  ec_fsm_master_clear(&master->fsm);
397 out_clear_devices:
398  for (; dev_idx > 0; dev_idx--) {
399  ec_device_clear(&master->devices[dev_idx - 1]);
400  }
401  return ret;
402 }
403 
404 /*****************************************************************************/
405 
409  ec_master_t *master
410  )
411 {
412  unsigned int dev_idx, i;
413 
414 #ifdef EC_RTDM
415  ec_rtdm_dev_clear(&master->rtdm_dev);
416 #endif
417 
418 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2, 6, 26)
419  device_unregister(master->class_device);
420 #else
421  class_device_unregister(master->class_device);
422 #endif
423 
424  ec_cdev_clear(&master->cdev);
425 
426 #ifdef EC_EOE
428 #endif
429  ec_master_clear_domains(master);
431  ec_master_clear_slaves(master);
432 
437 
438  for (i = 0; i < EC_EXT_RING_SIZE; i++) {
440  }
441 
442  ec_fsm_master_clear(&master->fsm);
444 
445  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
446  dev_idx++) {
447  ec_device_clear(&master->devices[dev_idx]);
448  }
449 }
450 
451 /*****************************************************************************/
452 
453 #ifdef EC_EOE
454 
457  ec_master_t *master
458  )
459 {
460  ec_eoe_t *eoe, *next;
461 
462  list_for_each_entry_safe(eoe, next, &master->eoe_handlers, list) {
463  list_del(&eoe->list);
464  ec_eoe_clear(eoe);
465  kfree(eoe);
466  }
467 }
468 #endif
469 
470 /*****************************************************************************/
471 
475 {
476  ec_slave_config_t *sc, *next;
477 
478  master->dc_ref_config = NULL;
479  master->fsm.sdo_request = NULL; // mark sdo_request as invalid
480 
481  list_for_each_entry_safe(sc, next, &master->configs, list) {
482  list_del(&sc->list);
484  kfree(sc);
485  }
486 }
487 
488 /*****************************************************************************/
489 
493 {
494  ec_slave_t *slave;
495 
496  master->dc_ref_clock = NULL;
497 
498  // External requests are obsolete, so we wake pending waiters and remove
499  // them from the list.
500 
501  while (!list_empty(&master->sii_requests)) {
502  ec_sii_write_request_t *request =
503  list_entry(master->sii_requests.next,
504  ec_sii_write_request_t, list);
505  list_del_init(&request->list); // dequeue
506  EC_MASTER_WARN(master, "Discarding SII request, slave %u about"
507  " to be deleted.\n", request->slave->ring_position);
508  request->state = EC_INT_REQUEST_FAILURE;
509  wake_up_all(&master->request_queue);
510  }
511 
512  master->fsm_slave = NULL;
513  INIT_LIST_HEAD(&master->fsm_exec_list);
514  master->fsm_exec_count = 0;
515 
516  for (slave = master->slaves;
517  slave < master->slaves + master->slave_count;
518  slave++) {
519  ec_slave_clear(slave);
520  }
521 
522  if (master->slaves) {
523  kfree(master->slaves);
524  master->slaves = NULL;
525  }
526 
527  master->slave_count = 0;
528 }
529 
530 /*****************************************************************************/
531 
535 {
536  ec_domain_t *domain, *next;
537 
538  ec_lock_down(&master->domains_lock);
539  list_for_each_entry_safe(domain, next, &master->domains, list) {
540  list_del(&domain->list);
541  ec_domain_clear(domain);
542  kfree(domain);
543  }
544  ec_lock_up(&master->domains_lock);
545 }
546 
547 /*****************************************************************************/
548 
552  ec_master_t *master
553  )
554 {
555  ec_lock_down(&master->master_sem);
556  ec_master_clear_domains(master);
558  ec_lock_up(&master->master_sem);
559 }
560 
561 /*****************************************************************************/
562 
566  void *cb_data
567  )
568 {
569  ec_master_t *master = (ec_master_t *) cb_data;
570  ecrt_master_send_ext(master);
571 }
572 
573 /*****************************************************************************/
574 
578  void *cb_data
579  )
580 {
581  ec_master_t *master = (ec_master_t *) cb_data;
582  ecrt_master_receive(master);
583 }
584 
585 /*****************************************************************************/
586 
593  ec_master_t *master,
594  int (*thread_func)(void *),
595  const char *name
596  )
597 {
598  EC_MASTER_INFO(master, "Starting %s thread.\n", name);
599  master->thread = kthread_run(thread_func, master, name);
600  if (IS_ERR(master->thread)) {
601  int err = (int) PTR_ERR(master->thread);
602  EC_MASTER_ERR(master, "Failed to start master thread (error %i)!\n",
603  err);
604  master->thread = NULL;
605  return err;
606  }
607 
608  return 0;
609 }
610 
611 /*****************************************************************************/
612 
616  ec_master_t *master
617  )
618 {
619  unsigned long sleep_jiffies;
620 
621  if (!master->thread) {
622  EC_MASTER_WARN(master, "%s(): Already finished!\n", __func__);
623  return;
624  }
625 
626  EC_MASTER_DBG(master, 1, "Stopping master thread.\n");
627 
628  kthread_stop(master->thread);
629  master->thread = NULL;
630  EC_MASTER_INFO(master, "Master thread exited.\n");
631 
632  if (master->fsm_datagram.state != EC_DATAGRAM_SENT) {
633  return;
634  }
635 
636  // wait for FSM datagram
637  sleep_jiffies = max(HZ / 100, 1); // 10 ms, at least 1 jiffy
638  schedule_timeout(sleep_jiffies);
639 }
640 
641 /*****************************************************************************/
642 
648  ec_master_t *master
649  )
650 {
651  int ret;
652  ec_device_index_t dev_idx;
653 
654  EC_MASTER_DBG(master, 1, "ORPHANED -> IDLE.\n");
655 
658  master->cb_data = master;
659 
660  master->phase = EC_IDLE;
661 
662  // reset number of responding slaves to trigger scanning
663  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
664  dev_idx++) {
665  master->fsm.slaves_responding[dev_idx] = 0;
666  }
667 
669  "EtherCAT-IDLE");
670  if (ret)
671  master->phase = EC_ORPHANED;
672 
673  return ret;
674 }
675 
676 /*****************************************************************************/
677 
681 {
682  EC_MASTER_DBG(master, 1, "IDLE -> ORPHANED.\n");
683 
684  master->phase = EC_ORPHANED;
685 
686 #ifdef EC_EOE
687  ec_master_eoe_stop(master);
688 #endif
689  ec_master_thread_stop(master);
690 
691  ec_lock_down(&master->master_sem);
692  ec_master_clear_slaves(master);
693  ec_lock_up(&master->master_sem);
694 
695  ec_fsm_master_reset(&master->fsm);
696 }
697 
698 /*****************************************************************************/
699 
705  ec_master_t *master
706  )
707 {
708  int ret = 0;
709  ec_slave_t *slave;
710 
711  EC_MASTER_DBG(master, 1, "IDLE -> OPERATION.\n");
712 
713  ec_lock_down(&master->config_sem);
714  if (master->config_busy) {
715  ec_lock_up(&master->config_sem);
716 
717  // wait for slave configuration to complete
718  ret = wait_event_interruptible(master->config_queue,
719  !master->config_busy);
720  if (ret) {
721  EC_MASTER_INFO(master, "Finishing slave configuration"
722  " interrupted by signal.\n");
723  goto out_return;
724  }
725 
726  EC_MASTER_DBG(master, 1, "Waiting for pending slave"
727  " configuration returned.\n");
728  } else {
729  ec_lock_up(&master->config_sem);
730  }
731 
732  ec_lock_down(&master->scan_sem);
733  master->allow_scan = 0; // 'lock' the slave list
734  if (!master->scan_busy) {
735  ec_lock_up(&master->scan_sem);
736  } else {
737  ec_lock_up(&master->scan_sem);
738 
739  // wait for slave scan to complete
740  ret = wait_event_interruptible(master->scan_queue,
741  !master->scan_busy);
742  if (ret) {
743  EC_MASTER_INFO(master, "Waiting for slave scan"
744  " interrupted by signal.\n");
745  goto out_allow;
746  }
747 
748  EC_MASTER_DBG(master, 1, "Waiting for pending"
749  " slave scan returned.\n");
750  }
751 
752  // set states for all slaves
753  for (slave = master->slaves;
754  slave < master->slaves + master->slave_count;
755  slave++) {
757  }
758 
759  master->phase = EC_OPERATION;
760  master->app_send_cb = NULL;
761  master->app_receive_cb = NULL;
762  master->app_cb_data = NULL;
763  return ret;
764 
765 out_allow:
766  master->allow_scan = 1;
767 out_return:
768  return ret;
769 }
770 
771 /*****************************************************************************/
772 
776  ec_master_t *master
777  )
778 {
779  if (master->active) {
780  ecrt_master_deactivate(master); // also clears config
781  } else {
782  ec_master_clear_config(master);
783  }
784 
785  /* Re-allow scanning for IDLE phase. */
786  master->allow_scan = 1;
787 
788  EC_MASTER_DBG(master, 1, "OPERATION -> IDLE.\n");
789 
790  master->phase = EC_IDLE;
791 }
792 
793 /*****************************************************************************/
794 
798  ec_master_t *master
799  )
800 {
801  ec_datagram_t *datagram;
802  size_t queue_size = 0, new_queue_size = 0;
803 #if DEBUG_INJECT
804  unsigned int datagram_count = 0;
805 #endif
806 
807  if (master->ext_ring_idx_rt == master->ext_ring_idx_fsm) {
808  // nothing to inject
809  return;
810  }
811 
812  list_for_each_entry(datagram, &master->datagram_queue, queue) {
813  if (datagram->state == EC_DATAGRAM_QUEUED) {
814  queue_size += datagram->data_size;
815  }
816  }
817 
818 #if DEBUG_INJECT
819  EC_MASTER_DBG(master, 1, "Injecting datagrams, queue_size=%zu\n",
820  queue_size);
821 #endif
822 
823  while (master->ext_ring_idx_rt != master->ext_ring_idx_fsm) {
824  datagram = &master->ext_datagram_ring[master->ext_ring_idx_rt];
825 
826  if (datagram->state != EC_DATAGRAM_INIT) {
827  // skip datagram
828  master->ext_ring_idx_rt =
829  (master->ext_ring_idx_rt + 1) % EC_EXT_RING_SIZE;
830  continue;
831  }
832 
833  new_queue_size = queue_size + datagram->data_size;
834  if (new_queue_size <= master->max_queue_size) {
835 #if DEBUG_INJECT
836  EC_MASTER_DBG(master, 1, "Injecting datagram %s"
837  " size=%zu, queue_size=%zu\n", datagram->name,
838  datagram->data_size, new_queue_size);
839  datagram_count++;
840 #endif
841 #ifdef EC_HAVE_CYCLES
842  datagram->cycles_sent = 0;
843 #endif
844  datagram->jiffies_sent = 0;
845  ec_master_queue_datagram(master, datagram);
846  queue_size = new_queue_size;
847  }
848  else if (datagram->data_size > master->max_queue_size) {
849  datagram->state = EC_DATAGRAM_ERROR;
850  EC_MASTER_ERR(master, "External datagram %s is too large,"
851  " size=%zu, max_queue_size=%zu\n",
852  datagram->name, datagram->data_size,
853  master->max_queue_size);
854  }
855  else { // datagram does not fit in the current cycle
856 #ifdef EC_HAVE_CYCLES
857  cycles_t cycles_now = get_cycles();
858 
859  if (cycles_now - datagram->cycles_sent
860  > ext_injection_timeout_cycles)
861 #else
862  if (jiffies - datagram->jiffies_sent
864 #endif
865  {
866 #if defined EC_RT_SYSLOG || DEBUG_INJECT
867  unsigned int time_us;
868 #endif
869 
870  datagram->state = EC_DATAGRAM_ERROR;
871 
872 #if defined EC_RT_SYSLOG || DEBUG_INJECT
873 #ifdef EC_HAVE_CYCLES
874  time_us = (unsigned int)
875  ((cycles_now - datagram->cycles_sent) * 1000LL)
876  / cpu_khz;
877 #else
878  time_us = (unsigned int)
879  ((jiffies - datagram->jiffies_sent) * 1000000 / HZ);
880 #endif
881  EC_MASTER_ERR(master, "Timeout %u us: Injecting"
882  " external datagram %s size=%zu,"
883  " max_queue_size=%zu\n", time_us, datagram->name,
884  datagram->data_size, master->max_queue_size);
885 #endif
886  }
887  else {
888 #if DEBUG_INJECT
889  EC_MASTER_DBG(master, 1, "Deferred injecting"
890  " external datagram %s size=%u, queue_size=%u\n",
891  datagram->name, datagram->data_size, queue_size);
892 #endif
893  break;
894  }
895  }
896 
897  master->ext_ring_idx_rt =
898  (master->ext_ring_idx_rt + 1) % EC_EXT_RING_SIZE;
899  }
900 
901 #if DEBUG_INJECT
902  EC_MASTER_DBG(master, 1, "Injected %u datagrams.\n", datagram_count);
903 #endif
904 }
905 
906 /*****************************************************************************/
907 
912  ec_master_t *master,
913  unsigned int send_interval
914  )
915 {
916  master->send_interval = send_interval;
917  master->max_queue_size =
918  (send_interval * 1000) / EC_BYTE_TRANSMISSION_TIME_NS;
919  master->max_queue_size -= master->max_queue_size / 10;
920 }
921 
922 /*****************************************************************************/
923 
929  ec_master_t *master
930  )
931 {
932  if ((master->ext_ring_idx_fsm + 1) % EC_EXT_RING_SIZE !=
933  master->ext_ring_idx_rt) {
934  ec_datagram_t *datagram =
935  &master->ext_datagram_ring[master->ext_ring_idx_fsm];
936  return datagram;
937  }
938  else {
939  return NULL;
940  }
941 }
942 
943 /*****************************************************************************/
944 
948  ec_master_t *master,
949  ec_datagram_t *datagram
950  )
951 {
952  ec_datagram_t *queued_datagram;
953 
954  /* It is possible, that a datagram in the queue is re-initialized with the
955  * ec_datagram_<type>() methods and then shall be queued with this method.
956  * In that case, the state is already reset to EC_DATAGRAM_INIT. Check if
957  * the datagram is queued to avoid duplicate queuing (which results in an
958  * infinite loop!). Set the state to EC_DATAGRAM_QUEUED again, probably
959  * causing an unmatched datagram. */
960  list_for_each_entry(queued_datagram, &master->datagram_queue, queue) {
961  if (queued_datagram == datagram) {
962  datagram->skip_count++;
963 #ifdef EC_RT_SYSLOG
964  EC_MASTER_DBG(master, 1,
965  "Datagram %p already queued (skipping).\n", datagram);
966 #endif
967  datagram->state = EC_DATAGRAM_QUEUED;
968  return;
969  }
970  }
971 
972  if (datagram->state != EC_DATAGRAM_INVALID) {
973  list_add_tail(&datagram->queue, &master->datagram_queue);
974  datagram->state = EC_DATAGRAM_QUEUED;
975  }
976 }
977 
978 /*****************************************************************************/
979 
983  ec_master_t *master,
984  ec_datagram_t *datagram
985  )
986 {
987  ec_lock_down(&master->ext_queue_sem);
988  list_add_tail(&datagram->queue, &master->ext_datagram_queue);
989  ec_lock_up(&master->ext_queue_sem);
990 }
991 
992 /*****************************************************************************/
993 
994 static int index_in_use(ec_master_t *master, uint8_t index)
995 {
996  ec_datagram_t *datagram;
997  list_for_each_entry(datagram, &master->datagram_queue, queue)
998  if (datagram->state == EC_DATAGRAM_SENT && datagram->index == index)
999  return 1;
1000  return 0;
1001 }
1002 
1007  ec_master_t *master,
1008  ec_device_index_t device_index
1009  )
1010 {
1011  ec_datagram_t *datagram, *next;
1012  size_t datagram_size;
1013  uint8_t *frame_data, *cur_data = NULL;
1014  void *follows_word;
1015 #ifdef EC_HAVE_CYCLES
1016  cycles_t cycles_start, cycles_sent, cycles_end;
1017 #endif
1018  unsigned long jiffies_sent;
1019  unsigned int frame_count, more_datagrams_waiting;
1020  struct list_head sent_datagrams;
1021  size_t sent_bytes = 0;
1022  uint8_t last_index;
1023 
1024 #ifdef EC_HAVE_CYCLES
1025  cycles_start = get_cycles();
1026 #endif
1027  frame_count = 0;
1028  INIT_LIST_HEAD(&sent_datagrams);
1029 
1030  EC_MASTER_DBG(master, 2, "%s(device_index = %u)\n",
1031  __func__, device_index);
1032 
1033  do {
1034  frame_data = NULL;
1035  follows_word = NULL;
1036  more_datagrams_waiting = 0;
1037 
1038  // fill current frame with datagrams
1039  list_for_each_entry(datagram, &master->datagram_queue, queue) {
1040  if (datagram->state != EC_DATAGRAM_QUEUED ||
1041  datagram->device_index != device_index) {
1042  continue;
1043  }
1044 
1045  if (!frame_data) {
1046  // fetch pointer to transmit socket buffer
1047  frame_data =
1048  ec_device_tx_data(&master->devices[device_index]);
1049  cur_data = frame_data + EC_FRAME_HEADER_SIZE;
1050  }
1051 
1052  // does the current datagram fit in the frame?
1053  datagram_size = EC_DATAGRAM_HEADER_SIZE + datagram->data_size
1055  if (cur_data - frame_data + datagram_size > ETH_DATA_LEN) {
1056  more_datagrams_waiting = 1;
1057  break;
1058  }
1059 
1060  // do not reuse the index of a pending datagram to avoid confusion
1061  // in ec_master_receive_datagrams()
1062  last_index = master->datagram_index;
1063  while (index_in_use(master, master->datagram_index)) {
1064  if (++master->datagram_index == last_index) {
1065  EC_MASTER_ERR(master, "No free datagram index, sending delayed\n");
1066  goto break_send;
1067  }
1068  }
1069  datagram->index = master->datagram_index++;
1070 
1071  list_add_tail(&datagram->sent, &sent_datagrams);
1072 
1073  EC_MASTER_DBG(master, 2, "Adding datagram 0x%02X\n",
1074  datagram->index);
1075 
1076  // set "datagram following" flag in previous datagram
1077  if (follows_word) {
1078  EC_WRITE_U16(follows_word,
1079  EC_READ_U16(follows_word) | 0x8000);
1080  }
1081 
1082  // EtherCAT datagram header
1083  EC_WRITE_U8 (cur_data, datagram->type);
1084  EC_WRITE_U8 (cur_data + 1, datagram->index);
1085  memcpy(cur_data + 2, datagram->address, EC_ADDR_LEN);
1086  EC_WRITE_U16(cur_data + 6, datagram->data_size & 0x7FF);
1087  EC_WRITE_U16(cur_data + 8, 0x0000);
1088  follows_word = cur_data + 6;
1089  cur_data += EC_DATAGRAM_HEADER_SIZE;
1090 
1091  // EtherCAT datagram data
1092  memcpy(cur_data, datagram->data, datagram->data_size);
1093  cur_data += datagram->data_size;
1094 
1095  // EtherCAT datagram footer
1096  EC_WRITE_U16(cur_data, 0x0000); // reset working counter
1097  cur_data += EC_DATAGRAM_FOOTER_SIZE;
1098  }
1099 
1100 break_send:
1101  if (list_empty(&sent_datagrams)) {
1102  EC_MASTER_DBG(master, 2, "nothing to send.\n");
1103  break;
1104  }
1105 
1106  // EtherCAT frame header
1107  EC_WRITE_U16(frame_data, ((cur_data - frame_data
1108  - EC_FRAME_HEADER_SIZE) & 0x7FF) | 0x1000);
1109 
1110  // pad frame
1111  while (cur_data - frame_data < ETH_ZLEN - ETH_HLEN)
1112  EC_WRITE_U8(cur_data++, 0x00);
1113 
1114  EC_MASTER_DBG(master, 2, "frame size: %zu\n", cur_data - frame_data);
1115 
1116  // send frame
1117  ec_device_send(&master->devices[device_index],
1118  cur_data - frame_data);
1119  /* preamble and inter-frame gap */
1120  sent_bytes += ETH_HLEN + cur_data - frame_data + ETH_FCS_LEN + 20;
1121 #ifdef EC_HAVE_CYCLES
1122  cycles_sent = get_cycles();
1123 #endif
1124  jiffies_sent = jiffies;
1125 
1126  // set datagram states and sending timestamps
1127  list_for_each_entry_safe(datagram, next, &sent_datagrams, sent) {
1128  datagram->state = EC_DATAGRAM_SENT;
1129 #ifdef EC_HAVE_CYCLES
1130  datagram->cycles_sent = cycles_sent;
1131 #endif
1132  datagram->jiffies_sent = jiffies_sent;
1133  datagram->app_time_sent = master->app_time;
1134  list_del_init(&datagram->sent); // empty list of sent datagrams
1135  }
1136 
1137  frame_count++;
1138  }
1139  while (more_datagrams_waiting && frame_count < EC_TX_RING_SIZE);
1140 
1141 #ifdef EC_HAVE_CYCLES
1142  if (unlikely(master->debug_level > 1)) {
1143  cycles_end = get_cycles();
1144  EC_MASTER_DBG(master, 0, "%s()"
1145  " sent %u frames in %uus.\n", __func__, frame_count,
1146  (unsigned int) (cycles_end - cycles_start) * 1000 / cpu_khz);
1147  }
1148 #endif
1149  return sent_bytes;
1150 }
1151 
1152 /*****************************************************************************/
1153 
1161  ec_master_t *master,
1162  ec_device_t *device,
1163  const uint8_t *frame_data,
1164  size_t size
1165  )
1166 {
1167  size_t frame_size, data_size;
1168  uint8_t datagram_type, datagram_index, datagram_mbox_prot;
1169 #ifdef EC_EOE
1170  uint8_t eoe_type;
1171 #endif
1172  unsigned int cmd_follows, datagram_slave_addr, datagram_offset_addr, datagram_wc, matched;
1173  const uint8_t *cur_data;
1174  ec_datagram_t *datagram;
1175  ec_slave_t *slave;
1176 
1177  if (unlikely(size < EC_FRAME_HEADER_SIZE)) {
1178  if (master->debug_level || FORCE_OUTPUT_CORRUPTED) {
1179  EC_MASTER_DBG(master, 0, "Corrupted frame received"
1180  " on %s (size %zu < %u byte):\n",
1181  device->dev->name, size, EC_FRAME_HEADER_SIZE);
1182  ec_print_data(frame_data, size);
1183  }
1184  master->stats.corrupted++;
1185 #ifdef EC_RT_SYSLOG
1186  ec_master_output_stats(master);
1187 #endif
1188  return;
1189  }
1190 
1191  cur_data = frame_data;
1192 
1193  // check length of entire frame
1194  frame_size = EC_READ_U16(cur_data) & 0x07FF;
1195  cur_data += EC_FRAME_HEADER_SIZE;
1196 
1197  if (unlikely(frame_size > size)) {
1198  if (master->debug_level || FORCE_OUTPUT_CORRUPTED) {
1199  EC_MASTER_DBG(master, 0, "Corrupted frame received"
1200  " on %s (invalid frame size %zu for "
1201  "received size %zu):\n", device->dev->name,
1202  frame_size, size);
1203  ec_print_data(frame_data, size);
1204  }
1205  master->stats.corrupted++;
1206 #ifdef EC_RT_SYSLOG
1207  ec_master_output_stats(master);
1208 #endif
1209  return;
1210  }
1211 
1212  cmd_follows = 1;
1213  while (cmd_follows) {
1214  // process datagram header
1215  datagram_type = EC_READ_U8 (cur_data);
1216  datagram_index = EC_READ_U8 (cur_data + 1);
1217  datagram_slave_addr = EC_READ_U16(cur_data + 2);
1218  datagram_offset_addr = EC_READ_U16(cur_data + 4);
1219  data_size = EC_READ_U16(cur_data + 6) & 0x07FF;
1220  cmd_follows = EC_READ_U16(cur_data + 6) & 0x8000;
1221  cur_data += EC_DATAGRAM_HEADER_SIZE;
1222 
1223  if (unlikely(cur_data - frame_data
1224  + data_size + EC_DATAGRAM_FOOTER_SIZE > size)) {
1225  if (master->debug_level || FORCE_OUTPUT_CORRUPTED) {
1226  EC_MASTER_DBG(master, 0, "Corrupted frame received"
1227  " on %s (invalid data size %zu):\n",
1228  device->dev->name, data_size);
1229  ec_print_data(frame_data, size);
1230  }
1231  master->stats.corrupted++;
1232 #ifdef EC_RT_SYSLOG
1233  ec_master_output_stats(master);
1234 #endif
1235  return;
1236  }
1237 
1238  // search for matching datagram in the queue
1239  matched = 0;
1240  list_for_each_entry(datagram, &master->datagram_queue, queue) {
1241  if (datagram->index == datagram_index
1242  && datagram->state == EC_DATAGRAM_SENT
1243  && datagram->type == datagram_type
1244  && datagram->data_size == data_size) {
1245  matched = 1;
1246  break;
1247  }
1248  }
1249 
1250  // no matching datagram was found
1251  if (!matched) {
1252  master->stats.unmatched++;
1253 #ifdef EC_RT_SYSLOG
1254  ec_master_output_stats(master);
1255 #endif
1256 
1257  if (unlikely(master->debug_level > 0)) {
1258  EC_MASTER_DBG(master, 0, "UNMATCHED datagram:\n");
1260  EC_DATAGRAM_HEADER_SIZE + data_size
1262 #ifdef EC_DEBUG_RING
1263  ec_device_debug_ring_print(&master->devices[EC_DEVICE_MAIN]);
1264 #endif
1265  }
1266 
1267  cur_data += data_size + EC_DATAGRAM_FOOTER_SIZE;
1268  continue;
1269  }
1270 
1271  if (datagram->type != EC_DATAGRAM_APWR &&
1272  datagram->type != EC_DATAGRAM_FPWR &&
1273  datagram->type != EC_DATAGRAM_BWR &&
1274  datagram->type != EC_DATAGRAM_LWR) {
1275 
1276  // common mailbox dispatcher for mailboxes read using the physical slave address
1277  if (datagram->type == EC_DATAGRAM_FPRD) {
1278  datagram_wc = EC_READ_U16(cur_data + data_size);
1279  if (datagram_wc) {
1280  if (master->slaves != NULL) {
1281  for (slave = master->slaves; slave < master->slaves + master->slave_count; slave++) {
1282  if (slave->station_address == datagram_slave_addr) {
1283  break;
1284  }
1285  }
1286  if (slave->station_address == datagram_slave_addr) {
1287  if (slave->configured_tx_mailbox_offset != 0) {
1288  if (datagram_offset_addr == slave->configured_tx_mailbox_offset) {
1289  if (slave->valid_mbox_data) {
1290  datagram_mbox_prot = EC_READ_U8(cur_data + 5) & 0x0F;
1291  switch (datagram_mbox_prot) {
1292 #ifdef EC_EOE
1293  case EC_MBOX_TYPE_EOE:
1294  // check EOE type and store in correct handlers mbox data cache
1295  eoe_type = EC_READ_U8(cur_data + 6) & 0x0F;
1296 
1297  switch (eoe_type) {
1298 
1299  case EC_EOE_TYPE_FRAME_FRAG:
1300  // EoE Frame Fragment handler
1301  if ((slave->mbox_eoe_frag_data.data) && (data_size <= slave->mbox_eoe_frag_data.data_size)) {
1302  memcpy(slave->mbox_eoe_frag_data.data, cur_data, data_size);
1303  slave->mbox_eoe_frag_data.payload_size = data_size;
1304  }
1305  break;
1306  case EC_EOE_TYPE_INIT_RES:
1307  // EoE Init / Set IP response handler
1308  if ((slave->mbox_eoe_init_data.data) && (data_size <= slave->mbox_eoe_init_data.data_size)) {
1309  memcpy(slave->mbox_eoe_init_data.data, cur_data, data_size);
1310  slave->mbox_eoe_init_data.payload_size = data_size;
1311  }
1312  break;
1313  default:
1314  EC_MASTER_DBG(master, 1, "Unhandled EoE protocol type from slave: %u Protocol: %u, Type: %x\n",
1315  datagram_slave_addr, datagram_mbox_prot, eoe_type);
1316  // copy instead received data into the datagram memory.
1317  memcpy(datagram->data, cur_data, data_size);
1318  break;
1319  }
1320  break;
1321 #endif
1322  case EC_MBOX_TYPE_COE:
1323  if ((slave->mbox_coe_data.data) && (data_size <= slave->mbox_coe_data.data_size)) {
1324  memcpy(slave->mbox_coe_data.data, cur_data, data_size);
1325  slave->mbox_coe_data.payload_size = data_size;
1326  }
1327  break;
1328  case EC_MBOX_TYPE_FOE:
1329  if ((slave->mbox_foe_data.data) && (data_size <= slave->mbox_foe_data.data_size)) {
1330  memcpy(slave->mbox_foe_data.data, cur_data, data_size);
1331  slave->mbox_foe_data.payload_size = data_size;
1332  }
1333  break;
1334  case EC_MBOX_TYPE_SOE:
1335  if ((slave->mbox_soe_data.data) && (data_size <= slave->mbox_soe_data.data_size)) {
1336  memcpy(slave->mbox_soe_data.data, cur_data, data_size);
1337  slave->mbox_soe_data.payload_size = data_size;
1338  }
1339  break;
1340  case EC_MBOX_TYPE_VOE:
1341  if ((slave->mbox_voe_data.data) && (data_size <= slave->mbox_voe_data.data_size)) {
1342  memcpy(slave->mbox_voe_data.data, cur_data, data_size);
1343  slave->mbox_voe_data.payload_size = data_size;
1344  }
1345  break;
1346  default:
1347  EC_MASTER_DBG(master, 1, "Unknown mailbox protocol from slave: %u Protocol: %u\n", datagram_slave_addr, datagram_mbox_prot);
1348  // copy instead received data into the datagram memory.
1349  memcpy(datagram->data, cur_data, data_size);
1350  break;
1351  }
1352  } else {
1353  // copy instead received data into the datagram memory.
1354  memcpy(datagram->data, cur_data, data_size);
1355  }
1356  } else {
1357  // copy instead received data into the datagram memory.
1358  memcpy(datagram->data, cur_data, data_size);
1359  }
1360  } else {
1361  // copy instead received data into the datagram memory.
1362  memcpy(datagram->data, cur_data, data_size);
1363  }
1364  } else {
1365  EC_MASTER_DBG(master, 1, "No slave matching datagram slave address: %u\n", datagram_slave_addr);
1366  }
1367  } else {
1368  EC_MASTER_DBG(master, 1, "No configured slaves!\n");
1369  // copy instead received data into the datagram memory.
1370  memcpy(datagram->data, cur_data, data_size);
1371  }
1372  } else {
1373  // copy instead received data into the datagram memory.
1374  memcpy(datagram->data, cur_data, data_size);
1375  }
1376  } else {
1377  // copy instead received data into the datagram memory.
1378  memcpy(datagram->data, cur_data, data_size);
1379  }
1380  }
1381  cur_data += data_size;
1382 
1383  // set the datagram's working counter
1384  datagram->working_counter = EC_READ_U16(cur_data);
1385  cur_data += EC_DATAGRAM_FOOTER_SIZE;
1386 
1387 #ifdef EC_HAVE_CYCLES
1388  datagram->cycles_received =
1389  master->devices[EC_DEVICE_MAIN].cycles_poll;
1390 #endif
1391  datagram->jiffies_received =
1393 
1394  barrier(); /* reordering might lead to races */
1395 
1396  // dequeue the received datagram
1397  datagram->state = EC_DATAGRAM_RECEIVED;
1398  list_del_init(&datagram->queue);
1399  }
1400 }
1401 
1402 /*****************************************************************************/
1403 
1410 {
1411  if (unlikely(jiffies - master->stats.output_jiffies >= HZ)) {
1412  if (!master->scan_busy || (master->debug_level > 0)) {
1413  master->stats.output_jiffies = jiffies;
1414  if (master->stats.timeouts) {
1415  EC_MASTER_WARN(master, "%u datagram%s TIMED OUT!\n",
1416  master->stats.timeouts,
1417  master->stats.timeouts == 1 ? "" : "s");
1418  master->stats.timeouts = 0;
1419  }
1420  if (master->stats.corrupted) {
1421  EC_MASTER_WARN(master, "%u frame%s CORRUPTED!\n",
1422  master->stats.corrupted,
1423  master->stats.corrupted == 1 ? "" : "s");
1424  master->stats.corrupted = 0;
1425  }
1426  if (master->stats.unmatched) {
1427  EC_MASTER_WARN(master, "%u datagram%s UNMATCHED!\n",
1428  master->stats.unmatched,
1429  master->stats.unmatched == 1 ? "" : "s");
1430  master->stats.unmatched = 0;
1431  }
1432  }
1433  }
1434 }
1435 
1436 /*****************************************************************************/
1437 
1441  ec_master_t *master
1442  )
1443 {
1444  unsigned int i;
1445 
1446  // zero frame statistics
1447  master->device_stats.tx_count = 0;
1448  master->device_stats.last_tx_count = 0;
1449  master->device_stats.rx_count = 0;
1450  master->device_stats.last_rx_count = 0;
1451  master->device_stats.tx_bytes = 0;
1452  master->device_stats.last_tx_bytes = 0;
1453  master->device_stats.rx_bytes = 0;
1454  master->device_stats.last_rx_bytes = 0;
1455  master->device_stats.last_loss = 0;
1456 
1457  for (i = 0; i < EC_RATE_COUNT; i++) {
1458  master->device_stats.tx_frame_rates[i] = 0;
1459  master->device_stats.rx_frame_rates[i] = 0;
1460  master->device_stats.tx_byte_rates[i] = 0;
1461  master->device_stats.rx_byte_rates[i] = 0;
1462  master->device_stats.loss_rates[i] = 0;
1463  }
1464 
1465  master->device_stats.jiffies = 0;
1466 }
1467 
1468 /*****************************************************************************/
1469 
1473  ec_master_t *master
1474  )
1475 {
1476  ec_device_stats_t *s = &master->device_stats;
1477  s32 tx_frame_rate, rx_frame_rate, tx_byte_rate, rx_byte_rate, loss_rate;
1478  u64 loss;
1479  unsigned int i, dev_idx;
1480 
1481  // frame statistics
1482  if (likely(jiffies - s->jiffies < HZ)) {
1483  return;
1484  }
1485 
1486  tx_frame_rate = (s->tx_count - s->last_tx_count) * 1000;
1487  rx_frame_rate = (s->rx_count - s->last_rx_count) * 1000;
1488  tx_byte_rate = s->tx_bytes - s->last_tx_bytes;
1489  rx_byte_rate = s->rx_bytes - s->last_rx_bytes;
1490  loss = s->tx_count - s->rx_count;
1491  loss_rate = (loss - s->last_loss) * 1000;
1492 
1493  /* Low-pass filter:
1494  * Y_n = y_(n - 1) + T / tau * (x - y_(n - 1)) | T = 1
1495  * -> Y_n += (x - y_(n - 1)) / tau
1496  */
1497  for (i = 0; i < EC_RATE_COUNT; i++) {
1498  s32 n = rate_intervals[i];
1499  s->tx_frame_rates[i] += (tx_frame_rate - s->tx_frame_rates[i]) / n;
1500  s->rx_frame_rates[i] += (rx_frame_rate - s->rx_frame_rates[i]) / n;
1501  s->tx_byte_rates[i] += (tx_byte_rate - s->tx_byte_rates[i]) / n;
1502  s->rx_byte_rates[i] += (rx_byte_rate - s->rx_byte_rates[i]) / n;
1503  s->loss_rates[i] += (loss_rate - s->loss_rates[i]) / n;
1504  }
1505 
1506  s->last_tx_count = s->tx_count;
1507  s->last_rx_count = s->rx_count;
1508  s->last_tx_bytes = s->tx_bytes;
1509  s->last_rx_bytes = s->rx_bytes;
1510  s->last_loss = loss;
1511 
1512  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
1513  dev_idx++) {
1514  ec_device_update_stats(&master->devices[dev_idx]);
1515  }
1516 
1517  s->jiffies = jiffies;
1518 }
1519 
1520 /*****************************************************************************/
1521 
1522 #ifdef EC_USE_HRTIMER
1523 
1524 /*
1525  * Sleep related functions:
1526  */
1527 static enum hrtimer_restart ec_master_nanosleep_wakeup(struct hrtimer *timer)
1528 {
1529  struct hrtimer_sleeper *t =
1530  container_of(timer, struct hrtimer_sleeper, timer);
1531  struct task_struct *task = t->task;
1532 
1533  t->task = NULL;
1534  if (task)
1535  wake_up_process(task);
1536 
1537  return HRTIMER_NORESTART;
1538 }
1539 
1540 /*****************************************************************************/
1541 
1542 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,28)
1543 
1544 /* compatibility with new hrtimer interface */
1545 static inline ktime_t hrtimer_get_expires(const struct hrtimer *timer)
1546 {
1547  return timer->expires;
1548 }
1549 
1550 /*****************************************************************************/
1551 
1552 static inline void hrtimer_set_expires(struct hrtimer *timer, ktime_t time)
1553 {
1554  timer->expires = time;
1555 }
1556 
1557 #endif
1558 
1559 /*****************************************************************************/
1560 
1561 void ec_master_nanosleep(const unsigned long nsecs)
1562 {
1563  struct hrtimer_sleeper t;
1564  enum hrtimer_mode mode = HRTIMER_MODE_REL;
1565 
1566  hrtimer_init(&t.timer, CLOCK_MONOTONIC, mode);
1567  t.timer.function = ec_master_nanosleep_wakeup;
1568  t.task = current;
1569 #ifdef CONFIG_HIGH_RES_TIMERS
1570 #if LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 24)
1571  t.timer.cb_mode = HRTIMER_CB_IRQSAFE_NO_RESTART;
1572 #elif LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 26)
1573  t.timer.cb_mode = HRTIMER_CB_IRQSAFE_NO_SOFTIRQ;
1574 #elif LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 28)
1575  t.timer.cb_mode = HRTIMER_CB_IRQSAFE_UNLOCKED;
1576 #endif
1577 #endif
1578  hrtimer_set_expires(&t.timer, ktime_set(0, nsecs));
1579 
1580  do {
1581  set_current_state(TASK_INTERRUPTIBLE);
1582  hrtimer_start(&t.timer, hrtimer_get_expires(&t.timer), mode);
1583 
1584  if (likely(t.task))
1585  schedule();
1586 
1587  hrtimer_cancel(&t.timer);
1588  mode = HRTIMER_MODE_ABS;
1589 
1590  } while (t.task && !signal_pending(current));
1591 }
1592 
1593 #endif // EC_USE_HRTIMER
1594 
1595 /*****************************************************************************/
1596 
1600  ec_master_t *master
1601  )
1602 {
1603  ec_datagram_t *datagram;
1604  ec_fsm_slave_t *fsm, *next;
1605  unsigned int count = 0;
1606 
1607  list_for_each_entry_safe(fsm, next, &master->fsm_exec_list, list) {
1608  if (!fsm->datagram) {
1609  EC_MASTER_WARN(master, "Slave %u FSM has zero datagram."
1610  "This is a bug!\n", fsm->slave->ring_position);
1611  list_del_init(&fsm->list);
1612  master->fsm_exec_count--;
1613  return;
1614  }
1615 
1616  if (fsm->datagram->state == EC_DATAGRAM_INIT ||
1617  fsm->datagram->state == EC_DATAGRAM_QUEUED ||
1618  fsm->datagram->state == EC_DATAGRAM_SENT) {
1619  // previous datagram was not sent or received yet.
1620  // wait until next thread execution
1621  return;
1622  }
1623 
1624  datagram = ec_master_get_external_datagram(master);
1625  if (!datagram) {
1626  // no free datagrams at the moment
1627  EC_MASTER_WARN(master, "No free datagram during"
1628  " slave FSM execution. This is a bug!\n");
1629  continue;
1630  }
1631 
1632 #if DEBUG_INJECT
1633  EC_MASTER_DBG(master, 1, "Executing slave %u FSM.\n",
1634  fsm->slave->ring_position);
1635 #endif
1636  if (ec_fsm_slave_exec(fsm, datagram)) {
1637  if (datagram->state != EC_DATAGRAM_INVALID) {
1638  // FSM consumed datagram
1639 #if DEBUG_INJECT
1640  EC_MASTER_DBG(master, 1, "FSM consumed datagram %s\n",
1641  datagram->name);
1642 #endif
1643  master->ext_ring_idx_fsm =
1644  (master->ext_ring_idx_fsm + 1) % EC_EXT_RING_SIZE;
1645  }
1646  }
1647  else {
1648  // FSM finished
1649  list_del_init(&fsm->list);
1650  master->fsm_exec_count--;
1651 #if DEBUG_INJECT
1652  EC_MASTER_DBG(master, 1, "FSM finished. %u remaining.\n",
1653  master->fsm_exec_count);
1654 #endif
1655  }
1656  }
1657 
1658  while (master->fsm_exec_count < EC_EXT_RING_SIZE / 2
1659  && count < master->slave_count) {
1660 
1661  if (ec_fsm_slave_is_ready(&master->fsm_slave->fsm)) {
1662  datagram = ec_master_get_external_datagram(master);
1663 
1664  if (ec_fsm_slave_exec(&master->fsm_slave->fsm, datagram)) {
1665  if (datagram->state != EC_DATAGRAM_INVALID) {
1666  master->ext_ring_idx_fsm =
1667  (master->ext_ring_idx_fsm + 1) % EC_EXT_RING_SIZE;
1668  }
1669  list_add_tail(&master->fsm_slave->fsm.list,
1670  &master->fsm_exec_list);
1671  master->fsm_exec_count++;
1672 #if DEBUG_INJECT
1673  EC_MASTER_DBG(master, 1, "New slave %u FSM"
1674  " consumed datagram %s, now %u FSMs in list.\n",
1675  master->fsm_slave->ring_position, datagram->name,
1676  master->fsm_exec_count);
1677 #endif
1678  }
1679  }
1680 
1681  master->fsm_slave++;
1682  if (master->fsm_slave >= master->slaves + master->slave_count) {
1683  master->fsm_slave = master->slaves;
1684  }
1685  count++;
1686  }
1687 }
1688 
1689 /*****************************************************************************/
1690 
1693 static int ec_master_idle_thread(void *priv_data)
1694 {
1695  ec_master_t *master = (ec_master_t *) priv_data;
1696  int fsm_exec;
1697  size_t sent_bytes;
1698 
1699  // send interval in IDLE phase
1700  ec_master_set_send_interval(master, 1000000 / HZ);
1701 
1702  EC_MASTER_DBG(master, 1, "Idle thread running with send interval = %u us,"
1703  " max data size=%zu\n", master->send_interval,
1704  master->max_queue_size);
1705 
1706  while (!kthread_should_stop()) {
1708 
1709  // receive
1710  ec_lock_down(&master->io_sem);
1711  ecrt_master_receive(master);
1712  ec_lock_up(&master->io_sem);
1713 
1714  // execute master & slave state machines
1715  if (ec_lock_down_interruptible(&master->master_sem)) {
1716  break;
1717  }
1718 
1719  fsm_exec = ec_fsm_master_exec(&master->fsm);
1720 
1721  ec_master_exec_slave_fsms(master);
1722 
1723  ec_lock_up(&master->master_sem);
1724 
1725  // queue and send
1726  ec_lock_down(&master->io_sem);
1727  if (fsm_exec) {
1728  ec_master_queue_datagram(master, &master->fsm_datagram);
1729  }
1730  sent_bytes = ecrt_master_send(master);
1731  ec_lock_up(&master->io_sem);
1732 
1733  if (ec_fsm_master_idle(&master->fsm)) {
1734 #ifdef EC_USE_HRTIMER
1735  ec_master_nanosleep(master->send_interval * 1000);
1736 #else
1737  set_current_state(TASK_INTERRUPTIBLE);
1738  schedule_timeout(1);
1739 #endif
1740  } else {
1741 #ifdef EC_USE_HRTIMER
1742  ec_master_nanosleep(
1743  sent_bytes * EC_BYTE_TRANSMISSION_TIME_NS * 6 / 5);
1744 #else
1745  schedule();
1746 #endif
1747  }
1748  }
1749 
1750  EC_MASTER_DBG(master, 1, "Master IDLE thread exiting...\n");
1751 
1752  return 0;
1753 }
1754 
1755 /*****************************************************************************/
1756 
1759 static int ec_master_operation_thread(void *priv_data)
1760 {
1761  ec_master_t *master = (ec_master_t *) priv_data;
1762 
1763  EC_MASTER_DBG(master, 1, "Operation thread running"
1764  " with fsm interval = %u us, max data size=%zu\n",
1765  master->send_interval, master->max_queue_size);
1766 
1767  while (!kthread_should_stop()) {
1769 
1770  if (master->injection_seq_rt == master->injection_seq_fsm) {
1771  // output statistics
1772  ec_master_output_stats(master);
1773 
1774  // execute master & slave state machines
1775  if (ec_lock_down_interruptible(&master->master_sem)) {
1776  break;
1777  }
1778 
1779  if (ec_fsm_master_exec(&master->fsm)) {
1780  // Inject datagrams (let the RT thread queue them, see
1781  // ecrt_master_send())
1782  master->injection_seq_fsm++;
1783  }
1784 
1785  ec_master_exec_slave_fsms(master);
1786 
1787  ec_lock_up(&master->master_sem);
1788  }
1789 
1790 #ifdef EC_USE_HRTIMER
1791  // the op thread should not work faster than the sending RT thread
1792  ec_master_nanosleep(master->send_interval * 1000);
1793 #else
1794  if (ec_fsm_master_idle(&master->fsm)) {
1795  set_current_state(TASK_INTERRUPTIBLE);
1796  schedule_timeout(1);
1797  }
1798  else {
1799  schedule();
1800  }
1801 #endif
1802  }
1803 
1804  EC_MASTER_DBG(master, 1, "Master OP thread exiting...\n");
1805  return 0;
1806 }
1807 
1808 /*****************************************************************************/
1809 
1810 #ifdef EC_EOE
1811 
1812 /* compatibility for priority changes */
1813 static inline void set_normal_priority(struct task_struct *p, int nice)
1814 {
1815 #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
1816  sched_set_normal(p, nice);
1817 #else
1818  struct sched_param param = { .sched_priority = 0 };
1819  sched_setscheduler(p, SCHED_NORMAL, &param);
1820  set_user_nice(p, nice);
1821 #endif
1822 }
1823 
1824 /*****************************************************************************/
1825 
1829 {
1830  if (master->eoe_thread) {
1831  EC_MASTER_WARN(master, "EoE already running!\n");
1832  return;
1833  }
1834 
1835  if (list_empty(&master->eoe_handlers)) {
1836  return;
1837  }
1838 
1839  if (!master->send_cb || !master->receive_cb) {
1840  EC_MASTER_WARN(master, "No EoE processing"
1841  " because of missing callbacks!\n");
1842  return;
1843  }
1844 
1845  EC_MASTER_INFO(master, "Starting EoE thread.\n");
1846  master->eoe_thread = kthread_run(ec_master_eoe_thread, master,
1847  "EtherCAT-EoE");
1848  if (IS_ERR(master->eoe_thread)) {
1849  int err = (int) PTR_ERR(master->eoe_thread);
1850  EC_MASTER_ERR(master, "Failed to start EoE thread (error %i)!\n",
1851  err);
1852  master->eoe_thread = NULL;
1853  return;
1854  }
1855 
1856  set_normal_priority(master->eoe_thread, 0);
1857 }
1858 
1859 /*****************************************************************************/
1860 
1864 {
1865  if (master->eoe_thread) {
1866  EC_MASTER_INFO(master, "Stopping EoE thread.\n");
1867 
1868  kthread_stop(master->eoe_thread);
1869  master->eoe_thread = NULL;
1870  EC_MASTER_INFO(master, "EoE thread exited.\n");
1871  }
1872 }
1873 
1874 /*****************************************************************************/
1875 
1878 static int ec_master_eoe_thread(void *priv_data)
1879 {
1880  ec_master_t *master = (ec_master_t *) priv_data;
1881  ec_eoe_t *eoe;
1882  unsigned int none_open, sth_to_send, all_idle;
1883 
1884  EC_MASTER_DBG(master, 1, "EoE thread running.\n");
1885 
1886  while (!kthread_should_stop()) {
1887  none_open = 1;
1888  all_idle = 1;
1889 
1890  list_for_each_entry(eoe, &master->eoe_handlers, list) {
1891  if (ec_eoe_is_open(eoe)) {
1892  none_open = 0;
1893  break;
1894  }
1895  }
1896  if (none_open) {
1897  goto schedule;
1898  }
1899 
1900  // receive datagrams
1901  ec_lock_down(&master->io_sem);
1902  master->receive_cb(master->cb_data);
1903  ec_lock_up(&master->io_sem);
1904 
1905  // actual EoE processing
1906  sth_to_send = 0;
1907  list_for_each_entry(eoe, &master->eoe_handlers, list) {
1908  if ((eoe->slave->current_state == EC_SLAVE_STATE_PREOP) ||
1910  (eoe->slave->current_state == EC_SLAVE_STATE_OP)) {
1911  ec_eoe_run(eoe);
1912  if (eoe->queue_datagram) {
1913  sth_to_send = 1;
1914  }
1915  if (!ec_eoe_is_idle(eoe)) {
1916  all_idle = 0;
1917  }
1918  }
1919  }
1920 
1921  if (sth_to_send) {
1922  list_for_each_entry(eoe, &master->eoe_handlers, list) {
1923  ec_eoe_queue(eoe);
1924  }
1925  // (try to) send datagrams
1926  ec_lock_down(&master->io_sem);
1927  master->send_cb(master->cb_data);
1928  ec_lock_up(&master->io_sem);
1929  }
1930 
1931 schedule:
1932  if (all_idle) {
1933  set_current_state(TASK_INTERRUPTIBLE);
1934  schedule_timeout(1);
1935  } else {
1936  schedule();
1937  }
1938  }
1939 
1940  EC_MASTER_DBG(master, 1, "EoE thread exiting...\n");
1941  return 0;
1942 }
1943 
1944 #endif
1945 
1946 /*****************************************************************************/
1947 
1951  ec_master_t *master
1952  )
1953 {
1954  ec_slave_config_t *sc;
1955 
1956  list_for_each_entry(sc, &master->configs, list) {
1958  }
1959 }
1960 
1961 /*****************************************************************************/
1962 
1966  ec_master_t *master
1967  )
1968 {
1969  ec_slave_config_t *sc;
1970 
1971  list_for_each_entry(sc, &master->configs, list) {
1973  }
1974 }
1975 
1976 /*****************************************************************************/
1977 
1981 #define EC_FIND_SLAVE \
1982  do { \
1983  if (alias) { \
1984  for (; slave < master->slaves + master->slave_count; \
1985  slave++) { \
1986  if (slave->effective_alias == alias) \
1987  break; \
1988  } \
1989  if (slave == master->slaves + master->slave_count) \
1990  return NULL; \
1991  } \
1992  \
1993  slave += position; \
1994  if (slave < master->slaves + master->slave_count) { \
1995  return slave; \
1996  } else { \
1997  return NULL; \
1998  } \
1999  } while (0)
2000 
2006  ec_master_t *master,
2007  uint16_t alias,
2008  uint16_t position
2009  )
2010 {
2011  ec_slave_t *slave = master->slaves;
2012  EC_FIND_SLAVE;
2013 }
2014 
2022  const ec_master_t *master,
2023  uint16_t alias,
2024  uint16_t position
2025  )
2026 {
2027  const ec_slave_t *slave = master->slaves;
2028  EC_FIND_SLAVE;
2029 }
2030 
2031 /*****************************************************************************/
2032 
2038  const ec_master_t *master
2039  )
2040 {
2041  const ec_slave_config_t *sc;
2042  unsigned int count = 0;
2043 
2044  list_for_each_entry(sc, &master->configs, list) {
2045  count++;
2046  }
2047 
2048  return count;
2049 }
2050 
2051 /*****************************************************************************/
2052 
2056 #define EC_FIND_CONFIG \
2057  do { \
2058  list_for_each_entry(sc, &master->configs, list) { \
2059  if (pos--) \
2060  continue; \
2061  return sc; \
2062  } \
2063  return NULL; \
2064  } while (0)
2065 
2071  const ec_master_t *master,
2072  unsigned int pos
2073  )
2074 {
2075  ec_slave_config_t *sc;
2077 }
2078 
2086  const ec_master_t *master,
2087  unsigned int pos
2088  )
2089 {
2090  const ec_slave_config_t *sc;
2092 }
2093 
2094 /*****************************************************************************/
2095 
2101  const ec_master_t *master
2102  )
2103 {
2104  const ec_domain_t *domain;
2105  unsigned int count = 0;
2106 
2107  ec_lock_down(&master->domains_lock);
2108  list_for_each_entry(domain, &master->domains, list) {
2109  count++;
2110  }
2111  ec_lock_up(&master->domains_lock);
2112 
2113  return count;
2114 }
2115 
2116 /*****************************************************************************/
2117 
2121 #define EC_FIND_DOMAIN \
2122  do { \
2123  list_for_each_entry(domain, &master->domains, list) { \
2124  if (index--) \
2125  continue; \
2126  return domain; \
2127  } \
2128  \
2129  return NULL; \
2130  } while (0)
2131 
2137  ec_master_t *master,
2138  unsigned int index
2139  )
2140 {
2141  ec_domain_t *domain;
2143 }
2144 
2152  const ec_master_t *master,
2153  unsigned int index
2154  )
2155 {
2156  const ec_domain_t *domain;
2158 }
2159 
2160 /*****************************************************************************/
2161 
2162 #ifdef EC_EOE
2163 
2169  const ec_master_t *master
2170  )
2171 {
2172  const ec_eoe_t *eoe;
2173  unsigned int count = 0;
2174 
2175  list_for_each_entry(eoe, &master->eoe_handlers, list) {
2176  count++;
2177  }
2178 
2179  return count;
2180 }
2181 
2182 /*****************************************************************************/
2183 
2191  const ec_master_t *master,
2192  uint16_t index
2193  )
2194 {
2195  const ec_eoe_t *eoe;
2196 
2197  list_for_each_entry(eoe, &master->eoe_handlers, list) {
2198  if (index--)
2199  continue;
2200  return eoe;
2201  }
2202 
2203  return NULL;
2204 }
2205 
2206 #endif
2207 
2208 /*****************************************************************************/
2209 
2216  ec_master_t *master,
2217  unsigned int level
2218  )
2219 {
2220  if (level > 2) {
2221  EC_MASTER_ERR(master, "Invalid debug level %u!\n", level);
2222  return -EINVAL;
2223  }
2224 
2225  if (level != master->debug_level) {
2226  master->debug_level = level;
2227  EC_MASTER_INFO(master, "Master debug level set to %u.\n",
2228  master->debug_level);
2229  }
2230 
2231  return 0;
2232 }
2233 
2234 /*****************************************************************************/
2235 
2239  ec_master_t *master
2240  )
2241 {
2242  ec_slave_t *slave, *ref = NULL;
2243 
2244  if (master->dc_ref_config) {
2245  // Check application-selected reference clock
2246  slave = master->dc_ref_config->slave;
2247 
2248  if (slave) {
2249  if (slave->base_dc_supported && slave->has_dc_system_time) {
2250  ref = slave;
2251  EC_MASTER_INFO(master, "Using slave %u as application selected"
2252  " DC reference clock.\n", ref->ring_position);
2253  }
2254  else {
2255  EC_MASTER_WARN(master, "Application selected slave %u can not"
2256  " act as a DC reference clock!", slave->ring_position);
2257  }
2258  }
2259  else {
2260  EC_MASTER_WARN(master, "Application selected DC reference clock"
2261  " config (%u-%u) has no slave attached!\n",
2262  master->dc_ref_config->alias,
2263  master->dc_ref_config->position);
2264  }
2265  }
2266 
2267  if (!ref) {
2268  // Use first slave with DC support as reference clock
2269  for (slave = master->slaves;
2270  slave < master->slaves + master->slave_count;
2271  slave++) {
2272  if (slave->base_dc_supported && slave->has_dc_system_time) {
2273  ref = slave;
2274  break;
2275  }
2276  }
2277 
2278  }
2279 
2280  master->dc_ref_clock = ref;
2281 
2282  if (ref) {
2283  EC_MASTER_INFO(master, "Using slave %u as DC reference clock.\n",
2284  ref->ring_position);
2285  }
2286  else {
2287  EC_MASTER_INFO(master, "No DC reference clock found.\n");
2288  }
2289 
2290  // These calls always succeed, because the
2291  // datagrams have been pre-allocated.
2293  ref ? ref->station_address : 0xffff, 0x0910, 4);
2295  ref ? ref->station_address : 0xffff, 0x0910, 4);
2297  ref ? ref->station_address : 0xffff, 0x0910, 8);
2298 }
2299 
2300 /*****************************************************************************/
2301 
2307  ec_master_t *master,
2308  ec_slave_t *port0_slave,
2309  unsigned int *slave_position
2310  )
2311 {
2312  ec_slave_t *slave = master->slaves + *slave_position;
2313  unsigned int port_index;
2314  int ret;
2315 
2316  static const unsigned int next_table[EC_MAX_PORTS] = {
2317  3, 2, 0, 1
2318  };
2319 
2320  slave->ports[0].next_slave = port0_slave;
2321 
2322  port_index = 3;
2323  while (port_index != 0) {
2324  if (!slave->ports[port_index].link.loop_closed) {
2325  *slave_position = *slave_position + 1;
2326  if (*slave_position < master->slave_count) {
2327  slave->ports[port_index].next_slave =
2328  master->slaves + *slave_position;
2329  ret = ec_master_calc_topology_rec(master,
2330  slave, slave_position);
2331  if (ret) {
2332  return ret;
2333  }
2334  } else {
2335  return -1;
2336  }
2337  }
2338 
2339  port_index = next_table[port_index];
2340  }
2341 
2342  return 0;
2343 }
2344 
2345 /*****************************************************************************/
2346 
2350  ec_master_t *master
2351  )
2352 {
2353  unsigned int slave_position = 0;
2354 
2355  if (master->slave_count == 0)
2356  return;
2357 
2358  if (ec_master_calc_topology_rec(master, NULL, &slave_position))
2359  EC_MASTER_ERR(master, "Failed to calculate bus topology.\n");
2360 }
2361 
2362 /*****************************************************************************/
2363 
2367  ec_master_t *master
2368  )
2369 {
2370  ec_slave_t *slave;
2371 
2372  for (slave = master->slaves;
2373  slave < master->slaves + master->slave_count;
2374  slave++) {
2376  }
2377 
2378  if (master->dc_ref_clock) {
2379  uint32_t delay = 0;
2381  }
2382 }
2383 
2384 /*****************************************************************************/
2385 
2389  ec_master_t *master
2390  )
2391 {
2392  // find DC reference clock
2394 
2395  // calculate bus topology
2396  ec_master_calc_topology(master);
2397 
2399 }
2400 
2401 /*****************************************************************************/
2402 
2406  ec_master_t *master
2407  )
2408 {
2409  unsigned int i;
2410  ec_slave_t *slave;
2411 
2412  if (!master->active)
2413  return;
2414 
2415  EC_MASTER_DBG(master, 1, "Requesting OP...\n");
2416 
2417  // request OP for all configured slaves
2418  for (i = 0; i < master->slave_count; i++) {
2419  slave = master->slaves + i;
2420  if (slave->config) {
2422  }
2423  }
2424 
2425 #ifdef EC_REFCLKOP
2426  // always set DC reference clock to OP
2427  if (master->dc_ref_clock) {
2429  }
2430 #endif
2431 }
2432 
2433 /*****************************************************************************/
2434 
2435 int ec_master_dict_upload(ec_master_t *master, uint16_t slave_position)
2436 {
2437  ec_dict_request_t request;
2438  ec_slave_t *slave;
2439  int ret = 0;
2440 
2441  EC_MASTER_DBG(master, 1, "%s(master = 0x%p, slave_position = %u\n",
2442  __func__, master, slave_position);
2443 
2444  ec_dict_request_init(&request);
2445  ec_dict_request_read(&request);
2446 
2447  if (ec_lock_down_interruptible(&master->master_sem)) {
2448  return -EINTR;
2449  }
2450 
2451  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
2452  ec_lock_up(&master->master_sem);
2453  EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
2454  return -EINVAL;
2455  }
2456 
2457  EC_SLAVE_DBG(slave, 1, "Scheduling dictionary upload request.\n");
2458 
2459  // schedule request.
2460  list_add_tail(&request.list, &slave->dict_requests);
2461 
2462  ec_lock_up(&master->master_sem);
2463 
2464  // wait for processing through FSM
2465  if (wait_event_interruptible(master->request_queue,
2466  request.state != EC_INT_REQUEST_QUEUED)) {
2467  // interrupted by signal
2468  ec_lock_down(&master->master_sem);
2469  if (request.state == EC_INT_REQUEST_QUEUED) {
2470  list_del(&request.list);
2471  ec_lock_up(&master->master_sem);
2472  return -EINTR;
2473  }
2474  // request already processing: interrupt not possible.
2475  ec_lock_up(&master->master_sem);
2476  }
2477 
2478  // wait until master FSM has finished processing
2479  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
2480 
2481  if (request.state != EC_INT_REQUEST_SUCCESS) {
2482  ret = -EIO;
2483  }
2484  return ret;
2485 }
2486 
2487 /******************************************************************************
2488  * Application interface
2489  *****************************************************************************/
2490 
2496  ec_master_t *master
2497  )
2498 {
2499  ec_domain_t *domain, *last_domain;
2500  unsigned int index;
2501 
2502  EC_MASTER_DBG(master, 1, "ecrt_master_create_domain(master = 0x%p)\n",
2503  master);
2504 
2505  if (!(domain =
2506  (ec_domain_t *) kmalloc(sizeof(ec_domain_t), GFP_KERNEL))) {
2507  EC_MASTER_ERR(master, "Error allocating domain memory!\n");
2508  return ERR_PTR(-ENOMEM);
2509  }
2510 
2511  ec_lock_down(&master->domains_lock);
2512 
2513  if (list_empty(&master->domains)) {
2514  index = 0;
2515  } else {
2516  last_domain = list_entry(master->domains.prev, ec_domain_t, list);
2517  index = last_domain->index + 1;
2518  }
2519 
2520  ec_domain_init(domain, master, index);
2521  list_add_tail(&domain->list, &master->domains);
2522 
2523  ec_lock_up(&master->domains_lock);
2524 
2525  EC_MASTER_DBG(master, 1, "Created domain %u.\n", domain->index);
2526 
2527  return domain;
2528 }
2529 
2530 /*****************************************************************************/
2531 
2533  ec_master_t *master
2534  )
2535 {
2537  return IS_ERR(d) ? NULL : d;
2538 }
2539 
2540 /*****************************************************************************/
2541 
2543 {
2544  // not currently supported
2545  return -ENOMEM; // FIXME
2546 }
2547 
2548 /*****************************************************************************/
2549 
2551 {
2552  uint32_t domain_offset;
2553  ec_domain_t *domain;
2554  int ret;
2555 #ifdef EC_EOE
2556  int eoe_was_running;
2557 #endif
2558 
2559  EC_MASTER_DBG(master, 1, "ecrt_master_activate(master = 0x%p)\n", master);
2560 
2561  if (master->active) {
2562  EC_MASTER_WARN(master, "%s: Master already active!\n", __func__);
2563  return 0;
2564  }
2565 
2566  ec_lock_down(&master->domains_lock);
2567 
2568  // finish all domains
2569  domain_offset = 0;
2570  list_for_each_entry(domain, &master->domains, list) {
2571  ret = ec_domain_finish(domain, domain_offset);
2572  if (ret < 0) {
2573  ec_lock_up(&master->domains_lock);
2574  EC_MASTER_ERR(master, "Failed to finish domain 0x%p!\n", domain);
2575  return ret;
2576  }
2577  domain_offset += domain->data_size;
2578  }
2579 
2580  ec_lock_up(&master->domains_lock);
2581 
2582  // restart EoE process and master thread with new locking
2583 
2584  ec_master_thread_stop(master);
2585 #ifdef EC_EOE
2586  eoe_was_running = master->eoe_thread != NULL;
2587  ec_master_eoe_stop(master);
2588 #endif
2589 
2590  EC_MASTER_DBG(master, 1, "FSM datagram is %p.\n", &master->fsm_datagram);
2591 
2592  master->injection_seq_fsm = 0;
2593  master->injection_seq_rt = 0;
2594 
2595  master->send_cb = master->app_send_cb;
2596  master->receive_cb = master->app_receive_cb;
2597  master->cb_data = master->app_cb_data;
2598 
2599 #ifdef EC_EOE
2600  if (eoe_was_running) {
2601  ec_master_eoe_start(master);
2602  }
2603 #endif
2605  "EtherCAT-OP");
2606  if (ret < 0) {
2607  EC_MASTER_ERR(master, "Failed to start master thread!\n");
2608  return ret;
2609  }
2610 
2611  /* Allow scanning after a topology change. */
2612  master->allow_scan = 1;
2613 
2614  master->active = 1;
2615 
2616  // notify state machine, that the configuration shall now be applied
2617  master->config_changed = 1;
2618  master->dc_offset_valid = 0;
2619 
2620  return 0;
2621 }
2622 
2623 /*****************************************************************************/
2624 
2626 {
2627  ec_slave_t *slave;
2628  ec_slave_config_t *sc, *next;
2629 #ifdef EC_EOE
2630  ec_eoe_t *eoe;
2631 #endif
2632 
2633  EC_MASTER_DBG(master, 1, "%s(master = 0x%p)\n", __func__, master);
2634 
2635  if (!master->active) {
2636  EC_MASTER_WARN(master, "%s: Master not active.\n", __func__);
2637  return;
2638  }
2639 
2640 
2641  // clear dc settings on all slaves
2642  list_for_each_entry_safe(sc, next, &master->configs, list) {
2643  if (sc->dc_assign_activate) {
2644  ecrt_slave_config_dc(sc, 0x0000, 0, 0, 0, 0);
2645  }
2646  }
2647 
2648 
2649  for (slave = master->slaves;
2650  slave < master->slaves + master->slave_count;
2651  slave++) {
2652 
2653  // set states for all slaves
2655 
2656  // mark for reconfiguration, because the master could have no
2657  // possibility for a reconfiguration between two sequential operation
2658  // phases.
2659  slave->force_config = 1;
2660  }
2661 
2662 #ifdef EC_EOE
2663  // ... but leave EoE slaves in OP
2664  list_for_each_entry(eoe, &master->eoe_handlers, list) {
2665  if (ec_eoe_is_open(eoe))
2667  }
2668 #endif
2669 }
2670 
2671 /*****************************************************************************/
2672 
2674 {
2675  ec_slave_t *slave;
2676 #ifdef EC_EOE
2677  ec_eoe_t *eoe;
2678  int eoe_was_running;
2679 #endif
2680 
2681  EC_MASTER_DBG(master, 1, "%s(master = 0x%p)\n", __func__, master);
2682 
2683  if (!master->active) {
2684  EC_MASTER_WARN(master, "%s: Master not active.\n", __func__);
2685  ec_master_clear_config(master);
2686  return;
2687  }
2688 
2689  ec_master_thread_stop(master);
2690 #ifdef EC_EOE
2691  eoe_was_running = master->eoe_thread != NULL;
2692  ec_master_eoe_stop(master);
2693 #endif
2694 
2697  master->cb_data = master;
2698 
2699  ec_master_clear_config(master);
2700 
2701  for (slave = master->slaves;
2702  slave < master->slaves + master->slave_count;
2703  slave++) {
2704 
2705  // set states for all slaves
2707 
2708  // clear read_mbox_busy flag in case slave CoE FSM were interrupted
2709  ec_read_mbox_lock_clear(slave);
2710 
2711  // mark for reconfiguration, because the master could have no
2712  // possibility for a reconfiguration between two sequential operation
2713  // phases.
2714  slave->force_config = 1;
2715  }
2716 
2717 #ifdef EC_EOE
2718  // ... but leave EoE slaves in OP
2719  list_for_each_entry(eoe, &master->eoe_handlers, list) {
2720  if (ec_eoe_is_open(eoe))
2722  }
2723 #endif
2724 
2725  master->app_time = 0ULL;
2726  master->dc_ref_time = 0ULL;
2727  master->dc_offset_valid = 0;
2728 
2729  /* Disallow scanning to get into the same state like after a master
2730  * request (after ec_master_enter_operation_phase() is called). */
2731  master->allow_scan = 0;
2732 
2733  master->active = 0;
2734 
2735 #ifdef EC_EOE
2736  if (eoe_was_running) {
2737  ec_master_eoe_start(master);
2738  }
2739 #endif
2741  "EtherCAT-IDLE")) {
2742  EC_MASTER_WARN(master, "Failed to restart master thread!\n");
2743  }
2744 }
2745 
2746 /*****************************************************************************/
2747 
2749 {
2750  ec_datagram_t *datagram, *n;
2751  ec_device_index_t dev_idx;
2752  size_t sent_bytes = 0;
2753 
2754 
2755  if (master->injection_seq_rt != master->injection_seq_fsm) {
2756  // inject datagram produced by master FSM
2757  ec_master_queue_datagram(master, &master->fsm_datagram);
2758  master->injection_seq_rt = master->injection_seq_fsm;
2759  }
2760 
2762 
2763  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
2764  dev_idx++) {
2765  if (unlikely(!master->devices[dev_idx].link_state)) {
2766  // link is down, no datagram can be sent
2767  list_for_each_entry_safe(datagram, n,
2768  &master->datagram_queue, queue) {
2769  if (datagram->device_index == dev_idx) {
2770  datagram->state = EC_DATAGRAM_ERROR;
2771  list_del_init(&datagram->queue);
2772  }
2773  }
2774 
2775  if (!master->devices[dev_idx].dev) {
2776  continue;
2777  }
2778 
2779  // query link state
2780  ec_device_poll(&master->devices[dev_idx]);
2781 
2782  // clear frame statistics
2783  ec_device_clear_stats(&master->devices[dev_idx]);
2784  continue;
2785  }
2786 
2787  // send frames
2788  sent_bytes = max(sent_bytes,
2789  ec_master_send_datagrams(master, dev_idx));
2790  }
2791 
2792  return sent_bytes;
2793 }
2794 
2795 /*****************************************************************************/
2796 
2798 {
2799  unsigned int dev_idx;
2800  ec_datagram_t *datagram, *next;
2801 
2802  // receive datagrams
2803  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
2804  dev_idx++) {
2805  ec_device_poll(&master->devices[dev_idx]);
2806  }
2808 
2809  // dequeue all datagrams that timed out
2810  list_for_each_entry_safe(datagram, next, &master->datagram_queue, queue) {
2811  if (datagram->state != EC_DATAGRAM_SENT) continue;
2812 
2813 #ifdef EC_HAVE_CYCLES
2814  if (master->devices[EC_DEVICE_MAIN].cycles_poll -
2815  datagram->cycles_sent > timeout_cycles) {
2816 #else
2817  if (master->devices[EC_DEVICE_MAIN].jiffies_poll -
2818  datagram->jiffies_sent > timeout_jiffies) {
2819 #endif
2820  list_del_init(&datagram->queue);
2821  datagram->state = EC_DATAGRAM_TIMED_OUT;
2822  master->stats.timeouts++;
2823 
2824 #ifdef EC_RT_SYSLOG
2825  ec_master_output_stats(master);
2826 
2827  if (unlikely(master->debug_level > 0)) {
2828  unsigned int time_us;
2829 #ifdef EC_HAVE_CYCLES
2830  time_us = (unsigned int)
2831  (master->devices[EC_DEVICE_MAIN].cycles_poll -
2832  datagram->cycles_sent) * 1000 / cpu_khz;
2833 #else
2834  time_us = (unsigned int)
2835  ((master->devices[EC_DEVICE_MAIN].jiffies_poll -
2836  datagram->jiffies_sent) * 1000000 / HZ);
2837 #endif
2838  EC_MASTER_DBG(master, 0, "TIMED OUT datagram %p,"
2839  " index %02X waited %u us.\n",
2840  datagram, datagram->index, time_us);
2841  }
2842 #endif /* RT_SYSLOG */
2843  }
2844  }
2845 }
2846 
2847 /*****************************************************************************/
2848 
2850 {
2851  ec_datagram_t *datagram, *next;
2852 
2853  ec_lock_down(&master->ext_queue_sem);
2854  list_for_each_entry_safe(datagram, next, &master->ext_datagram_queue,
2855  queue) {
2856  list_del(&datagram->queue);
2857  ec_master_queue_datagram(master, datagram);
2858  }
2859  ec_lock_up(&master->ext_queue_sem);
2860 
2861  ecrt_master_send(master);
2862 }
2863 
2864 /*****************************************************************************/
2865 
2869  uint16_t alias, uint16_t position, uint32_t vendor_id,
2870  uint32_t product_code)
2871 {
2872  ec_slave_config_t *sc;
2873  unsigned int found = 0;
2874 
2875 
2876  EC_MASTER_DBG(master, 1, "ecrt_master_slave_config(master = 0x%p,"
2877  " alias = %u, position = %u, vendor_id = 0x%08x,"
2878  " product_code = 0x%08x)\n",
2879  master, alias, position, vendor_id, product_code);
2880 
2881  list_for_each_entry(sc, &master->configs, list) {
2882  if (sc->alias == alias && sc->position == position) {
2883  found = 1;
2884  break;
2885  }
2886  }
2887 
2888  if (found) { // config with same alias/position already existing
2889  if (sc->vendor_id != vendor_id || sc->product_code != product_code) {
2890  EC_MASTER_ERR(master, "Slave type mismatch. Slave was"
2891  " configured as 0x%08X/0x%08X before. Now configuring"
2892  " with 0x%08X/0x%08X.\n", sc->vendor_id, sc->product_code,
2893  vendor_id, product_code);
2894  return ERR_PTR(-ENOENT);
2895  }
2896  } else {
2897  EC_MASTER_DBG(master, 1, "Creating slave configuration for %u:%u,"
2898  " 0x%08X/0x%08X.\n",
2899  alias, position, vendor_id, product_code);
2900 
2901  if (!(sc = (ec_slave_config_t *) kmalloc(sizeof(ec_slave_config_t),
2902  GFP_KERNEL))) {
2903  EC_MASTER_ERR(master, "Failed to allocate memory"
2904  " for slave configuration.\n");
2905  return ERR_PTR(-ENOMEM);
2906  }
2907 
2908  ec_slave_config_init(sc, master,
2909  alias, position, vendor_id, product_code);
2910 
2911  ec_lock_down(&master->master_sem);
2912 
2913  // try to find the addressed slave
2916  list_add_tail(&sc->list, &master->configs);
2917 
2918  ec_lock_up(&master->master_sem);
2919  }
2920 
2921  return sc;
2922 }
2923 
2924 /*****************************************************************************/
2925 
2927  uint16_t alias, uint16_t position, uint32_t vendor_id,
2928  uint32_t product_code)
2929 {
2930  ec_slave_config_t *sc = ecrt_master_slave_config_err(master, alias,
2931  position, vendor_id, product_code);
2932  return IS_ERR(sc) ? NULL : sc;
2933 }
2934 
2935 /*****************************************************************************/
2936 
2938  ec_slave_config_t *sc)
2939 {
2940  master->dc_ref_config = sc;
2941 
2942  if (master->dc_ref_config) {
2943  EC_MASTER_INFO(master, "Application selected DC reference clock"
2944  " config (%u-%u) set by application.\n",
2945  master->dc_ref_config->alias,
2946  master->dc_ref_config->position);
2947  }
2948  else {
2949  EC_MASTER_INFO(master, "Application selected DC reference clock"
2950  " config cleared by application.\n");
2951  }
2952 
2953  // update dc datagrams
2955 
2956  return 0;
2957 }
2958 
2959 /*****************************************************************************/
2960 
2961 int ecrt_master(ec_master_t *master, ec_master_info_t *master_info)
2962 {
2963  EC_MASTER_DBG(master, 1, "ecrt_master(master = 0x%p,"
2964  " master_info = 0x%p)\n", master, master_info);
2965 
2966  master_info->slave_count = master->slave_count;
2967  master_info->link_up = master->devices[EC_DEVICE_MAIN].link_state;
2968  master_info->scan_busy = master->scan_busy;
2969  master_info->app_time = master->app_time;
2970  return 0;
2971 }
2972 
2973 /*****************************************************************************/
2974 
2975 int ecrt_master_get_slave(ec_master_t *master, uint16_t slave_position,
2976  ec_slave_info_t *slave_info)
2977 {
2978  const ec_slave_t *slave;
2979  unsigned int i;
2980  int ret = 0;
2981 
2982  if (ec_lock_down_interruptible(&master->master_sem)) {
2983  return -EINTR;
2984  }
2985 
2986  slave = ec_master_find_slave_const(master, 0, slave_position);
2987 
2988  if (slave == NULL) {
2989  ret = -ENOENT;
2990  goto out_get_slave;
2991  }
2992 
2993  slave_info->position = slave->ring_position;
2994  slave_info->vendor_id = slave->sii.vendor_id;
2995  slave_info->product_code = slave->sii.product_code;
2996  slave_info->revision_number = slave->sii.revision_number;
2997  slave_info->serial_number = slave->sii.serial_number;
2998  slave_info->alias = slave->effective_alias;
2999  slave_info->current_on_ebus = slave->sii.current_on_ebus;
3000 
3001  for (i = 0; i < EC_MAX_PORTS; i++) {
3002  slave_info->ports[i].desc = slave->ports[i].desc;
3003  slave_info->ports[i].link.link_up = slave->ports[i].link.link_up;
3004  slave_info->ports[i].link.loop_closed =
3005  slave->ports[i].link.loop_closed;
3006  slave_info->ports[i].link.signal_detected =
3007  slave->ports[i].link.signal_detected;
3008  slave_info->ports[i].receive_time = slave->ports[i].receive_time;
3009  if (slave->ports[i].next_slave) {
3010  slave_info->ports[i].next_slave =
3011  slave->ports[i].next_slave->ring_position;
3012  } else {
3013  slave_info->ports[i].next_slave = 0xffff;
3014  }
3015  slave_info->ports[i].delay_to_next_dc =
3016  slave->ports[i].delay_to_next_dc;
3017  }
3018 
3019  slave_info->al_state = slave->current_state;
3020  slave_info->error_flag = slave->error_flag;
3021  slave_info->sync_count = slave->sii.sync_count;
3022  slave_info->sdo_count = ec_slave_sdo_count(slave);
3023  if (slave->sii.name) {
3024  strncpy(slave_info->name, slave->sii.name, EC_MAX_STRING_LENGTH);
3025  } else {
3026  slave_info->name[0] = 0;
3027  }
3028 
3029 out_get_slave:
3030  ec_lock_up(&master->master_sem);
3031 
3032  return ret;
3033 }
3034 
3035 /*****************************************************************************/
3036 
3038  void (*send_cb)(void *), void (*receive_cb)(void *), void *cb_data)
3039 {
3040  EC_MASTER_DBG(master, 1, "ecrt_master_callbacks(master = 0x%p,"
3041  " send_cb = 0x%p, receive_cb = 0x%p, cb_data = 0x%p)\n",
3042  master, send_cb, receive_cb, cb_data);
3043 
3044  master->app_send_cb = send_cb;
3045  master->app_receive_cb = receive_cb;
3046  master->app_cb_data = cb_data;
3047 }
3048 
3049 /*****************************************************************************/
3050 
3052 {
3053  ec_device_index_t dev_idx;
3054 
3055  state->slaves_responding = 0U;
3056  state->al_states = 0;
3057  state->link_up = 0U;
3058 
3059  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
3060  dev_idx++) {
3061  /* Announce sum of responding slaves on all links. */
3062  state->slaves_responding += master->fsm.slaves_responding[dev_idx];
3063 
3064  /* Binary-or slave states of all links. */
3065  state->al_states |= master->fsm.slave_states[dev_idx];
3066 
3067  /* Signal link up if at least one device has link. */
3068  state->link_up |= master->devices[dev_idx].link_state;
3069  }
3070 }
3071 
3072 /*****************************************************************************/
3073 
3074 int ecrt_master_link_state(const ec_master_t *master, unsigned int dev_idx,
3075  ec_master_link_state_t *state)
3076 {
3077  if (dev_idx >= ec_master_num_devices(master)) {
3078  return -EINVAL;
3079  }
3080 
3081  state->slaves_responding = master->fsm.slaves_responding[dev_idx];
3082  state->al_states = master->fsm.slave_states[dev_idx];
3083  state->link_up = master->devices[dev_idx].link_state;
3084 
3085  return 0;
3086 }
3087 
3088 /*****************************************************************************/
3089 
3090 void ecrt_master_application_time(ec_master_t *master, uint64_t app_time)
3091 {
3092  master->app_time = app_time;
3093 
3094  if (unlikely(!master->dc_ref_time)) {
3095  master->dc_ref_time = app_time;
3096  }
3097 }
3098 
3099 /*****************************************************************************/
3100 
3101 int ecrt_master_reference_clock_time(ec_master_t *master, uint32_t *time)
3102 {
3103  if (!master->dc_ref_clock) {
3104  return -ENXIO;
3105  }
3106 
3107  if (master->sync_datagram.state != EC_DATAGRAM_RECEIVED) {
3108  return -EIO;
3109  }
3110 
3111  if (!master->dc_offset_valid) {
3112  return -EAGAIN;
3113  }
3114 
3115  // Get returned datagram time, transmission delay removed.
3116  *time = EC_READ_U32(master->sync_datagram.data) -
3118 
3119  return 0;
3120 }
3121 
3122 /*****************************************************************************/
3123 
3125 {
3126  if (master->dc_ref_clock && master->dc_offset_valid) {
3127  EC_WRITE_U32(master->ref_sync_datagram.data, master->app_time);
3128  ec_master_queue_datagram(master, &master->ref_sync_datagram);
3129  }
3130 }
3131 
3132 /*****************************************************************************/
3133 
3135  ec_master_t *master,
3136  uint64_t sync_time
3137  )
3138 {
3139  if (master->dc_ref_clock) {
3140  EC_WRITE_U32(master->ref_sync_datagram.data, sync_time);
3141  ec_master_queue_datagram(master, &master->ref_sync_datagram);
3142  }
3143 }
3144 
3145 /*****************************************************************************/
3146 
3148 {
3149  if (master->dc_ref_clock && master->dc_offset_valid) {
3150  ec_datagram_zero(&master->sync_datagram);
3151  ec_master_queue_datagram(master, &master->sync_datagram);
3152  }
3153 }
3154 
3155 /*****************************************************************************/
3156 
3158 {
3159  if (master->dc_ref_clock && master->dc_offset_valid) {
3161  ec_master_queue_datagram(master, &master->sync64_datagram);
3162  }
3163 }
3164 
3165 /*****************************************************************************/
3166 
3168 {
3169  if (!master->dc_ref_clock) {
3170  return -ENXIO;
3171  }
3172 
3173  if (master->sync64_datagram.state != EC_DATAGRAM_RECEIVED) {
3174  return -EIO;
3175  }
3176 
3177  if (!master->dc_offset_valid) {
3178  return -EAGAIN;
3179  }
3180 
3181  // Get returned datagram time, transmission delay removed.
3182  *time = EC_READ_U64(master->sync64_datagram.data) -
3184 
3185  return 0;
3186 }
3187 
3188 /*****************************************************************************/
3189 
3191 {
3193  ec_master_queue_datagram(master, &master->sync_mon_datagram);
3194 }
3195 
3196 /*****************************************************************************/
3197 
3199 {
3200  if (master->sync_mon_datagram.state == EC_DATAGRAM_RECEIVED) {
3201  return EC_READ_U32(master->sync_mon_datagram.data) & 0x7fffffff;
3202  } else {
3203  return 0xffffffff;
3204  }
3205 }
3206 
3207 /*****************************************************************************/
3208 
3209 int ecrt_master_sdo_download(ec_master_t *master, uint16_t slave_position,
3210  uint16_t index, uint8_t subindex, const uint8_t *data,
3211  size_t data_size, uint32_t *abort_code)
3212 {
3213  ec_sdo_request_t request;
3214  ec_slave_t *slave;
3215  int ret;
3216 
3217  EC_MASTER_DBG(master, 1, "%s(master = 0x%p,"
3218  " slave_position = %u, index = 0x%04X, subindex = 0x%02X,"
3219  " data = 0x%p, data_size = %zu, abort_code = 0x%p)\n",
3220  __func__, master, slave_position, index, subindex,
3221  data, data_size, abort_code);
3222 
3223  ec_sdo_request_init(&request);
3224  ecrt_sdo_request_index(&request, index, subindex);
3225  ret = ec_sdo_request_alloc(&request, data_size);
3226  if (ret) {
3227  ec_sdo_request_clear(&request);
3228  return ret;
3229  }
3230 
3231  memcpy(request.data, data, data_size);
3232  request.data_size = data_size;
3233  ecrt_sdo_request_write(&request);
3234 
3235  if (ec_lock_down_interruptible(&master->master_sem)) {
3236  ec_sdo_request_clear(&request);
3237  return -EINTR;
3238  }
3239 
3240  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
3241  ec_lock_up(&master->master_sem);
3242  EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
3243  ec_sdo_request_clear(&request);
3244  return -EINVAL;
3245  }
3246 
3247  EC_SLAVE_DBG(slave, 1, "Scheduling SDO download request.\n");
3248 
3249  // schedule request.
3250  list_add_tail(&request.list, &slave->sdo_requests);
3251 
3252  ec_lock_up(&master->master_sem);
3253 
3254  // wait for processing through FSM
3255  if (wait_event_interruptible(master->request_queue,
3256  request.state != EC_INT_REQUEST_QUEUED)) {
3257  // interrupted by signal
3258  ec_lock_down(&master->master_sem);
3259  if (request.state == EC_INT_REQUEST_QUEUED) {
3260  list_del(&request.list);
3261  ec_lock_up(&master->master_sem);
3262  ec_sdo_request_clear(&request);
3263  return -EINTR;
3264  }
3265  // request already processing: interrupt not possible.
3266  ec_lock_up(&master->master_sem);
3267  }
3268 
3269  // wait until master FSM has finished processing
3270  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
3271 
3272  *abort_code = request.abort_code;
3273 
3274  if (request.state == EC_INT_REQUEST_SUCCESS) {
3275  ret = 0;
3276  } else if (request.errno) {
3277  ret = -request.errno;
3278  } else {
3279  ret = -EIO;
3280  }
3281 
3282  ec_sdo_request_clear(&request);
3283  return ret;
3284 }
3285 
3286 /*****************************************************************************/
3287 
3289  uint16_t slave_position, uint16_t index, const uint8_t *data,
3290  size_t data_size, uint32_t *abort_code)
3291 {
3292  ec_sdo_request_t request;
3293  ec_slave_t *slave;
3294  int ret;
3295 
3296  EC_MASTER_DBG(master, 1, "%s(master = 0x%p,"
3297  " slave_position = %u, index = 0x%04X,"
3298  " data = 0x%p, data_size = %zu, abort_code = 0x%p)\n",
3299  __func__, master, slave_position, index, data, data_size,
3300  abort_code);
3301 
3302  ec_sdo_request_init(&request);
3303  ecrt_sdo_request_index(&request, index, 0);
3304  ret = ec_sdo_request_alloc(&request, data_size);
3305  if (ret) {
3306  ec_sdo_request_clear(&request);
3307  return ret;
3308  }
3309 
3310  request.complete_access = 1;
3311  memcpy(request.data, data, data_size);
3312  request.data_size = data_size;
3313  ecrt_sdo_request_write(&request);
3314 
3315  if (ec_lock_down_interruptible(&master->master_sem)) {
3316  ec_sdo_request_clear(&request);
3317  return -EINTR;
3318  }
3319 
3320  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
3321  ec_lock_up(&master->master_sem);
3322  EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
3323  ec_sdo_request_clear(&request);
3324  return -EINVAL;
3325  }
3326 
3327  EC_SLAVE_DBG(slave, 1, "Scheduling SDO download request"
3328  " (complete access).\n");
3329 
3330  // schedule request.
3331  list_add_tail(&request.list, &slave->sdo_requests);
3332 
3333  ec_lock_up(&master->master_sem);
3334 
3335  // wait for processing through FSM
3336  if (wait_event_interruptible(master->request_queue,
3337  request.state != EC_INT_REQUEST_QUEUED)) {
3338  // interrupted by signal
3339  ec_lock_down(&master->master_sem);
3340  if (request.state == EC_INT_REQUEST_QUEUED) {
3341  list_del(&request.list);
3342  ec_lock_up(&master->master_sem);
3343  ec_sdo_request_clear(&request);
3344  return -EINTR;
3345  }
3346  // request already processing: interrupt not possible.
3347  ec_lock_up(&master->master_sem);
3348  }
3349 
3350  // wait until master FSM has finished processing
3351  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
3352 
3353  *abort_code = request.abort_code;
3354 
3355  if (request.state == EC_INT_REQUEST_SUCCESS) {
3356  ret = 0;
3357  } else if (request.errno) {
3358  ret = -request.errno;
3359  } else {
3360  ret = -EIO;
3361  }
3362 
3363  ec_sdo_request_clear(&request);
3364  return ret;
3365 }
3366 
3367 /*****************************************************************************/
3368 
3369 int ecrt_master_sdo_upload(ec_master_t *master, uint16_t slave_position,
3370  uint16_t index, uint8_t subindex, uint8_t *target,
3371  size_t target_size, size_t *result_size, uint32_t *abort_code)
3372 {
3373  ec_sdo_request_t request;
3374  ec_slave_t *slave;
3375  int ret = 0;
3376 
3377  EC_MASTER_DBG(master, 1, "%s(master = 0x%p,"
3378  " slave_position = %u, index = 0x%04X, subindex = 0x%02X,"
3379  " target = 0x%p, target_size = %zu, result_size = 0x%p,"
3380  " abort_code = 0x%p)\n",
3381  __func__, master, slave_position, index, subindex,
3382  target, target_size, result_size, abort_code);
3383 
3384  ec_sdo_request_init(&request);
3385  ecrt_sdo_request_index(&request, index, subindex);
3386  ecrt_sdo_request_read(&request);
3387 
3388  if (ec_lock_down_interruptible(&master->master_sem)) {
3389  ec_sdo_request_clear(&request);
3390  return -EINTR;
3391  }
3392 
3393  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
3394  ec_lock_up(&master->master_sem);
3395  ec_sdo_request_clear(&request);
3396  EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
3397  return -EINVAL;
3398  }
3399 
3400  EC_SLAVE_DBG(slave, 1, "Scheduling SDO upload request.\n");
3401 
3402  // schedule request.
3403  list_add_tail(&request.list, &slave->sdo_requests);
3404 
3405  ec_lock_up(&master->master_sem);
3406 
3407  // wait for processing through FSM
3408  if (wait_event_interruptible(master->request_queue,
3409  request.state != EC_INT_REQUEST_QUEUED)) {
3410  // interrupted by signal
3411  ec_lock_down(&master->master_sem);
3412  if (request.state == EC_INT_REQUEST_QUEUED) {
3413  list_del(&request.list);
3414  ec_lock_up(&master->master_sem);
3415  ec_sdo_request_clear(&request);
3416  return -EINTR;
3417  }
3418  // request already processing: interrupt not possible.
3419  ec_lock_up(&master->master_sem);
3420  }
3421 
3422  // wait until master FSM has finished processing
3423  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
3424 
3425  *abort_code = request.abort_code;
3426 
3427  if (request.state != EC_INT_REQUEST_SUCCESS) {
3428  *result_size = 0;
3429  if (request.errno) {
3430  ret = -request.errno;
3431  } else {
3432  ret = -EIO;
3433  }
3434  } else {
3435  if (request.data_size > target_size) {
3436  EC_SLAVE_ERR(slave, "%s(): Buffer too small.\n", __func__);
3437  ret = -EOVERFLOW;
3438  }
3439  else {
3440  memcpy(target, request.data, request.data_size);
3441  *result_size = request.data_size;
3442  ret = 0;
3443  }
3444  }
3445 
3446  ec_sdo_request_clear(&request);
3447  return ret;
3448 }
3449 
3450 /*****************************************************************************/
3451 
3452 int ecrt_master_write_idn(ec_master_t *master, uint16_t slave_position,
3453  uint8_t drive_no, uint16_t idn, uint8_t *data, size_t data_size,
3454  uint16_t *error_code)
3455 {
3456  ec_soe_request_t request;
3457  ec_slave_t *slave;
3458  int ret;
3459 
3460  if (drive_no > 7) {
3461  EC_MASTER_ERR(master, "Invalid drive number!\n");
3462  return -EINVAL;
3463  }
3464 
3465  ec_soe_request_init(&request);
3466  ec_soe_request_set_drive_no(&request, drive_no);
3467  ec_soe_request_set_idn(&request, idn);
3468 
3469  ret = ec_soe_request_alloc(&request, data_size);
3470  if (ret) {
3471  ec_soe_request_clear(&request);
3472  return ret;
3473  }
3474 
3475  memcpy(request.data, data, data_size);
3476  request.data_size = data_size;
3477  ec_soe_request_write(&request);
3478 
3479  if (ec_lock_down_interruptible(&master->master_sem)) {
3480  ec_soe_request_clear(&request);
3481  return -EINTR;
3482  }
3483 
3484  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
3485  ec_lock_up(&master->master_sem);
3486  EC_MASTER_ERR(master, "Slave %u does not exist!\n",
3487  slave_position);
3488  ec_soe_request_clear(&request);
3489  return -EINVAL;
3490  }
3491 
3492  EC_SLAVE_DBG(slave, 1, "Scheduling SoE write request.\n");
3493 
3494  // schedule SoE write request.
3495  list_add_tail(&request.list, &slave->soe_requests);
3496 
3497  ec_lock_up(&master->master_sem);
3498 
3499  // wait for processing through FSM
3500  if (wait_event_interruptible(master->request_queue,
3501  request.state != EC_INT_REQUEST_QUEUED)) {
3502  // interrupted by signal
3503  ec_lock_down(&master->master_sem);
3504  if (request.state == EC_INT_REQUEST_QUEUED) {
3505  // abort request
3506  list_del(&request.list);
3507  ec_lock_up(&master->master_sem);
3508  ec_soe_request_clear(&request);
3509  return -EINTR;
3510  }
3511  ec_lock_up(&master->master_sem);
3512  }
3513 
3514  // wait until master FSM has finished processing
3515  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
3516 
3517  if (error_code) {
3518  *error_code = request.error_code;
3519  }
3520  ret = request.state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO;
3521  ec_soe_request_clear(&request);
3522 
3523  return ret;
3524 }
3525 
3526 /*****************************************************************************/
3527 
3528 int ecrt_master_read_idn(ec_master_t *master, uint16_t slave_position,
3529  uint8_t drive_no, uint16_t idn, uint8_t *target, size_t target_size,
3530  size_t *result_size, uint16_t *error_code)
3531 {
3532  ec_soe_request_t request;
3533  ec_slave_t *slave;
3534  int ret;
3535 
3536  if (drive_no > 7) {
3537  EC_MASTER_ERR(master, "Invalid drive number!\n");
3538  return -EINVAL;
3539  }
3540 
3541  ec_soe_request_init(&request);
3542  ec_soe_request_set_drive_no(&request, drive_no);
3543  ec_soe_request_set_idn(&request, idn);
3544  ec_soe_request_read(&request);
3545 
3546  if (ec_lock_down_interruptible(&master->master_sem)) {
3547  ec_soe_request_clear(&request);
3548  return -EINTR;
3549  }
3550 
3551  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
3552  ec_lock_up(&master->master_sem);
3553  ec_soe_request_clear(&request);
3554  EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
3555  return -EINVAL;
3556  }
3557 
3558  EC_SLAVE_DBG(slave, 1, "Scheduling SoE read request.\n");
3559 
3560  // schedule request.
3561  list_add_tail(&request.list, &slave->soe_requests);
3562 
3563  ec_lock_up(&master->master_sem);
3564 
3565  // wait for processing through FSM
3566  if (wait_event_interruptible(master->request_queue,
3567  request.state != EC_INT_REQUEST_QUEUED)) {
3568  // interrupted by signal
3569  ec_lock_down(&master->master_sem);
3570  if (request.state == EC_INT_REQUEST_QUEUED) {
3571  list_del(&request.list);
3572  ec_lock_up(&master->master_sem);
3573  ec_soe_request_clear(&request);
3574  return -EINTR;
3575  }
3576  // request already processing: interrupt not possible.
3577  ec_lock_up(&master->master_sem);
3578  }
3579 
3580  // wait until master FSM has finished processing
3581  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
3582 
3583  if (error_code) {
3584  *error_code = request.error_code;
3585  }
3586 
3587  if (request.state != EC_INT_REQUEST_SUCCESS) {
3588  if (result_size) {
3589  *result_size = 0;
3590  }
3591  ret = -EIO;
3592  } else { // success
3593  if (request.data_size > target_size) {
3594  EC_SLAVE_ERR(slave, "%s(): Buffer too small.\n", __func__);
3595  ret = -EOVERFLOW;
3596  }
3597  else { // data fits in buffer
3598  if (result_size) {
3599  *result_size = request.data_size;
3600  }
3601  memcpy(target, request.data, request.data_size);
3602  ret = 0;
3603  }
3604  }
3605 
3606  ec_soe_request_clear(&request);
3607  return ret;
3608 }
3609 
3610 /*****************************************************************************/
3611 
3613 {
3614  ec_slave_config_t *sc;
3615 
3616  list_for_each_entry(sc, &master->configs, list) {
3617  if (sc->slave) {
3619  }
3620  }
3621 }
3622 
3623 /*****************************************************************************/
3624 
3627 EXPORT_SYMBOL(ecrt_master_create_domain);
3628 EXPORT_SYMBOL(ecrt_master_setup_domain_memory);
3629 EXPORT_SYMBOL(ecrt_master_activate);
3630 EXPORT_SYMBOL(ecrt_master_deactivate_slaves);
3631 EXPORT_SYMBOL(ecrt_master_deactivate);
3632 EXPORT_SYMBOL(ecrt_master_send);
3633 EXPORT_SYMBOL(ecrt_master_send_ext);
3634 EXPORT_SYMBOL(ecrt_master_receive);
3635 EXPORT_SYMBOL(ecrt_master_callbacks);
3636 EXPORT_SYMBOL(ecrt_master);
3637 EXPORT_SYMBOL(ecrt_master_get_slave);
3638 EXPORT_SYMBOL(ecrt_master_slave_config);
3639 EXPORT_SYMBOL(ecrt_master_select_reference_clock);
3640 EXPORT_SYMBOL(ecrt_master_state);
3641 EXPORT_SYMBOL(ecrt_master_link_state);
3642 EXPORT_SYMBOL(ecrt_master_application_time);
3643 EXPORT_SYMBOL(ecrt_master_sync_reference_clock);
3645 EXPORT_SYMBOL(ecrt_master_sync_slave_clocks);
3646 EXPORT_SYMBOL(ecrt_master_reference_clock_time);
3649 EXPORT_SYMBOL(ecrt_master_sync_monitor_queue);
3650 EXPORT_SYMBOL(ecrt_master_sync_monitor_process);
3651 EXPORT_SYMBOL(ecrt_master_sdo_download);
3652 EXPORT_SYMBOL(ecrt_master_sdo_download_complete);
3653 EXPORT_SYMBOL(ecrt_master_sdo_upload);
3654 EXPORT_SYMBOL(ecrt_master_write_idn);
3655 EXPORT_SYMBOL(ecrt_master_read_idn);
3656 EXPORT_SYMBOL(ecrt_master_reset);
3657 
3660 /*****************************************************************************/
uint8_t * data
Mailbox response data.
Definition: datagram.h:123
ec_lock_t ext_queue_sem
Semaphore protecting the ext_datagram_queue.
Definition: master.h:268
void ec_eoe_queue(ec_eoe_t *eoe)
Queues the datagram, if necessary.
Definition: ethernet.c:460
ec_mbox_data_t mbox_eoe_frag_data
Received mailbox data for EoE, type frame fragment.
Definition: slave.h:265
unsigned int injection_seq_fsm
Datagram injection sequence number for the FSM side.
Definition: master.h:221
uint32_t serial_number
Serial-Number stored on the slave.
Definition: ecrt.h:387
#define EC_IO_TIMEOUT
Datagram timeout in microseconds.
Definition: globals.h:38
ec_slave_port_desc_t desc
Physical port type.
Definition: ecrt.h:391
unsigned int reserved
True, if the master is in use.
Definition: master.h:191
struct list_head ext_datagram_queue
Queue for non-application datagrams.
Definition: master.h:266
int ec_mac_is_zero(const uint8_t *)
Definition: module.c:267
uint16_t ring_position
Ring position.
Definition: slave.h:206
uint32_t revision_number
Revision number.
Definition: slave.h:160
unsigned long jiffies_sent
Jiffies, when the datagram was sent.
Definition: datagram.h:105
void ec_master_clear_config(ec_master_t *master)
Clear the configuration applied by the application.
Definition: master.c:551
#define EC_ADDR_LEN
Size of the EtherCAT address field.
Definition: globals.h:76
uint16_t ec_slave_sdo_count(const ec_slave_t *slave)
Get the number of SDOs in the dictionary.
Definition: slave.c:828
void ec_soe_request_set_idn(ec_soe_request_t *req, uint16_t idn)
Set IDN.
Definition: soe_request.c:117
int ec_rtdm_dev_init(ec_rtdm_dev_t *rtdm_dev, ec_master_t *master)
Initialize an RTDM device.
Definition: rtdm.c:69
#define EC_DATAGRAM_NAME_SIZE
Size of the datagram description string.
Definition: globals.h:110
ec_sii_t sii
Extracted SII data.
Definition: slave.h:246
uint32_t ecrt_master_sync_monitor_process(ec_master_t *master)
Processes the DC synchrony monitoring datagram.
Definition: master.c:3198
size_t data_size
Size of the data in data.
Definition: datagram.h:98
uint8_t * data
Pointer to SDO data.
Definition: soe_request.h:53
void ec_slave_config_init(ec_slave_config_t *sc, ec_master_t *master, uint16_t alias, uint16_t position, uint32_t vendor_id, uint32_t product_code)
Slave configuration constructor.
Definition: slave_config.c:56
uint8_t sync_count
Number of sync managers.
Definition: ecrt.h:401
void ec_master_calc_dc(ec_master_t *master)
Distributed-clocks calculations.
Definition: master.c:2388
unsigned int fsm_exec_count
Number of entries in execution list.
Definition: master.h:283
u64 last_loss
Tx/Rx difference of last statistics cycle.
Definition: master.h:161
u64 tx_count
Number of frames sent.
Definition: master.h:151
const unsigned int rate_intervals[]
List of intervals for statistics [s].
Definition: master.c:100
uint8_t error_flag
Error flag for that slave.
Definition: ecrt.h:400
void ec_master_clear(ec_master_t *master)
Destructor.
Definition: master.c:408
struct list_head list
List item.
Definition: soe_request.h:49
struct list_head sii_requests
SII write requests.
Definition: master.h:304
void ecrt_master_sync_slave_clocks(ec_master_t *master)
Queues the DC clock drift compensation datagram for sending.
Definition: master.c:3147
#define EC_SLAVE_DBG(slave, level, fmt, args...)
Convenience macro for printing slave-specific debug messages to syslog.
Definition: slave.h:107
size_t data_size
Size of the process data.
Definition: domain.h:62
ec_mbox_data_t mbox_eoe_init_data
Received mailbox data for EoE, type eoe init reponse.
Definition: slave.h:266
unsigned long jiffies_poll
jiffies of last poll
Definition: device.h:97
ec_slave_t * slave
pointer to the corresponding slave
Definition: ethernet.h:87
void ec_master_queue_datagram_ext(ec_master_t *master, ec_datagram_t *datagram)
Places a datagram in the non-application datagram queue.
Definition: master.c:982
uint64_t app_time_sent
App time, when the datagram was sent.
Definition: datagram.h:106
OP (mailbox communication and input/output update)
Definition: globals.h:138
s32 tx_byte_rates[EC_RATE_COUNT]
Transmit rates in byte/s for different statistics cycle periods.
Definition: master.h:168
uint16_t configured_tx_mailbox_offset
Configured send mailbox offset.
Definition: slave.h:222
ec_internal_request_state_t state
State of the request.
Definition: fsm_master.h:59
ec_slave_config_t * ec_master_get_config(const ec_master_t *master, unsigned int pos)
Get a slave configuration via its position in the list.
Definition: master.c:2070
unsigned int slaves_responding[EC_MAX_NUM_DEVICES]
Number of responding slaves for every device.
Definition: fsm_master.h:80
int ecrt_master_link_state(const ec_master_t *master, unsigned int dev_idx, ec_master_link_state_t *state)
Reads the current state of a redundant link.
Definition: master.c:3074
ec_slave_port_t ports[EC_MAX_PORTS]
Ports.
Definition: slave.h:210
void ecrt_master_application_time(ec_master_t *master, uint64_t app_time)
Sets the application time.
Definition: master.c:3090
void ec_fsm_master_reset(ec_fsm_master_t *fsm)
Reset state machine.
Definition: fsm_master.c:131
void ec_master_request_op(ec_master_t *master)
Request OP state for configured slaves.
Definition: master.c:2405
static int ec_master_eoe_thread(void *)
Does the Ethernet over EtherCAT processing.
Definition: master.c:1878
int ec_fsm_slave_is_ready(const ec_fsm_slave_t *fsm)
Returns, if the FSM is currently not busy and ready to execute.
Definition: fsm_slave.c:186
CANopen SDO request.
Definition: sdo_request.h:48
unsigned int slave_count
Number of slaves in the bus.
Definition: ecrt.h:347
ec_slave_state_t current_state
Current application state.
Definition: slave.h:215
void ec_master_leave_operation_phase(ec_master_t *master)
Transition function from OPERATION to IDLE phase.
Definition: master.c:775
#define ec_master_num_devices(MASTER)
Number of Ethernet devices.
Definition: master.h:327
#define EC_RATE_COUNT
Number of statistic rate intervals to maintain.
Definition: globals.h:60
ec_datagram_t sync_mon_datagram
Datagram used for DC synchronisation monitoring.
Definition: master.h:243
EtherCAT slave structure.
ec_internal_request_state_t state
SDO request state.
Definition: sdo_request.h:63
uint32_t vendor_id
Vendor-ID stored on the slave.
Definition: ecrt.h:384
void ec_device_clear(ec_device_t *device)
Destructor.
Definition: device.c:162
struct list_head list
List item.
Definition: domain.h:57
ec_mbox_data_t mbox_foe_data
Received mailbox data for FoE.
Definition: slave.h:269
struct list_head eoe_handlers
Ethernet over EtherCAT handlers.
Definition: master.h:292
uint32_t product_code
Slave product code.
Definition: slave_config.h:127
ec_slave_port_link_t link
Port link state.
Definition: ecrt.h:392
int ec_master_thread_start(ec_master_t *master, int(*thread_func)(void *), const char *name)
Starts the master thread.
Definition: master.c:592
Operation phase.
Definition: master.h:130
dev_t device_number
Device number for master cdevs.
Definition: module.c:66
ec_slave_port_link_t link
Port link status.
Definition: slave.h:139
unsigned int allow_scan
True, if slave scanning is allowed.
Definition: master.h:250
size_t max_queue_size
Maximum size of datagram queue.
Definition: master.h:279
void ec_master_internal_receive_cb(void *cb_data)
Internal receiving callback.
Definition: master.c:577
uint16_t position
Index after alias.
Definition: slave_config.h:124
static int ec_master_operation_thread(void *)
Master kernel thread function for OPERATION phase.
Definition: master.c:1759
void ec_soe_request_read(ec_soe_request_t *req)
Request a read operation.
Definition: soe_request.c:232
const ec_slave_t * ec_master_find_slave_const(const ec_master_t *master, uint16_t alias, uint16_t position)
Finds a slave in the bus, given the alias and position.
Definition: master.c:2021
#define EC_FRAME_HEADER_SIZE
Size of an EtherCAT frame header.
Definition: globals.h:67
void ecrt_master_callbacks(ec_master_t *master, void(*send_cb)(void *), void(*receive_cb)(void *), void *cb_data)
Sets the locking callbacks.
Definition: master.c:3037
EtherCAT datagram.
Definition: datagram.h:88
struct list_head list
List item.
Definition: slave_config.h:120
uint32_t serial_number
Serial number.
Definition: slave.h:161
int ecrt_master_get_slave(ec_master_t *master, uint16_t slave_position, ec_slave_info_t *slave_info)
Obtains slave information.
Definition: master.c:2975
struct list_head fsm_exec_list
Slave FSM execution list.
Definition: master.h:282
void ec_master_expire_slave_config_requests(ec_master_t *master)
Abort active requests for slave configs without attached slaves.
Definition: master.c:1965
const ec_domain_t * ec_master_find_domain_const(const ec_master_t *master, unsigned int index)
Get a domain via its position in the list.
Definition: master.c:2151
const ec_eoe_t * ec_master_get_eoe_handler_const(const ec_master_t *master, uint16_t index)
Get an EoE handler via its position in the list.
Definition: master.c:2190
#define EC_WRITE_U8(DATA, VAL)
Write an 8-bit unsigned value to EtherCAT data.
Definition: ecrt.h:2338
uint32_t abort_code
SDO request abort code.
Definition: sdo_request.h:68
u64 dc_ref_time
Common reference timestamp for DC start times.
Definition: master.h:235
ec_slave_state_t slave_states[EC_MAX_NUM_DEVICES]
AL states of responding slaves for every device.
Definition: fsm_master.h:84
struct list_head emerg_reg_requests
Emergency register access requests.
Definition: master.h:305
ec_internal_request_state_t state
Request state.
Definition: soe_request.h:58
char name[EC_DATAGRAM_NAME_SIZE]
Description of the datagram.
Definition: datagram.h:114
uint16_t alias
Slave alias.
Definition: slave_config.h:123
void ec_device_update_stats(ec_device_t *device)
Update device statistics.
Definition: device.c:496
struct list_head domains
List of domains.
Definition: master.h:231
Finite state machine of an EtherCAT slave.
Definition: fsm_slave.h:59
ec_datagram_t * datagram
Previous state datagram.
Definition: fsm_slave.h:64
uint32_t delay_to_next_dc
Delay [ns] to next DC slave.
Definition: ecrt.h:397
ec_fsm_slave_t fsm
Slave state machine.
Definition: slave.h:259
#define EC_FIND_CONFIG
Common implementation for ec_master_get_config() and ec_master_get_config_const().
Definition: master.c:2056
uint16_t error_code
SoE error code.
Definition: soe_request.h:61
void ecrt_master_send_ext(ec_master_t *master)
Sends non-application datagrams.
Definition: master.c:2849
uint16_t working_counter
Working counter.
Definition: datagram.h:100
ec_domain_t * ecrt_master_create_domain(ec_master_t *master)
Creates a new process data domain.
Definition: master.c:2532
uint8_t * data
Pointer to SDO data.
Definition: sdo_request.h:52
unsigned long jiffies
Jiffies of last statistic cycle.
Definition: master.h:174
int16_t current_on_ebus
Power consumption in mA.
Definition: slave.h:185
ec_slave_t * ec_master_find_slave(ec_master_t *master, uint16_t alias, uint16_t position)
Finds a slave in the bus, given the alias and position.
Definition: master.c:2005
ec_lock_t domains_lock
Lock for access to domains list.
Definition: master.h:232
uint8_t link_state
device link state
Definition: device.h:88
int ecrt_master_setup_domain_memory(ec_master_t *master)
setup the domain&#39;s process data memory.
Definition: master.c:2542
static unsigned int debug_level
Debug level parameter.
Definition: module.c:61
u64 last_rx_count
Number of frames received of last statistics cycle.
Definition: master.h:154
const uint8_t * macs[EC_MAX_NUM_DEVICES]
Device MAC addresses.
Definition: master.h:207
Sent (still in the queue).
Definition: datagram.h:77
unsigned int slaves_responding
Sum of responding slaves on all Ethernet devices.
Definition: ecrt.h:277
void ecrt_master_state(const ec_master_t *master, ec_master_state_t *state)
Reads the current master state.
Definition: master.c:3051
Configured Address Physical Read.
Definition: datagram.h:55
wait_queue_head_t request_queue
Wait queue for external requests from user space.
Definition: master.h:308
void ecrt_master_sync_reference_clock_to(ec_master_t *master, uint64_t sync_time)
Queues the DC reference clock drift compensation datagram for sending.
Definition: master.c:3134
uint16_t station_address
Configured station address.
Definition: slave.h:207
unsigned int sync_count
Number of sync managers.
Definition: slave.h:189
struct list_head list
List head.
Definition: fsm_master.h:54
SII write request.
Definition: fsm_master.h:53
void ec_slave_clear(ec_slave_t *slave)
Slave destructor.
Definition: slave.c:224
ec_domain_t * ecrt_master_create_domain_err(ec_master_t *master)
Same as ecrt_master_create_domain(), but with ERR_PTR() return value.
Definition: master.c:2495
unsigned int link_up
true, if the network link is up.
Definition: ecrt.h:348
void ec_datagram_output_stats(ec_datagram_t *datagram)
Outputs datagram statistics at most every second.
Definition: datagram.c:626
int ec_master_enter_idle_phase(ec_master_t *master)
Transition function from ORPHANED to IDLE phase.
Definition: master.c:647
ec_datagram_type_t type
Datagram type (APRD, BWR, etc.).
Definition: datagram.h:93
const ec_slave_config_t * ec_master_get_config_const(const ec_master_t *master, unsigned int pos)
Get a slave configuration via its position in the list.
Definition: master.c:2085
void ecrt_slave_config_dc(ec_slave_config_t *sc, uint16_t assign_activate, uint32_t sync0_cycle_time, int32_t sync0_shift_time, uint32_t sync1_cycle_time, int32_t sync1_shift_time)
Configure distributed clocks.
struct ec_slave_info_t::@6 ports[EC_MAX_PORTS]
Port information.
Global definitions and macros.
uint32_t revision_number
Revision-Number stored on the slave.
Definition: ecrt.h:386
Logical Write.
Definition: datagram.h:62
EtherCAT master structure.
int ecrt_master_64bit_reference_clock_time(ec_master_t *master, uint64_t *time)
Get the 64 bit DC reference slave clock time.
Definition: master.c:3167
void * cb_data
Current callback data.
Definition: master.h:297
SAFEOP (mailbox communication and input update)
Definition: globals.h:136
void ec_device_send(ec_device_t *device, size_t size)
Sends the content of the transmit socket buffer.
Definition: device.c:331
ec_lock_t config_sem
Semaphore protecting the config_busy variable and the allow_config flag.
Definition: master.h:257
void ec_fsm_master_init(ec_fsm_master_t *fsm, ec_master_t *master, ec_datagram_t *datagram)
Constructor.
Definition: fsm_master.c:86
Initial state of a new datagram.
Definition: datagram.h:75
#define EC_MASTER_DBG(master, level, fmt, args...)
Convenience macro for printing master-specific debug messages to syslog.
Definition: master.h:106
ec_slave_t * fsm_slave
Slave that is queried next for FSM exec.
Definition: master.h:281
unsigned int send_interval
Interval between two calls to ecrt_master_send().
Definition: master.h:277
ec_slave_t * slave
EtherCAT slave.
Definition: fsm_master.h:55
EtherCAT slave.
Definition: slave.h:199
uint8_t datagram_index
Current datagram index.
Definition: master.h:263
ec_lock_t device_sem
Device semaphore.
Definition: master.h:213
void ec_master_attach_slave_configs(ec_master_t *master)
Attaches the slave configurations to the slaves.
Definition: master.c:1950
struct list_head datagram_queue
Datagram queue.
Definition: master.h:262
ec_slave_t * slave
slave the FSM runs on
Definition: fsm_slave.h:60
void ecrt_sdo_request_read(ec_sdo_request_t *req)
Schedule an SDO read operation.
Definition: sdo_request.c:224
char name[EC_MAX_STRING_LENGTH]
Name of the slave.
Definition: ecrt.h:403
void ec_sdo_request_clear(ec_sdo_request_t *req)
SDO request destructor.
Definition: sdo_request.c:76
struct task_struct * eoe_thread
EoE thread.
Definition: master.h:291
struct list_head sdo_requests
SDO access requests.
Definition: slave.h:252
Master state.
Definition: ecrt.h:276
unsigned int unmatched
unmatched datagrams (received, but not queued any longer)
Definition: master.h:141
unsigned int ext_ring_idx_fsm
Index in external datagram ring for FSM side.
Definition: master.h:275
void ec_datagram_zero(ec_datagram_t *datagram)
Fills the datagram payload memory with zeros.
Definition: datagram.c:179
#define EC_TX_RING_SIZE
Size of the transmit ring.
Definition: device.h:51
int ec_master_debug_level(ec_master_t *master, unsigned int level)
Set the debug level.
Definition: master.c:2215
s32 tx_frame_rates[EC_RATE_COUNT]
Transmit rates in frames/s for different statistics cycle periods.
Definition: master.h:162
u8 dc_offset_valid
DC slaves have valid system time offsets.
Definition: master.h:236
uint64_t app_time
Application time.
Definition: ecrt.h:350
s32 rx_byte_rates[EC_RATE_COUNT]
Receive rates in byte/s for different statistics cycle periods.
Definition: master.h:170
Ethernet over EtherCAT (EoE)
struct list_head soe_requests
SoE requests.
Definition: slave.h:255
#define EC_DATAGRAM_HEADER_SIZE
Size of an EtherCAT datagram header.
Definition: globals.h:70
ec_datagram_state_t state
State.
Definition: datagram.h:101
ec_device_stats_t device_stats
Device statistics.
Definition: master.h:214
ec_datagram_t fsm_datagram
Datagram used for state machines.
Definition: master.h:217
ec_slave_config_t * config
Current configuration.
Definition: slave.h:213
ec_master_phase_t phase
Master phase.
Definition: master.h:218
#define EC_WRITE_U32(DATA, VAL)
Write a 32-bit unsigned value to EtherCAT data.
Definition: ecrt.h:2372
ec_slave_t * slaves
Array of slaves on the bus.
Definition: master.h:226
void ec_master_clear_device_stats(ec_master_t *)
Clears the common device statistics.
Definition: master.c:1440
void ec_domain_clear(ec_domain_t *domain)
Domain destructor.
Definition: domain.c:98
void ec_soe_request_set_drive_no(ec_soe_request_t *req, uint8_t drive_no)
Set drive number.
Definition: soe_request.c:105
void ec_slave_calc_port_delays(ec_slave_t *slave)
Calculates the port transmission delays.
Definition: slave.c:1044
int ec_domain_finish(ec_domain_t *domain, uint32_t base_address)
Finishes a domain.
Definition: domain.c:315
static unsigned long ext_injection_timeout_jiffies
Timeout for external datagram injection [jiffies].
Definition: master.c:94
int ec_eoe_is_idle(const ec_eoe_t *eoe)
Returns the idle state.
Definition: ethernet.c:486
EtherCAT device.
Definition: device.h:81
ec_domain_t * ec_master_find_domain(ec_master_t *master, unsigned int index)
Get a domain via its position in the list.
Definition: master.c:2136
size_t data_size
Size of SDO data.
Definition: soe_request.h:55
ec_datagram_t sync64_datagram
Datagram used to retrieve 64bit ref slave system clock time.
Definition: master.h:241
unsigned int timeouts
datagram timeouts
Definition: master.h:139
ec_sdo_request_t * sdo_request
SDO request to process.
Definition: fsm_master.h:90
unsigned int debug_level
Master debug level.
Definition: master.h:285
int ec_datagram_frmw(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT FRMW datagram.
Definition: datagram.c:349
#define EC_SLAVE_ERR(slave, fmt, args...)
Convenience macro for printing slave-specific errors to syslog.
Definition: slave.h:77
unsigned int ec_master_domain_count(const ec_master_t *master)
Get the number of domains.
Definition: master.c:2100
Orphaned phase.
Definition: master.h:126
s32 loss_rates[EC_RATE_COUNT]
Frame loss rates for different statistics cycle periods.
Definition: master.h:172
unsigned int corrupted
corrupted frames
Definition: master.h:140
u64 last_tx_count
Number of frames sent of last statistics cycle.
Definition: master.h:152
uint32_t transmission_delay
DC system time transmission delay (offset from reference clock).
Definition: slave.h:238
int ecrt_master_select_reference_clock(ec_master_t *master, ec_slave_config_t *sc)
Selects the reference clock for distributed clocks.
Definition: master.c:2937
void ec_master_exec_slave_fsms(ec_master_t *master)
Execute slave FSMs.
Definition: master.c:1599
void ec_soe_request_clear(ec_soe_request_t *req)
SoE request destructor.
Definition: soe_request.c:77
unsigned int ext_ring_idx_rt
Index in external datagram ring for RT side.
Definition: master.h:273
unsigned int slave_count
Number of slaves on the bus.
Definition: master.h:227
unsigned int scan_busy
Current scan state.
Definition: master.h:249
ec_device_index_t
Master devices.
Definition: globals.h:204
void(* receive_cb)(void *)
Current receive datagrams callback.
Definition: master.h:296
uint16_t dc_assign_activate
Vendor-specific AssignActivate word.
Definition: slave_config.h:143
s32 rx_frame_rates[EC_RATE_COUNT]
Receive rates in frames/s for different statistics cycle periods.
Definition: master.h:165
#define EC_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
Definition: ecrt.h:2355
unsigned int index
Index (just a number).
Definition: domain.h:59
void ec_slave_calc_transmission_delays_rec(ec_slave_t *slave, uint32_t *delay)
Recursively calculates transmission delays.
Definition: slave.c:1090
void ec_master_leave_idle_phase(ec_master_t *master)
Transition function from IDLE to ORPHANED phase.
Definition: master.c:680
Main device.
Definition: globals.h:205
EoE Init, Set IP Parameter Request.
Definition: ethernet.h:56
unsigned int skip_count
Number of requeues when not yet received.
Definition: datagram.h:112
int ec_master_init(ec_master_t *master, unsigned int index, const uint8_t *main_mac, const uint8_t *backup_mac, dev_t device_number, struct class *class, unsigned int debug_level)
Master constructor.
Definition: master.c:142
#define EC_READ_U32(DATA)
Read a 32-bit unsigned value from EtherCAT data.
Definition: ecrt.h:2266
int ec_device_init(ec_device_t *device, ec_master_t *master)
Constructor.
Definition: device.c:63
ec_slave_port_desc_t desc
Port descriptors.
Definition: slave.h:138
#define EC_MASTER_WARN(master, fmt, args...)
Convenience macro for printing master-specific warnings to syslog.
Definition: master.h:92
int ec_fsm_slave_exec(ec_fsm_slave_t *fsm, ec_datagram_t *datagram)
Executes the current state of the state machine.
Definition: fsm_slave.c:145
unsigned int active
Master has been activated.
Definition: master.h:219
struct list_head sent
Master list item for sent datagrams.
Definition: datagram.h:90
int errno
Error number.
Definition: sdo_request.h:67
int ec_datagram_brd(ec_datagram_t *datagram, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT BRD datagram.
Definition: datagram.c:374
int ec_datagram_fpwr(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT FPWR datagram.
Definition: datagram.c:299
int ec_master_enter_operation_phase(ec_master_t *master)
Transition function from IDLE to OPERATION phase.
Definition: master.c:704
int ecrt_master_sdo_upload(ec_master_t *master, uint16_t slave_position, uint16_t index, uint8_t subindex, uint8_t *target, size_t target_size, size_t *result_size, uint32_t *abort_code)
Executes an SDO upload request to read data from a slave.
Definition: master.c:3369
uint8_t has_dc_system_time
The slave supports the DC system time register.
Definition: slave.h:235
wait_queue_head_t scan_queue
Queue for processes that wait for slave scanning.
Definition: master.h:253
ec_datagram_t sync_datagram
Datagram used for DC drift compensation.
Definition: master.h:239
#define EC_MASTER_ERR(master, fmt, args...)
Convenience macro for printing master-specific errors to syslog.
Definition: master.h:80
struct device * class_device
Master class device.
Definition: master.h:195
int ec_datagram_fprd(ec_datagram_t *datagram, uint16_t configured_address, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT FPRD datagram.
Definition: datagram.c:274
EtherCAT datagram structure.
void ec_master_queue_datagram(ec_master_t *master, ec_datagram_t *datagram)
Places a datagram in the datagram queue.
Definition: master.c:947
int ec_slave_config_attach(ec_slave_config_t *sc)
Attaches the configuration to the addressed slave object.
Definition: slave_config.c:250
Broadcast Write.
Definition: datagram.h:59
CANopen dictionary request.
Definition: dict_request.h:48
static int ec_master_idle_thread(void *)
Master kernel thread function for IDLE phase.
Definition: master.c:1693
struct list_head configs
List of slave configurations.
Definition: master.h:230
ec_slave_t * slave
Slave pointer.
Definition: slave_config.h:136
ec_slave_config_t * dc_ref_config
Application-selected DC reference clock slave config.
Definition: master.h:245
ec_device_index_t device_index
Device via which the datagram shall be / was sent.
Definition: datagram.h:91
int ec_soe_request_alloc(ec_soe_request_t *req, size_t size)
Pre-allocates the data memory.
Definition: soe_request.c:150
void ecrt_master_reset(ec_master_t *master)
Retry configuring slaves.
Definition: master.c:3612
int ec_fsm_master_idle(const ec_fsm_master_t *fsm)
Definition: fsm_master.c:179
void ec_master_clear_slaves(ec_master_t *master)
Clear all slaves.
Definition: master.c:492
Slave information.
Definition: ecrt.h:382
void ecrt_master_sync_monitor_queue(ec_master_t *master)
Queues the DC synchrony monitoring datagram for sending.
Definition: master.c:3190
struct list_head list
list item
Definition: ethernet.h:86
void ecrt_master_deactivate_slaves(ec_master_t *master)
Deactivates the slaves distributed clocks and sends the slaves into PREOP.
Definition: master.c:2625
struct list_head list
List item.
Definition: dict_request.h:49
Device statistics.
Definition: master.h:150
uint8_t * ec_device_tx_data(ec_device_t *device)
Returns a pointer to the device&#39;s transmit memory.
Definition: device.c:312
u64 last_rx_bytes
Number of bytes received of last statistics cycle.
Definition: master.h:159
ec_rtdm_dev_t rtdm_dev
RTDM device.
Definition: master.h:201
unsigned long output_jiffies
time of last output
Definition: master.h:143
ec_stats_t stats
Cyclic statistics.
Definition: master.h:286
void ec_print_data(const uint8_t *, size_t)
Outputs frame contents for debugging purposes.
Definition: module.c:345
void ec_read_mbox_lock_clear(ec_slave_t *slave)
Clears the mailbox lock.
Definition: slave.c:190
uint8_t valid_mbox_data
Received mailbox data is valid.
Definition: slave.h:273
Idle phase.
Definition: master.h:128
int ec_datagram_prealloc(ec_datagram_t *datagram, size_t size)
Allocates internal payload memory.
Definition: datagram.c:151
uint16_t effective_alias
Effective alias address.
Definition: slave.h:208
void ec_master_calc_transmission_delays(ec_master_t *master)
Calculates the bus transmission delays.
Definition: master.c:2366
void ec_master_clear_eoe_handlers(ec_master_t *master)
Clear and free all EoE handlers.
Definition: master.c:456
uint8_t al_state
Current state of the slave.
Definition: ecrt.h:399
size_t data_size
Size of SDO data.
Definition: sdo_request.h:54
ec_lock_t master_sem
Master semaphore.
Definition: master.h:204
ec_slave_config_t * ecrt_master_slave_config(ec_master_t *master, uint16_t alias, uint16_t position, uint32_t vendor_id, uint32_t product_code)
Obtains a slave configuration.
Definition: master.c:2926
uint8_t scan_busy
true, while the master is scanning the bus
Definition: ecrt.h:349
int ecrt_master_read_idn(ec_master_t *master, uint16_t slave_position, uint8_t drive_no, uint16_t idn, uint8_t *target, size_t target_size, size_t *result_size, uint16_t *error_code)
Executes an SoE read request.
Definition: master.c:3528
#define EC_READ_U16(DATA)
Read a 16-bit unsigned value from EtherCAT data.
Definition: ecrt.h:2250
void ec_master_eoe_start(ec_master_t *master)
Starts Ethernet over EtherCAT processing on demand.
Definition: master.c:1828
u64 tx_bytes
Number of bytes sent.
Definition: master.h:156
void(* app_send_cb)(void *)
Application&#39;s send datagrams callback.
Definition: master.h:298
size_t ec_master_send_datagrams(ec_master_t *master, ec_device_index_t device_index)
Sends the datagrams in the queue for a certain device.
Definition: master.c:1006
void * app_cb_data
Application callback data.
Definition: master.h:302
int ecrt_master_activate(ec_master_t *master)
Finishes the configuration phase and prepares for cyclic operation.
Definition: master.c:2550
uint16_t ec_master_eoe_handler_count(const ec_master_t *master)
Get the number of EoE handlers.
Definition: master.c:2168
int16_t current_on_ebus
Used current in mA.
Definition: ecrt.h:389
Mailbox functionality.
void ec_master_clear_slave_configs(ec_master_t *)
Clear all slave configurations.
Definition: master.c:474
void ec_master_clear_domains(ec_master_t *)
Clear all domains.
Definition: master.c:534
size_t ecrt_master_send(ec_master_t *master)
Sends all datagrams in the queue.
Definition: master.c:2748
struct list_head list
Used for execution list.
Definition: fsm_slave.h:61
void ec_master_thread_stop(ec_master_t *master)
Stops the master thread.
Definition: master.c:615
void ec_sdo_request_init(ec_sdo_request_t *req)
SDO request constructor.
Definition: sdo_request.c:56
#define EC_MAX_PORTS
Maximum number of slave ports.
Definition: ecrt.h:227
#define EC_SDO_INJECTION_TIMEOUT
SDO injection timeout in microseconds.
Definition: master.c:74
ec_datagram_t * ec_master_get_external_datagram(ec_master_t *master)
Searches for a free datagram in the external datagram ring.
Definition: master.c:928
ec_datagram_t ext_datagram_ring[EC_EXT_RING_SIZE]
External datagram ring.
Definition: master.h:271
uint16_t sdo_count
Number of SDOs.
Definition: ecrt.h:402
struct list_head list
List item.
Definition: sdo_request.h:49
#define EC_MAX_STRING_LENGTH
Maximum string length.
Definition: ecrt.h:224
void ec_datagram_init(ec_datagram_t *datagram)
Constructor.
Definition: datagram.c:88
static unsigned long timeout_jiffies
Frame timeout in jiffies.
Definition: master.c:90
int ecrt_master_sdo_download(ec_master_t *master, uint16_t slave_position, uint16_t index, uint8_t subindex, const uint8_t *data, size_t data_size, uint32_t *abort_code)
Executes an SDO download request to write data to a slave.
Definition: master.c:3209
void ec_rtdm_dev_clear(ec_rtdm_dev_t *rtdm_dev)
Clear an RTDM device.
Definition: rtdm.c:118
void ec_cdev_clear(ec_cdev_t *cdev)
Destructor.
Definition: cdev.c:142
ec_slave_t * next_slave
Connected slaves.
Definition: slave.h:140
void ec_master_update_device_stats(ec_master_t *)
Updates the common device statistics.
Definition: master.c:1472
Queued for sending.
Definition: datagram.h:76
unsigned int link_up
true, if at least one Ethernet link is up.
Definition: ecrt.h:288
uint32_t vendor_id
Slave vendor ID.
Definition: slave_config.h:126
uint32_t receive_time
Port receive times for delay measurement.
Definition: slave.h:141
Timed out (dequeued).
Definition: datagram.h:79
wait_queue_head_t config_queue
Queue for processes that wait for slave configuration.
Definition: master.h:259
#define EC_EXT_RING_SIZE
Size of the external datagram ring.
Definition: master.h:119
void ec_master_internal_send_cb(void *cb_data)
Internal sending callback.
Definition: master.c:565
int ec_master_calc_topology_rec(ec_master_t *master, ec_slave_t *port0_slave, unsigned int *slave_position)
Calculates the bus topology; recursion function.
Definition: master.c:2306
uint16_t next_slave
Ring position of next DC slave on that port.
Definition: ecrt.h:395
void ec_master_calc_topology(ec_master_t *master)
Calculates the bus topology.
Definition: master.c:2349
u64 app_time
Time of the last ecrt_master_sync() call.
Definition: master.h:234
void ec_slave_request_state(ec_slave_t *slave, ec_slave_state_t state)
Request a slave state and resets the error flag.
Definition: slave.c:418
ec_mbox_data_t mbox_voe_data
Received mailbox data for VoE.
Definition: slave.h:271
ec_datagram_t ref_sync_datagram
Datagram used for synchronizing the reference clock to the master clock.
Definition: master.h:237
void ec_master_output_stats(ec_master_t *master)
Output master statistics.
Definition: master.c:1409
uint8_t base_dc_supported
Distributed clocks are supported.
Definition: slave.h:233
#define EC_FIND_DOMAIN
Common implementation for ec_master_find_domain() and ec_master_find_domain_const().
Definition: master.c:2121
u64 rx_count
Number of frames received.
Definition: master.h:153
void ecrt_master_deactivate(ec_master_t *master)
Deactivates the master.
Definition: master.c:2673
unsigned int al_states
Application-layer states of all slaves.
Definition: ecrt.h:279
uint8_t * data
Datagram payload.
Definition: datagram.h:95
#define EC_FIND_SLAVE
Common implementation for ec_master_find_slave() and ec_master_find_slave_const().
Definition: master.c:1981
#define EC_BYTE_TRANSMISSION_TIME_NS
Time to send a byte in nanoseconds.
Definition: globals.h:44
uint16_t alias
The slaves alias if not equal to 0.
Definition: ecrt.h:388
int ecrt_master(ec_master_t *master, ec_master_info_t *master_info)
Obtains master information.
Definition: master.c:2961
void ec_eoe_run(ec_eoe_t *eoe)
Runs the EoE state machine.
Definition: ethernet.c:430
#define EC_READ_U8(DATA)
Read an 8-bit unsigned value from EtherCAT data.
Definition: ecrt.h:2234
void ec_dict_request_init(ec_dict_request_t *req)
Dictionary request constructor.
Definition: dict_request.c:43
int ecrt_master_write_idn(ec_master_t *master, uint16_t slave_position, uint8_t drive_no, uint16_t idn, uint8_t *data, size_t data_size, uint16_t *error_code)
Executes an SoE write request.
Definition: master.c:3452
struct list_head dict_requests
Dictionary read requests.
Definition: slave.h:257
EtherCAT slave configuration.
Definition: slave_config.h:119
struct list_head queue
Master datagram queue item.
Definition: datagram.h:89
uint32_t product_code
Product-Code stored on the slave.
Definition: ecrt.h:385
EtherCAT device structure.
void(* app_receive_cb)(void *)
Application&#39;s receive datagrams callback.
Definition: master.h:300
void ec_soe_request_write(ec_soe_request_t *req)
Request a write operation.
Definition: soe_request.c:245
struct net_device * dev
pointer to the assigned net_device
Definition: device.h:84
int ec_fsm_master_exec(ec_fsm_master_t *fsm)
Executes the current state of the state machine.
Definition: fsm_master.c:160
void ec_soe_request_init(ec_soe_request_t *req)
SoE request constructor.
Definition: soe_request.c:56
EtherCAT slave configuration structure.
ec_slave_config_t * ecrt_master_slave_config_err(ec_master_t *master, uint16_t alias, uint16_t position, uint32_t vendor_id, uint32_t product_code)
Same as ecrt_master_slave_config(), but with ERR_PTR() return value.
Definition: master.c:2868
void ec_device_poll(ec_device_t *device)
Calls the poll function of the assigned net_device.
Definition: device.c:478
void ec_eoe_clear(ec_eoe_t *eoe)
EoE destructor.
Definition: ethernet.c:311
int ecrt_master_reference_clock_time(ec_master_t *master, uint32_t *time)
Get the lower 32 bit of the reference clock system time.
Definition: master.c:3101
Unused and should not be queued (dequeued).
Definition: datagram.h:81
Master information.
Definition: ecrt.h:346
unsigned int index
Index.
Definition: master.h:190
unsigned int ec_master_config_count(const ec_master_t *master)
Get the number of slave configurations provided by the application.
Definition: master.c:2037
void ecrt_master_64bit_reference_clock_time_queue(ec_master_t *master)
Queues the 64 bit DC reference slave clock time value datagram for sending.
Definition: master.c:3157
Error while sending/receiving (dequeued).
Definition: datagram.h:80
Auto Increment Physical Write.
Definition: datagram.h:53
uint8_t address[EC_ADDR_LEN]
Recipient address.
Definition: datagram.h:94
u64 last_tx_bytes
Number of bytes sent of last statistics cycle.
Definition: master.h:157
int ec_sdo_request_alloc(ec_sdo_request_t *req, size_t size)
Pre-allocates the data memory.
Definition: sdo_request.c:127
uint32_t product_code
Vendor-specific product code.
Definition: slave.h:159
void ec_domain_init(ec_domain_t *domain, ec_master_t *master, unsigned int index)
Domain constructor.
Definition: domain.c:63
PREOP state (mailbox communication, no IO)
Definition: globals.h:132
int ecrt_master_sdo_download_complete(ec_master_t *master, uint16_t slave_position, uint16_t index, const uint8_t *data, size_t data_size, uint32_t *abort_code)
Executes an SDO download request to write data to a slave via complete access.
Definition: master.c:3288
void ec_slave_config_clear(ec_slave_config_t *sc)
Slave configuration destructor.
Definition: slave_config.c:105
Backup device.
Definition: globals.h:206
Received (dequeued).
Definition: datagram.h:78
Ethernet over EtherCAT (EoE) handler.
Definition: ethernet.h:84
ec_fsm_master_t fsm
Master state machine.
Definition: master.h:216
ec_cdev_t cdev
Master character device.
Definition: master.h:193
u64 rx_bytes
Number of bytes received.
Definition: master.h:158
#define EC_DATAGRAM_FOOTER_SIZE
Size of an EtherCAT datagram footer.
Definition: globals.h:73
#define EC_MASTER_INFO(master, fmt, args...)
Convenience macro for printing master-specific information to syslog.
Definition: master.h:68
unsigned int error_flag
Stop processing after an error.
Definition: slave.h:216
uint16_t position
Offset of the slave in the ring.
Definition: ecrt.h:383
uint32_t receive_time
Receive time on DC transmission delay measurement.
Definition: ecrt.h:393
unsigned int config_changed
The configuration changed.
Definition: master.h:220
EtherCAT master.
Definition: master.h:189
unsigned int injection_seq_rt
Datagram injection sequence number for the realtime side.
Definition: master.h:223
void ec_master_receive_datagrams(ec_master_t *master, ec_device_t *device, const uint8_t *frame_data, size_t size)
Processes a received frame.
Definition: master.c:1160
Configured Address Physical Write.
Definition: datagram.h:56
#define FORCE_OUTPUT_CORRUPTED
Always output corrupted frames.
Definition: master.c:71
#define EC_READ_U64(DATA)
Read a 64-bit unsigned value from EtherCAT data.
Definition: ecrt.h:2282
uint8_t index
Index (set by master).
Definition: datagram.h:99
void ecrt_master_sync_reference_clock(ec_master_t *master)
Queues the DC reference clock drift compensation datagram for sending.
Definition: master.c:3124
ec_device_t devices[EC_MAX_NUM_DEVICES]
EtherCAT devices.
Definition: master.h:206
void ec_slave_config_load_default_sync_config(ec_slave_config_t *sc)
Loads the default PDO assignment from the slave object.
Definition: slave_config.c:337
ec_lock_t scan_sem
Semaphore protecting the scan_busy variable and the allow_scan flag.
Definition: master.h:251
unsigned int config_busy
State of slave configuration.
Definition: master.h:256
void ecrt_sdo_request_write(ec_sdo_request_t *req)
Schedule an SDO write operation.
Definition: sdo_request.c:235
void ec_master_inject_external_datagrams(ec_master_t *master)
Injects external datagrams that fit into the datagram queue.
Definition: master.c:797
ec_lock_t io_sem
Semaphore protecting the datagram_queue.
Definition: master.h:264
void ec_fsm_master_clear(ec_fsm_master_t *fsm)
Destructor.
Definition: fsm_master.c:113
int ec_eoe_is_open(const ec_eoe_t *eoe)
Returns the state of the device.
Definition: ethernet.c:474
void ec_device_clear_stats(ec_device_t *device)
Clears the frame statistics.
Definition: device.c:374
char * name
Slave name.
Definition: slave.h:181
void ec_master_set_send_interval(ec_master_t *master, unsigned int send_interval)
Sets the expected interval between calls to ecrt_master_send and calculates the maximum amount of dat...
Definition: master.c:911
unsigned long jiffies_received
Jiffies, when the datagram was received.
Definition: datagram.h:110
ec_mbox_data_t mbox_coe_data
Received mailbox data for CoE.
Definition: slave.h:268
void ec_slave_config_expire_disconnected_requests(ec_slave_config_t *sc)
Expires any requests that have been started on a detached slave.
Definition: slave_config.c:614
EtherCAT domain.
Definition: domain.h:55
ec_mbox_data_t mbox_soe_data
Received mailbox data for SoE.
Definition: slave.h:270
size_t payload_size
Size of the mailbox response payload data.
Definition: datagram.h:125
void ec_master_eoe_stop(ec_master_t *master)
Stops the Ethernet over EtherCAT processing.
Definition: master.c:1863
void(* send_cb)(void *)
Current send datagrams callback.
Definition: master.h:295
uint32_t vendor_id
Vendor ID.
Definition: slave.h:158
uint8_t complete_access
SDO shall be transferred completely.
Definition: sdo_request.h:55
void ec_master_find_dc_ref_clock(ec_master_t *)
Finds the DC reference clock.
Definition: master.c:2238
uint32_t delay_to_next_dc
Delay to next slave with DC support behind this port [ns].
Definition: slave.h:143
struct task_struct * thread
Master thread.
Definition: master.h:288
unsigned int queue_datagram
the datagram is ready for queuing
Definition: ethernet.h:89
void ecrt_sdo_request_index(ec_sdo_request_t *req, uint16_t index, uint8_t subindex)
Set the SDO index and subindex.
Definition: sdo_request.c:187
ec_slave_t * dc_ref_clock
DC reference clock slave.
Definition: master.h:247
int ec_cdev_init(ec_cdev_t *cdev, ec_master_t *master, dev_t dev_num)
Constructor.
Definition: cdev.c:116
unsigned int force_config
Force (re-)configuration.
Definition: slave.h:217
void ecrt_master_receive(ec_master_t *master)
Fetches received frames from the hardware and processes the datagrams.
Definition: master.c:2797
#define EC_MAX_DATA_SIZE
Resulting maximum data size of a single datagram in a frame.
Definition: globals.h:84
Sercos-over-EtherCAT request.
Definition: soe_request.h:48
void ec_master_init_static(void)
Static variables initializer.
Definition: master.c:121
ec_internal_request_state_t state
SDO request state.
Definition: dict_request.h:50
void ec_datagram_clear(ec_datagram_t *datagram)
Destructor.
Definition: datagram.c:119