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 
1679  if (ec_fsm_slave_exec(&master->fsm_slave->fsm, datagram)) {
1680  if (datagram->state != EC_DATAGRAM_UNUSED) {
1681  master->ext_ring_idx_fsm =
1682  (master->ext_ring_idx_fsm + 1) % EC_EXT_RING_SIZE;
1683  }
1684  list_add_tail(&master->fsm_slave->fsm.list,
1685  &master->fsm_exec_list);
1686  master->fsm_exec_count++;
1687 #if DEBUG_INJECT
1688  EC_MASTER_DBG(master, 1, "New slave %u FSM"
1689  " consumed datagram %s, now %u FSMs in list.\n",
1690  master->fsm_slave->ring_position, datagram->name,
1691  master->fsm_exec_count);
1692 #endif
1693  }
1694  }
1695 
1696  master->fsm_slave++;
1697  if (master->fsm_slave >= master->slaves + master->slave_count) {
1698  master->fsm_slave = master->slaves;
1699  }
1700  count++;
1701  }
1702 }
1703 
1704 /****************************************************************************/
1705 
1708 static int ec_master_idle_thread(void *priv_data)
1709 {
1710  ec_master_t *master = (ec_master_t *) priv_data;
1711  int fsm_exec;
1712 #ifdef EC_USE_HRTIMER
1713  size_t sent_bytes;
1714 #endif
1715 
1716  // send interval in IDLE phase
1717  ec_master_set_send_interval(master, 1000000 / HZ);
1718 
1719  EC_MASTER_DBG(master, 1, "Idle thread running with send interval = %u us,"
1720  " max data size=%zu\n", master->send_interval,
1721  master->max_queue_size);
1722 
1723  while (!kthread_should_stop()) {
1725 
1726  // receive
1727  if (ec_rt_lock_interruptible(&master->io_mutex))
1728  break;
1729  ecrt_master_receive(master);
1730  rt_mutex_unlock(&master->io_mutex);
1731 
1732  // execute master & slave state machines
1733  if (down_interruptible(&master->master_sem)) {
1734  break;
1735  }
1736 
1737  fsm_exec = ec_fsm_master_exec(&master->fsm);
1738 
1739  ec_master_exec_slave_fsms(master);
1740 
1741  up(&master->master_sem);
1742 
1743  // queue and send
1744  if (ec_rt_lock_interruptible(&master->io_mutex))
1745  break;
1746  if (fsm_exec) {
1747  ec_master_queue_datagram(master, &master->fsm_datagram);
1748  }
1749  ecrt_master_send(master);
1750 #ifdef EC_USE_HRTIMER
1751  sent_bytes = master->devices[EC_DEVICE_MAIN].tx_skb[
1752  master->devices[EC_DEVICE_MAIN].tx_ring_index]->len;
1753 #endif
1754  rt_mutex_unlock(&master->io_mutex);
1755 
1756  if (ec_fsm_master_idle(&master->fsm)) {
1757 #ifdef EC_USE_HRTIMER
1758  ec_master_nanosleep(master->send_interval * 1000);
1759 #else
1760  set_current_state(TASK_INTERRUPTIBLE);
1761  schedule_timeout(1);
1762 #endif
1763  } else {
1764 #ifdef EC_USE_HRTIMER
1765  ec_master_nanosleep(sent_bytes * EC_BYTE_TRANSMISSION_TIME_NS);
1766 #else
1767  schedule();
1768 #endif
1769  }
1770  }
1771 
1772  EC_MASTER_DBG(master, 1, "Master IDLE thread exiting...\n");
1773 
1774  return 0;
1775 }
1776 
1777 /****************************************************************************/
1778 
1781 static int ec_master_operation_thread(void *priv_data)
1782 {
1783  ec_master_t *master = (ec_master_t *) priv_data;
1784  unsigned int seq_rt;
1785 
1786  EC_MASTER_DBG(master, 1, "Operation thread running"
1787  " with fsm interval = %u us, max data size=%zu\n",
1788  master->send_interval, master->max_queue_size);
1789 
1790  while (!kthread_should_stop()) {
1792 
1793  /* Use smp_load_acquire() to prevent re-ordering.
1794  * https://gitlab.com/etherlab.org/ethercat/-/work_items/168 */
1795  seq_rt = smp_load_acquire(&master->injection_seq_rt);
1796  if (seq_rt == master->injection_seq_fsm) { // was injected
1797  // output statistics
1798  ec_master_output_stats(master);
1799 
1800  // execute master & slave state machines
1801  if (down_interruptible(&master->master_sem)) {
1802  break;
1803  }
1804 
1805  if (ec_fsm_master_exec(&master->fsm)) {
1806  // Inject datagrams (let the RT thread queue them, see
1807  // ecrt_master_send())
1808  // re-ordering-safe version of `master->injection_seq_fsm++`
1809  smp_store_release(&master->injection_seq_fsm,
1810  master->injection_seq_fsm + 1);
1811  }
1812 
1813  ec_master_exec_slave_fsms(master);
1814 
1815  up(&master->master_sem);
1816  }
1817 
1818 #ifdef EC_USE_HRTIMER
1819  // the op thread should not work faster than the sending RT thread
1820  ec_master_nanosleep(master->send_interval * 1000);
1821 #else
1822  if (ec_fsm_master_idle(&master->fsm)) {
1823  set_current_state(TASK_INTERRUPTIBLE);
1824  schedule_timeout(1);
1825  }
1826  else {
1827  schedule();
1828  }
1829 #endif
1830  }
1831 
1832  EC_MASTER_DBG(master, 1, "Master OP thread exiting...\n");
1833  return 0;
1834 }
1835 
1836 /****************************************************************************/
1837 
1838 #ifdef EC_EOE
1839 
1840 /* compatibility for priority changes */
1841 static inline void set_normal_priority(struct task_struct *p, int nice)
1842 {
1843 #if LINUX_VERSION_CODE >= KERNEL_VERSION(5, 9, 0)
1844  sched_set_normal(p, nice);
1845 #else
1846  struct sched_param param = { .sched_priority = 0 };
1847  sched_setscheduler(p, SCHED_NORMAL, &param);
1848  set_user_nice(p, nice);
1849 #endif
1850 }
1851 
1852 /****************************************************************************/
1853 
1857 {
1858  if (master->eoe_thread) {
1859  EC_MASTER_WARN(master, "EoE already running!\n");
1860  return;
1861  }
1862 
1863  if (list_empty(&master->eoe_handlers))
1864  return;
1865 
1866  if (!master->send_cb || !master->receive_cb) {
1867  EC_MASTER_WARN(master, "No EoE processing"
1868  " because of missing callbacks!\n");
1869  return;
1870  }
1871 
1872  EC_MASTER_INFO(master, "Starting EoE thread.\n");
1873  master->eoe_thread = kthread_run(ec_master_eoe_thread, master,
1874  "EtherCAT-EoE");
1875  if (IS_ERR(master->eoe_thread)) {
1876  int err = (int) PTR_ERR(master->eoe_thread);
1877  EC_MASTER_ERR(master, "Failed to start EoE thread (error %i)!\n",
1878  err);
1879  master->eoe_thread = NULL;
1880  return;
1881  }
1882 
1883  set_normal_priority(master->eoe_thread, 0);
1884 }
1885 
1886 /****************************************************************************/
1887 
1891 {
1892  if (master->eoe_thread) {
1893  EC_MASTER_INFO(master, "Stopping EoE thread.\n");
1894 
1895  kthread_stop(master->eoe_thread);
1896  master->eoe_thread = NULL;
1897  EC_MASTER_INFO(master, "EoE thread exited.\n");
1898  }
1899 }
1900 
1901 /****************************************************************************/
1902 
1905 static int ec_master_eoe_thread(void *priv_data)
1906 {
1907  ec_master_t *master = (ec_master_t *) priv_data;
1908  ec_eoe_t *eoe;
1909  unsigned int none_open, sth_to_send, all_idle;
1910 
1911  EC_MASTER_DBG(master, 1, "EoE thread running.\n");
1912 
1913  while (!kthread_should_stop()) {
1914  none_open = 1;
1915  all_idle = 1;
1916 
1917  list_for_each_entry(eoe, &master->eoe_handlers, list) {
1918  // closed handlers have to finish a receive sequence to release
1919  // the mailbox read lock
1920  if (ec_eoe_is_open(eoe) || ec_eoe_holds_mbox_lock(eoe)) {
1921  none_open = 0;
1922  break;
1923  }
1924  }
1925  if (none_open)
1926  goto schedule;
1927 
1928  // receive datagrams
1929  master->receive_cb(master->cb_data);
1930 
1931  // actual EoE processing
1932  sth_to_send = 0;
1933  list_for_each_entry(eoe, &master->eoe_handlers, list) {
1934  ec_eoe_run(eoe);
1935  if (eoe->queue_datagram) {
1936  sth_to_send = 1;
1937  }
1938  if (!ec_eoe_is_idle(eoe)) {
1939  all_idle = 0;
1940  }
1941  }
1942 
1943  if (sth_to_send) {
1944  list_for_each_entry(eoe, &master->eoe_handlers, list) {
1945  ec_eoe_queue(eoe);
1946  }
1947  // (try to) send datagrams
1948  master->send_cb(master->cb_data);
1949  }
1950 
1951 schedule:
1952  if (all_idle) {
1953  set_current_state(TASK_INTERRUPTIBLE);
1954  schedule_timeout(1);
1955  } else {
1956  schedule();
1957  }
1958  }
1959 
1960  EC_MASTER_DBG(master, 1, "EoE thread exiting...\n");
1961  return 0;
1962 }
1963 
1964 #endif
1965 
1966 /****************************************************************************/
1967 
1971  ec_master_t *master
1972  )
1973 {
1974  ec_slave_config_t *sc;
1975 
1976  list_for_each_entry(sc, &master->configs, list) {
1978  }
1979 }
1980 
1981 /****************************************************************************/
1982 
1986 #define EC_FIND_SLAVE \
1987  do { \
1988  if (alias) { \
1989  for (; slave < master->slaves + master->slave_count; \
1990  slave++) { \
1991  if (slave->effective_alias == alias) \
1992  break; \
1993  } \
1994  if (slave == master->slaves + master->slave_count) \
1995  return NULL; \
1996  } \
1997  \
1998  slave += position; \
1999  if (slave < master->slaves + master->slave_count) { \
2000  return slave; \
2001  } else { \
2002  return NULL; \
2003  } \
2004  } while (0)
2005 
2011  ec_master_t *master,
2012  uint16_t alias,
2013  uint16_t position
2014  )
2015 {
2016  ec_slave_t *slave = master->slaves;
2017  EC_FIND_SLAVE;
2018 }
2019 
2027  const ec_master_t *master,
2028  uint16_t alias,
2029  uint16_t position
2030  )
2031 {
2032  const ec_slave_t *slave = master->slaves;
2033  EC_FIND_SLAVE;
2034 }
2035 
2046  ec_master_t *master,
2047  const ec_slave_t *slave
2048  )
2049 {
2050  ec_slave_config_t *sc;
2051 
2052  list_for_each_entry(sc, &master->configs, list) {
2053  if (ec_master_find_slave(master, sc->alias, sc->position) != slave)
2054  continue;
2055 
2056 #ifdef EC_IDENT_WILDCARDS
2057  if (sc->vendor_id != 0xffffffff
2058  && slave->sii.vendor_id != sc->vendor_id)
2059  continue;
2060  if (sc->product_code != 0xffffffff
2061  && slave->sii.product_code != sc->product_code)
2062  continue;
2063 #else
2064  if (slave->sii.vendor_id != sc->vendor_id)
2065  continue;
2066  if (slave->sii.product_code != sc->product_code)
2067  continue;
2068 #endif
2069 
2070  return sc;
2071  }
2072 
2073  return NULL;
2074 }
2075 
2076 /****************************************************************************/
2077 
2083  const ec_master_t *master
2084  )
2085 {
2086  const ec_slave_config_t *sc;
2087  unsigned int count = 0;
2088 
2089  list_for_each_entry(sc, &master->configs, list) {
2090  count++;
2091  }
2092 
2093  return count;
2094 }
2095 
2096 /****************************************************************************/
2097 
2101 #define EC_FIND_CONFIG \
2102  do { \
2103  list_for_each_entry(sc, &master->configs, list) { \
2104  if (pos--) \
2105  continue; \
2106  return sc; \
2107  } \
2108  return NULL; \
2109  } while (0)
2110 
2116  const ec_master_t *master,
2117  unsigned int pos
2118  )
2119 {
2120  ec_slave_config_t *sc;
2122 }
2123 
2131  const ec_master_t *master,
2132  unsigned int pos
2133  )
2134 {
2135  const ec_slave_config_t *sc;
2137 }
2138 
2139 /****************************************************************************/
2140 
2146  const ec_master_t *master
2147  )
2148 {
2149  const ec_domain_t *domain;
2150  unsigned int count = 0;
2151 
2152  list_for_each_entry(domain, &master->domains, list) {
2153  count++;
2154  }
2155 
2156  return count;
2157 }
2158 
2159 /****************************************************************************/
2160 
2164 #define EC_FIND_DOMAIN \
2165  do { \
2166  list_for_each_entry(domain, &master->domains, list) { \
2167  if (index--) \
2168  continue; \
2169  return domain; \
2170  } \
2171  \
2172  return NULL; \
2173  } while (0)
2174 
2180  ec_master_t *master,
2181  unsigned int index
2182  )
2183 {
2184  ec_domain_t *domain;
2186 }
2187 
2195  const ec_master_t *master,
2196  unsigned int index
2197  )
2198 {
2199  const ec_domain_t *domain;
2201 }
2202 
2203 /****************************************************************************/
2204 
2205 #ifdef EC_EOE
2206 
2212  const ec_master_t *master
2213  )
2214 {
2215  const ec_eoe_t *eoe;
2216  unsigned int count = 0;
2217 
2218  list_for_each_entry(eoe, &master->eoe_handlers, list) {
2219  count++;
2220  }
2221 
2222  return count;
2223 }
2224 
2225 /****************************************************************************/
2226 
2234  const ec_master_t *master,
2235  uint16_t index
2236  )
2237 {
2238  const ec_eoe_t *eoe;
2239 
2240  list_for_each_entry(eoe, &master->eoe_handlers, list) {
2241  if (index--)
2242  continue;
2243  return eoe;
2244  }
2245 
2246  return NULL;
2247 }
2248 
2249 #endif
2250 
2251 /****************************************************************************/
2252 
2259  ec_master_t *master,
2260  unsigned int level
2261  )
2262 {
2263  if (level > 2) {
2264  EC_MASTER_ERR(master, "Invalid debug level %u!\n", level);
2265  return -EINVAL;
2266  }
2267 
2268  if (level != master->debug_level) {
2269  master->debug_level = level;
2270  EC_MASTER_INFO(master, "Master debug level set to %u.\n",
2271  master->debug_level);
2272  }
2273 
2274  return 0;
2275 }
2276 
2277 /****************************************************************************/
2278 
2282  ec_master_t *master
2283  )
2284 {
2285  ec_slave_t *slave, *ref = NULL;
2286 
2287  if (master->dc_ref_config) {
2288  // Use application-selected reference clock
2289  slave = master->dc_ref_config->slave;
2290 
2291  if (slave) {
2292  if (slave->base_dc_supported && slave->has_dc_system_time) {
2293  ref = slave;
2294  }
2295  else {
2296  EC_MASTER_WARN(master, "Slave %u can not act as a"
2297  " DC reference clock!", slave->ring_position);
2298  }
2299  }
2300  else {
2301  EC_MASTER_WARN(master, "DC reference clock config (%u-%u)"
2302  " has no slave attached!\n", master->dc_ref_config->alias,
2303  master->dc_ref_config->position);
2304  }
2305  }
2306  else {
2307  // Use first slave with DC support as reference clock
2308  for (slave = master->slaves;
2309  slave < master->slaves + master->slave_count;
2310  slave++) {
2311  if (slave->base_dc_supported && slave->has_dc_system_time) {
2312  ref = slave;
2313  break;
2314  }
2315  }
2316  }
2317 
2318  master->dc_ref_clock = ref;
2319 
2320  if (ref) {
2321  EC_MASTER_INFO(master, "Using slave %u as DC reference clock.\n",
2322  ref->ring_position);
2323 
2324  // The cyclic time distribution datagram only writes to slaves behind
2325  // the reference in frame order; DC slaves in front of it free-run.
2326  {
2327  unsigned int upstream_dc = 0;
2328 
2329  for (slave = master->slaves; slave < ref; slave++) {
2330  if (slave->base_dc_supported && slave->has_dc_system_time) {
2331  upstream_dc++;
2332  if (slave->config && slave->config->dc_assign_activate) {
2333  EC_SLAVE_WARN(slave, "Slave has DC sync configured,"
2334  " but is in front of the reference clock and"
2335  " will not receive cyclic time"
2336  " distribution!\n");
2337  }
2338  }
2339  }
2340 
2341  if (upstream_dc) {
2342  EC_MASTER_WARN(master, "%u DC-capable slave(s) in front of"
2343  " the reference clock will not receive cyclic time"
2344  " distribution.\n", upstream_dc);
2345  }
2346  }
2347  }
2348  else {
2349  EC_MASTER_INFO(master, "No DC reference clock found.\n");
2350  }
2351 
2352  // These calls always succeed, because the
2353  // datagrams have been pre-allocated.
2355  ref ? ref->station_address : 0xffff, 0x0910, 4);
2357  ref ? ref->station_address : 0xffff, 0x0910, 4);
2358 }
2359 
2360 /****************************************************************************/
2361 
2367  ec_master_t *master,
2368  ec_slave_t *port0_slave,
2369  unsigned int *slave_position
2370  )
2371 {
2372  ec_slave_t *slave = master->slaves + *slave_position;
2373  unsigned int port_index;
2374  int ret;
2375 
2376  static const unsigned int next_table[EC_MAX_PORTS] = {
2377  3, 2, 0, 1
2378  };
2379 
2380  slave->ports[0].next_slave = port0_slave;
2381 
2382  port_index = 3;
2383  while (port_index != 0) {
2384  if (!slave->ports[port_index].link.loop_closed) {
2385  *slave_position = *slave_position + 1;
2386  if (*slave_position < master->slave_count) {
2387  slave->ports[port_index].next_slave =
2388  master->slaves + *slave_position;
2389  ret = ec_master_calc_topology_rec(master,
2390  slave, slave_position);
2391  if (ret) {
2392  return ret;
2393  }
2394  } else {
2395  return -1;
2396  }
2397  }
2398 
2399  port_index = next_table[port_index];
2400  }
2401 
2402  return 0;
2403 }
2404 
2405 /****************************************************************************/
2406 
2410  ec_master_t *master
2411  )
2412 {
2413  unsigned int slave_position = 0;
2414 
2415  if (master->slave_count == 0)
2416  return;
2417 
2418  if (ec_master_calc_topology_rec(master, NULL, &slave_position))
2419  EC_MASTER_ERR(master, "Failed to calculate bus topology.\n");
2420 }
2421 
2422 /****************************************************************************/
2423 
2427  ec_master_t *master
2428  )
2429 {
2430  ec_slave_t *slave;
2431 
2432  for (slave = master->slaves;
2433  slave < master->slaves + master->slave_count;
2434  slave++) {
2436  // Reset before the re-rootable walk below: with a non-default
2437  // reference some slaves would otherwise keep stale delays from a
2438  // previous reference if they are not revisited.
2439  slave->transmission_delay = 0U;
2440  }
2441 
2442  if (master->dc_ref_clock) {
2443  uint32_t delay = 0;
2445  &delay);
2446  }
2447 }
2448 
2449 /****************************************************************************/
2450 
2454  ec_master_t *master
2455  )
2456 {
2457  // find DC reference clock
2459 
2460  // calculate bus topology
2461  ec_master_calc_topology(master);
2462 
2464 }
2465 
2466 /****************************************************************************/
2467 
2471  ec_master_t *master
2472  )
2473 {
2474  unsigned int i;
2475  ec_slave_t *slave;
2476 
2477  if (!master->active)
2478  return;
2479 
2480  EC_MASTER_DBG(master, 1, "Requesting OP...\n");
2481 
2482  // request OP for all configured slaves
2483  for (i = 0; i < master->slave_count; i++) {
2484  slave = master->slaves + i;
2485  if (slave->config) {
2487  }
2488  }
2489 
2490  // always set DC reference clock to OP
2491  if (master->dc_ref_clock) {
2493  }
2494 }
2495 
2496 /****************************************************************************/
2497 
2503  const ec_master_t *master,
2504  const ec_sii_page_t *cached_page,
2505  uint32_t vendor_id,
2506  uint32_t product_code,
2507  uint32_t revision,
2508  uint32_t serial,
2509  uint16_t alias)
2510 {
2511  if (!master->sii_caching) {
2512  return 0;
2513  }
2514 
2515  if ((master->sii_caching & EC_SII_VENDOR) &&
2516  cached_page->vendor_id != vendor_id) {
2517  return 0;
2518  }
2519 
2520  if ((master->sii_caching & EC_SII_PRODUCT) &&
2521  cached_page->product_code != product_code) {
2522  return 0;
2523  }
2524 
2525  if ((master->sii_caching & EC_SII_REVISION) &&
2526  cached_page->revision_number != revision) {
2527  return 0;
2528  }
2529 
2530  if ((master->sii_caching & EC_SII_SERIAL) &&
2531  (!serial || cached_page->serial_number != serial)) {
2532  return 0;
2533  }
2534 
2535  if ((master->sii_caching & EC_SII_ALIAS) &&
2536  (!alias || cached_page->alias != alias)) {
2537  return 0;
2538  }
2539 
2540  return 1;
2541 }
2542 
2543 /****************************************************************************/
2544 
2550  const ec_master_t *master,
2551  uint32_t vendor_id,
2552  uint32_t product_code,
2553  uint32_t revision,
2554  uint32_t serial,
2555  uint16_t alias)
2556 {
2557  ec_sii_page_t *cached_page;
2558 
2559  list_for_each_entry(cached_page, &master->sii_cache, list) {
2560  if (ec_master_cached_sii_page_matches(master, cached_page,
2561  vendor_id, product_code, revision, serial, alias)) {
2562  return cached_page;
2563  }
2564  }
2565 
2566  return NULL;
2567 }
2568 
2569 /****************************************************************************/
2570 
2578  ec_master_t *master,
2579  const ec_sii_page_t *page
2580  )
2581 {
2582  ec_sii_page_t *cached_page;
2583  int ret;
2584 
2585  if (!master->sii_caching) {
2586  return 0;
2587  }
2588 
2589  if ((master->sii_caching & EC_SII_SERIAL) && !page->serial_number) {
2590  // only caching non-zero serial numbers
2591  return 0;
2592  }
2593 
2594  if ((master->sii_caching & EC_SII_ALIAS) && !page->alias) {
2595  // not caching non-zero alias addresses
2596  return 0;
2597  }
2598 
2599  list_for_each_entry(cached_page, &master->sii_cache, list) {
2600  if (ec_master_cached_sii_page_matches(master, cached_page,
2601  page->vendor_id, page->product_code,
2602  page->revision_number, page->serial_number,
2603  page->alias)) {
2604  EC_MASTER_WARN(master, "Matching SII page already existing.\n");
2605  return 0;
2606  }
2607  }
2608 
2609  EC_MASTER_DBG(master, 1,
2610  "Caching SII page for 0x%08X / 0x%08X / 0x%08X / 0x%08X / %u\n",
2611  page->vendor_id, page->product_code, page->revision_number,
2612  page->serial_number, page->alias);
2613 
2614  if (!(cached_page = (ec_sii_page_t *)
2615  kmalloc(sizeof(ec_sii_page_t), GFP_KERNEL))) {
2616  EC_MASTER_ERR(master, "Error allocating SII page memory!\n");
2617  return -ENOMEM;
2618  }
2619 
2620  ec_sii_page_init(cached_page);
2621  cached_page->origin = EC_SII_PAGE_CACHED;
2622 
2623  ret = ec_sii_page_copy(cached_page, page);
2624  if (ret) {
2625  EC_MASTER_ERR(master, "Failed to copy SII page!\n");
2626  return ret;
2627  }
2628 
2629  list_add_tail(&cached_page->list, &master->sii_cache);
2630  return 0;
2631 }
2632 
2633 /*****************************************************************************
2634  * Application interface
2635  ****************************************************************************/
2636 
2642  ec_master_t *master
2643  )
2644 {
2645  ec_domain_t *domain, *last_domain;
2646  unsigned int index;
2647 
2648  EC_MASTER_DBG(master, 1, "%s(master = 0x%p)\n", __func__, master);
2649 
2650  if (!(domain =
2651  (ec_domain_t *) kmalloc(sizeof(ec_domain_t), GFP_KERNEL))) {
2652  EC_MASTER_ERR(master, "Error allocating domain memory!\n");
2653  return ERR_PTR(-ENOMEM);
2654  }
2655 
2656  down(&master->master_sem);
2657 
2658  if (list_empty(&master->domains)) {
2659  index = 0;
2660  } else {
2661  last_domain = list_entry(master->domains.prev, ec_domain_t, list);
2662  index = last_domain->index + 1;
2663  }
2664 
2665  ec_domain_init(domain, master, index);
2666  list_add_tail(&domain->list, &master->domains);
2667 
2668  up(&master->master_sem);
2669 
2670  EC_MASTER_DBG(master, 1, "Created domain %u.\n", domain->index);
2671 
2672  return domain;
2673 }
2674 
2675 /****************************************************************************/
2676 
2678  ec_master_t *master
2679  )
2680 {
2682  return IS_ERR(d) ? NULL : d;
2683 }
2684 
2685 /****************************************************************************/
2686 
2688 {
2689  uint32_t domain_offset;
2690  ec_domain_t *domain;
2691  int ret;
2692 #ifdef EC_EOE
2693  int eoe_was_running;
2694 #endif
2695 
2696  EC_MASTER_DBG(master, 1, "%s(master = 0x%p)\n", __func__, master);
2697 
2698  if (master->active) {
2699  EC_MASTER_WARN(master, "%s: Master already active!\n", __func__);
2700  return 0;
2701  }
2702 
2703  down(&master->master_sem);
2704 
2705  // finish all domains
2706  domain_offset = 0;
2707  list_for_each_entry(domain, &master->domains, list) {
2708  ret = ec_domain_finish(domain, domain_offset);
2709  if (ret < 0) {
2710  up(&master->master_sem);
2711  EC_MASTER_ERR(master, "Failed to finish domain 0x%p!\n", domain);
2712  return ret;
2713  }
2714  domain_offset += domain->data_size;
2715  }
2716 
2717  up(&master->master_sem);
2718 
2719  // restart EoE process and master thread with new locking
2720 
2721  ec_master_thread_stop(master);
2722 #ifdef EC_EOE
2723  eoe_was_running = master->eoe_thread != NULL;
2724  ec_master_eoe_stop(master);
2725 #endif
2726 
2727  EC_MASTER_DBG(master, 1, "FSM datagram is %p.\n", &master->fsm_datagram);
2728 
2729  master->injection_seq_fsm = 0;
2730  master->injection_seq_rt = 0;
2731 
2732  master->send_cb = master->app_send_cb;
2733  master->receive_cb = master->app_receive_cb;
2734  master->cb_data = master->app_cb_data;
2735 
2736 #ifdef EC_EOE
2737  if (eoe_was_running) {
2738  ec_master_eoe_start(master);
2739  }
2740 #endif
2742  "EtherCAT-OP");
2743  if (ret < 0) {
2744  EC_MASTER_ERR(master, "Failed to start master thread!\n");
2745  return ret;
2746  }
2747 
2748  /* Allow scanning after a topology change. */
2749  master->allow_scan = 1;
2750 
2751  master->active = 1;
2752 
2753  // notify state machine, that the configuration shall now be applied
2754  master->config_changed = 1;
2755 
2756  return 0;
2757 }
2758 
2759 /****************************************************************************/
2760 
2762 {
2763  ec_slave_t *slave;
2764 #ifdef EC_EOE
2765  ec_eoe_t *eoe;
2766  int eoe_was_running;
2767 #endif
2768 
2769  EC_MASTER_DBG(master, 1, "%s(master = 0x%p)\n", __func__, master);
2770 
2771  if (!master->active) {
2772  EC_MASTER_WARN(master, "%s: Master not active.\n", __func__);
2773  return -EINVAL;
2774  }
2775 
2776  ec_master_thread_stop(master);
2777 #ifdef EC_EOE
2778  eoe_was_running = master->eoe_thread != NULL;
2779  ec_master_eoe_stop(master);
2780 #endif
2781 
2784  master->cb_data = master;
2785 
2786  ec_master_clear_config(master);
2787 
2788  for (slave = master->slaves;
2789  slave < master->slaves + master->slave_count;
2790  slave++) {
2791  // set states for all slaves
2793 
2794  // mark for reconfiguration, because the master could have no
2795  // possibility for a reconfiguration between two sequential operation
2796  // phases.
2797  slave->force_config = 1;
2798  }
2799 
2800 #ifdef EC_EOE
2801  // ... but leave EoE slaves in OP
2802  list_for_each_entry(eoe, &master->eoe_handlers, list) {
2803  if (ec_eoe_is_open(eoe))
2805  }
2806 #endif
2807 
2808  master->app_time = 0ULL;
2809  master->dc_ref_time = 0ULL;
2810 
2811 #ifdef EC_EOE
2812  if (eoe_was_running) {
2813  ec_master_eoe_start(master);
2814  }
2815 #endif
2817  "EtherCAT-IDLE")) {
2818  EC_MASTER_WARN(master, "Failed to restart master thread!\n");
2819  }
2820 
2821  /* Disallow scanning to get into the same state like after a master
2822  * request (after ec_master_enter_operation_phase() is called). */
2823  master->allow_scan = 0;
2824 
2825  master->active = 0;
2826  return 0;
2827 }
2828 
2829 /****************************************************************************/
2830 
2832 {
2833  ec_datagram_t *datagram, *n;
2834  ec_device_index_t dev_idx;
2835  unsigned int seq_fsm;
2836 
2837  seq_fsm = smp_load_acquire(&master->injection_seq_fsm);
2838  if (master->injection_seq_rt != seq_fsm) {
2839  // inject datagram produced by master FSM
2840  ec_master_queue_datagram(master, &master->fsm_datagram);
2841 
2842  smp_store_release(&master->injection_seq_rt, seq_fsm);
2843  }
2844 
2846 
2847  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
2848  dev_idx++) {
2849  if (unlikely(!master->devices[dev_idx].link_state)) {
2850  // link is down, no datagram can be sent
2851  list_for_each_entry_safe(datagram, n,
2852  &master->datagram_queue, queue) {
2853  if (datagram->device_index == dev_idx) {
2854  list_del_init(&datagram->queue);
2855  smp_store_release(&datagram->state, EC_DATAGRAM_ERROR);
2856  }
2857  }
2858 
2859  if (!master->devices[dev_idx].dev) {
2860  continue;
2861  }
2862 
2863  // query link state
2864  ec_device_poll(&master->devices[dev_idx]);
2865 
2866  // clear frame statistics
2867  ec_device_clear_stats(&master->devices[dev_idx]);
2868  continue;
2869  }
2870 
2871  // send frames
2872  ec_master_send_datagrams(master, dev_idx);
2873  }
2874  return 0;
2875 }
2876 
2877 /****************************************************************************/
2878 
2880 {
2881  unsigned int dev_idx;
2882  ec_datagram_t *datagram, *next;
2883 
2884  // receive datagrams
2885  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
2886  dev_idx++) {
2887  ec_device_poll(&master->devices[dev_idx]);
2888  }
2890 
2891  // dequeue all datagrams that timed out
2892  list_for_each_entry_safe(datagram, next, &master->datagram_queue, queue) {
2893  if (datagram->state != EC_DATAGRAM_SENT) continue;
2894 
2895 #ifdef EC_HAVE_CYCLES
2896  if (master->devices[EC_DEVICE_MAIN].cycles_poll -
2897  datagram->cycles_sent > timeout_cycles) {
2898 #else
2899  if (master->devices[EC_DEVICE_MAIN].jiffies_poll -
2900  datagram->jiffies_sent > timeout_jiffies) {
2901 #endif
2902  list_del_init(&datagram->queue);
2903  smp_store_release(&datagram->state, EC_DATAGRAM_TIMED_OUT);
2904  master->stats.timeouts++;
2905 
2906 #ifdef EC_RT_SYSLOG
2907  ec_master_output_stats(master);
2908 
2909  if (unlikely(master->debug_level > 0)) {
2910  unsigned int time_us;
2911 #ifdef EC_HAVE_CYCLES
2912  time_us = (unsigned int)
2913  (master->devices[EC_DEVICE_MAIN].cycles_poll -
2914  datagram->cycles_sent) * 1000 / cpu_khz;
2915 #else
2916  time_us = (unsigned int)
2917  ((master->devices[EC_DEVICE_MAIN].jiffies_poll -
2918  datagram->jiffies_sent) * 1000000 / HZ);
2919 #endif
2920  EC_MASTER_DBG(master, 0, "TIMED OUT datagram %p,"
2921  " index %02X waited %u us.\n",
2922  datagram, datagram->index, time_us);
2923  }
2924 #endif /* RT_SYSLOG */
2925  }
2926  }
2927  return 0;
2928 }
2929 
2930 /****************************************************************************/
2931 
2933 {
2934  ec_datagram_t *datagram, *next;
2935 
2936  if (down_trylock(&master->ext_queue_sem))
2937  return -EAGAIN;
2938 
2939  list_for_each_entry_safe(datagram, next, &master->ext_datagram_queue,
2940  ext_queue) {
2941  list_del_init(&datagram->ext_queue);
2942  ec_master_queue_datagram(master, datagram);
2943  }
2944  up(&master->ext_queue_sem);
2945 
2946  return ecrt_master_send(master);
2947 }
2948 
2949 /****************************************************************************/
2950 
2954  uint16_t alias, uint16_t position, uint32_t vendor_id,
2955  uint32_t product_code)
2956 {
2957  ec_slave_config_t *sc;
2958  unsigned int found = 0;
2959 
2960  EC_MASTER_DBG(master, 1, "ecrt_master_slave_config(master = 0x%p,"
2961  " alias = %u, position = %u, vendor_id = 0x%08x,"
2962  " product_code = 0x%08x)\n",
2963  master, alias, position, vendor_id, product_code);
2964 
2965  list_for_each_entry(sc, &master->configs, list) {
2966  if (sc->alias == alias && sc->position == position) {
2967  found = 1;
2968  break;
2969  }
2970  }
2971 
2972  if (found) { // config with same alias/position already existing
2973  if (sc->vendor_id != vendor_id || sc->product_code != product_code) {
2974  EC_MASTER_ERR(master, "Slave type mismatch. Slave was"
2975  " configured as 0x%08X/0x%08X before. Now configuring"
2976  " with 0x%08X/0x%08X.\n", sc->vendor_id, sc->product_code,
2977  vendor_id, product_code);
2978  return ERR_PTR(-ENOENT);
2979  }
2980  } else {
2981  EC_MASTER_DBG(master, 1, "Creating slave configuration for %u:%u,"
2982  " 0x%08X/0x%08X.\n",
2983  alias, position, vendor_id, product_code);
2984 
2985  if (!(sc = (ec_slave_config_t *) kmalloc(sizeof(ec_slave_config_t),
2986  GFP_KERNEL))) {
2987  EC_MASTER_ERR(master, "Failed to allocate memory"
2988  " for slave configuration.\n");
2989  return ERR_PTR(-ENOMEM);
2990  }
2991 
2992  ec_slave_config_init(sc, master,
2993  alias, position, vendor_id, product_code);
2994 
2995  down(&master->master_sem);
2996 
2997  // try to find the addressed slave
3000  list_add_tail(&sc->list, &master->configs);
3001 
3002  up(&master->master_sem);
3003  }
3004 
3005  return sc;
3006 }
3007 
3008 /****************************************************************************/
3009 
3011  uint16_t alias, uint16_t position, uint32_t vendor_id,
3012  uint32_t product_code)
3013 {
3014  ec_slave_config_t *sc = ecrt_master_slave_config_err(master, alias,
3015  position, vendor_id, product_code);
3016  return IS_ERR(sc) ? NULL : sc;
3017 }
3018 
3019 /****************************************************************************/
3020 
3022  ec_slave_config_t *sc)
3023 {
3024  EC_MASTER_DBG(master, 1, "%s(master = 0x%p, sc = 0x%p)\n",
3025  __func__, master, sc);
3026 
3027  if (down_interruptible(&master->master_sem)) {
3028  return -EINTR;
3029  }
3030 
3031  master->dc_ref_config = sc;
3032  // Re-run the full DC calculation, not just ec_master_find_dc_ref_clock():
3033  // the reference pointer alone is not enough. calc_topology() and
3034  // calc_transmission_delays() must recompute every slave's propagation
3035  // delay relative to the newly selected reference, otherwise the cyclic
3036  // write-system-times FSM keeps writing delays anchored on the old
3037  // default reference and the selection has no effect on DC compensation.
3038  ec_master_calc_dc(master);
3039  up(&master->master_sem);
3040  return 0;
3041 }
3042 
3043 /****************************************************************************/
3044 
3045 int ecrt_master(ec_master_t *master, ec_master_info_t *master_info)
3046 {
3047  EC_MASTER_DBG(master, 1, "%s(master = 0x%p,"
3048  " master_info = 0x%p)\n", __func__, master, master_info);
3049 
3050  master_info->slave_count = master->slave_count;
3051  master_info->link_up = master->devices[EC_DEVICE_MAIN].link_state;
3052  master_info->scan_busy = master->scan_busy;
3053  master_info->app_time = master->app_time;
3054  return 0;
3055 }
3056 
3057 /****************************************************************************/
3058 
3060  ec_master_scan_progress_t *progress)
3061 {
3062  EC_MASTER_DBG(master, 1, "%s(master = 0x%p, progress = 0x%p)\n",
3063  __func__, master, progress);
3064 
3065  progress->slave_count = master->slave_count;
3066  progress->scan_index = master->scan_index;
3067  return 0;
3068 }
3069 
3070 /****************************************************************************/
3071 
3072 int ecrt_master_get_slave(ec_master_t *master, uint16_t slave_position,
3073  ec_slave_info_t *slave_info)
3074 {
3075  const ec_slave_t *slave;
3076  unsigned int i;
3077  int ret = 0;
3078 
3079  if (down_interruptible(&master->master_sem)) {
3080  return -EINTR;
3081  }
3082 
3083  slave = ec_master_find_slave_const(master, 0, slave_position);
3084 
3085  if (slave == NULL) {
3086  ret = -ENOENT;
3087  goto out_get_slave;
3088  }
3089 
3090  slave_info->position = slave->ring_position;
3091  slave_info->vendor_id = slave->sii.vendor_id;
3092  slave_info->product_code = slave->sii.product_code;
3093  slave_info->revision_number = slave->sii.revision_number;
3094  slave_info->serial_number = slave->sii.serial_number;
3095  slave_info->alias = slave->effective_alias;
3096  slave_info->current_on_ebus = slave->sii.current_on_ebus;
3097 
3098  for (i = 0; i < EC_MAX_PORTS; i++) {
3099  slave_info->ports[i].desc = slave->ports[i].desc;
3100  slave_info->ports[i].link.link_up = slave->ports[i].link.link_up;
3101  slave_info->ports[i].link.loop_closed =
3102  slave->ports[i].link.loop_closed;
3103  slave_info->ports[i].link.signal_detected =
3104  slave->ports[i].link.signal_detected;
3105  slave_info->ports[i].receive_time = slave->ports[i].receive_time;
3106  if (slave->ports[i].next_slave) {
3107  slave_info->ports[i].next_slave =
3108  slave->ports[i].next_slave->ring_position;
3109  } else {
3110  slave_info->ports[i].next_slave = 0xffff;
3111  }
3112  slave_info->ports[i].delay_to_next_dc =
3113  slave->ports[i].delay_to_next_dc;
3114  }
3115 
3116  slave_info->al_state = slave->current_state;
3117  slave_info->error_flag = slave->error_flag;
3118  slave_info->sync_count = slave->sii.sync_count;
3119  slave_info->sdo_count = ec_slave_sdo_count(slave);
3120  if (slave->sii.name) {
3121  strscpy(slave_info->name, slave->sii.name, EC_MAX_STRING_LENGTH);
3122  } else {
3123  slave_info->name[0] = 0;
3124  }
3125 
3126 out_get_slave:
3127  up(&master->master_sem);
3128 
3129  return ret;
3130 }
3131 
3132 /****************************************************************************/
3133 
3135  void (*send_cb)(void *), void (*receive_cb)(void *), void *cb_data)
3136 {
3137  EC_MASTER_DBG(master, 1, "%s(master = 0x%p,"
3138  " send_cb = 0x%p, receive_cb = 0x%p, cb_data = 0x%p)\n",
3139  __func__, master, send_cb, receive_cb, cb_data);
3140 
3141  master->app_send_cb = send_cb;
3142  master->app_receive_cb = receive_cb;
3143  master->app_cb_data = cb_data;
3144 }
3145 
3146 /****************************************************************************/
3147 
3149 {
3150  ec_device_index_t dev_idx;
3151 
3152  state->slaves_responding = 0U;
3153  state->al_states = 0;
3154  state->link_up = 0U;
3155 
3156  for (dev_idx = EC_DEVICE_MAIN; dev_idx < ec_master_num_devices(master);
3157  dev_idx++) {
3158  /* Announce sum of responding slaves on all links. */
3159  state->slaves_responding += master->fsm.slaves_responding[dev_idx];
3160 
3161  /* Binary-or slave states of all links. */
3162  state->al_states |= master->fsm.slave_states[dev_idx];
3163 
3164  /* Signal link up if at least one device has link. */
3165  state->link_up |= master->devices[dev_idx].link_state;
3166  }
3167  return 0;
3168 }
3169 
3170 /****************************************************************************/
3171 
3172 int ecrt_master_link_state(const ec_master_t *master, unsigned int dev_idx,
3173  ec_master_link_state_t *state)
3174 {
3175  if (dev_idx >= ec_master_num_devices(master)) {
3176  return -EINVAL;
3177  }
3178 
3179  state->slaves_responding = master->fsm.slaves_responding[dev_idx];
3180  state->al_states = master->fsm.slave_states[dev_idx];
3181  state->link_up = master->devices[dev_idx].link_state;
3182 
3183  return 0;
3184 }
3185 
3186 /****************************************************************************/
3187 
3188 int ecrt_master_application_time(ec_master_t *master, uint64_t app_time)
3189 {
3190  master->app_time = app_time;
3191 
3192  if (unlikely(!master->dc_ref_time)) {
3193  master->dc_ref_time = app_time;
3194  }
3195  return 0;
3196 }
3197 
3198 /****************************************************************************/
3199 
3201  uint32_t *time)
3202 {
3203  if (!master->dc_ref_clock) {
3204  return -ENXIO;
3205  }
3206 
3207  if (master->sync_datagram.state != EC_DATAGRAM_RECEIVED) {
3208  return -EIO;
3209  }
3210 
3211  // Get returned datagram time, transmission delay removed.
3212  *time = EC_READ_U32(master->sync_datagram.data) -
3214 
3215  return 0;
3216 }
3217 
3218 /****************************************************************************/
3219 
3221 {
3222  if (master->dc_ref_clock) {
3223  EC_WRITE_U32(master->ref_sync_datagram.data, master->app_time);
3224  ec_master_queue_datagram(master, &master->ref_sync_datagram);
3225  } else {
3226  return -ENXIO;
3227  }
3228  return 0;
3229 }
3230 
3231 /****************************************************************************/
3232 
3234  ec_master_t *master,
3235  uint64_t sync_time
3236  )
3237 {
3238  if (master->dc_ref_clock) {
3239  EC_WRITE_U32(master->ref_sync_datagram.data, sync_time);
3240  ec_master_queue_datagram(master, &master->ref_sync_datagram);
3241  } else {
3242  return -ENXIO;
3243  }
3244  return 0;
3245 }
3246 
3247 /****************************************************************************/
3248 
3250 {
3251  if (master->dc_ref_clock) {
3252  ec_datagram_zero(&master->sync_datagram);
3253  ec_master_queue_datagram(master, &master->sync_datagram);
3254  } else {
3255  return -ENXIO;
3256  }
3257  return 0;
3258 }
3259 
3260 /****************************************************************************/
3261 
3263 {
3265  ec_master_queue_datagram(master, &master->sync_mon_datagram);
3266  return 0;
3267 }
3268 
3269 /****************************************************************************/
3270 
3272 {
3273  if (master->sync_mon_datagram.state == EC_DATAGRAM_RECEIVED) {
3274  return EC_READ_U32(master->sync_mon_datagram.data) & 0x7fffffff;
3275  } else {
3276  return 0xffffffff;
3277  }
3278 }
3279 
3280 /****************************************************************************/
3281 
3282 int ecrt_master_sdo_download(ec_master_t *master, uint16_t slave_position,
3283  uint16_t index, uint8_t subindex, const uint8_t *data,
3284  size_t data_size, uint32_t *abort_code)
3285 {
3286  ec_sdo_request_t request;
3287  ec_slave_t *slave;
3288  int ret;
3289 
3290  EC_MASTER_DBG(master, 1, "%s(master = 0x%p,"
3291  " slave_position = %u, index = 0x%04X, subindex = 0x%02X,"
3292  " data = 0x%p, data_size = %zu, abort_code = 0x%p)\n",
3293  __func__, master, slave_position, index, subindex,
3294  data, data_size, abort_code);
3295 
3296  ec_sdo_request_init(&request);
3297  ecrt_sdo_request_index(&request, index, subindex);
3298  ret = ec_sdo_request_alloc(&request, data_size);
3299  if (ret) {
3300  ec_sdo_request_clear(&request);
3301  return ret;
3302  }
3303 
3304  memcpy(request.data, data, data_size);
3305  request.data_size = data_size;
3306  ecrt_sdo_request_write(&request);
3307 
3308  if (down_interruptible(&master->master_sem)) {
3309  ec_sdo_request_clear(&request);
3310  return -EINTR;
3311  }
3312 
3313  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
3314  up(&master->master_sem);
3315  EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
3316  ec_sdo_request_clear(&request);
3317  return -EINVAL;
3318  }
3319 
3320  EC_SLAVE_DBG(slave, 1, "Scheduling SDO download request.\n");
3321 
3322  // schedule request.
3323  list_add_tail(&request.list, &slave->sdo_requests);
3324 
3325  up(&master->master_sem);
3326 
3327  // wait for processing through FSM
3328  if (wait_event_interruptible(master->request_queue,
3329  request.state != EC_INT_REQUEST_QUEUED)) {
3330  // interrupted by signal
3331  down(&master->master_sem);
3332  if (request.state == EC_INT_REQUEST_QUEUED) {
3333  list_del(&request.list);
3334  up(&master->master_sem);
3335  ec_sdo_request_clear(&request);
3336  return -EINTR;
3337  }
3338  // request already processing: interrupt not possible.
3339  up(&master->master_sem);
3340  }
3341 
3342  // wait until master FSM has finished processing
3343  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
3344 
3345  *abort_code = request.abort_code;
3346 
3347  if (request.state == EC_INT_REQUEST_SUCCESS) {
3348  ret = 0;
3349  } else if (request.errno) {
3350  ret = -request.errno;
3351  } else {
3352  ret = -EIO;
3353  }
3354 
3355  ec_sdo_request_clear(&request);
3356  return ret;
3357 }
3358 
3359 /****************************************************************************/
3360 
3362  uint16_t slave_position, uint16_t index, const uint8_t *data,
3363  size_t data_size, uint32_t *abort_code)
3364 {
3365  ec_sdo_request_t request;
3366  ec_slave_t *slave;
3367  int ret;
3368 
3369  EC_MASTER_DBG(master, 1, "%s(master = 0x%p,"
3370  " slave_position = %u, index = 0x%04X,"
3371  " data = 0x%p, data_size = %zu, abort_code = 0x%p)\n",
3372  __func__, master, slave_position, index, data, data_size,
3373  abort_code);
3374 
3375  ec_sdo_request_init(&request);
3376  ecrt_sdo_request_index(&request, index, 0);
3377  ret = ec_sdo_request_alloc(&request, data_size);
3378  if (ret) {
3379  ec_sdo_request_clear(&request);
3380  return ret;
3381  }
3382 
3383  request.complete_access = 1;
3384  memcpy(request.data, data, data_size);
3385  request.data_size = data_size;
3386  ecrt_sdo_request_write(&request);
3387 
3388  if (down_interruptible(&master->master_sem)) {
3389  ec_sdo_request_clear(&request);
3390  return -EINTR;
3391  }
3392 
3393  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
3394  up(&master->master_sem);
3395  EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
3396  ec_sdo_request_clear(&request);
3397  return -EINVAL;
3398  }
3399 
3400  EC_SLAVE_DBG(slave, 1, "Scheduling SDO download request"
3401  " (complete access).\n");
3402 
3403  // schedule request.
3404  list_add_tail(&request.list, &slave->sdo_requests);
3405 
3406  up(&master->master_sem);
3407 
3408  // wait for processing through FSM
3409  if (wait_event_interruptible(master->request_queue,
3410  request.state != EC_INT_REQUEST_QUEUED)) {
3411  // interrupted by signal
3412  down(&master->master_sem);
3413  if (request.state == EC_INT_REQUEST_QUEUED) {
3414  list_del(&request.list);
3415  up(&master->master_sem);
3416  ec_sdo_request_clear(&request);
3417  return -EINTR;
3418  }
3419  // request already processing: interrupt not possible.
3420  up(&master->master_sem);
3421  }
3422 
3423  // wait until master FSM has finished processing
3424  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
3425 
3426  *abort_code = request.abort_code;
3427 
3428  if (request.state == EC_INT_REQUEST_SUCCESS) {
3429  ret = 0;
3430  } else if (request.errno) {
3431  ret = -request.errno;
3432  } else {
3433  ret = -EIO;
3434  }
3435 
3436  ec_sdo_request_clear(&request);
3437  return ret;
3438 }
3439 
3440 /****************************************************************************/
3441 
3442 int ecrt_master_sdo_upload(ec_master_t *master, uint16_t slave_position,
3443  uint16_t index, uint8_t subindex, uint8_t *target,
3444  size_t target_size, size_t *result_size, uint32_t *abort_code)
3445 {
3446  ec_sdo_request_t request;
3447  ec_slave_t *slave;
3448  int ret = 0;
3449 
3450  EC_MASTER_DBG(master, 1, "%s(master = 0x%p,"
3451  " slave_position = %u, index = 0x%04X, subindex = 0x%02X,"
3452  " target = 0x%p, target_size = %zu, result_size = 0x%p,"
3453  " abort_code = 0x%p)\n",
3454  __func__, master, slave_position, index, subindex,
3455  target, target_size, result_size, abort_code);
3456 
3457  ec_sdo_request_init(&request);
3458  ecrt_sdo_request_index(&request, index, subindex);
3459  ecrt_sdo_request_read(&request);
3460 
3461  if (down_interruptible(&master->master_sem)) {
3462  ec_sdo_request_clear(&request);
3463  return -EINTR;
3464  }
3465 
3466  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
3467  up(&master->master_sem);
3468  ec_sdo_request_clear(&request);
3469  EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
3470  return -EINVAL;
3471  }
3472 
3473  EC_SLAVE_DBG(slave, 1, "Scheduling SDO upload request.\n");
3474 
3475  // schedule request.
3476  list_add_tail(&request.list, &slave->sdo_requests);
3477 
3478  up(&master->master_sem);
3479 
3480  // wait for processing through FSM
3481  if (wait_event_interruptible(master->request_queue,
3482  request.state != EC_INT_REQUEST_QUEUED)) {
3483  // interrupted by signal
3484  down(&master->master_sem);
3485  if (request.state == EC_INT_REQUEST_QUEUED) {
3486  list_del(&request.list);
3487  up(&master->master_sem);
3488  ec_sdo_request_clear(&request);
3489  return -EINTR;
3490  }
3491  // request already processing: interrupt not possible.
3492  up(&master->master_sem);
3493  }
3494 
3495  // wait until master FSM has finished processing
3496  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
3497 
3498  *abort_code = request.abort_code;
3499 
3500  if (request.state != EC_INT_REQUEST_SUCCESS) {
3501  *result_size = 0;
3502  if (request.errno) {
3503  ret = -request.errno;
3504  } else {
3505  ret = -EIO;
3506  }
3507  } else {
3508  if (request.data_size > target_size) {
3509  EC_SLAVE_ERR(slave, "%s(): Buffer too small.\n", __func__);
3510  ret = -ENOBUFS;
3511  }
3512  else {
3513  memcpy(target, request.data, request.data_size);
3514  *result_size = request.data_size;
3515  ret = 0;
3516  }
3517  }
3518 
3519  ec_sdo_request_clear(&request);
3520  return ret;
3521 }
3522 
3523 /****************************************************************************/
3524 
3525 int ecrt_master_write_idn(ec_master_t *master, uint16_t slave_position,
3526  uint8_t drive_no, uint16_t idn, const uint8_t *data, size_t data_size,
3527  uint16_t *error_code)
3528 {
3529  ec_soe_request_t request;
3530  ec_slave_t *slave;
3531  int ret;
3532 
3533  if (drive_no > 7) {
3534  EC_MASTER_ERR(master, "Invalid drive number!\n");
3535  return -EINVAL;
3536  }
3537 
3538  ec_soe_request_init(&request);
3539  ec_soe_request_set_drive_no(&request, drive_no);
3540  ec_soe_request_set_idn(&request, idn);
3541 
3542  ret = ec_soe_request_alloc(&request, data_size);
3543  if (ret) {
3544  ec_soe_request_clear(&request);
3545  return ret;
3546  }
3547 
3548  memcpy(request.data, data, data_size);
3549  request.data_size = data_size;
3550  ec_soe_request_write(&request);
3551 
3552  if (down_interruptible(&master->master_sem)) {
3553  ec_soe_request_clear(&request);
3554  return -EINTR;
3555  }
3556 
3557  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
3558  up(&master->master_sem);
3559  EC_MASTER_ERR(master, "Slave %u does not exist!\n",
3560  slave_position);
3561  ec_soe_request_clear(&request);
3562  return -EINVAL;
3563  }
3564 
3565  EC_SLAVE_DBG(slave, 1, "Scheduling SoE write request.\n");
3566 
3567  // schedule SoE write request.
3568  list_add_tail(&request.list, &slave->soe_requests);
3569 
3570  up(&master->master_sem);
3571 
3572  // wait for processing through FSM
3573  if (wait_event_interruptible(master->request_queue,
3574  request.state != EC_INT_REQUEST_QUEUED)) {
3575  // interrupted by signal
3576  down(&master->master_sem);
3577  if (request.state == EC_INT_REQUEST_QUEUED) {
3578  // abort request
3579  list_del(&request.list);
3580  up(&master->master_sem);
3581  ec_soe_request_clear(&request);
3582  return -EINTR;
3583  }
3584  up(&master->master_sem);
3585  }
3586 
3587  // wait until master FSM has finished processing
3588  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
3589 
3590  if (error_code) {
3591  *error_code = request.error_code;
3592  }
3593  ret = request.state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO;
3594  ec_soe_request_clear(&request);
3595 
3596  return ret;
3597 }
3598 
3599 /****************************************************************************/
3600 
3601 int ecrt_master_read_idn(ec_master_t *master, uint16_t slave_position,
3602  uint8_t drive_no, uint16_t idn, uint8_t *target, size_t target_size,
3603  size_t *result_size, uint16_t *error_code)
3604 {
3605  ec_soe_request_t request;
3606  ec_slave_t *slave;
3607  int ret;
3608 
3609  if (drive_no > 7) {
3610  EC_MASTER_ERR(master, "Invalid drive number!\n");
3611  return -EINVAL;
3612  }
3613 
3614  ec_soe_request_init(&request);
3615  ec_soe_request_set_drive_no(&request, drive_no);
3616  ec_soe_request_set_idn(&request, idn);
3617  ec_soe_request_read(&request);
3618 
3619  if (down_interruptible(&master->master_sem)) {
3620  ec_soe_request_clear(&request);
3621  return -EINTR;
3622  }
3623 
3624  if (!(slave = ec_master_find_slave(master, 0, slave_position))) {
3625  up(&master->master_sem);
3626  ec_soe_request_clear(&request);
3627  EC_MASTER_ERR(master, "Slave %u does not exist!\n", slave_position);
3628  return -EINVAL;
3629  }
3630 
3631  EC_SLAVE_DBG(slave, 1, "Scheduling SoE read request.\n");
3632 
3633  // schedule request.
3634  list_add_tail(&request.list, &slave->soe_requests);
3635 
3636  up(&master->master_sem);
3637 
3638  // wait for processing through FSM
3639  if (wait_event_interruptible(master->request_queue,
3640  request.state != EC_INT_REQUEST_QUEUED)) {
3641  // interrupted by signal
3642  down(&master->master_sem);
3643  if (request.state == EC_INT_REQUEST_QUEUED) {
3644  list_del(&request.list);
3645  up(&master->master_sem);
3646  ec_soe_request_clear(&request);
3647  return -EINTR;
3648  }
3649  // request already processing: interrupt not possible.
3650  up(&master->master_sem);
3651  }
3652 
3653  // wait until master FSM has finished processing
3654  wait_event(master->request_queue, request.state != EC_INT_REQUEST_BUSY);
3655 
3656  if (error_code) {
3657  *error_code = request.error_code;
3658  }
3659 
3660  if (request.state != EC_INT_REQUEST_SUCCESS) {
3661  if (result_size) {
3662  *result_size = 0;
3663  }
3664  ret = -EIO;
3665  } else { // success
3666  if (request.data_size > target_size) {
3667  EC_SLAVE_ERR(slave, "%s(): Buffer too small.\n", __func__);
3668  ret = -ENOBUFS;
3669  }
3670  else { // data fits in buffer
3671  if (result_size) {
3672  *result_size = request.data_size;
3673  }
3674  memcpy(target, request.data, request.data_size);
3675  ret = 0;
3676  }
3677  }
3678 
3679  ec_soe_request_clear(&request);
3680  return ret;
3681 }
3682 
3683 /****************************************************************************/
3684 
3686 {
3687  ec_slave_config_t *sc;
3688 
3689  list_for_each_entry(sc, &master->configs, list) {
3690  if (sc->slave) {
3692  }
3693  }
3694  return 0;
3695 }
3696 
3697 /****************************************************************************/
3698 
3700  ec_sii_caching_fields_t fields)
3701 {
3702  fields &= EC_SII_CACHING_MASK;
3703 
3704  if (master->sii_caching == fields) {
3705  // no changes
3706  return 0;
3707  }
3708 
3709  EC_MASTER_DBG(master, 1, "Setting SII caching fields to %u.\n",
3710  fields);
3711  master->sii_caching = fields;
3712 
3713  if (!master->sii_caching) {
3714  EC_MASTER_DBG(master, 1, "Clearing SII page cache.\n");
3715  ec_master_clear_sii_cache(master);
3716  }
3717 
3718  return 0;
3719 }
3720 
3721 /****************************************************************************/
3722 
3723 static void sc_reset_task_kicker(struct irq_work *work)
3724 {
3725  struct ec_master *master =
3726  container_of(work, struct ec_master, sc_reset_work_kicker);
3727  schedule_work(&master->sc_reset_work);
3728 }
3729 
3730 /****************************************************************************/
3731 
3732 static void sc_reset_task(struct work_struct *work)
3733 {
3734  struct ec_master *master =
3735  container_of(work, struct ec_master, sc_reset_work);
3736 
3737  down(&master->master_sem);
3738  ecrt_master_reset(master);
3739  up(&master->master_sem);
3740 }
3741 
3742 /****************************************************************************/
3743 
3746 EXPORT_SYMBOL(ecrt_master_create_domain);
3747 EXPORT_SYMBOL(ecrt_master_activate);
3748 EXPORT_SYMBOL(ecrt_master_deactivate);
3749 EXPORT_SYMBOL(ecrt_master_send);
3750 EXPORT_SYMBOL(ecrt_master_send_ext);
3751 EXPORT_SYMBOL(ecrt_master_receive);
3752 EXPORT_SYMBOL(ecrt_master_callbacks);
3753 EXPORT_SYMBOL(ecrt_master);
3754 EXPORT_SYMBOL(ecrt_master_scan_progress);
3755 EXPORT_SYMBOL(ecrt_master_get_slave);
3756 EXPORT_SYMBOL(ecrt_master_slave_config);
3757 EXPORT_SYMBOL(ecrt_master_select_reference_clock);
3758 EXPORT_SYMBOL(ecrt_master_state);
3759 EXPORT_SYMBOL(ecrt_master_link_state);
3760 EXPORT_SYMBOL(ecrt_master_application_time);
3761 EXPORT_SYMBOL(ecrt_master_sync_reference_clock);
3763 EXPORT_SYMBOL(ecrt_master_sync_slave_clocks);
3764 EXPORT_SYMBOL(ecrt_master_reference_clock_time);
3765 EXPORT_SYMBOL(ecrt_master_sync_monitor_queue);
3766 EXPORT_SYMBOL(ecrt_master_sync_monitor_process);
3767 EXPORT_SYMBOL(ecrt_master_sdo_download);
3768 EXPORT_SYMBOL(ecrt_master_sdo_download_complete);
3769 EXPORT_SYMBOL(ecrt_master_sdo_upload);
3770 EXPORT_SYMBOL(ecrt_master_write_idn);
3771 EXPORT_SYMBOL(ecrt_master_read_idn);
3772 EXPORT_SYMBOL(ecrt_master_reset);
3773 EXPORT_SYMBOL(ecrt_master_sii_caching);
3774 
3777 /****************************************************************************/
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:391
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:265
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:2761
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:257
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:2453
int ecrt_master_sii_caching(ec_master_t *master, ec_sii_caching_fields_t fields)
Set the SII caching method.
Definition: master.c:3699
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:3172
unsigned int fsm_exec_count
Number of entries in execution list.
Definition: master.h:282
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:307
#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:2831
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:3059
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:2115
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:418
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:2470
static int ec_master_eoe_thread(void *)
Does the Ethernet over EtherCAT processing.
Definition: master.c:1905
int ec_fsm_slave_is_ready(const ec_fsm_slave_t *fsm)
Returns, if the FSM is currently not busy and ready to execute.
Definition: fsm_slave.c:176
CANopen SDO request.
Definition: sdo_request.h:40
unsigned int slave_count
Number of slaves in the network.
Definition: ecrt.h:417
ec_slave_state_t current_state
Current application state.
Definition: slave.h: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:3361
ec_domain_t * ecrt_master_create_domain(ec_master_t *master)
Creates a new process data domain.
Definition: master.c:2677
#define ec_master_num_devices(MASTER)
Number of Ethernet devices.
Definition: master.h:333
#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:242
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:2502
struct list_head eoe_handlers
Ethernet over EtherCAT handlers.
Definition: master.h:293
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:250
int ecrt_master_sync_reference_clock(ec_master_t *master)
Queues the DC reference clock drift compensation datagram for sending.
Definition: master.c:3220
size_t max_queue_size
Maximum size of datagram queue.
Definition: master.h:278
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:1781
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:2026
#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:3134
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:281
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:2194
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:2233
#define EC_WRITE_U8(DATA, VAL)
Write an 8-bit unsigned value to EtherCAT data.
Definition: ecrt.h:3353
unsigned int scan_index
Index of slave currently scanned.
Definition: master.h:249
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:308
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:2101
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:2045
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:2010
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:311
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:285
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:2641
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:3525
int ec_master_enter_idle_phase(ec_master_t *master)
Transition function from ORPHANED to IDLE phase.
Definition: master.c:680
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:2130
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:300
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:3200
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:280
unsigned int send_interval
Interval between two calls to ecrt_master_send().
Definition: master.h:276
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:2549
uint8_t datagram_index
Current datagram index.
Definition: master.h:263
void ec_master_attach_slave_configs(ec_master_t *master)
Attaches the slave configurations to the slaves.
Definition: master.c:1970
struct list_head datagram_queue
Datagram queue.
Definition: master.h:262
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:3233
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:315
struct task_struct * eoe_thread
EoE thread.
Definition: master.h:292
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:274
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:2258
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:3387
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:2577
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:430
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:2179
int ecrt_master_application_time(ec_master_t *master, uint64_t app_time)
Sets the application time.
Definition: master.c:3188
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:284
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:2145
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:272
struct rt_mutex io_mutex
Mutex used in IDLE and OP phase.
Definition: master.h:296
unsigned int slave_count
Number of slaves on the bus.
Definition: master.h:228
unsigned int scan_busy
Current scan state.
Definition: master.h:248
ec_device_index_t
Master devices.
Definition: globals.h:203
void(* receive_cb)(void *)
Current receive datagrams callback.
Definition: master.h:299
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:3601
#define EC_WRITE_U16(DATA, VAL)
Write a 16-bit unsigned value to EtherCAT data.
Definition: ecrt.h:3370
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:3010
#define EC_READ_U32(DATA)
Read a 32-bit unsigned value from EtherCAT data.
Definition: ecrt.h:3277
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:253
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:2932
#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:3021
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:3262
static int ec_master_idle_thread(void *)
Master kernel thread function for IDLE phase.
Definition: master.c:1708
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:244
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:3045
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:287
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:251
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:3072
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:2426
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:286
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:3261
void ec_master_eoe_start(ec_master_t *master)
Starts Ethernet over EtherCAT processing on demand.
Definition: master.c:1856
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:301
void * app_cb_data
Application callback data.
Definition: master.h:305
uint16_t ec_master_eoe_handler_count(const ec_master_t *master)
Get the number of EoE handlers.
Definition: master.c:2211
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:2281
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:3282
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:270
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:259
#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:2366
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:2409
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:2164
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:2687
struct work_struct sc_reset_work
Task to reset slave configuration.
Definition: master.h:313
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:1986
struct semaphore ext_queue_sem
Semaphore protecting the ext_datagram_queue.
Definition: master.h:267
#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:348
#define EC_READ_U8(DATA)
Read an 8-bit unsigned value from EtherCAT data.
Definition: ecrt.h:3245
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:2879
EtherCAT device structure.
void(* app_receive_cb)(void *)
Application&#39;s receive datagrams callback.
Definition: master.h:303
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:3271
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:2953
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:226
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:2082
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:256
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:3249
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:3148
int ec_eoe_is_open(const ec_eoe_t *eoe)
Returns the state of the device.
Definition: ethernet.c:405
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:3685
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:1890
void(* send_cb)(void *)
Current send datagrams callback.
Definition: master.h:298
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:3442
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:289
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:246
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