IgH EtherCAT Master  1.6.5
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  * vim: expandtab
21  *
22  ****************************************************************************/
23 
29 /****************************************************************************/
30 
31 #include <linux/module.h>
32 #include <linux/kernel.h>
33 #include <linux/string.h>
34 #include <linux/slab.h>
35 #include <linux/delay.h>
36 #include <linux/device.h>
37 #include <linux/version.h>
38 #include <linux/hrtimer.h>
39 #include <linux/kthread.h>
40 
41 #include "globals.h"
42 #include "slave.h"
43 #include "slave_config.h"
44 #include "device.h"
45 #include "datagram.h"
46 
47 #ifdef EC_EOE
48 #if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 11, 0)
49 #include <uapi/linux/sched/types.h> // struct sched_param
50 #include <linux/sched/types.h> // sched_setscheduler
51 #endif
52 #include "ethernet.h"
53 #endif
54 
55 #if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0) || \
56  (defined(CONFIG_PREEMPT_RT_FULL) && LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0))
57 # define ec_rt_lock_interruptible(lock) \
58  rt_mutex_lock_interruptible(lock)
59 #else
60 # define ec_rt_lock_interruptible(lock) \
61  rt_mutex_lock_interruptible(lock, 0)
62 #endif
63 
64 #include "master.h"
65 
66 /****************************************************************************/
67 
70 #define DEBUG_INJECT 0
71 
74 #define FORCE_OUTPUT_CORRUPTED 0
75 
77 #define EC_SDO_INJECTION_TIMEOUT 10000
78 
79 #ifdef EC_HAVE_CYCLES
80 
83 static cycles_t timeout_cycles;
84 
87 static cycles_t ext_injection_timeout_cycles;
88 
89 #else
90 
93 static unsigned long timeout_jiffies;
94 
97 static unsigned long ext_injection_timeout_jiffies;
98 
99 #endif
100 
103 const unsigned int rate_intervals[] = {
104  1, 10, 60
105 };
106 
107 /****************************************************************************/
108 
112 int ec_master_thread_start(ec_master_t *, int (*)(void *), const char *);
118 int ec_master_calc_topology_rec(ec_master_t *, ec_slave_t *, unsigned int *);
121 static int ec_master_idle_thread(void *);
122 static int ec_master_operation_thread(void *);
123 #ifdef EC_EOE
124 static int ec_master_eoe_thread(void *);
125 #endif
129 void ec_master_nanosleep(const unsigned long);
130 static void sc_reset_task_kicker(struct irq_work *work);
131 static void sc_reset_task(struct work_struct *work);
132 
133 /****************************************************************************/
134 
138 {
139 #ifdef EC_HAVE_CYCLES
140  timeout_cycles = (cycles_t) EC_IO_TIMEOUT /* us */ * (cpu_khz / 1000);
141  ext_injection_timeout_cycles =
142  (cycles_t) EC_SDO_INJECTION_TIMEOUT /* us */ * (cpu_khz / 1000);
143 #else
144  // one jiffy may always elapse between time measurement
145  timeout_jiffies = max(EC_IO_TIMEOUT * HZ / 1000000, 1);
147  max(EC_SDO_INJECTION_TIMEOUT * HZ / 1000000, 1);
148 #endif
149 }
150 
151 /****************************************************************************/
152 
159  unsigned int index,
160  const uint8_t *main_mac,
161  const uint8_t *backup_mac,
162  dev_t device_number,
163  struct class *class,
164  unsigned int debug_level,
165  unsigned int run_on_cpu
166  )
167 {
168  int ret;
169  unsigned int dev_idx, i;
170 
171  master->index = index;
172  master->reserved = 0;
173 
174  sema_init(&master->master_sem, 1);
175 
176  for (dev_idx = EC_DEVICE_MAIN; dev_idx < EC_MAX_NUM_DEVICES; dev_idx++) {
177  master->macs[dev_idx] = NULL;
178  }
179 
180  master->macs[EC_DEVICE_MAIN] = main_mac;
181 
182 #if EC_MAX_NUM_DEVICES > 1
183  master->macs[EC_DEVICE_BACKUP] = backup_mac;
184  master->num_devices = 1 + !ec_mac_is_zero(backup_mac);
185 #else
186  if (!ec_mac_is_zero(backup_mac)) {
187  EC_MASTER_WARN(master, "Ignoring backup MAC address!");
188  }
189 #endif
190 
192 
193  sema_init(&master->device_sem, 1);
194 
195  master->phase = EC_ORPHANED;
196  master->active = 0;
197  master->config_changed = 0;
198  master->injection_seq_fsm = 0;
199  master->injection_seq_rt = 0;
200 
201  master->slaves = NULL;
202  master->slave_count = 0;
203 
204  INIT_LIST_HEAD(&master->configs);
205  INIT_LIST_HEAD(&master->domains);
206 
207  master->app_time = 0ULL;
208  master->dc_ref_time = 0ULL;
209 
210  master->scan_busy = 0;
211  master->scan_index = 0;
212  master->allow_scan = 1;
213  sema_init(&master->scan_sem, 1);
214  init_waitqueue_head(&master->scan_queue);
215 
216  master->config_busy = 0;
217  sema_init(&master->config_sem, 1);
218  init_waitqueue_head(&master->config_queue);
219 
220  INIT_LIST_HEAD(&master->datagram_queue);
221  master->datagram_index = 0;
222 
223  INIT_LIST_HEAD(&master->ext_datagram_queue);
224  sema_init(&master->ext_queue_sem, 1);
225 
226  master->ext_ring_idx_rt = 0;
227  master->ext_ring_idx_fsm = 0;
228 
229  // init external datagram ring
230  for (i = 0; i < EC_EXT_RING_SIZE; i++) {
231  ec_datagram_t *datagram = &master->ext_datagram_ring[i];
232  ec_datagram_init(datagram);
233  snprintf(datagram->name, EC_DATAGRAM_NAME_SIZE, "ext-%u", i);
234  }
235 
236  // send interval in IDLE phase
237  ec_master_set_send_interval(master, 1000000 / HZ);
238 
239  master->fsm_slave = NULL;
240  INIT_LIST_HEAD(&master->fsm_exec_list);
241  master->fsm_exec_count = 0U;
242 
243  master->debug_level = debug_level;
244  master->run_on_cpu = run_on_cpu;
245  master->stats.timeouts = 0;
246  master->stats.corrupted = 0;
247  master->stats.unmatched = 0;
248  master->stats.output_jiffies = 0;
249 
250  master->thread = NULL;
251 
252 #ifdef EC_EOE
253  master->eoe_thread = NULL;
254  INIT_LIST_HEAD(&master->eoe_handlers);
255 #endif
256 
257  rt_mutex_init(&master->io_mutex);
258  master->send_cb = NULL;
259  master->receive_cb = NULL;
260  master->cb_data = NULL;
261  master->app_send_cb = NULL;
262  master->app_receive_cb = NULL;
263  master->app_cb_data = NULL;
264 
265  INIT_LIST_HEAD(&master->sii_requests);
266  INIT_LIST_HEAD(&master->emerg_reg_requests);
267 
268  init_waitqueue_head(&master->request_queue);
269 
270  // init devices
271  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
272  dev_idx++) {
273  ret = ec_device_init(&master->devices[dev_idx], master);
274  if (ret < 0) {
275  goto out_clear_devices;
276  }
277  }
278 
279  // init state machine datagram
280  ec_datagram_init(&master->fsm_datagram);
281  snprintf(master->fsm_datagram.name, EC_DATAGRAM_NAME_SIZE, "master-fsm");
283  if (ret < 0) {
285  EC_MASTER_ERR(master, "Failed to allocate FSM datagram.\n");
286  goto out_clear_devices;
287  }
288 
289  // create state machine object
290  ec_fsm_master_init(&master->fsm, master, &master->fsm_datagram);
291 
292  // alloc external datagram ring
293  for (i = 0; i < EC_EXT_RING_SIZE; i++) {
294  ec_datagram_t *datagram = &master->ext_datagram_ring[i];
295  ret = ec_datagram_prealloc(datagram, EC_MAX_DATA_SIZE);
296  if (ret) {
297  EC_MASTER_ERR(master, "Failed to allocate external"
298  " datagram %u.\n", i);
299  goto out_clear_ext_datagrams;
300  }
301  }
302 
303  // init reference sync datagram
305  snprintf(master->ref_sync_datagram.name, EC_DATAGRAM_NAME_SIZE,
306  "refsync");
307  ret = ec_datagram_prealloc(&master->ref_sync_datagram, 4);
308  if (ret < 0) {
310  EC_MASTER_ERR(master, "Failed to allocate reference"
311  " synchronisation datagram.\n");
312  goto out_clear_ext_datagrams;
313  }
314 
315  // init sync datagram
317  snprintf(master->sync_datagram.name, EC_DATAGRAM_NAME_SIZE, "sync");
318  ret = ec_datagram_prealloc(&master->sync_datagram, 4);
319  if (ret < 0) {
321  EC_MASTER_ERR(master, "Failed to allocate"
322  " synchronisation datagram.\n");
323  goto out_clear_ref_sync;
324  }
325 
326  // init sync monitor datagram
328  snprintf(master->sync_mon_datagram.name, EC_DATAGRAM_NAME_SIZE,
329  "syncmon");
330  ret = ec_datagram_brd(&master->sync_mon_datagram, 0x092c, 4);
331  if (ret < 0) {
333  EC_MASTER_ERR(master, "Failed to allocate sync"
334  " monitoring datagram.\n");
335  goto out_clear_sync;
336  }
337 
338  master->dc_ref_config = NULL;
339  master->dc_ref_clock = NULL;
340 
341  INIT_WORK(&master->sc_reset_work, sc_reset_task);
342  init_irq_work(&master->sc_reset_work_kicker, sc_reset_task_kicker);
343 
344  // init character device
345  ret = ec_cdev_init(&master->cdev, master, device_number);
346  if (ret)
347  goto out_clear_sync_mon;
348 
349  master->class_device = device_create(class, NULL,
350  MKDEV(MAJOR(device_number), master->index), NULL,
351  "EtherCAT%u", master->index);
352  if (IS_ERR(master->class_device)) {
353  EC_MASTER_ERR(master, "Failed to create class device!\n");
354  ret = PTR_ERR(master->class_device);
355  goto out_clear_cdev;
356  }
357 
358 #ifdef EC_RTDM
359  // init RTDM device
360  ret = ec_rtdm_dev_init(&master->rtdm_dev, master);
361  if (ret) {
362  goto out_unregister_class_device;
363  }
364 #endif
365 
366  return 0;
367 
368 #ifdef EC_RTDM
369 out_unregister_class_device:
370  device_unregister(master->class_device);
371 #endif
372 out_clear_cdev:
373  ec_cdev_clear(&master->cdev);
374 out_clear_sync_mon:
376 out_clear_sync:
378 out_clear_ref_sync:
380 out_clear_ext_datagrams:
381  for (i = 0; i < EC_EXT_RING_SIZE; i++) {
383  }
384  ec_fsm_master_clear(&master->fsm);
386 out_clear_devices:
387  for (; dev_idx > 0; dev_idx--) {
388  ec_device_clear(&master->devices[dev_idx - 1]);
389  }
390  return ret;
391 }
392 
393 /****************************************************************************/
394 
398  ec_master_t *master
399  )
400 {
401  unsigned int dev_idx, i;
402 
403 #ifdef EC_RTDM
404  ec_rtdm_dev_clear(&master->rtdm_dev);
405 #endif
406 
407  device_unregister(master->class_device);
408 
409  ec_cdev_clear(&master->cdev);
410 
411  irq_work_sync(&master->sc_reset_work_kicker);
412  cancel_work_sync(&master->sc_reset_work);
413 
414 #ifdef EC_EOE
416 #endif
417  ec_master_clear_domains(master);
419  ec_master_clear_slaves(master);
420 
424 
425  for (i = 0; i < EC_EXT_RING_SIZE; i++) {
427  }
428 
429  ec_fsm_master_clear(&master->fsm);
431 
432  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
433  dev_idx++) {
434  ec_device_clear(&master->devices[dev_idx]);
435  }
436 }
437 
438 /****************************************************************************/
439 
440 #ifdef EC_EOE
441 
444  ec_master_t *master
445  )
446 {
447  ec_eoe_t *eoe, *next;
448 
449  list_for_each_entry_safe(eoe, next, &master->eoe_handlers, list) {
450  list_del(&eoe->list);
451  ec_eoe_clear(eoe);
452  kfree(eoe);
453  }
454 }
455 #endif
456 
457 /****************************************************************************/
458 
462 {
463  ec_slave_config_t *sc, *next;
464 
465  master->dc_ref_config = NULL;
466  master->fsm.sdo_request = NULL; // mark sdo_request as invalid
467 
468  list_for_each_entry_safe(sc, next, &master->configs, list) {
469  list_del(&sc->list);
471  kfree(sc);
472  }
473 }
474 
475 /****************************************************************************/
476 
480 {
481  ec_slave_t *slave;
482 
483  master->dc_ref_clock = NULL;
484 
485  // External requests are obsolete, so we wake pending waiters and remove
486  // them from the list.
487 
488  while (!list_empty(&master->sii_requests)) {
489  ec_sii_write_request_t *request =
490  list_entry(master->sii_requests.next,
491  ec_sii_write_request_t, list);
492  list_del_init(&request->list); // dequeue
493  EC_MASTER_WARN(master, "Discarding SII request, slave %u about"
494  " to be deleted.\n", request->slave->ring_position);
495  request->state = EC_INT_REQUEST_FAILURE;
496  wake_up_all(&master->request_queue);
497  }
498 
499  master->fsm_slave = NULL;
500  INIT_LIST_HEAD(&master->fsm_exec_list);
501  master->fsm_exec_count = 0;
502 
503  for (slave = master->slaves;
504  slave < master->slaves + master->slave_count;
505  slave++) {
506  ec_slave_clear(slave);
507  }
508 
509  if (master->slaves) {
510  kfree(master->slaves);
511  master->slaves = NULL;
512  }
513 
514  master->slave_count = 0;
515 }
516 
517 /****************************************************************************/
518 
522 {
523  ec_domain_t *domain, *next;
524 
525  list_for_each_entry_safe(domain, next, &master->domains, list) {
526  list_del(&domain->list);
527  ec_domain_clear(domain);
528  kfree(domain);
529  }
530 }
531 
532 /****************************************************************************/
533 
537  ec_master_t *master
538  )
539 {
540  down(&master->master_sem);
541  ec_master_clear_domains(master);
543  up(&master->master_sem);
544 }
545 
546 /****************************************************************************/
547 
551  void *cb_data
552  )
553 {
554  ec_master_t *master = (ec_master_t *) cb_data;
555  if (ec_rt_lock_interruptible(&master->io_mutex))
556  return;
557  ecrt_master_send_ext(master);
558  rt_mutex_unlock(&master->io_mutex);
559 }
560 
561 /****************************************************************************/
562 
566  void *cb_data
567  )
568 {
569  ec_master_t *master = (ec_master_t *) cb_data;
570  if (ec_rt_lock_interruptible(&master->io_mutex))
571  return;
572  ecrt_master_receive(master);
573  rt_mutex_unlock(&master->io_mutex);
574 }
575 
576 /****************************************************************************/
577 
584  ec_master_t *master,
585  int (*thread_func)(void *),
586  const char *name
587  )
588 {
589  EC_MASTER_INFO(master, "Starting %s thread.\n", name);
590  master->thread = kthread_create(thread_func, master, name);
591  if (IS_ERR(master->thread)) {
592  int err = (int) PTR_ERR(master->thread);
593  EC_MASTER_ERR(master, "Failed to start master thread (error %i)!\n",
594  err);
595  master->thread = NULL;
596  return err;
597  }
598  if (0xffffffff != master->run_on_cpu) {
599  EC_MASTER_INFO(master, " binding thread to cpu %u\n",master->run_on_cpu);
600  kthread_bind(master->thread,master->run_on_cpu);
601  }
602  /* Ignoring return value of wake_up_process */
603  (void) wake_up_process(master->thread);
604 
605  return 0;
606 }
607 
608 /****************************************************************************/
609 
613  ec_master_t *master
614  )
615 {
616  unsigned long sleep_jiffies;
617 
618  if (!master->thread) {
619  EC_MASTER_WARN(master, "%s(): Already finished!\n", __func__);
620  return;
621  }
622 
623  EC_MASTER_DBG(master, 1, "Stopping master thread.\n");
624 
625  kthread_stop(master->thread);
626  master->thread = NULL;
627  EC_MASTER_INFO(master, "Master thread exited.\n");
628 
629  if (master->fsm_datagram.state != EC_DATAGRAM_SENT) {
630  return;
631  }
632 
633  // wait for FSM datagram
634  sleep_jiffies = max(HZ / 100, 1); // 10 ms, at least 1 jiffy
635  schedule_timeout(sleep_jiffies);
636 }
637 
638 /****************************************************************************/
639 
645  ec_master_t *master
646  )
647 {
648  int ret;
649  ec_device_index_t dev_idx;
650 
651  EC_MASTER_DBG(master, 1, "ORPHANED -> IDLE.\n");
652 
655  master->cb_data = master;
656 
657  master->phase = EC_IDLE;
658 
659  // reset number of responding slaves to trigger scanning
660  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
661  dev_idx++) {
662  master->fsm.slaves_responding[dev_idx] = 0;
663  }
664 
666  "EtherCAT-IDLE");
667  if (ret)
668  master->phase = EC_ORPHANED;
669 
670  return ret;
671 }
672 
673 /****************************************************************************/
674 
678 {
679  EC_MASTER_DBG(master, 1, "IDLE -> ORPHANED.\n");
680 
681  master->phase = EC_ORPHANED;
682 
683 #ifdef EC_EOE
684  ec_master_eoe_stop(master);
685 #endif
686  ec_master_thread_stop(master);
687 
688  down(&master->master_sem);
689  ec_master_clear_slaves(master);
690  up(&master->master_sem);
691 
692  ec_fsm_master_reset(&master->fsm);
693 }
694 
695 /****************************************************************************/
696 
702  ec_master_t *master
703  )
704 {
705  int ret = 0;
706  ec_slave_t *slave;
707 
708  EC_MASTER_DBG(master, 1, "IDLE -> OPERATION.\n");
709 
710  down(&master->config_sem);
711  if (master->config_busy) {
712  up(&master->config_sem);
713 
714  // wait for slave configuration to complete
715  ret = wait_event_interruptible(master->config_queue,
716  !master->config_busy);
717  if (ret) {
718  EC_MASTER_INFO(master, "Finishing slave configuration"
719  " interrupted by signal.\n");
720  goto out_return;
721  }
722 
723  EC_MASTER_DBG(master, 1, "Waiting for pending slave"
724  " configuration returned.\n");
725  } else {
726  up(&master->config_sem);
727  }
728 
729  down(&master->scan_sem);
730  master->allow_scan = 0; // 'lock' the slave list
731  if (!master->scan_busy) {
732  up(&master->scan_sem);
733  } else {
734  up(&master->scan_sem);
735 
736  // wait for slave scan to complete
737  ret = wait_event_interruptible(master->scan_queue,
738  !master->scan_busy);
739  if (ret) {
740  EC_MASTER_INFO(master, "Waiting for slave scan"
741  " interrupted by signal.\n");
742  goto out_allow;
743  }
744 
745  EC_MASTER_DBG(master, 1, "Waiting for pending"
746  " slave scan returned.\n");
747  }
748 
749  // set states for all slaves
750  for (slave = master->slaves;
751  slave < master->slaves + master->slave_count;
752  slave++) {
754  }
755 
756  master->phase = EC_OPERATION;
757  master->app_send_cb = NULL;
758  master->app_receive_cb = NULL;
759  master->app_cb_data = NULL;
760  return ret;
761 
762 out_allow:
763  master->allow_scan = 1;
764 out_return:
765  return ret;
766 }
767 
768 /****************************************************************************/
769 
773  ec_master_t *master
774  )
775 {
776  if (master->active) {
777  ecrt_master_deactivate(master); // also clears config
778  } else {
779  ec_master_clear_config(master);
780  }
781 
782  /* Re-allow scanning for IDLE phase. */
783  master->allow_scan = 1;
784 
785  EC_MASTER_DBG(master, 1, "OPERATION -> IDLE.\n");
786 
787  master->phase = EC_IDLE;
788 }
789 
790 /****************************************************************************/
791 
795  ec_master_t *master
796  )
797 {
798  ec_datagram_t *datagram;
799  size_t queue_size = 0, new_queue_size = 0;
800 #if DEBUG_INJECT
801  unsigned int datagram_count = 0;
802 #endif
803 
804  if (master->ext_ring_idx_rt == master->ext_ring_idx_fsm) {
805  // nothing to inject
806  return;
807  }
808 
809  list_for_each_entry(datagram, &master->datagram_queue, queue) {
810  if (datagram->state == EC_DATAGRAM_QUEUED) {
811  queue_size += datagram->data_size;
812  }
813  }
814 
815 #if DEBUG_INJECT
816  EC_MASTER_DBG(master, 1, "Injecting datagrams, queue_size=%zu\n",
817  queue_size);
818 #endif
819 
820  while (master->ext_ring_idx_rt != master->ext_ring_idx_fsm) {
821  datagram = &master->ext_datagram_ring[master->ext_ring_idx_rt];
822 
823  if (datagram->state != EC_DATAGRAM_INIT) {
824  // skip datagram
825  master->ext_ring_idx_rt =
826  (master->ext_ring_idx_rt + 1) % EC_EXT_RING_SIZE;
827  continue;
828  }
829 
830  new_queue_size = queue_size + datagram->data_size;
831  if (new_queue_size <= master->max_queue_size) {
832 #if DEBUG_INJECT
833  EC_MASTER_DBG(master, 1, "Injecting datagram %s"
834  " size=%zu, queue_size=%zu\n", datagram->name,
835  datagram->data_size, new_queue_size);
836  datagram_count++;
837 #endif
838 #ifdef EC_HAVE_CYCLES
839  datagram->cycles_sent = 0;
840 #endif
841  datagram->jiffies_sent = 0;
842  ec_master_queue_datagram(master, datagram);
843  queue_size = new_queue_size;
844  }
845  else if (datagram->data_size > master->max_queue_size) {
846  datagram->state = EC_DATAGRAM_ERROR;
847  EC_MASTER_ERR(master, "External datagram %s is too large,"
848  " size=%zu, max_queue_size=%zu\n",
849  datagram->name, datagram->data_size,
850  master->max_queue_size);
851  }
852  else { // datagram does not fit in the current cycle
853 #ifdef EC_HAVE_CYCLES
854  cycles_t cycles_now = get_cycles();
855 
856  if (cycles_now - datagram->cycles_sent
857  > ext_injection_timeout_cycles)
858 #else
859  if (jiffies - datagram->jiffies_sent
861 #endif
862  {
863 #if defined EC_RT_SYSLOG || DEBUG_INJECT
864  unsigned int time_us;
865 #endif
866 
867  datagram->state = EC_DATAGRAM_ERROR;
868 
869 #if defined EC_RT_SYSLOG || DEBUG_INJECT
870 #ifdef EC_HAVE_CYCLES
871  time_us = (unsigned int)
872  ((cycles_now - datagram->cycles_sent) * 1000LL)
873  / cpu_khz;
874 #else
875  time_us = (unsigned int)
876  ((jiffies - datagram->jiffies_sent) * 1000000 / HZ);
877 #endif
878  EC_MASTER_ERR(master, "Timeout %u us: Injecting"
879  " external datagram %s size=%zu,"
880  " max_queue_size=%zu\n", time_us, datagram->name,
881  datagram->data_size, master->max_queue_size);
882 #endif
883  }
884  else {
885 #if DEBUG_INJECT
886  EC_MASTER_DBG(master, 1, "Deferred injecting"
887  " external datagram %s size=%u, queue_size=%u\n",
888  datagram->name, datagram->data_size, queue_size);
889 #endif
890  break;
891  }
892  }
893 
894  master->ext_ring_idx_rt =
895  (master->ext_ring_idx_rt + 1) % EC_EXT_RING_SIZE;
896  }
897 
898 #if DEBUG_INJECT
899  EC_MASTER_DBG(master, 1, "Injected %u datagrams.\n", datagram_count);
900 #endif
901 }
902 
903 /****************************************************************************/
904 
909  ec_master_t *master,
910  unsigned int send_interval
911  )
912 {
913  master->send_interval = send_interval;
914  master->max_queue_size =
915  (send_interval * 1000) / EC_BYTE_TRANSMISSION_TIME_NS;
916  master->max_queue_size -= master->max_queue_size / 10;
917 }
918 
919 /****************************************************************************/
920 
926  ec_master_t *master
927  )
928 {
929  if ((master->ext_ring_idx_fsm + 1) % EC_EXT_RING_SIZE !=
930  master->ext_ring_idx_rt) {
931  ec_datagram_t *datagram =
932  &master->ext_datagram_ring[master->ext_ring_idx_fsm];
933  return datagram;
934  }
935  else {
936  return NULL;
937  }
938 }
939 
940 /****************************************************************************/
941 
945  ec_master_t *master,
946  ec_datagram_t *datagram
947  )
948 {
949  ec_datagram_t *queued_datagram;
950 
951  /* It is possible, that a datagram in the queue is re-initialized with the
952  * ec_datagram_<type>() methods and then shall be queued with this method.
953  * In that case, the state is already reset to EC_DATAGRAM_INIT. Check if
954  * the datagram is queued to avoid duplicate queuing (which results in an
955  * infinite loop!). Set the state to EC_DATAGRAM_QUEUED again, probably
956  * causing an unmatched datagram. */
957  list_for_each_entry(queued_datagram, &master->datagram_queue, queue) {
958  if (queued_datagram == datagram) {
959  datagram->skip_count++;
960 #ifdef EC_RT_SYSLOG
961  EC_MASTER_DBG(master, 1,
962  "Datagram %p already queued (skipping).\n", datagram);
963 #endif
964  datagram->state = EC_DATAGRAM_QUEUED;
965  return;
966  }
967  }
968 
969  list_add_tail(&datagram->queue, &master->datagram_queue);
970  datagram->state = EC_DATAGRAM_QUEUED;
971 }
972 
973 /****************************************************************************/
974 
978  ec_master_t *master,
979  ec_datagram_t *datagram
980  )
981 {
982  down(&master->ext_queue_sem);
983  list_add_tail(&datagram->ext_queue, &master->ext_datagram_queue);
984  up(&master->ext_queue_sem);
985 }
986 
987 /****************************************************************************/
988 
993  ec_master_t *master,
994  ec_device_index_t device_index
995  )
996 {
997  ec_datagram_t *datagram, *next;
998  size_t datagram_size;
999  uint8_t *frame_data, *cur_data = NULL;
1000  void *follows_word;
1001 #ifdef EC_HAVE_CYCLES
1002  cycles_t cycles_start, cycles_sent, cycles_end;
1003 #endif
1004  unsigned long jiffies_sent;
1005  unsigned int frame_count, more_datagrams_waiting;
1006  struct list_head sent_datagrams;
1007 
1008 #ifdef EC_HAVE_CYCLES
1009  cycles_start = get_cycles();
1010 #endif
1011  frame_count = 0;
1012  INIT_LIST_HEAD(&sent_datagrams);
1013 
1014  EC_MASTER_DBG(master, 2, "%s(device_index = %u)\n",
1015  __func__, device_index);
1016 
1017  do {
1018  frame_data = NULL;
1019  follows_word = NULL;
1020  more_datagrams_waiting = 0;
1021 
1022  // fill current frame with datagrams
1023  list_for_each_entry(datagram, &master->datagram_queue, queue) {
1024  if (datagram->state != EC_DATAGRAM_QUEUED ||
1025  datagram->device_index != device_index) {
1026  continue;
1027  }
1028 
1029  if (!frame_data) {
1030  // fetch pointer to transmit socket buffer
1031  frame_data =
1032  ec_device_tx_data(&master->devices[device_index]);
1033  cur_data = frame_data + EC_FRAME_HEADER_SIZE;
1034  }
1035 
1036  // does the current datagram fit in the frame?
1037  datagram_size = EC_DATAGRAM_HEADER_SIZE + datagram->data_size
1039  if (cur_data - frame_data + datagram_size > ETH_DATA_LEN) {
1040  more_datagrams_waiting = 1;
1041  break;
1042  }
1043 
1044  list_add_tail(&datagram->sent, &sent_datagrams);
1045  datagram->index = master->datagram_index++;
1046 
1047  EC_MASTER_DBG(master, 2, "Adding datagram 0x%02X\n",
1048  datagram->index);
1049 
1050  // set "datagram following" flag in previous datagram
1051  if (follows_word) {
1052  EC_WRITE_U16(follows_word,
1053  EC_READ_U16(follows_word) | 0x8000);
1054  }
1055 
1056  // EtherCAT datagram header
1057  EC_WRITE_U8 (cur_data, datagram->type);
1058  EC_WRITE_U8 (cur_data + 1, datagram->index);
1059  memcpy(cur_data + 2, datagram->address, EC_ADDR_LEN);
1060  EC_WRITE_U16(cur_data + 6, datagram->data_size & 0x7FF);
1061  EC_WRITE_U16(cur_data + 8, 0x0000);
1062  follows_word = cur_data + 6;
1063  cur_data += EC_DATAGRAM_HEADER_SIZE;
1064 
1065  // EtherCAT datagram data
1066  memcpy(cur_data, datagram->data, datagram->data_size);
1067  cur_data += datagram->data_size;
1068 
1069  // EtherCAT datagram footer
1070  EC_WRITE_U16(cur_data, 0x0000); // reset working counter
1071  cur_data += EC_DATAGRAM_FOOTER_SIZE;
1072  }
1073 
1074  if (list_empty(&sent_datagrams)) {
1075  EC_MASTER_DBG(master, 2, "nothing to send.\n");
1076  break;
1077  }
1078 
1079  // EtherCAT frame header
1080  EC_WRITE_U16(frame_data, ((cur_data - frame_data
1081  - EC_FRAME_HEADER_SIZE) & 0x7FF) | 0x1000);
1082 
1083  // pad frame
1084  while (cur_data - frame_data < ETH_ZLEN - ETH_HLEN)
1085  EC_WRITE_U8(cur_data++, 0x00);
1086 
1087  EC_MASTER_DBG(master, 2, "frame size: %zu\n", cur_data - frame_data);
1088 
1089  // send frame
1090  ec_device_send(&master->devices[device_index],
1091  cur_data - frame_data);
1092 #ifdef EC_HAVE_CYCLES
1093  cycles_sent = get_cycles();
1094 #endif
1095  jiffies_sent = jiffies;
1096 
1097  // set datagram states and sending timestamps
1098  list_for_each_entry_safe(datagram, next, &sent_datagrams, sent) {
1099  datagram->state = EC_DATAGRAM_SENT;
1100 #ifdef EC_HAVE_CYCLES
1101  datagram->cycles_sent = cycles_sent;
1102 #endif
1103  datagram->jiffies_sent = jiffies_sent;
1104  list_del_init(&datagram->sent); // empty list of sent datagrams
1105  }
1106 
1107  frame_count++;
1108  }
1109  while (more_datagrams_waiting);
1110 
1111 #ifdef EC_HAVE_CYCLES
1112  if (unlikely(master->debug_level > 1)) {
1113  cycles_end = get_cycles();
1114  EC_MASTER_DBG(master, 0, "%s()"
1115  " sent %u frames in %uus.\n", __func__, frame_count,
1116  (unsigned int) (cycles_end - cycles_start) * 1000 / cpu_khz);
1117  }
1118 #endif
1119 }
1120 
1121 /****************************************************************************/
1122 
1130  ec_master_t *master,
1131  ec_device_t *device,
1132  const uint8_t *frame_data,
1133  size_t size
1134  )
1135 {
1136  size_t frame_size, data_size;
1137  uint8_t datagram_type, datagram_index;
1138  unsigned int cmd_follows, matched;
1139  const uint8_t *cur_data;
1140  ec_datagram_t *datagram;
1141 
1142  if (unlikely(size < EC_FRAME_HEADER_SIZE)) {
1143  if (master->debug_level || FORCE_OUTPUT_CORRUPTED) {
1144  EC_MASTER_DBG(master, 0, "Corrupted frame received"
1145  " on %s (size %zu < %u byte):\n",
1146  device->dev->name, size, EC_FRAME_HEADER_SIZE);
1147  ec_print_data(frame_data, size);
1148  }
1149  master->stats.corrupted++;
1150 #ifdef EC_RT_SYSLOG
1151  ec_master_output_stats(master);
1152 #endif
1153  return;
1154  }
1155 
1156  cur_data = frame_data;
1157 
1158  // check length of entire frame
1159  frame_size = EC_READ_U16(cur_data) & 0x07FF;
1160  cur_data += EC_FRAME_HEADER_SIZE;
1161 
1162  if (unlikely(frame_size > size)) {
1163  if (master->debug_level || FORCE_OUTPUT_CORRUPTED) {
1164  EC_MASTER_DBG(master, 0, "Corrupted frame received"
1165  " on %s (invalid frame size %zu for "
1166  "received size %zu):\n", device->dev->name,
1167  frame_size, size);
1168  ec_print_data(frame_data, size);
1169  }
1170  master->stats.corrupted++;
1171 #ifdef EC_RT_SYSLOG
1172  ec_master_output_stats(master);
1173 #endif
1174  return;
1175  }
1176 
1177  cmd_follows = 1;
1178  while (cmd_follows) {
1179  // process datagram header
1180  datagram_type = EC_READ_U8 (cur_data);
1181  datagram_index = EC_READ_U8 (cur_data + 1);
1182  data_size = EC_READ_U16(cur_data + 6) & 0x07FF;
1183  cmd_follows = EC_READ_U16(cur_data + 6) & 0x8000;
1184  cur_data += EC_DATAGRAM_HEADER_SIZE;
1185 
1186  if (unlikely(cur_data - frame_data
1187  + data_size + EC_DATAGRAM_FOOTER_SIZE > size)) {
1188  if (master->debug_level || FORCE_OUTPUT_CORRUPTED) {
1189  EC_MASTER_DBG(master, 0, "Corrupted frame received"
1190  " on %s (invalid data size %zu):\n",
1191  device->dev->name, data_size);
1192  ec_print_data(frame_data, size);
1193  }
1194  master->stats.corrupted++;
1195 #ifdef EC_RT_SYSLOG
1196  ec_master_output_stats(master);
1197 #endif
1198  return;
1199  }
1200 
1201  // search for matching datagram in the queue
1202  matched = 0;
1203  list_for_each_entry(datagram, &master->datagram_queue, queue) {
1204  if (datagram->index == datagram_index
1205  && datagram->state == EC_DATAGRAM_SENT
1206  && datagram->type == datagram_type
1207  && datagram->data_size == data_size) {
1208  matched = 1;
1209  break;
1210  }
1211  }
1212 
1213  // no matching datagram was found
1214  if (!matched) {
1215  master->stats.unmatched++;
1216 #ifdef EC_RT_SYSLOG
1217  ec_master_output_stats(master);
1218 #endif
1219 
1220  if (unlikely(master->debug_level > 0)) {
1221  EC_MASTER_DBG(master, 0, "UNMATCHED datagram:\n");
1223  EC_DATAGRAM_HEADER_SIZE + data_size
1225 #ifdef EC_DEBUG_RING
1226  ec_device_debug_ring_print(&master->devices[EC_DEVICE_MAIN]);
1227 #endif
1228  }
1229 
1230  cur_data += data_size + EC_DATAGRAM_FOOTER_SIZE;
1231  continue;
1232  }
1233 
1234  if (datagram->type != EC_DATAGRAM_APWR &&
1235  datagram->type != EC_DATAGRAM_FPWR &&
1236  datagram->type != EC_DATAGRAM_BWR &&
1237  datagram->type != EC_DATAGRAM_LWR) {
1238  // copy received data into the datagram memory,
1239  // if something has been read
1240  memcpy(datagram->data, cur_data, data_size);
1241  }
1242  cur_data += data_size;
1243 
1244  // set the datagram's working counter
1245  datagram->working_counter = EC_READ_U16(cur_data);
1246  cur_data += EC_DATAGRAM_FOOTER_SIZE;
1247 
1248  // dequeue the received datagram
1249  datagram->state = EC_DATAGRAM_RECEIVED;
1250 #ifdef EC_HAVE_CYCLES
1251  datagram->cycles_received =
1252  master->devices[EC_DEVICE_MAIN].cycles_poll;
1253 #endif
1254  datagram->jiffies_received =
1256  list_del_init(&datagram->queue);
1257  }
1258 }
1259 
1260 /****************************************************************************/
1261 
1268 {
1269  if (unlikely(jiffies - master->stats.output_jiffies >= HZ)) {
1270  master->stats.output_jiffies = jiffies;
1271 
1272  if (master->stats.timeouts) {
1273  EC_MASTER_WARN(master, "%u datagram%s TIMED OUT!\n",
1274  master->stats.timeouts,
1275  master->stats.timeouts == 1 ? "" : "s");
1276  master->stats.timeouts = 0;
1277  }
1278  if (master->stats.corrupted) {
1279  EC_MASTER_WARN(master, "%u frame%s CORRUPTED!\n",
1280  master->stats.corrupted,
1281  master->stats.corrupted == 1 ? "" : "s");
1282  master->stats.corrupted = 0;
1283  }
1284  if (master->stats.unmatched) {
1285  EC_MASTER_WARN(master, "%u datagram%s UNMATCHED!\n",
1286  master->stats.unmatched,
1287  master->stats.unmatched == 1 ? "" : "s");
1288  master->stats.unmatched = 0;
1289  }
1290  }
1291 }
1292 
1293 /****************************************************************************/
1294 
1298  ec_master_t *master
1299  )
1300 {
1301  unsigned int i;
1302 
1303  // zero frame statistics
1304  master->device_stats.tx_count = 0;
1305  master->device_stats.last_tx_count = 0;
1306  master->device_stats.rx_count = 0;
1307  master->device_stats.last_rx_count = 0;
1308  master->device_stats.tx_bytes = 0;
1309  master->device_stats.last_tx_bytes = 0;
1310  master->device_stats.rx_bytes = 0;
1311  master->device_stats.last_rx_bytes = 0;
1312  master->device_stats.last_loss = 0;
1313 
1314  for (i = 0; i < EC_RATE_COUNT; i++) {
1315  master->device_stats.tx_frame_rates[i] = 0;
1316  master->device_stats.rx_frame_rates[i] = 0;
1317  master->device_stats.tx_byte_rates[i] = 0;
1318  master->device_stats.rx_byte_rates[i] = 0;
1319  master->device_stats.loss_rates[i] = 0;
1320  }
1321 
1322  master->device_stats.jiffies = 0;
1323 }
1324 
1325 /****************************************************************************/
1326 
1330  ec_master_t *master
1331  )
1332 {
1333  ec_device_stats_t *s = &master->device_stats;
1334  s32 tx_frame_rate, rx_frame_rate, tx_byte_rate, rx_byte_rate, loss_rate;
1335  u64 loss;
1336  unsigned int i, dev_idx;
1337 
1338  // frame statistics
1339  if (likely(jiffies - s->jiffies < HZ)) {
1340  return;
1341  }
1342 
1343  tx_frame_rate = (s->tx_count - s->last_tx_count) * 1000;
1344  rx_frame_rate = (s->rx_count - s->last_rx_count) * 1000;
1345  tx_byte_rate = s->tx_bytes - s->last_tx_bytes;
1346  rx_byte_rate = s->rx_bytes - s->last_rx_bytes;
1347  loss = s->tx_count - s->rx_count;
1348  loss_rate = (loss - s->last_loss) * 1000;
1349 
1350  /* Low-pass filter:
1351  * Y_n = y_(n - 1) + T / tau * (x - y_(n - 1)) | T = 1
1352  * -> Y_n += (x - y_(n - 1)) / tau
1353  */
1354  for (i = 0; i < EC_RATE_COUNT; i++) {
1355  s32 n = rate_intervals[i];
1356  s->tx_frame_rates[i] += (tx_frame_rate - s->tx_frame_rates[i]) / n;
1357  s->rx_frame_rates[i] += (rx_frame_rate - s->rx_frame_rates[i]) / n;
1358  s->tx_byte_rates[i] += (tx_byte_rate - s->tx_byte_rates[i]) / n;
1359  s->rx_byte_rates[i] += (rx_byte_rate - s->rx_byte_rates[i]) / n;
1360  s->loss_rates[i] += (loss_rate - s->loss_rates[i]) / n;
1361  }
1362 
1363  s->last_tx_count = s->tx_count;
1364  s->last_rx_count = s->rx_count;
1365  s->last_tx_bytes = s->tx_bytes;
1366  s->last_rx_bytes = s->rx_bytes;
1367  s->last_loss = loss;
1368 
1369  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
1370  dev_idx++) {
1371  ec_device_update_stats(&master->devices[dev_idx]);
1372  }
1373 
1374  s->jiffies = jiffies;
1375 }
1376 
1377 /****************************************************************************/
1378 
1379 #ifdef EC_USE_HRTIMER
1380 
1381 /*
1382  * Sleep related functions:
1383  */
1384 static enum hrtimer_restart ec_master_nanosleep_wakeup(struct hrtimer *timer)
1385 {
1386  struct hrtimer_sleeper *t =
1387  container_of(timer, struct hrtimer_sleeper, timer);
1388  struct task_struct *task = t->task;
1389 
1390  t->task = NULL;
1391  if (task)
1392  wake_up_process(task);
1393 
1394  return HRTIMER_NORESTART;
1395 }
1396 
1397 /****************************************************************************/
1398 
1399 void ec_master_nanosleep(const unsigned long nsecs)
1400 {
1401  struct hrtimer_sleeper t;
1402  enum hrtimer_mode mode = HRTIMER_MODE_REL;
1403 
1404 #if LINUX_VERSION_CODE >= KERNEL_VERSION(6, 15, 0)
1405  hrtimer_setup(&t.timer, ec_master_nanosleep_wakeup,
1406  CLOCK_MONOTONIC, mode);
1407 #else
1408  hrtimer_init(&t.timer, CLOCK_MONOTONIC, mode);
1409  t.timer.function = ec_master_nanosleep_wakeup;
1410 #endif
1411  t.task = current;
1412  hrtimer_set_expires(&t.timer, ktime_set(0, nsecs));
1413 
1414  do {
1415  set_current_state(TASK_INTERRUPTIBLE);
1416  hrtimer_start(&t.timer, hrtimer_get_expires(&t.timer), mode);
1417 
1418  if (likely(t.task))
1419  schedule();
1420 
1421  hrtimer_cancel(&t.timer);
1422  mode = HRTIMER_MODE_ABS;
1423 
1424  } while (t.task && !signal_pending(current));
1425 }
1426 
1427 #endif // EC_USE_HRTIMER
1428 
1429 /****************************************************************************/
1430 
1434  ec_master_t *master
1435  )
1436 {
1437  ec_datagram_t *datagram;
1438  ec_fsm_slave_t *fsm, *next;
1439  unsigned int count = 0;
1440 
1441  list_for_each_entry_safe(fsm, next, &master->fsm_exec_list, list) {
1442  if (!fsm->datagram) {
1443  EC_MASTER_WARN(master, "Slave %u FSM has zero datagram."
1444  "This is a bug!\n", fsm->slave->ring_position);
1445  list_del_init(&fsm->list);
1446  master->fsm_exec_count--;
1447  return;
1448  }
1449 
1450  if (fsm->datagram->state == EC_DATAGRAM_INIT ||
1451  fsm->datagram->state == EC_DATAGRAM_QUEUED ||
1452  fsm->datagram->state == EC_DATAGRAM_SENT) {
1453  // previous datagram was not sent or received yet.
1454  // wait until next thread execution
1455  return;
1456  }
1457 
1458  datagram = ec_master_get_external_datagram(master);
1459  if (!datagram) {
1460  // no free datagrams at the moment
1461  EC_MASTER_WARN(master, "No free datagram during"
1462  " slave FSM execution. This is a bug!\n");
1463  continue;
1464  }
1465 
1466 #if DEBUG_INJECT
1467  EC_MASTER_DBG(master, 1, "Executing slave %u FSM.\n",
1468  fsm->slave->ring_position);
1469 #endif
1470  if (ec_fsm_slave_exec(fsm, datagram)) {
1471  // FSM consumed datagram
1472 #if DEBUG_INJECT
1473  EC_MASTER_DBG(master, 1, "FSM consumed datagram %s\n",
1474  datagram->name);
1475 #endif
1476  master->ext_ring_idx_fsm =
1477  (master->ext_ring_idx_fsm + 1) % EC_EXT_RING_SIZE;
1478  }
1479  else {
1480  // FSM finished
1481  list_del_init(&fsm->list);
1482  master->fsm_exec_count--;
1483 #if DEBUG_INJECT
1484  EC_MASTER_DBG(master, 1, "FSM finished. %u remaining.\n",
1485  master->fsm_exec_count);
1486 #endif
1487  }
1488  }
1489 
1490  while (master->fsm_exec_count < EC_EXT_RING_SIZE / 2
1491  && count < master->slave_count) {
1492 
1493  if (ec_fsm_slave_is_ready(&master->fsm_slave->fsm)) {
1494  datagram = ec_master_get_external_datagram(master);
1495 
1496  if (ec_fsm_slave_exec(&master->fsm_slave->fsm, datagram)) {
1497  master->ext_ring_idx_fsm =
1498  (master->ext_ring_idx_fsm + 1) % EC_EXT_RING_SIZE;
1499  list_add_tail(&master->fsm_slave->fsm.list,
1500  &master->fsm_exec_list);
1501  master->fsm_exec_count++;
1502 #if DEBUG_INJECT
1503  EC_MASTER_DBG(master, 1, "New slave %u FSM"
1504  " consumed datagram %s, now %u FSMs in list.\n",
1505  master->fsm_slave->ring_position, datagram->name,
1506  master->fsm_exec_count);
1507 #endif
1508  }
1509  }
1510 
1511  master->fsm_slave++;
1512  if (master->fsm_slave >= master->slaves + master->slave_count) {
1513  master->fsm_slave = master->slaves;
1514  }
1515  count++;
1516  }
1517 }
1518 
1519 /****************************************************************************/
1520 
1523 static int ec_master_idle_thread(void *priv_data)
1524 {
1525  ec_master_t *master = (ec_master_t *) priv_data;
1526  int fsm_exec;
1527 #ifdef EC_USE_HRTIMER
1528  size_t sent_bytes;
1529 #endif
1530 
1531  // send interval in IDLE phase
1532  ec_master_set_send_interval(master, 1000000 / HZ);
1533 
1534  EC_MASTER_DBG(master, 1, "Idle thread running with send interval = %u us,"
1535  " max data size=%zu\n", master->send_interval,
1536  master->max_queue_size);
1537 
1538  while (!kthread_should_stop()) {
1540 
1541  // receive
1542  if (ec_rt_lock_interruptible(&master->io_mutex))
1543  break;
1544  ecrt_master_receive(master);
1545  rt_mutex_unlock(&master->io_mutex);
1546 
1547  // execute master & slave state machines
1548  if (down_interruptible(&master->master_sem)) {
1549  break;
1550  }
1551 
1552  fsm_exec = ec_fsm_master_exec(&master->fsm);
1553 
1554  ec_master_exec_slave_fsms(master);
1555 
1556  up(&master->master_sem);
1557 
1558  // queue and send
1559  if (ec_rt_lock_interruptible(&master->io_mutex))
1560  break;
1561  if (fsm_exec) {
1562  ec_master_queue_datagram(master, &master->fsm_datagram);
1563  }
1564  ecrt_master_send(master);
1565 #ifdef EC_USE_HRTIMER
1566  sent_bytes = master->devices[EC_DEVICE_MAIN].tx_skb[
1567  master->devices[EC_DEVICE_MAIN].tx_ring_index]->len;
1568 #endif
1569  rt_mutex_unlock(&master->io_mutex);
1570 
1571  if (ec_fsm_master_idle(&master->fsm)) {
1572 #ifdef EC_USE_HRTIMER
1573  ec_master_nanosleep(master->send_interval * 1000);
1574 #else
1575  set_current_state(TASK_INTERRUPTIBLE);
1576  schedule_timeout(1);
1577 #endif
1578  } else {
1579 #ifdef EC_USE_HRTIMER
1580  ec_master_nanosleep(sent_bytes * EC_BYTE_TRANSMISSION_TIME_NS);
1581 #else
1582  schedule();
1583 #endif
1584  }
1585  }
1586 
1587  EC_MASTER_DBG(master, 1, "Master IDLE thread exiting...\n");
1588 
1589  return 0;
1590 }
1591 
1592 /****************************************************************************/
1593 
1596 static int ec_master_operation_thread(void *priv_data)
1597 {
1598  ec_master_t *master = (ec_master_t *) priv_data;
1599 
1600  EC_MASTER_DBG(master, 1, "Operation thread running"
1601  " with fsm interval = %u us, max data size=%zu\n",
1602  master->send_interval, master->max_queue_size);
1603 
1604  while (!kthread_should_stop()) {
1606 
1607  if (master->injection_seq_rt == master->injection_seq_fsm) {
1608  // output statistics
1609  ec_master_output_stats(master);
1610 
1611  // execute master & slave state machines
1612  if (down_interruptible(&master->master_sem)) {
1613  break;
1614  }
1615 
1616  if (ec_fsm_master_exec(&master->fsm)) {
1617  // Inject datagrams (let the RT thread queue them, see
1618  // ecrt_master_send())
1619  master->injection_seq_fsm++;
1620  }
1621 
1622  ec_master_exec_slave_fsms(master);
1623 
1624  up(&master->master_sem);
1625  }
1626 
1627 #ifdef EC_USE_HRTIMER
1628  // the op thread should not work faster than the sending RT thread
1629  ec_master_nanosleep(master->send_interval * 1000);
1630 #else
1631  if (ec_fsm_master_idle(&master->fsm)) {
1632  set_current_state(TASK_INTERRUPTIBLE);
1633  schedule_timeout(1);
1634  }
1635  else {
1636  schedule();
1637  }
1638 #endif
1639  }
1640 
1641  EC_MASTER_DBG(master, 1, "Master OP thread exiting...\n");
1642  return 0;
1643 }
1644 
1645 /****************************************************************************/
1646 
1647 #ifdef EC_EOE
1648 
1649 /* compatibility for priority changes */
1650 static inline void set_normal_priority(struct task_struct *p, int nice)
1651 {
1652 #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
1653  sched_set_normal(p, nice);
1654 #else
1655  struct sched_param param = { .sched_priority = 0 };
1656  sched_setscheduler(p, SCHED_NORMAL, &param);
1657  set_user_nice(p, nice);
1658 #endif
1659 }
1660 
1661 /****************************************************************************/
1662 
1666 {
1667  if (master->eoe_thread) {
1668  EC_MASTER_WARN(master, "EoE already running!\n");
1669  return;
1670  }
1671 
1672  if (list_empty(&master->eoe_handlers))
1673  return;
1674 
1675  if (!master->send_cb || !master->receive_cb) {
1676  EC_MASTER_WARN(master, "No EoE processing"
1677  " because of missing callbacks!\n");
1678  return;
1679  }
1680 
1681  EC_MASTER_INFO(master, "Starting EoE thread.\n");
1682  master->eoe_thread = kthread_run(ec_master_eoe_thread, master,
1683  "EtherCAT-EoE");
1684  if (IS_ERR(master->eoe_thread)) {
1685  int err = (int) PTR_ERR(master->eoe_thread);
1686  EC_MASTER_ERR(master, "Failed to start EoE thread (error %i)!\n",
1687  err);
1688  master->eoe_thread = NULL;
1689  return;
1690  }
1691 
1692  set_normal_priority(master->eoe_thread, 0);
1693 }
1694 
1695 /****************************************************************************/
1696 
1700 {
1701  if (master->eoe_thread) {
1702  EC_MASTER_INFO(master, "Stopping EoE thread.\n");
1703 
1704  kthread_stop(master->eoe_thread);
1705  master->eoe_thread = NULL;
1706  EC_MASTER_INFO(master, "EoE thread exited.\n");
1707  }
1708 }
1709 
1710 /****************************************************************************/
1711 
1714 static int ec_master_eoe_thread(void *priv_data)
1715 {
1716  ec_master_t *master = (ec_master_t *) priv_data;
1717  ec_eoe_t *eoe;
1718  unsigned int none_open, sth_to_send, all_idle;
1719 
1720  EC_MASTER_DBG(master, 1, "EoE thread running.\n");
1721 
1722  while (!kthread_should_stop()) {
1723  none_open = 1;
1724  all_idle = 1;
1725 
1726  list_for_each_entry(eoe, &master->eoe_handlers, list) {
1727  if (ec_eoe_is_open(eoe)) {
1728  none_open = 0;
1729  break;
1730  }
1731  }
1732  if (none_open)
1733  goto schedule;
1734 
1735  // receive datagrams
1736  master->receive_cb(master->cb_data);
1737 
1738  // actual EoE processing
1739  sth_to_send = 0;
1740  list_for_each_entry(eoe, &master->eoe_handlers, list) {
1741  ec_eoe_run(eoe);
1742  if (eoe->queue_datagram) {
1743  sth_to_send = 1;
1744  }
1745  if (!ec_eoe_is_idle(eoe)) {
1746  all_idle = 0;
1747  }
1748  }
1749 
1750  if (sth_to_send) {
1751  list_for_each_entry(eoe, &master->eoe_handlers, list) {
1752  ec_eoe_queue(eoe);
1753  }
1754  // (try to) send datagrams
1755  master->send_cb(master->cb_data);
1756  }
1757 
1758 schedule:
1759  if (all_idle) {
1760  set_current_state(TASK_INTERRUPTIBLE);
1761  schedule_timeout(1);
1762  } else {
1763  schedule();
1764  }
1765  }
1766 
1767  EC_MASTER_DBG(master, 1, "EoE thread exiting...\n");
1768  return 0;
1769 }
1770 
1771 #endif
1772 
1773 /****************************************************************************/
1774 
1778  ec_master_t *master
1779  )
1780 {
1781  ec_slave_config_t *sc;
1782 
1783  list_for_each_entry(sc, &master->configs, list) {
1785  }
1786 }
1787 
1788 /****************************************************************************/
1789 
1793 #define EC_FIND_SLAVE \
1794  do { \
1795  if (alias) { \
1796  for (; slave < master->slaves + master->slave_count; \
1797  slave++) { \
1798  if (slave->effective_alias == alias) \
1799  break; \
1800  } \
1801  if (slave == master->slaves + master->slave_count) \
1802  return NULL; \
1803  } \
1804  \
1805  slave += position; \
1806  if (slave < master->slaves + master->slave_count) { \
1807  return slave; \
1808  } else { \
1809  return NULL; \
1810  } \
1811  } while (0)
1812 
1818  ec_master_t *master,
1819  uint16_t alias,
1820  uint16_t position
1821  )
1822 {
1823  ec_slave_t *slave = master->slaves;
1824  EC_FIND_SLAVE;
1825 }
1826 
1834  const ec_master_t *master,
1835  uint16_t alias,
1836  uint16_t position
1837  )
1838 {
1839  const ec_slave_t *slave = master->slaves;
1840  EC_FIND_SLAVE;
1841 }
1842 
1843 /****************************************************************************/
1844 
1850  const ec_master_t *master
1851  )
1852 {
1853  const ec_slave_config_t *sc;
1854  unsigned int count = 0;
1855 
1856  list_for_each_entry(sc, &master->configs, list) {
1857  count++;
1858  }
1859 
1860  return count;
1861 }
1862 
1863 /****************************************************************************/
1864 
1868 #define EC_FIND_CONFIG \
1869  do { \
1870  list_for_each_entry(sc, &master->configs, list) { \
1871  if (pos--) \
1872  continue; \
1873  return sc; \
1874  } \
1875  return NULL; \
1876  } while (0)
1877 
1883  const ec_master_t *master,
1884  unsigned int pos
1885  )
1886 {
1887  ec_slave_config_t *sc;
1889 }
1890 
1898  const ec_master_t *master,
1899  unsigned int pos
1900  )
1901 {
1902  const ec_slave_config_t *sc;
1904 }
1905 
1906 /****************************************************************************/
1907 
1913  const ec_master_t *master
1914  )
1915 {
1916  const ec_domain_t *domain;
1917  unsigned int count = 0;
1918 
1919  list_for_each_entry(domain, &master->domains, list) {
1920  count++;
1921  }
1922 
1923  return count;
1924 }
1925 
1926 /****************************************************************************/
1927 
1931 #define EC_FIND_DOMAIN \
1932  do { \
1933  list_for_each_entry(domain, &master->domains, list) { \
1934  if (index--) \
1935  continue; \
1936  return domain; \
1937  } \
1938  \
1939  return NULL; \
1940  } while (0)
1941 
1947  ec_master_t *master,
1948  unsigned int index
1949  )
1950 {
1951  ec_domain_t *domain;
1953 }
1954 
1962  const ec_master_t *master,
1963  unsigned int index
1964  )
1965 {
1966  const ec_domain_t *domain;
1968 }
1969 
1970 /****************************************************************************/
1971 
1972 #ifdef EC_EOE
1973 
1979  const ec_master_t *master
1980  )
1981 {
1982  const ec_eoe_t *eoe;
1983  unsigned int count = 0;
1984 
1985  list_for_each_entry(eoe, &master->eoe_handlers, list) {
1986  count++;
1987  }
1988 
1989  return count;
1990 }
1991 
1992 /****************************************************************************/
1993 
2001  const ec_master_t *master,
2002  uint16_t index
2003  )
2004 {
2005  const ec_eoe_t *eoe;
2006 
2007  list_for_each_entry(eoe, &master->eoe_handlers, list) {
2008  if (index--)
2009  continue;
2010  return eoe;
2011  }
2012 
2013  return NULL;
2014 }
2015 
2016 #endif
2017 
2018 /****************************************************************************/
2019 
2026  ec_master_t *master,
2027  unsigned int level
2028  )
2029 {
2030  if (level > 2) {
2031  EC_MASTER_ERR(master, "Invalid debug level %u!\n", level);
2032  return -EINVAL;
2033  }
2034 
2035  if (level != master->debug_level) {
2036  master->debug_level = level;
2037  EC_MASTER_INFO(master, "Master debug level set to %u.\n",
2038  master->debug_level);
2039  }
2040 
2041  return 0;
2042 }
2043 
2044 /****************************************************************************/
2045 
2049  ec_master_t *master
2050  )
2051 {
2052  ec_slave_t *slave, *ref = NULL;
2053 
2054  if (master->dc_ref_config) {
2055  // Use application-selected reference clock
2056  slave = master->dc_ref_config->slave;
2057 
2058  if (slave) {
2059  if (slave->base_dc_supported && slave->has_dc_system_time) {
2060  ref = slave;
2061  }
2062  else {
2063  EC_MASTER_WARN(master, "Slave %u can not act as a"
2064  " DC reference clock!", slave->ring_position);
2065  }
2066  }
2067  else {
2068  EC_MASTER_WARN(master, "DC reference clock config (%u-%u)"
2069  " has no slave attached!\n", master->dc_ref_config->alias,
2070  master->dc_ref_config->position);
2071  }
2072  }
2073  else {
2074  // Use first slave with DC support as reference clock
2075  for (slave = master->slaves;
2076  slave < master->slaves + master->slave_count;
2077  slave++) {
2078  if (slave->base_dc_supported && slave->has_dc_system_time) {
2079  ref = slave;
2080  break;
2081  }
2082  }
2083 
2084  }
2085 
2086  master->dc_ref_clock = ref;
2087 
2088  if (ref) {
2089  EC_MASTER_INFO(master, "Using slave %u as DC reference clock.\n",
2090  ref->ring_position);
2091  }
2092  else {
2093  EC_MASTER_INFO(master, "No DC reference clock found.\n");
2094  }
2095 
2096  // These calls always succeed, because the
2097  // datagrams have been pre-allocated.
2099  ref ? ref->station_address : 0xffff, 0x0910, 4);
2101  ref ? ref->station_address : 0xffff, 0x0910, 4);
2102 }
2103 
2104 /****************************************************************************/
2105 
2111  ec_master_t *master,
2112  ec_slave_t *port0_slave,
2113  unsigned int *slave_position
2114  )
2115 {
2116  ec_slave_t *slave = master->slaves + *slave_position;
2117  unsigned int port_index;
2118  int ret;
2119 
2120  static const unsigned int next_table[EC_MAX_PORTS] = {
2121  3, 2, 0, 1
2122  };
2123 
2124  slave->ports[0].next_slave = port0_slave;
2125 
2126  port_index = 3;
2127  while (port_index != 0) {
2128  if (!slave->ports[port_index].link.loop_closed) {
2129  *slave_position = *slave_position + 1;
2130  if (*slave_position < master->slave_count) {
2131  slave->ports[port_index].next_slave =
2132  master->slaves + *slave_position;
2133  ret = ec_master_calc_topology_rec(master,
2134  slave, slave_position);
2135  if (ret) {
2136  return ret;
2137  }
2138  } else {
2139  return -1;
2140  }
2141  }
2142 
2143  port_index = next_table[port_index];
2144  }
2145 
2146  return 0;
2147 }
2148 
2149 /****************************************************************************/
2150 
2154  ec_master_t *master
2155  )
2156 {
2157  unsigned int slave_position = 0;
2158 
2159  if (master->slave_count == 0)
2160  return;
2161 
2162  if (ec_master_calc_topology_rec(master, NULL, &slave_position))
2163  EC_MASTER_ERR(master, "Failed to calculate bus topology.\n");
2164 }
2165 
2166 /****************************************************************************/
2167 
2171  ec_master_t *master
2172  )
2173 {
2174  ec_slave_t *slave;
2175 
2176  for (slave = master->slaves;
2177  slave < master->slaves + master->slave_count;
2178  slave++) {
2180  }
2181 
2182  if (master->dc_ref_clock) {
2183  uint32_t delay = 0;
2185  }
2186 }
2187 
2188 /****************************************************************************/
2189 
2193  ec_master_t *master
2194  )
2195 {
2196  // find DC reference clock
2198 
2199  // calculate bus topology
2200  ec_master_calc_topology(master);
2201 
2203 }
2204 
2205 /****************************************************************************/
2206 
2210  ec_master_t *master
2211  )
2212 {
2213  unsigned int i;
2214  ec_slave_t *slave;
2215 
2216  if (!master->active)
2217  return;
2218 
2219  EC_MASTER_DBG(master, 1, "Requesting OP...\n");
2220 
2221  // request OP for all configured slaves
2222  for (i = 0; i < master->slave_count; i++) {
2223  slave = master->slaves + i;
2224  if (slave->config) {
2226  }
2227  }
2228 
2229  // always set DC reference clock to OP
2230  if (master->dc_ref_clock) {
2232  }
2233 }
2234 
2235 /*****************************************************************************
2236  * Application interface
2237  ****************************************************************************/
2238 
2244  ec_master_t *master
2245  )
2246 {
2247  ec_domain_t *domain, *last_domain;
2248  unsigned int index;
2249 
2250  EC_MASTER_DBG(master, 1, "ecrt_master_create_domain(master = 0x%p)\n",
2251  master);
2252 
2253  if (!(domain =
2254  (ec_domain_t *) kmalloc(sizeof(ec_domain_t), GFP_KERNEL))) {
2255  EC_MASTER_ERR(master, "Error allocating domain memory!\n");
2256  return ERR_PTR(-ENOMEM);
2257  }
2258 
2259  down(&master->master_sem);
2260 
2261  if (list_empty(&master->domains)) {
2262  index = 0;
2263  } else {
2264  last_domain = list_entry(master->domains.prev, ec_domain_t, list);
2265  index = last_domain->index + 1;
2266  }
2267 
2268  ec_domain_init(domain, master, index);
2269  list_add_tail(&domain->list, &master->domains);
2270 
2271  up(&master->master_sem);
2272 
2273  EC_MASTER_DBG(master, 1, "Created domain %u.\n", domain->index);
2274 
2275  return domain;
2276 }
2277 
2278 /****************************************************************************/
2279 
2281  ec_master_t *master
2282  )
2283 {
2285  return IS_ERR(d) ? NULL : d;
2286 }
2287 
2288 /****************************************************************************/
2289 
2291 {
2292  uint32_t domain_offset;
2293  ec_domain_t *domain;
2294  int ret;
2295 #ifdef EC_EOE
2296  int eoe_was_running;
2297 #endif
2298 
2299  EC_MASTER_DBG(master, 1, "ecrt_master_activate(master = 0x%p)\n", master);
2300 
2301  if (master->active) {
2302  EC_MASTER_WARN(master, "%s: Master already active!\n", __func__);
2303  return 0;
2304  }
2305 
2306  down(&master->master_sem);
2307 
2308  // finish all domains
2309  domain_offset = 0;
2310  list_for_each_entry(domain, &master->domains, list) {
2311  ret = ec_domain_finish(domain, domain_offset);
2312  if (ret < 0) {
2313  up(&master->master_sem);
2314  EC_MASTER_ERR(master, "Failed to finish domain 0x%p!\n", domain);
2315  return ret;
2316  }
2317  domain_offset += domain->data_size;
2318  }
2319 
2320  up(&master->master_sem);
2321 
2322  // restart EoE process and master thread with new locking
2323 
2324  ec_master_thread_stop(master);
2325 #ifdef EC_EOE
2326  eoe_was_running = master->eoe_thread != NULL;
2327  ec_master_eoe_stop(master);
2328 #endif
2329 
2330  EC_MASTER_DBG(master, 1, "FSM datagram is %p.\n", &master->fsm_datagram);
2331 
2332  master->injection_seq_fsm = 0;
2333  master->injection_seq_rt = 0;
2334 
2335  master->send_cb = master->app_send_cb;
2336  master->receive_cb = master->app_receive_cb;
2337  master->cb_data = master->app_cb_data;
2338 
2339 #ifdef EC_EOE
2340  if (eoe_was_running) {
2341  ec_master_eoe_start(master);
2342  }
2343 #endif
2345  "EtherCAT-OP");
2346  if (ret < 0) {
2347  EC_MASTER_ERR(master, "Failed to start master thread!\n");
2348  return ret;
2349  }
2350 
2351  /* Allow scanning after a topology change. */
2352  master->allow_scan = 1;
2353 
2354  master->active = 1;
2355 
2356  // notify state machine, that the configuration shall now be applied
2357  master->config_changed = 1;
2358 
2359  return 0;
2360 }
2361 
2362 /****************************************************************************/
2363 
2365 {
2366  ec_slave_t *slave;
2367 #ifdef EC_EOE
2368  ec_eoe_t *eoe;
2369  int eoe_was_running;
2370 #endif
2371 
2372  EC_MASTER_DBG(master, 1, "%s(master = 0x%p)\n", __func__, master);
2373 
2374  if (!master->active) {
2375  EC_MASTER_WARN(master, "%s: Master not active.\n", __func__);
2376  return -EINVAL;
2377  }
2378 
2379  ec_master_thread_stop(master);
2380 #ifdef EC_EOE
2381  eoe_was_running = master->eoe_thread != NULL;
2382  ec_master_eoe_stop(master);
2383 #endif
2384 
2387  master->cb_data = master;
2388 
2389  ec_master_clear_config(master);
2390 
2391  for (slave = master->slaves;
2392  slave < master->slaves + master->slave_count;
2393  slave++) {
2394 
2395  // set states for all slaves
2397 
2398  // mark for reconfiguration, because the master could have no
2399  // possibility for a reconfiguration between two sequential operation
2400  // phases.
2401  slave->force_config = 1;
2402  }
2403 
2404 #ifdef EC_EOE
2405  // ... but leave EoE slaves in OP
2406  list_for_each_entry(eoe, &master->eoe_handlers, list) {
2407  if (ec_eoe_is_open(eoe))
2409  }
2410 #endif
2411 
2412  master->app_time = 0ULL;
2413  master->dc_ref_time = 0ULL;
2414 
2415 #ifdef EC_EOE
2416  if (eoe_was_running) {
2417  ec_master_eoe_start(master);
2418  }
2419 #endif
2421  "EtherCAT-IDLE")) {
2422  EC_MASTER_WARN(master, "Failed to restart master thread!\n");
2423  }
2424 
2425  /* Disallow scanning to get into the same state like after a master
2426  * request (after ec_master_enter_operation_phase() is called). */
2427  master->allow_scan = 0;
2428 
2429  master->active = 0;
2430  return 0;
2431 }
2432 
2433 /****************************************************************************/
2434 
2436 {
2437  ec_datagram_t *datagram, *n;
2438  ec_device_index_t dev_idx;
2439 
2440  if (master->injection_seq_rt != master->injection_seq_fsm) {
2441  // inject datagram produced by master FSM
2442  ec_master_queue_datagram(master, &master->fsm_datagram);
2443  master->injection_seq_rt = master->injection_seq_fsm;
2444  }
2445 
2447 
2448  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
2449  dev_idx++) {
2450  if (unlikely(!master->devices[dev_idx].link_state)) {
2451  // link is down, no datagram can be sent
2452  list_for_each_entry_safe(datagram, n,
2453  &master->datagram_queue, queue) {
2454  if (datagram->device_index == dev_idx) {
2455  datagram->state = EC_DATAGRAM_ERROR;
2456  list_del_init(&datagram->queue);
2457  }
2458  }
2459 
2460  if (!master->devices[dev_idx].dev) {
2461  continue;
2462  }
2463 
2464  // query link state
2465  ec_device_poll(&master->devices[dev_idx]);
2466 
2467  // clear frame statistics
2468  ec_device_clear_stats(&master->devices[dev_idx]);
2469  continue;
2470  }
2471 
2472  // send frames
2473  ec_master_send_datagrams(master, dev_idx);
2474  }
2475  return 0;
2476 }
2477 
2478 /****************************************************************************/
2479 
2481 {
2482  unsigned int dev_idx;
2483  ec_datagram_t *datagram, *next;
2484 
2485  // receive datagrams
2486  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
2487  dev_idx++) {
2488  ec_device_poll(&master->devices[dev_idx]);
2489  }
2491 
2492  // dequeue all datagrams that timed out
2493  list_for_each_entry_safe(datagram, next, &master->datagram_queue, queue) {
2494  if (datagram->state != EC_DATAGRAM_SENT) continue;
2495 
2496 #ifdef EC_HAVE_CYCLES
2497  if (master->devices[EC_DEVICE_MAIN].cycles_poll -
2498  datagram->cycles_sent > timeout_cycles) {
2499 #else
2500  if (master->devices[EC_DEVICE_MAIN].jiffies_poll -
2501  datagram->jiffies_sent > timeout_jiffies) {
2502 #endif
2503  list_del_init(&datagram->queue);
2504  datagram->state = EC_DATAGRAM_TIMED_OUT;
2505  master->stats.timeouts++;
2506 
2507 #ifdef EC_RT_SYSLOG
2508  ec_master_output_stats(master);
2509 
2510  if (unlikely(master->debug_level > 0)) {
2511  unsigned int time_us;
2512 #ifdef EC_HAVE_CYCLES
2513  time_us = (unsigned int)
2514  (master->devices[EC_DEVICE_MAIN].cycles_poll -
2515  datagram->cycles_sent) * 1000 / cpu_khz;
2516 #else
2517  time_us = (unsigned int)
2518  ((master->devices[EC_DEVICE_MAIN].jiffies_poll -
2519  datagram->jiffies_sent) * 1000000 / HZ);
2520 #endif
2521  EC_MASTER_DBG(master, 0, "TIMED OUT datagram %p,"
2522  " index %02X waited %u us.\n",
2523  datagram, datagram->index, time_us);
2524  }
2525 #endif /* RT_SYSLOG */
2526  }
2527  }
2528  return 0;
2529 }
2530 
2531 /****************************************************************************/
2532 
2534 {
2535  ec_datagram_t *datagram, *next;
2536 
2537  if (down_trylock(&master->ext_queue_sem))
2538  return -EAGAIN;
2539 
2540  list_for_each_entry_safe(datagram, next, &master->ext_datagram_queue,
2541  ext_queue) {
2542  list_del_init(&datagram->ext_queue);
2543  ec_master_queue_datagram(master, datagram);
2544  }
2545  up(&master->ext_queue_sem);
2546 
2547  return ecrt_master_send(master);
2548 }
2549 
2550 /****************************************************************************/
2551 
2555  uint16_t alias, uint16_t position, uint32_t vendor_id,
2556  uint32_t product_code)
2557 {
2558  ec_slave_config_t *sc;
2559  unsigned int found = 0;
2560 
2561 
2562  EC_MASTER_DBG(master, 1, "ecrt_master_slave_config(master = 0x%p,"
2563  " alias = %u, position = %u, vendor_id = 0x%08x,"
2564  " product_code = 0x%08x)\n",
2565  master, alias, position, vendor_id, product_code);
2566 
2567  list_for_each_entry(sc, &master->configs, list) {
2568  if (sc->alias == alias && sc->position == position) {
2569  found = 1;
2570  break;
2571  }
2572  }
2573 
2574  if (found) { // config with same alias/position already existing
2575  if (sc->vendor_id != vendor_id || sc->product_code != product_code) {
2576  EC_MASTER_ERR(master, "Slave type mismatch. Slave was"
2577  " configured as 0x%08X/0x%08X before. Now configuring"
2578  " with 0x%08X/0x%08X.\n", sc->vendor_id, sc->product_code,
2579  vendor_id, product_code);
2580  return ERR_PTR(-ENOENT);
2581  }
2582  } else {
2583  EC_MASTER_DBG(master, 1, "Creating slave configuration for %u:%u,"
2584  " 0x%08X/0x%08X.\n",
2585  alias, position, vendor_id, product_code);
2586 
2587  if (!(sc = (ec_slave_config_t *) kmalloc(sizeof(ec_slave_config_t),
2588  GFP_KERNEL))) {
2589  EC_MASTER_ERR(master, "Failed to allocate memory"
2590  " for slave configuration.\n");
2591  return ERR_PTR(-ENOMEM);
2592  }
2593 
2594  ec_slave_config_init(sc, master,
2595  alias, position, vendor_id, product_code);
2596 
2597  down(&master->master_sem);
2598 
2599  // try to find the addressed slave
2602  list_add_tail(&sc->list, &master->configs);
2603 
2604  up(&master->master_sem);
2605  }
2606 
2607  return sc;
2608 }
2609 
2610 /****************************************************************************/
2611 
2613  uint16_t alias, uint16_t position, uint32_t vendor_id,
2614  uint32_t product_code)
2615 {
2616  ec_slave_config_t *sc = ecrt_master_slave_config_err(master, alias,
2617  position, vendor_id, product_code);
2618  return IS_ERR(sc) ? NULL : sc;
2619 }
2620 
2621 /****************************************************************************/
2622 
2624  ec_slave_config_t *sc)
2625 {
2626  if (sc) {
2627  ec_slave_t *slave = sc->slave;
2628 
2629  // output an early warning
2630  if (slave &&
2631  (!slave->base_dc_supported || !slave->has_dc_system_time)) {
2632  EC_MASTER_WARN(master, "Slave %u can not act as"
2633  " a reference clock!", slave->ring_position);
2634  }
2635  }
2636 
2637  master->dc_ref_config = sc;
2638  return 0;
2639 }
2640 
2641 /****************************************************************************/
2642 
2643 int ecrt_master(ec_master_t *master, ec_master_info_t *master_info)
2644 {
2645  EC_MASTER_DBG(master, 1, "ecrt_master(master = 0x%p,"
2646  " master_info = 0x%p)\n", master, master_info);
2647 
2648  master_info->slave_count = master->slave_count;
2649  master_info->link_up = master->devices[EC_DEVICE_MAIN].link_state;
2650  master_info->scan_busy = master->scan_busy;
2651  master_info->app_time = master->app_time;
2652  return 0;
2653 }
2654 
2655 /****************************************************************************/
2656 
2658  ec_master_scan_progress_t *progress)
2659 {
2660  EC_MASTER_DBG(master, 1, "ecrt_master_scan_progress(master = 0x%p,"
2661  " progress = 0x%p)\n", master, progress);
2662 
2663  progress->slave_count = master->slave_count;
2664  progress->scan_index = master->scan_index;
2665  return 0;
2666 }
2667 
2668 /****************************************************************************/
2669 
2670 int ecrt_master_get_slave(ec_master_t *master, uint16_t slave_position,
2671  ec_slave_info_t *slave_info)
2672 {
2673  const ec_slave_t *slave;
2674  unsigned int i;
2675  int ret = 0;
2676 
2677  if (down_interruptible(&master->master_sem)) {
2678  return -EINTR;
2679  }
2680 
2681  slave = ec_master_find_slave_const(master, 0, slave_position);
2682 
2683  if (slave == NULL) {
2684  ret = -ENOENT;
2685  goto out_get_slave;
2686  }
2687 
2688  slave_info->position = slave->ring_position;
2689  slave_info->vendor_id = slave->sii.vendor_id;
2690  slave_info->product_code = slave->sii.product_code;
2691  slave_info->revision_number = slave->sii.revision_number;
2692  slave_info->serial_number = slave->sii.serial_number;
2693  slave_info->alias = slave->effective_alias;
2694  slave_info->current_on_ebus = slave->sii.current_on_ebus;
2695 
2696  for (i = 0; i < EC_MAX_PORTS; i++) {
2697  slave_info->ports[i].desc = slave->ports[i].desc;
2698  slave_info->ports[i].link.link_up = slave->ports[i].link.link_up;
2699  slave_info->ports[i].link.loop_closed =
2700  slave->ports[i].link.loop_closed;
2701  slave_info->ports[i].link.signal_detected =
2702  slave->ports[i].link.signal_detected;
2703  slave_info->ports[i].receive_time = slave->ports[i].receive_time;
2704  if (slave->ports[i].next_slave) {
2705  slave_info->ports[i].next_slave =
2706  slave->ports[i].next_slave->ring_position;
2707  } else {
2708  slave_info->ports[i].next_slave = 0xffff;
2709  }
2710  slave_info->ports[i].delay_to_next_dc =
2711  slave->ports[i].delay_to_next_dc;
2712  }
2713 
2714  slave_info->al_state = slave->current_state;
2715  slave_info->error_flag = slave->error_flag;
2716  slave_info->sync_count = slave->sii.sync_count;
2717  slave_info->sdo_count = ec_slave_sdo_count(slave);
2718  if (slave->sii.name) {
2719  strncpy(slave_info->name, slave->sii.name, EC_MAX_STRING_LENGTH);
2720  } else {
2721  slave_info->name[0] = 0;
2722  }
2723 
2724 out_get_slave:
2725  up(&master->master_sem);
2726 
2727  return ret;
2728 }
2729 
2730 /****************************************************************************/
2731 
2733  void (*send_cb)(void *), void (*receive_cb)(void *), void *cb_data)
2734 {
2735  EC_MASTER_DBG(master, 1, "ecrt_master_callbacks(master = 0x%p,"
2736  " send_cb = 0x%p, receive_cb = 0x%p, cb_data = 0x%p)\n",
2737  master, send_cb, receive_cb, cb_data);
2738 
2739  master->app_send_cb = send_cb;
2740  master->app_receive_cb = receive_cb;
2741  master->app_cb_data = cb_data;
2742 }
2743 
2744 /****************************************************************************/
2745 
2747 {
2748  ec_device_index_t dev_idx;
2749 
2750  state->slaves_responding = 0U;
2751  state->al_states = 0;
2752  state->link_up = 0U;
2753 
2754  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
2755  dev_idx++) {
2756  /* Announce sum of responding slaves on all links. */
2757  state->slaves_responding += master->fsm.slaves_responding[dev_idx];
2758 
2759  /* Binary-or slave states of all links. */
2760  state->al_states |= master->fsm.slave_states[dev_idx];
2761 
2762  /* Signal link up if at least one device has link. */
2763  state->link_up |= master->devices[dev_idx].link_state;
2764  }
2765  return 0;
2766 }
2767 
2768 /****************************************************************************/
2769 
2770 int ecrt_master_link_state(const ec_master_t *master, unsigned int dev_idx,
2771  ec_master_link_state_t *state)
2772 {
2773  if (dev_idx >= ec_master_num_devices(master)) {
2774  return -EINVAL;
2775  }
2776 
2777  state->slaves_responding = master->fsm.slaves_responding[dev_idx];
2778  state->al_states = master->fsm.slave_states[dev_idx];
2779  state->link_up = master->devices[dev_idx].link_state;
2780 
2781  return 0;
2782 }
2783 
2784 /****************************************************************************/
2785 
2786 int ecrt_master_application_time(ec_master_t *master, uint64_t app_time)
2787 {
2788  master->app_time = app_time;
2789 
2790  if (unlikely(!master->dc_ref_time)) {
2791  master->dc_ref_time = app_time;
2792  }
2793  return 0;
2794 }
2795 
2796 /****************************************************************************/
2797 
2799  uint32_t *time)
2800 {
2801  if (!master->dc_ref_clock) {
2802  return -ENXIO;
2803  }
2804 
2805  if (master->sync_datagram.state != EC_DATAGRAM_RECEIVED) {
2806  return -EIO;
2807  }
2808 
2809  // Get returned datagram time, transmission delay removed.
2810  *time = EC_READ_U32(master->sync_datagram.data) -
2812 
2813  return 0;
2814 }
2815 
2816 /****************************************************************************/
2817 
2819 {
2820  if (master->dc_ref_clock) {
2821  EC_WRITE_U32(master->ref_sync_datagram.data, master->app_time);
2822  ec_master_queue_datagram(master, &master->ref_sync_datagram);
2823  } else {
2824  return -ENXIO;
2825  }
2826  return 0;
2827 }
2828 
2829 /****************************************************************************/
2830 
2832  ec_master_t *master,
2833  uint64_t sync_time
2834  )
2835 {
2836  if (master->dc_ref_clock) {
2837  EC_WRITE_U32(master->ref_sync_datagram.data, sync_time);
2838  ec_master_queue_datagram(master, &master->ref_sync_datagram);
2839  } else {
2840  return -ENXIO;
2841  }
2842  return 0;
2843 }
2844 
2845 /****************************************************************************/
2846 
2848 {
2849  if (master->dc_ref_clock) {
2850  ec_datagram_zero(&master->sync_datagram);
2851  ec_master_queue_datagram(master, &master->sync_datagram);
2852  } else {
2853  return -ENXIO;
2854  }
2855  return 0;
2856 }
2857 
2858 /****************************************************************************/
2859 
2861 {
2863  ec_master_queue_datagram(master, &master->sync_mon_datagram);
2864  return 0;
2865 }
2866 
2867 /****************************************************************************/
2868 
2870 {
2871  if (master->sync_mon_datagram.state == EC_DATAGRAM_RECEIVED) {
2872  return EC_READ_U32(master->sync_mon_datagram.data) & 0x7fffffff;
2873  } else {
2874  return 0xffffffff;
2875  }
2876 }
2877 
2878 /****************************************************************************/
2879 
2880 int ecrt_master_sdo_download(ec_master_t *master, uint16_t slave_position,
2881  uint16_t index, uint8_t subindex, const uint8_t *data,
2882  size_t data_size, uint32_t *abort_code)
2883 {
2884  ec_sdo_request_t request;
2885  ec_slave_t *slave;
2886  int ret;
2887 
2888  EC_MASTER_DBG(master, 1, "%s(master = 0x%p,"
2889  " slave_position = %u, index = 0x%04X, subindex = 0x%02X,"
2890  " data = 0x%p, data_size = %zu, abort_code = 0x%p)\n",
2891  __func__, master, slave_position, index, subindex,
2892  data, data_size, abort_code);
2893 
2894  ec_sdo_request_init(&request);
2895  ecrt_sdo_request_index(&request, index, subindex);
2896  ret = ec_sdo_request_alloc(&request, data_size);
2897  if (ret) {
2898  ec_sdo_request_clear(&request);
2899  return ret;
2900  }
2901 
2902  memcpy(request.data, data, data_size);
2903  request.data_size = data_size;
2904  ecrt_sdo_request_write(&request);
2905 
2906  if (down_interruptible(&master->master_sem)) {
2907  ec_sdo_request_clear(&request);
2908  return -EINTR;
2909  }
2910 
2911  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
2912  up(&master->master_sem);
2913  EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
2914  ec_sdo_request_clear(&request);
2915  return -EINVAL;
2916  }
2917 
2918  EC_SLAVE_DBG(slave, 1, "Scheduling SDO download request.\n");
2919 
2920  // schedule request.
2921  list_add_tail(&request.list, &slave->sdo_requests);
2922 
2923  up(&master->master_sem);
2924 
2925  // wait for processing through FSM
2926  if (wait_event_interruptible(master->request_queue,
2927  request.state != EC_INT_REQUEST_QUEUED)) {
2928  // interrupted by signal
2929  down(&master->master_sem);
2930  if (request.state == EC_INT_REQUEST_QUEUED) {
2931  list_del(&request.list);
2932  up(&master->master_sem);
2933  ec_sdo_request_clear(&request);
2934  return -EINTR;
2935  }
2936  // request already processing: interrupt not possible.
2937  up(&master->master_sem);
2938  }
2939 
2940  // wait until master FSM has finished processing
2941  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
2942 
2943  *abort_code = request.abort_code;
2944 
2945  if (request.state == EC_INT_REQUEST_SUCCESS) {
2946  ret = 0;
2947  } else if (request.errno) {
2948  ret = -request.errno;
2949  } else {
2950  ret = -EIO;
2951  }
2952 
2953  ec_sdo_request_clear(&request);
2954  return ret;
2955 }
2956 
2957 /****************************************************************************/
2958 
2960  uint16_t slave_position, uint16_t index, const uint8_t *data,
2961  size_t data_size, uint32_t *abort_code)
2962 {
2963  ec_sdo_request_t request;
2964  ec_slave_t *slave;
2965  int ret;
2966 
2967  EC_MASTER_DBG(master, 1, "%s(master = 0x%p,"
2968  " slave_position = %u, index = 0x%04X,"
2969  " data = 0x%p, data_size = %zu, abort_code = 0x%p)\n",
2970  __func__, master, slave_position, index, data, data_size,
2971  abort_code);
2972 
2973  ec_sdo_request_init(&request);
2974  ecrt_sdo_request_index(&request, index, 0);
2975  ret = ec_sdo_request_alloc(&request, data_size);
2976  if (ret) {
2977  ec_sdo_request_clear(&request);
2978  return ret;
2979  }
2980 
2981  request.complete_access = 1;
2982  memcpy(request.data, data, data_size);
2983  request.data_size = data_size;
2984  ecrt_sdo_request_write(&request);
2985 
2986  if (down_interruptible(&master->master_sem)) {
2987  ec_sdo_request_clear(&request);
2988  return -EINTR;
2989  }
2990 
2991  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
2992  up(&master->master_sem);
2993  EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
2994  ec_sdo_request_clear(&request);
2995  return -EINVAL;
2996  }
2997 
2998  EC_SLAVE_DBG(slave, 1, "Scheduling SDO download request"
2999  " (complete access).\n");
3000 
3001  // schedule request.
3002  list_add_tail(&request.list, &slave->sdo_requests);
3003 
3004  up(&master->master_sem);
3005 
3006  // wait for processing through FSM
3007  if (wait_event_interruptible(master->request_queue,
3008  request.state != EC_INT_REQUEST_QUEUED)) {
3009  // interrupted by signal
3010  down(&master->master_sem);
3011  if (request.state == EC_INT_REQUEST_QUEUED) {
3012  list_del(&request.list);
3013  up(&master->master_sem);
3014  ec_sdo_request_clear(&request);
3015  return -EINTR;
3016  }
3017  // request already processing: interrupt not possible.
3018  up(&master->master_sem);
3019  }
3020 
3021  // wait until master FSM has finished processing
3022  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
3023 
3024  *abort_code = request.abort_code;
3025 
3026  if (request.state == EC_INT_REQUEST_SUCCESS) {
3027  ret = 0;
3028  } else if (request.errno) {
3029  ret = -request.errno;
3030  } else {
3031  ret = -EIO;
3032  }
3033 
3034  ec_sdo_request_clear(&request);
3035  return ret;
3036 }
3037 
3038 /****************************************************************************/
3039 
3040 int ecrt_master_sdo_upload(ec_master_t *master, uint16_t slave_position,
3041  uint16_t index, uint8_t subindex, uint8_t *target,
3042  size_t target_size, size_t *result_size, uint32_t *abort_code)
3043 {
3044  ec_sdo_request_t request;
3045  ec_slave_t *slave;
3046  int ret = 0;
3047 
3048  EC_MASTER_DBG(master, 1, "%s(master = 0x%p,"
3049  " slave_position = %u, index = 0x%04X, subindex = 0x%02X,"
3050  " target = 0x%p, target_size = %zu, result_size = 0x%p,"
3051  " abort_code = 0x%p)\n",
3052  __func__, master, slave_position, index, subindex,
3053  target, target_size, result_size, abort_code);
3054 
3055  ec_sdo_request_init(&request);
3056  ecrt_sdo_request_index(&request, index, subindex);
3057  ecrt_sdo_request_read(&request);
3058 
3059  if (down_interruptible(&master->master_sem)) {
3060  ec_sdo_request_clear(&request);
3061  return -EINTR;
3062  }
3063 
3064  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
3065  up(&master->master_sem);
3066  ec_sdo_request_clear(&request);
3067  EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
3068  return -EINVAL;
3069  }
3070 
3071  EC_SLAVE_DBG(slave, 1, "Scheduling SDO upload request.\n");
3072 
3073  // schedule request.
3074  list_add_tail(&request.list, &slave->sdo_requests);
3075 
3076  up(&master->master_sem);
3077 
3078  // wait for processing through FSM
3079  if (wait_event_interruptible(master->request_queue,
3080  request.state != EC_INT_REQUEST_QUEUED)) {
3081  // interrupted by signal
3082  down(&master->master_sem);
3083  if (request.state == EC_INT_REQUEST_QUEUED) {
3084  list_del(&request.list);
3085  up(&master->master_sem);
3086  ec_sdo_request_clear(&request);
3087  return -EINTR;
3088  }
3089  // request already processing: interrupt not possible.
3090  up(&master->master_sem);
3091  }
3092 
3093  // wait until master FSM has finished processing
3094  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
3095 
3096  *abort_code = request.abort_code;
3097 
3098  if (request.state != EC_INT_REQUEST_SUCCESS) {
3099  *result_size = 0;
3100  if (request.errno) {
3101  ret = -request.errno;
3102  } else {
3103  ret = -EIO;
3104  }
3105  } else {
3106  if (request.data_size > target_size) {
3107  EC_SLAVE_ERR(slave, "%s(): Buffer too small.\n", __func__);
3108  ret = -ENOBUFS;
3109  }
3110  else {
3111  memcpy(target, request.data, request.data_size);
3112  *result_size = request.data_size;
3113  ret = 0;
3114  }
3115  }
3116 
3117  ec_sdo_request_clear(&request);
3118  return ret;
3119 }
3120 
3121 /****************************************************************************/
3122 
3123 int ecrt_master_write_idn(ec_master_t *master, uint16_t slave_position,
3124  uint8_t drive_no, uint16_t idn, const uint8_t *data, size_t data_size,
3125  uint16_t *error_code)
3126 {
3127  ec_soe_request_t request;
3128  ec_slave_t *slave;
3129  int ret;
3130 
3131  if (drive_no > 7) {
3132  EC_MASTER_ERR(master, "Invalid drive number!\n");
3133  return -EINVAL;
3134  }
3135 
3136  ec_soe_request_init(&request);
3137  ec_soe_request_set_drive_no(&request, drive_no);
3138  ec_soe_request_set_idn(&request, idn);
3139 
3140  ret = ec_soe_request_alloc(&request, data_size);
3141  if (ret) {
3142  ec_soe_request_clear(&request);
3143  return ret;
3144  }
3145 
3146  memcpy(request.data, data, data_size);
3147  request.data_size = data_size;
3148  ec_soe_request_write(&request);
3149 
3150  if (down_interruptible(&master->master_sem)) {
3151  ec_soe_request_clear(&request);
3152  return -EINTR;
3153  }
3154 
3155  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
3156  up(&master->master_sem);
3157  EC_MASTER_ERR(master, "Slave %u does not exist!\n",
3158  slave_position);
3159  ec_soe_request_clear(&request);
3160  return -EINVAL;
3161  }
3162 
3163  EC_SLAVE_DBG(slave, 1, "Scheduling SoE write request.\n");
3164 
3165  // schedule SoE write request.
3166  list_add_tail(&request.list, &slave->soe_requests);
3167 
3168  up(&master->master_sem);
3169 
3170  // wait for processing through FSM
3171  if (wait_event_interruptible(master->request_queue,
3172  request.state != EC_INT_REQUEST_QUEUED)) {
3173  // interrupted by signal
3174  down(&master->master_sem);
3175  if (request.state == EC_INT_REQUEST_QUEUED) {
3176  // abort request
3177  list_del(&request.list);
3178  up(&master->master_sem);
3179  ec_soe_request_clear(&request);
3180  return -EINTR;
3181  }
3182  up(&master->master_sem);
3183  }
3184 
3185  // wait until master FSM has finished processing
3186  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
3187 
3188  if (error_code) {
3189  *error_code = request.error_code;
3190  }
3191  ret = request.state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO;
3192  ec_soe_request_clear(&request);
3193 
3194  return ret;
3195 }
3196 
3197 /****************************************************************************/
3198 
3199 int ecrt_master_read_idn(ec_master_t *master, uint16_t slave_position,
3200  uint8_t drive_no, uint16_t idn, uint8_t *target, size_t target_size,
3201  size_t *result_size, uint16_t *error_code)
3202 {
3203  ec_soe_request_t request;
3204  ec_slave_t *slave;
3205  int ret;
3206 
3207  if (drive_no > 7) {
3208  EC_MASTER_ERR(master, "Invalid drive number!\n");
3209  return -EINVAL;
3210  }
3211 
3212  ec_soe_request_init(&request);
3213  ec_soe_request_set_drive_no(&request, drive_no);
3214  ec_soe_request_set_idn(&request, idn);
3215  ec_soe_request_read(&request);
3216 
3217  if (down_interruptible(&master->master_sem)) {
3218  ec_soe_request_clear(&request);
3219  return -EINTR;
3220  }
3221 
3222  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
3223  up(&master->master_sem);
3224  ec_soe_request_clear(&request);
3225  EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
3226  return -EINVAL;
3227  }
3228 
3229  EC_SLAVE_DBG(slave, 1, "Scheduling SoE read request.\n");
3230 
3231  // schedule request.
3232  list_add_tail(&request.list, &slave->soe_requests);
3233 
3234  up(&master->master_sem);
3235 
3236  // wait for processing through FSM
3237  if (wait_event_interruptible(master->request_queue,
3238  request.state != EC_INT_REQUEST_QUEUED)) {
3239  // interrupted by signal
3240  down(&master->master_sem);
3241  if (request.state == EC_INT_REQUEST_QUEUED) {
3242  list_del(&request.list);
3243  up(&master->master_sem);
3244  ec_soe_request_clear(&request);
3245  return -EINTR;
3246  }
3247  // request already processing: interrupt not possible.
3248  up(&master->master_sem);
3249  }
3250 
3251  // wait until master FSM has finished processing
3252  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
3253 
3254  if (error_code) {
3255  *error_code = request.error_code;
3256  }
3257 
3258  if (request.state != EC_INT_REQUEST_SUCCESS) {
3259  if (result_size) {
3260  *result_size = 0;
3261  }
3262  ret = -EIO;
3263  } else { // success
3264  if (request.data_size > target_size) {
3265  EC_SLAVE_ERR(slave, "%s(): Buffer too small.\n", __func__);
3266  ret = -ENOBUFS;
3267  }
3268  else { // data fits in buffer
3269  if (result_size) {
3270  *result_size = request.data_size;
3271  }
3272  memcpy(target, request.data, request.data_size);
3273  ret = 0;
3274  }
3275  }
3276 
3277  ec_soe_request_clear(&request);
3278  return ret;
3279 }
3280 
3281 /****************************************************************************/
3282 
3284 {
3285  ec_slave_config_t *sc;
3286 
3287  list_for_each_entry(sc, &master->configs, list) {
3288  if (sc->slave) {
3290  }
3291  }
3292  return 0;
3293 }
3294 
3295 /****************************************************************************/
3296 
3297 static void sc_reset_task_kicker(struct irq_work *work)
3298 {
3299  struct ec_master *master =
3300  container_of(work, struct ec_master, sc_reset_work_kicker);
3301  schedule_work(&master->sc_reset_work);
3302 }
3303 
3304 /****************************************************************************/
3305 
3306 static void sc_reset_task(struct work_struct *work)
3307 {
3308  struct ec_master *master =
3309  container_of(work, struct ec_master, sc_reset_work);
3310 
3311  down(&master->master_sem);
3312  ecrt_master_reset(master);
3313  up(&master->master_sem);
3314 }
3315 
3316 /****************************************************************************/
3317 
3320 EXPORT_SYMBOL(ecrt_master_create_domain);
3321 EXPORT_SYMBOL(ecrt_master_activate);
3322 EXPORT_SYMBOL(ecrt_master_deactivate);
3323 EXPORT_SYMBOL(ecrt_master_send);
3324 EXPORT_SYMBOL(ecrt_master_send_ext);
3325 EXPORT_SYMBOL(ecrt_master_receive);
3326 EXPORT_SYMBOL(ecrt_master_callbacks);
3327 EXPORT_SYMBOL(ecrt_master);
3328 EXPORT_SYMBOL(ecrt_master_scan_progress);
3329 EXPORT_SYMBOL(ecrt_master_get_slave);
3330 EXPORT_SYMBOL(ecrt_master_slave_config);
3331 EXPORT_SYMBOL(ecrt_master_select_reference_clock);
3332 EXPORT_SYMBOL(ecrt_master_state);
3333 EXPORT_SYMBOL(ecrt_master_link_state);
3334 EXPORT_SYMBOL(ecrt_master_application_time);
3335 EXPORT_SYMBOL(ecrt_master_sync_reference_clock);
3337 EXPORT_SYMBOL(ecrt_master_sync_slave_clocks);
3338 EXPORT_SYMBOL(ecrt_master_reference_clock_time);
3339 EXPORT_SYMBOL(ecrt_master_sync_monitor_queue);
3340 EXPORT_SYMBOL(ecrt_master_sync_monitor_process);
3341 EXPORT_SYMBOL(ecrt_master_sdo_download);
3342 EXPORT_SYMBOL(ecrt_master_sdo_download_complete);
3343 EXPORT_SYMBOL(ecrt_master_sdo_upload);
3344 EXPORT_SYMBOL(ecrt_master_write_idn);
3345 EXPORT_SYMBOL(ecrt_master_read_idn);
3346 EXPORT_SYMBOL(ecrt_master_reset);
3347 
3350 /****************************************************************************/
void ec_eoe_queue(ec_eoe_t *eoe)
Queues the datagram, if necessary.
Definition: ethernet.c:371
unsigned int injection_seq_fsm
Datagram injection sequence number for the FSM side.
Definition: master.h:215
uint32_t serial_number
Serial-Number stored on the slave.
Definition: ecrt.h:456
#define EC_IO_TIMEOUT
Datagram timeout in microseconds.
Definition: globals.h:38
ec_slave_port_desc_t desc
Physical port type.
Definition: ecrt.h:460
uint16_t error_code
SoE error code.
Definition: soe_request.h:56
unsigned int reserved
True, if the master is in use.
Definition: master.h:189
struct list_head ext_datagram_queue
Queue for non-application datagrams.
Definition: master.h:256
int ec_mac_is_zero(const uint8_t *)
Definition: module.c:266
uint16_t ring_position
Ring position.
Definition: slave.h:175
uint32_t revision_number
Revision number.
Definition: slave.h:129
unsigned long jiffies_sent
Jiffies, when the datagram was sent.
Definition: datagram.h:98
void ec_master_clear_config(ec_master_t *)
Clear the configuration applied by the application.
Definition: master.c:536
ec_datagram_t * ec_master_get_external_datagram(ec_master_t *)
Searches for a free datagram in the external datagram ring.
Definition: master.c:925
#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:716
int ecrt_master_deactivate(ec_master_t *master)
Deactivates the master.
Definition: master.c:2364
void ec_soe_request_set_idn(ec_soe_request_t *req, uint16_t idn)
Set IDN.
Definition: soe_request.c:111
int ec_rtdm_dev_init(ec_rtdm_dev_t *rtdm_dev, ec_master_t *master)
Initialize an RTDM device.
Definition: rtdm.c:59
#define EC_DATAGRAM_NAME_SIZE
Size of the datagram description string.
Definition: globals.h:104
ec_sii_t sii
Extracted SII data.
Definition: slave.h:215
struct sk_buff * tx_skb[EC_TX_RING_SIZE]
transmit skb ring
Definition: device.h:81
size_t data_size
Size of the data in data.
Definition: datagram.h:91
struct semaphore config_sem
Semaphore protecting the config_busy variable and the allow_config flag.
Definition: master.h:248
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:72
uint8_t sync_count
Number of sync managers.
Definition: ecrt.h:470
void ec_master_calc_dc(ec_master_t *master)
Distributed-clocks calculations.
Definition: master.c:2192
int ecrt_sdo_request_write(ec_sdo_request_t *req)
Schedule an SDO write operation.
Definition: sdo_request.c:232
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:2770
unsigned int fsm_exec_count
Number of entries in execution list.
Definition: master.h:273
unsigned int num_devices
Number of devices.
Definition: master.h:203
u64 last_loss
Tx/Rx difference of last statistics cycle.
Definition: master.h:159
u64 tx_count
Number of frames sent.
Definition: master.h:149
const unsigned int rate_intervals[]
List of intervals for statistics [s].
Definition: master.c:103
uint8_t error_flag
Error flag for that slave.
Definition: ecrt.h:469
void ec_master_clear(ec_master_t *master)
Destructor.
Definition: master.c:397
struct list_head sii_requests
SII write requests.
Definition: master.h:297
#define EC_SLAVE_DBG(slave, level, fmt, args...)
Convenience macro for printing slave-specific debug messages to syslog.
Definition: slave.h:98
int ecrt_master_send(ec_master_t *master)
Sends all datagrams in the queue.
Definition: master.c:2435
size_t data_size
Size of the process data.
Definition: domain.h:53
unsigned long jiffies_poll
jiffies of last poll
Definition: device.h:89
ec_slave_t * slave
pointer to the corresponding slave
Definition: ethernet.h:77
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:977
OP (mailbox communication and input/output update)
Definition: globals.h:132
s32 tx_byte_rates[EC_RATE_COUNT]
Transmit rates in byte/s for different statistics cycle periods.
Definition: master.h:166
int ecrt_master_scan_progress(ec_master_t *master, ec_master_scan_progress_t *progress)
Obtains network scan progress information.
Definition: master.c:2657
ec_internal_request_state_t state
State of the request.
Definition: fsm_master.h:51
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:1882
unsigned int slaves_responding[EC_MAX_NUM_DEVICES]
Number of responding slaves for every device.
Definition: fsm_master.h:72
ec_slave_port_t ports[EC_MAX_PORTS]
Ports.
Definition: slave.h:179
void ec_fsm_master_reset(ec_fsm_master_t *fsm)
Reset state machine.
Definition: fsm_master.c:144
void ec_master_request_op(ec_master_t *master)
Request OP state for configured slaves.
Definition: master.c:2209
static int ec_master_eoe_thread(void *)
Does the Ethernet over EtherCAT processing.
Definition: master.c:1714
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:176
CANopen SDO request.
Definition: sdo_request.h:40
unsigned int slave_count
Number of slaves in the network.
Definition: ecrt.h:399
ec_slave_state_t current_state
Current application state.
Definition: slave.h:184
void ec_master_leave_operation_phase(ec_master_t *master)
Transition function from OPERATION to IDLE phase.
Definition: master.c:772
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:2959
ec_domain_t * ecrt_master_create_domain(ec_master_t *master)
Creates a new process data domain.
Definition: master.c:2280
#define ec_master_num_devices(MASTER)
Number of Ethernet devices.
Definition: master.h:321
#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:233
EtherCAT slave structure.
ec_internal_request_state_t state
SDO request state.
Definition: sdo_request.h:55
uint32_t vendor_id
Vendor-ID stored on the slave.
Definition: ecrt.h:453
void ec_device_clear(ec_device_t *device)
Destructor.
Definition: device.c:159
struct list_head list
List item.
Definition: domain.h:48
struct list_head eoe_handlers
Ethernet over EtherCAT handlers.
Definition: master.h:283
uint32_t product_code
Slave product code.
Definition: slave_config.h:119
ec_slave_port_link_t link
Port link state.
Definition: ecrt.h:461
int ec_master_thread_start(ec_master_t *, int(*)(void *), const char *)
Starts the master thread.
Definition: master.c:583
Operation phase.
Definition: master.h:128
dev_t device_number
Device number for master cdevs.
Definition: module.c:63
ec_slave_port_link_t link
Port link status.
Definition: slave.h:112
unsigned int allow_scan
True, if slave scanning is allowed.
Definition: master.h:241
int ecrt_master_sync_reference_clock(ec_master_t *master)
Queues the DC reference clock drift compensation datagram for sending.
Definition: master.c:2818
size_t max_queue_size
Maximum size of datagram queue.
Definition: master.h:269
void ec_master_internal_receive_cb(void *cb_data)
Internal receiving callback.
Definition: master.c:565
uint16_t position
Index after alias.
Definition: slave_config.h:116
static int ec_master_operation_thread(void *)
Master kernel thread function for OPERATION phase.
Definition: master.c:1596
int ecrt_sdo_request_read(ec_sdo_request_t *req)
Schedule an SDO read operation.
Definition: sdo_request.c:220
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:1833
#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:2732
EtherCAT datagram.
Definition: datagram.h:79
struct list_head list
List item.
Definition: slave_config.h:112
uint32_t serial_number
Serial number.
Definition: slave.h:130
struct list_head fsm_exec_list
Slave FSM execution list.
Definition: master.h:272
Master scan progress information.
Definition: ecrt.h:414
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:1961
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:2000
#define EC_WRITE_U8(DATA, VAL)
Write an 8-bit unsigned value to EtherCAT data.
Definition: ecrt.h:3137
unsigned int scan_index
Index of slave currently scanned.
Definition: master.h:240
uint32_t abort_code
SDO request abort code.
Definition: sdo_request.h:60
u64 dc_ref_time
Common reference timestamp for DC start times.
Definition: master.h:228
ec_slave_state_t slave_states[EC_MAX_NUM_DEVICES]
AL states of responding slaves for every device.
Definition: fsm_master.h:76
struct list_head emerg_reg_requests
Emergency register access requests.
Definition: master.h:298
char name[EC_DATAGRAM_NAME_SIZE]
Description of the datagram.
Definition: datagram.h:106
uint16_t alias
Slave alias.
Definition: slave_config.h:115
void ec_master_send_datagrams(ec_master_t *, ec_device_index_t)
Sends the datagrams in the queue for a certain device.
Definition: master.c:992
void ec_device_update_stats(ec_device_t *device)
Update device statistics.
Definition: device.c:481
struct list_head domains
List of domains.
Definition: master.h:225
Finite state machine of an EtherCAT slave.
Definition: fsm_slave.h:52
ec_datagram_t * datagram
Previous state datagram.
Definition: fsm_slave.h:57
uint32_t delay_to_next_dc
Delay [ns] to next DC slave.
Definition: ecrt.h:466
ec_fsm_slave_t fsm
Slave state machine.
Definition: slave.h:227
#define EC_FIND_CONFIG
Common implementation for ec_master_get_config() and ec_master_get_config_const().
Definition: master.c:1868
uint16_t working_counter
Working counter.
Definition: datagram.h:93
uint8_t * data
Pointer to SDO data.
Definition: sdo_request.h:44
unsigned long jiffies
Jiffies of last statistic cycle.
Definition: master.h:172
int16_t current_on_ebus
Power consumption in mA.
Definition: slave.h:154
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:1817
uint8_t link_state
device link state
Definition: device.h:80
static unsigned int debug_level
Debug level parameter.
Definition: module.c:55
u64 last_rx_count
Number of frames received of last statistics cycle.
Definition: master.h:152
const uint8_t * macs[EC_MAX_NUM_DEVICES]
Device MAC addresses.
Definition: master.h:201
Sent (still in the queue).
Definition: datagram.h:69
unsigned int slaves_responding
Sum of responding slaves on all Ethernet devices.
Definition: ecrt.h:329
size_t data_size
Size of SDO data.
Definition: soe_request.h:47
wait_queue_head_t request_queue
Wait queue for external requests from user space.
Definition: master.h:301
void ec_master_clear_device_stats(ec_master_t *)
Clears the common device statistics.
Definition: master.c:1297
unsigned int run_on_cpu
bind kernel threads to this cpu
Definition: master.h:276
uint16_t station_address
Configured station address.
Definition: slave.h:176
int ec_soe_request_write(ec_soe_request_t *req)
Request a write operation.
Definition: soe_request.c:241
unsigned int sync_count
Number of sync managers.
Definition: slave.h:158
struct list_head list
List head.
Definition: fsm_master.h:46
SII write request.
Definition: fsm_master.h:45
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, unsigned int run_on_cpu)
Master constructor.
Definition: master.c:158
void ec_slave_clear(ec_slave_t *slave)
Slave destructor.
Definition: slave.c:169
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:2243
unsigned int link_up
true, if the network link is up.
Definition: ecrt.h:400
void ec_datagram_output_stats(ec_datagram_t *datagram)
Outputs datagram statistics at most every second.
Definition: datagram.c:614
int ecrt_master_write_idn(ec_master_t *master, uint16_t slave_position, uint8_t drive_no, uint16_t idn, const uint8_t *data, size_t data_size, uint16_t *error_code)
Executes an SoE write request.
Definition: master.c:3123
int ec_master_enter_idle_phase(ec_master_t *master)
Transition function from ORPHANED to IDLE phase.
Definition: master.c:644
ec_datagram_type_t type
Datagram type (APRD, BWR, etc.).
Definition: datagram.h:86
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:1897
Global definitions and macros.
uint32_t revision_number
Revision-Number stored on the slave.
Definition: ecrt.h:455
Logical Write.
Definition: datagram.h:54
EtherCAT master structure.
void * cb_data
Current callback data.
Definition: master.h:290
void ec_device_send(ec_device_t *device, size_t size)
Sends the content of the transmit socket buffer.
Definition: device.c:320
int ecrt_master_reference_clock_time(const ec_master_t *master, uint32_t *time)
Get the lower 32 bit of the reference clock system time.
Definition: master.c:2798
void ec_fsm_master_init(ec_fsm_master_t *fsm, ec_master_t *master, ec_datagram_t *datagram)
Constructor.
Definition: fsm_master.c:82
Initial state of a new datagram.
Definition: datagram.h:67
#define EC_MASTER_DBG(master, level, fmt, args...)
Convenience macro for printing master-specific debug messages to syslog.
Definition: master.h:100
ec_slave_t * fsm_slave
Slave that is queried next for FSM exec.
Definition: master.h:271
unsigned int send_interval
Interval between two calls to ecrt_master_send().
Definition: master.h:267
ec_slave_t * slave
EtherCAT slave.
Definition: fsm_master.h:47
EtherCAT slave.
Definition: slave.h:168
struct semaphore master_sem
Master semaphore.
Definition: master.h:198
uint8_t datagram_index
Current datagram index.
Definition: master.h:254
void ec_master_attach_slave_configs(ec_master_t *master)
Attaches the slave configurations to the slaves.
Definition: master.c:1777
struct list_head datagram_queue
Datagram queue.
Definition: master.h:253
int 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:2831
ec_slave_t * slave
slave the FSM runs on
Definition: fsm_slave.h:53
char name[EC_MAX_STRING_LENGTH]
Name of the slave.
Definition: ecrt.h:472
void ec_sdo_request_clear(ec_sdo_request_t *req)
SDO request destructor.
Definition: sdo_request.c:70
struct irq_work sc_reset_work_kicker
NMI-Safe kicker to trigger reset task above.
Definition: master.h:304
struct task_struct * eoe_thread
EoE thread.
Definition: master.h:282
struct list_head sdo_requests
SDO access requests.
Definition: slave.h:221
Master state.
Definition: ecrt.h:328
int 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:181
unsigned int unmatched
unmatched datagrams (received, but not queued any longer)
Definition: master.h:139
unsigned int ext_ring_idx_fsm
Index in external datagram ring for FSM side.
Definition: master.h:265
void ec_datagram_zero(ec_datagram_t *datagram)
Fills the datagram payload memory with zeros.
Definition: datagram.c:170
int ec_master_debug_level(ec_master_t *master, unsigned int level)
Set the debug level.
Definition: master.c:2025
s32 tx_frame_rates[EC_RATE_COUNT]
Transmit rates in frames/s for different statistics cycle periods.
Definition: master.h:160
uint64_t app_time
Application time.
Definition: ecrt.h:403
s32 rx_byte_rates[EC_RATE_COUNT]
Receive rates in byte/s for different statistics cycle periods.
Definition: master.h:168
Ethernet over EtherCAT (EoE)
struct list_head soe_requests
SoE requests.
Definition: slave.h:224
#define EC_DATAGRAM_HEADER_SIZE
Size of an EtherCAT datagram header.
Definition: globals.h:70
ec_datagram_state_t state
State.
Definition: datagram.h:94
ec_device_stats_t device_stats
Device statistics.
Definition: master.h:208
ec_datagram_t fsm_datagram
Datagram used for state machines.
Definition: master.h:211
ec_slave_config_t * config
Current configuration.
Definition: slave.h:182
ec_master_phase_t phase
Master phase.
Definition: master.h:212
#define EC_WRITE_U32(DATA, VAL)
Write a 32-bit unsigned value to EtherCAT data.
Definition: ecrt.h:3171
ec_slave_t * slaves
Array of slaves on the bus.
Definition: master.h:220
void ec_domain_clear(ec_domain_t *domain)
Domain destructor.
Definition: domain.c:87
void ec_soe_request_set_drive_no(ec_soe_request_t *req, uint8_t drive_no)
Set drive number.
Definition: soe_request.c:99
void ec_slave_calc_port_delays(ec_slave_t *slave)
Calculates the port transmission delays.
Definition: slave.c:932
int ec_domain_finish(ec_domain_t *domain, uint32_t base_address)
Finishes a domain.
Definition: domain.c:225
static unsigned long ext_injection_timeout_jiffies
Timeout for external datagram injection [jiffies].
Definition: master.c:97
struct semaphore device_sem
Device semaphore.
Definition: master.h:207
int ec_eoe_is_idle(const ec_eoe_t *eoe)
Returns the idle state.
Definition: ethernet.c:397
EtherCAT device.
Definition: device.h:73
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:1946
int ecrt_master_application_time(ec_master_t *master, uint64_t app_time)
Sets the application time.
Definition: master.c:2786
unsigned int tx_ring_index
last ring entry used to transmit
Definition: device.h:82
unsigned int timeouts
datagram timeouts
Definition: master.h:137
ec_sdo_request_t * sdo_request
SDO request to process.
Definition: fsm_master.h:82
unsigned int debug_level
Master debug level.
Definition: master.h:275
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:340
#define EC_SLAVE_ERR(slave, fmt, args...)
Convenience macro for printing slave-specific errors to syslog.
Definition: slave.h:68
unsigned int ec_master_domain_count(const ec_master_t *master)
Get the number of domains.
Definition: master.c:1912
Orphaned phase.
Definition: master.h:124
struct list_head ext_queue
External datagram queue item, protected by ext_queue_sem.
Definition: datagram.h:82
s32 loss_rates[EC_RATE_COUNT]
Frame loss rates for different statistics cycle periods.
Definition: master.h:170
unsigned int corrupted
corrupted frames
Definition: master.h:138
struct list_head list
List item.
Definition: soe_request.h:41
u64 last_tx_count
Number of frames sent of last statistics cycle.
Definition: master.h:150
uint32_t transmission_delay
DC system time transmission delay (offset from reference clock).
Definition: slave.h:207
void ec_master_exec_slave_fsms(ec_master_t *)
Execute slave FSMs.
Definition: master.c:1433
void ec_soe_request_clear(ec_soe_request_t *req)
SoE request destructor.
Definition: soe_request.c:71
unsigned int ext_ring_idx_rt
Index in external datagram ring for RT side.
Definition: master.h:263
struct rt_mutex io_mutex
Mutex used in IDLE and OP phase.
Definition: master.h:286
unsigned int slave_count
Number of slaves on the bus.
Definition: master.h:221
unsigned int scan_busy
Current scan state.
Definition: master.h:239
ec_device_index_t
Master devices.
Definition: globals.h:198
void(* receive_cb)(void *)
Current receive datagrams callback.
Definition: master.h:289
s32 rx_frame_rates[EC_RATE_COUNT]
Receive rates in frames/s for different statistics cycle periods.
Definition: master.h:163
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:3199
#define EC_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
Definition: ecrt.h:3154
unsigned int index
Index (just a number).
Definition: domain.h:50
void ec_slave_calc_transmission_delays_rec(ec_slave_t *slave, uint32_t *delay)
Recursively calculates transmission delays.
Definition: slave.c:978
void ec_master_leave_idle_phase(ec_master_t *master)
Transition function from IDLE to ORPHANED phase.
Definition: master.c:677
Main device.
Definition: globals.h:199
unsigned int skip_count
Number of requeues when not yet received.
Definition: datagram.h:104
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:2612
#define EC_READ_U32(DATA)
Read a 32-bit unsigned value from EtherCAT data.
Definition: ecrt.h:3061
int ec_device_init(ec_device_t *device, ec_master_t *master)
Constructor.
Definition: device.c:60
ec_slave_port_desc_t desc
Port descriptors.
Definition: slave.h:111
#define EC_MASTER_WARN(master, fmt, args...)
Convenience macro for printing master-specific warnings to syslog.
Definition: master.h:86
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:135
unsigned int active
Master has been activated.
Definition: master.h:213
struct list_head sent
Master list item for sent datagrams.
Definition: datagram.h:83
int errno
Error number.
Definition: sdo_request.h:59
int ec_datagram_brd(ec_datagram_t *datagram, uint16_t mem_address, size_t data_size)
Initializes an EtherCAT BRD datagram.
Definition: datagram.c:365
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:290
int ec_master_enter_operation_phase(ec_master_t *master)
Transition function from IDLE to OPERATION phase.
Definition: master.c:701
uint8_t has_dc_system_time
The slave supports the DC system time register.
Definition: slave.h:204
wait_queue_head_t scan_queue
Queue for processes that wait for slave scanning.
Definition: master.h:244
ec_datagram_t sync_datagram
Datagram used for DC drift compensation.
Definition: master.h:231
int ecrt_master_send_ext(ec_master_t *master)
Sends non-application datagrams.
Definition: master.c:2533
#define EC_MASTER_ERR(master, fmt, args...)
Convenience macro for printing master-specific errors to syslog.
Definition: master.h:74
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:2623
struct device * class_device
Master class device.
Definition: master.h:192
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:944
int ec_slave_config_attach(ec_slave_config_t *sc)
Attaches the configuration to the addressed slave object.
Definition: slave_config.c:254
Broadcast Write.
Definition: datagram.h:51
int ecrt_master_sync_monitor_queue(ec_master_t *master)
Queues the DC synchrony monitoring datagram for sending.
Definition: master.c:2860
static int ec_master_idle_thread(void *)
Master kernel thread function for IDLE phase.
Definition: master.c:1523
struct list_head configs
List of slave configurations.
Definition: master.h:224
ec_slave_t * slave
Slave pointer.
Definition: slave_config.h:126
ec_slave_config_t * dc_ref_config
Application-selected DC reference clock slave config.
Definition: master.h:235
ec_device_index_t device_index
Device via which the datagram shall be / was sent.
Definition: datagram.h:84
int ec_soe_request_alloc(ec_soe_request_t *req, size_t size)
Pre-allocates the data memory.
Definition: soe_request.c:144
int ecrt_master(ec_master_t *master, ec_master_info_t *master_info)
Obtains master information.
Definition: master.c:2643
int ec_fsm_master_idle(const ec_fsm_master_t *fsm)
Definition: fsm_master.c:192
void ec_master_clear_slaves(ec_master_t *master)
Clear all slaves.
Definition: master.c:479
Slave information.
Definition: ecrt.h:451
struct list_head list
list item
Definition: ethernet.h:76
Device statistics.
Definition: master.h:148
uint8_t * ec_device_tx_data(ec_device_t *device)
Returns a pointer to the device&#39;s transmit memory.
Definition: device.c:301
u64 last_rx_bytes
Number of bytes received of last statistics cycle.
Definition: master.h:157
unsigned long output_jiffies
time of last output
Definition: master.h:141
ec_stats_t stats
Cyclic statistics.
Definition: master.h:277
void ec_print_data(const uint8_t *, size_t)
Outputs frame contents for debugging purposes.
Definition: module.c:344
Idle phase.
Definition: master.h:126
void ec_master_update_device_stats(ec_master_t *)
Updates the common device statistics.
Definition: master.c:1329
struct semaphore scan_sem
Semaphore protecting the scan_busy variable and the allow_scan flag.
Definition: master.h:242
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:2670
int ec_datagram_prealloc(ec_datagram_t *datagram, size_t size)
Allocates internal payload memory.
Definition: datagram.c:142
static unsigned int run_on_cpu
Bind created kernel threads to a cpu.
Definition: module.c:56
uint16_t effective_alias
Effective alias address.
Definition: slave.h:177
void ec_master_calc_transmission_delays(ec_master_t *)
Calculates the bus transmission delays.
Definition: master.c:2170
void ec_master_clear_eoe_handlers(ec_master_t *master)
Clear and free all EoE handlers.
Definition: master.c:443
uint8_t al_state
Current state of the slave.
Definition: ecrt.h:468
size_t data_size
Size of SDO data.
Definition: sdo_request.h:46
uint8_t scan_busy
true, while the master is scanning the network.
Definition: ecrt.h:401
#define EC_READ_U16(DATA)
Read a 16-bit unsigned value from EtherCAT data.
Definition: ecrt.h:3045
void ec_master_eoe_start(ec_master_t *master)
Starts Ethernet over EtherCAT processing on demand.
Definition: master.c:1665
u64 tx_bytes
Number of bytes sent.
Definition: master.h:154
void(* app_send_cb)(void *)
Application&#39;s send datagrams callback.
Definition: master.h:291
void * app_cb_data
Application callback data.
Definition: master.h:295
uint16_t ec_master_eoe_handler_count(const ec_master_t *master)
Get the number of EoE handlers.
Definition: master.c:1978
int16_t current_on_ebus
Used current in mA.
Definition: ecrt.h:458
void ec_master_clear_slave_configs(ec_master_t *)
Clear all slave configurations.
Definition: master.c:461
int ec_soe_request_read(ec_soe_request_t *req)
Request a read operation.
Definition: soe_request.c:226
void ec_master_clear_domains(ec_master_t *)
Clear all domains.
Definition: master.c:521
void ec_master_find_dc_ref_clock(ec_master_t *)
Finds the DC reference clock.
Definition: master.c:2048
struct list_head list
Used for execution list.
Definition: fsm_slave.h:54
void ec_master_thread_stop(ec_master_t *)
Stops the master thread.
Definition: master.c:612
void ec_sdo_request_init(ec_sdo_request_t *req)
SDO request constructor.
Definition: sdo_request.c:48
#define EC_MAX_PORTS
Maximum number of slave ports.
Definition: ecrt.h:276
#define EC_SDO_INJECTION_TIMEOUT
SDO injection timeout in microseconds.
Definition: master.c:77
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:2880
struct ec_slave_info_t::@7 ports[EC_MAX_PORTS]
Port information.
ec_datagram_t ext_datagram_ring[EC_EXT_RING_SIZE]
External datagram ring.
Definition: master.h:261
uint16_t sdo_count
Number of SDOs.
Definition: ecrt.h:471
struct list_head list
List item.
Definition: sdo_request.h:41
#define EC_MAX_STRING_LENGTH
Maximum string length.
Definition: ecrt.h:273
void ec_datagram_init(ec_datagram_t *datagram)
Constructor.
Definition: datagram.c:80
static unsigned long timeout_jiffies
Frame timeout in jiffies.
Definition: master.c:93
void ec_rtdm_dev_clear(ec_rtdm_dev_t *rtdm_dev)
Clear an RTDM device.
Definition: rtdm.c:108
void ec_cdev_clear(ec_cdev_t *cdev)
Destructor.
Definition: cdev.c:126
ec_slave_t * next_slave
Connected slaves.
Definition: slave.h:113
Queued for sending.
Definition: datagram.h:68
unsigned int link_up
true, if at least one Ethernet link is up.
Definition: ecrt.h:340
uint32_t vendor_id
Slave vendor ID.
Definition: slave_config.h:118
uint32_t receive_time
Port receive times for delay measurement.
Definition: slave.h:114
Timed out (dequeued).
Definition: datagram.h:71
wait_queue_head_t config_queue
Queue for processes that wait for slave configuration.
Definition: master.h:250
#define EC_EXT_RING_SIZE
Size of the external datagram ring.
Definition: master.h:113
void ec_master_internal_send_cb(void *cb_data)
Internal sending callback.
Definition: master.c:550
int ec_master_calc_topology_rec(ec_master_t *, ec_slave_t *, unsigned int *)
Calculates the bus topology; recursion function.
Definition: master.c:2110
unsigned int scan_index
Index of the slave that is currently scanned.
Definition: ecrt.h:416
uint16_t next_slave
Ring position of next DC slave on that port.
Definition: ecrt.h:464
void ec_master_calc_topology(ec_master_t *)
Calculates the bus topology.
Definition: master.c:2153
u64 app_time
Time of the last ecrt_master_sync() call.
Definition: master.h:227
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:306
ec_datagram_t ref_sync_datagram
Datagram used for synchronizing the reference clock to the master clock.
Definition: master.h:229
void ec_master_output_stats(ec_master_t *master)
Output master statistics.
Definition: master.c:1267
uint8_t base_dc_supported
Distributed clocks are supported.
Definition: slave.h:202
#define EC_FIND_DOMAIN
Common implementation for ec_master_find_domain() and ec_master_find_domain_const().
Definition: master.c:1931
u64 rx_count
Number of frames received.
Definition: master.h:151
unsigned int al_states
Application-layer states of all slaves.
Definition: ecrt.h:331
int ecrt_master_activate(ec_master_t *master)
Finishes the configuration phase and prepares for cyclic operation.
Definition: master.c:2290
struct work_struct sc_reset_work
Task to reset slave configuration.
Definition: master.h:303
uint8_t * data
Datagram payload.
Definition: datagram.h:88
#define EC_FIND_SLAVE
Common implementation for ec_master_find_slave() and ec_master_find_slave_const().
Definition: master.c:1793
struct semaphore ext_queue_sem
Semaphore protecting the ext_datagram_queue.
Definition: master.h:258
#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:457
void ec_eoe_run(ec_eoe_t *eoe)
Runs the EoE state machine.
Definition: ethernet.c:343
#define EC_READ_U8(DATA)
Read an 8-bit unsigned value from EtherCAT data.
Definition: ecrt.h:3029
EtherCAT slave configuration.
Definition: slave_config.h:111
struct list_head queue
Master datagram queue item, protected by user-supplied mutex.
Definition: datagram.h:80
uint32_t product_code
Product-Code stored on the slave.
Definition: ecrt.h:454
int ecrt_master_receive(ec_master_t *master)
Fetches received frames from the hardware and processes the datagrams.
Definition: master.c:2480
EtherCAT device structure.
void(* app_receive_cb)(void *)
Application&#39;s receive datagrams callback.
Definition: master.h:293
unsigned int slave_count
Number of slaves detected.
Definition: ecrt.h:415
struct net_device * dev
pointer to the assigned net_device
Definition: device.h:76
int ec_fsm_master_exec(ec_fsm_master_t *fsm)
Executes the current state of the state machine.
Definition: fsm_master.c:173
uint32_t ecrt_master_sync_monitor_process(const ec_master_t *master)
Processes the DC synchrony monitoring datagram.
Definition: master.c:2869
void ec_soe_request_init(ec_soe_request_t *req)
SoE request constructor.
Definition: soe_request.c:48
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:2554
void ec_device_poll(ec_device_t *device)
Calls the poll function of the assigned net_device.
Definition: device.c:463
void ec_eoe_clear(ec_eoe_t *eoe)
EoE destructor.
Definition: ethernet.c:223
Master information.
Definition: ecrt.h:398
unsigned int index
Index.
Definition: master.h:188
unsigned int ec_master_config_count(const ec_master_t *master)
Get the number of slave configurations provided by the application.
Definition: master.c:1849
Error while sending/receiving (dequeued).
Definition: datagram.h:72
Auto Increment Physical Write.
Definition: datagram.h:45
uint8_t address[EC_ADDR_LEN]
Recipient address.
Definition: datagram.h:87
u64 last_tx_bytes
Number of bytes sent of last statistics cycle.
Definition: master.h:155
int ec_sdo_request_alloc(ec_sdo_request_t *req, size_t size)
Pre-allocates the data memory.
Definition: sdo_request.c:121
uint32_t product_code
Vendor-specific product code.
Definition: slave.h:128
void ec_domain_init(ec_domain_t *domain, ec_master_t *master, unsigned int index)
Domain constructor.
Definition: domain.c:57
PREOP state (mailbox communication, no IO)
Definition: globals.h:126
void ec_slave_config_clear(ec_slave_config_t *sc)
Slave configuration destructor.
Definition: slave_config.c:126
Backup device.
Definition: globals.h:200
Received (dequeued).
Definition: datagram.h:70
Ethernet over EtherCAT (EoE) handler.
Definition: ethernet.h:74
ec_fsm_master_t fsm
Master state machine.
Definition: master.h:210
ec_cdev_t cdev
Master character device.
Definition: master.h:191
u64 rx_bytes
Number of bytes received.
Definition: master.h:156
#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:62
unsigned int error_flag
Stop processing after an error.
Definition: slave.h:185
uint16_t position
Offset of the slave in the ring.
Definition: ecrt.h:452
uint32_t receive_time
Receive time on DC transmission delay measurement.
Definition: ecrt.h:462
unsigned int config_changed
The configuration changed.
Definition: master.h:214
EtherCAT master.
Definition: master.h:187
unsigned int injection_seq_rt
Datagram injection sequence number for the realtime side.
Definition: master.h:217
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:1129
Configured Address Physical Write.
Definition: datagram.h:48
#define FORCE_OUTPUT_CORRUPTED
Always output corrupted frames.
Definition: master.c:74
uint8_t index
Index (set by master).
Definition: datagram.h:92
ec_device_t devices[EC_MAX_NUM_DEVICES]
EtherCAT devices.
Definition: master.h:200
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_internal_request_state_t state
Request state.
Definition: soe_request.h:52
unsigned int config_busy
State of slave configuration.
Definition: master.h:247
void ec_master_inject_external_datagrams(ec_master_t *)
Injects external datagrams that fit into the datagram queue.
Definition: master.c:794
int ecrt_master_sync_slave_clocks(ec_master_t *master)
Queues the DC clock drift compensation datagram for sending.
Definition: master.c:2847
void ec_fsm_master_clear(ec_fsm_master_t *fsm)
Destructor.
Definition: fsm_master.c:123
int ecrt_master_state(const ec_master_t *master, ec_master_state_t *state)
Reads the current master state.
Definition: master.c:2746
int ec_eoe_is_open(const ec_eoe_t *eoe)
Returns the state of the device.
Definition: ethernet.c:385
void ec_device_clear_stats(ec_device_t *device)
Clears the frame statistics.
Definition: device.c:359
Sercos-over-EtherCAT request.
Definition: soe_request.h:40
char * name
Slave name.
Definition: slave.h:150
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:908
unsigned long jiffies_received
Jiffies, when the datagram was received.
Definition: datagram.h:102
int ecrt_master_reset(ec_master_t *master)
Retry configuring slaves.
Definition: master.c:3283
uint8_t * data
Pointer to SDO data.
Definition: soe_request.h:45
EtherCAT domain.
Definition: domain.h:46
void ec_master_eoe_stop(ec_master_t *master)
Stops the Ethernet over EtherCAT processing.
Definition: master.c:1699
void(* send_cb)(void *)
Current send datagrams callback.
Definition: master.h:288
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:3040
uint32_t vendor_id
Vendor ID.
Definition: slave.h:127
uint8_t complete_access
SDO shall be transferred completely.
Definition: sdo_request.h:47
uint32_t delay_to_next_dc
Delay to next slave with DC support behind this port [ns].
Definition: slave.h:116
struct task_struct * thread
Master thread.
Definition: master.h:279
unsigned int queue_datagram
the datagram is ready for queuing
Definition: ethernet.h:79
ec_slave_t * dc_ref_clock
DC reference clock slave.
Definition: master.h:237
int ec_cdev_init(ec_cdev_t *cdev, ec_master_t *master, dev_t dev_num)
Constructor.
Definition: cdev.c:100
unsigned int force_config
Force (re-)configuration.
Definition: slave.h:186
#define EC_MAX_DATA_SIZE
Resulting maximum data size of a single datagram in a frame.
Definition: globals.h:79
void ec_master_init_static(void)
Static variables initializer.
Definition: master.c:137
void ec_datagram_clear(ec_datagram_t *datagram)
Destructor.
Definition: datagram.c:110