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