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