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