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