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