IgH EtherCAT Master  1.7.0
master.h
Go to the documentation of this file.
1 /*****************************************************************************
2  *
3  * Copyright (C) 2006-2026 Florian Pose, Ingenieurgemeinschaft IgH
4  *
5  * This file is part of the IgH EtherCAT Master.
6  *
7  * The IgH EtherCAT Master is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License version 2, as
9  * published by the Free Software Foundation.
10  *
11  * The IgH EtherCAT Master is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
14  * Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License along
17  * with the IgH EtherCAT Master; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
19  *
20  ****************************************************************************/
21 
27 /****************************************************************************/
28 
29 #ifndef __EC_MASTER_H__
30 #define __EC_MASTER_H__
31 
32 #include <linux/version.h>
33 #include <linux/irq_work.h>
34 #include <linux/list.h>
35 #include <linux/timer.h>
36 #include <linux/wait.h>
37 #include <linux/kthread.h>
38 #include <linux/rtmutex.h>
39 #include <linux/workqueue.h>
40 
41 #include "device.h"
42 #include "domain.h"
43 #include "ethernet.h"
44 #include "fsm_master.h"
45 #include "cdev.h"
46 
47 #ifdef EC_RTDM
48 #include "rtdm.h"
49 #endif
50 
51 /****************************************************************************/
52 
62 #define EC_MASTER_INFO(master, fmt, args...) \
63  printk(KERN_INFO "EtherCAT %u: " fmt, master->index, ##args)
64 
74 #define EC_MASTER_ERR(master, fmt, args...) \
75  printk(KERN_ERR "EtherCAT ERROR %u: " fmt, master->index, ##args)
76 
86 #define EC_MASTER_WARN(master, fmt, args...) \
87  printk(KERN_WARNING "EtherCAT WARNING %u: " fmt, master->index, ##args)
88 
100 #define EC_MASTER_DBG(master, level, fmt, args...) \
101  do { \
102  if (master->debug_level >= level) { \
103  printk(KERN_DEBUG "EtherCAT DEBUG %u: " fmt, \
104  master->index, ##args); \
105  } \
106  } while (0)
107 
108 
113 #define EC_EXT_RING_SIZE 32
114 
117 #define EC_MAX_MASTERS 32
118 
119 /****************************************************************************/
120 
123 typedef enum {
131 
132 /****************************************************************************/
133 
136 typedef struct {
137  unsigned int timeouts;
138  unsigned int corrupted;
139  unsigned int unmatched;
141  unsigned long output_jiffies;
142 } ec_stats_t;
143 
144 /****************************************************************************/
145 
148 typedef struct {
149  u64 tx_count;
151  u64 rx_count;
154  u64 tx_bytes;
156  u64 rx_bytes;
159  u64 last_loss;
160  s32 tx_frame_rates[EC_RATE_COUNT];
163  s32 rx_frame_rates[EC_RATE_COUNT];
166  s32 tx_byte_rates[EC_RATE_COUNT];
168  s32 rx_byte_rates[EC_RATE_COUNT];
170  s32 loss_rates[EC_RATE_COUNT];
172  unsigned long jiffies;
174 
175 /****************************************************************************/
176 
177 #if EC_MAX_NUM_DEVICES < 1
178 #error Invalid number of devices
179 #endif
180 
181 /****************************************************************************/
182 
183 // Support old kernels by providing a fallback for `strscpy`
184 #if LINUX_VERSION_CODE < KERNEL_VERSION(4, 3, 0)
185 #define strscpy strncpy
186 #endif
187 
188 /****************************************************************************/
189 
194 struct ec_master {
195  unsigned int index;
196  unsigned int reserved;
199  struct device *class_device;
201 #ifdef EC_RTDM
202  ec_rtdm_dev_t rtdm_dev;
203 #endif
204 
205  struct semaphore master_sem;
207  ec_device_t devices[EC_MAX_NUM_DEVICES];
208  const uint8_t *macs[EC_MAX_NUM_DEVICES];
209 #if EC_MAX_NUM_DEVICES > 1
210  unsigned int num_devices;
213 #endif
214  struct semaphore device_sem;
220  unsigned int active;
221  unsigned int config_changed;
222  unsigned int injection_seq_fsm;
224  unsigned int injection_seq_rt;
228  unsigned int slave_count;
230  struct list_head sii_cache;
232  /* Configuration applied by the application. */
233  struct list_head configs;
234  struct list_head domains;
236  u64 app_time;
248  unsigned int scan_busy;
249  unsigned int scan_index;
250  unsigned int allow_scan;
251  struct semaphore scan_sem;
253  wait_queue_head_t scan_queue;
256  unsigned int config_busy;
257  struct semaphore config_sem;
259  wait_queue_head_t config_queue;
262  struct list_head datagram_queue;
263  uint8_t datagram_index;
265  struct list_head ext_datagram_queue;
267  struct semaphore ext_queue_sem;
272  unsigned int ext_ring_idx_rt;
274  unsigned int ext_ring_idx_fsm;
276  unsigned int send_interval;
278  size_t max_queue_size;
281  struct list_head fsm_exec_list;
282  unsigned int fsm_exec_count;
284  unsigned int debug_level;
285  unsigned int run_on_cpu;
286  unsigned int sii_caching;
289  struct task_struct *thread;
291 #ifdef EC_EOE
292  struct task_struct *eoe_thread;
293  struct list_head eoe_handlers;
294 #endif
295 
296  struct rt_mutex io_mutex;
298  void (*send_cb)(void *);
299  void (*receive_cb)(void *);
300  void *cb_data;
301  void (*app_send_cb)(void *);
303  void (*app_receive_cb)(void *);
305  void *app_cb_data;
307  struct list_head sii_requests;
308  struct list_head emerg_reg_requests;
311  wait_queue_head_t request_queue;
313  struct work_struct sc_reset_work;
315  struct irq_work sc_reset_work_kicker;
317 };
318 
319 /****************************************************************************/
320 
321 // static funtions
322 void ec_master_init_static(void);
323 
324 // master creation/deletion
325 int ec_master_init(ec_master_t *, unsigned int, const uint8_t *,
326  const uint8_t *, dev_t, struct class *, unsigned int, unsigned int,
327  unsigned int);
329 
332 #if EC_MAX_NUM_DEVICES > 1
333 #define ec_master_num_devices(MASTER) ((MASTER)->num_devices)
334 #else
335 #define ec_master_num_devices(MASTER) 1
336 #endif
337 
338 // phase transitions
343 
344 #ifdef EC_EOE
345 // EoE
348 #endif
349 
350 // datagram IO
352  const uint8_t *, size_t);
355 
356 // misc.
357 void ec_master_set_send_interval(ec_master_t *, unsigned int);
359 ec_slave_t *ec_master_find_slave(ec_master_t *, uint16_t, uint16_t);
360 const ec_slave_t *ec_master_find_slave_const(const ec_master_t *, uint16_t,
361  uint16_t);
363  const ec_slave_t *);
365 #ifdef EC_EOE
367 #endif
369 
370 unsigned int ec_master_config_count(const ec_master_t *);
372  const ec_master_t *, unsigned int);
374  const ec_master_t *, unsigned int);
375 unsigned int ec_master_domain_count(const ec_master_t *);
378  unsigned int);
379 #ifdef EC_EOE
380 uint16_t ec_master_eoe_handler_count(const ec_master_t *);
382  uint16_t);
383 #endif
384 
385 int ec_master_debug_level(ec_master_t *, unsigned int);
386 
389  uint16_t, uint32_t, uint32_t);
390 
393  uint32_t, uint32_t, uint32_t, uint32_t, uint16_t);
394 
397 
398 void ec_master_internal_send_cb(void *);
399 void ec_master_internal_receive_cb(void *);
400 
401 extern const unsigned int rate_intervals[EC_RATE_COUNT]; // see master.c
402 
403 /****************************************************************************/
404 
405 #endif
unsigned int injection_seq_fsm
Datagram injection sequence number for the FSM side.
Definition: master.h:222
Cyclic statistics.
Definition: master.h:136
void ec_master_clear_slaves(ec_master_t *)
Clear all slaves.
Definition: master.c:513
unsigned int reserved
True, if the master is in use.
Definition: master.h:196
struct list_head ext_datagram_queue
Queue for non-application datagrams.
Definition: master.h:265
ec_slave_config_t * ec_master_find_config_for_slave(ec_master_t *, const ec_slave_t *)
Finds the slave configuration that will be attached to the given slave.
Definition: master.c:1896
void ec_master_eoe_stop(ec_master_t *)
Stops the Ethernet over EtherCAT processing.
Definition: master.c:1743
struct semaphore config_sem
Semaphore protecting the config_busy variable and the allow_config flag.
Definition: master.h:257
int ec_master_cache_sii_page(ec_master_t *, const ec_sii_page_t *)
Add an SII page to the cache.
Definition: master.c:2399
void ec_master_internal_receive_cb(void *)
Internal receiving callback.
Definition: master.c:599
unsigned int fsm_exec_count
Number of entries in execution list.
Definition: master.h:282
unsigned int num_devices
Number of devices.
Definition: master.h:210
u64 last_loss
Tx/Rx difference of last statistics cycle.
Definition: master.h:159
u64 tx_count
Number of frames sent.
Definition: master.h:149
ec_domain_t * ecrt_master_create_domain_err(ec_master_t *)
Same as ecrt_master_create_domain(), but with ERR_PTR() return value.
Definition: master.c:2463
struct list_head sii_requests
SII write requests.
Definition: master.h:307
Finite state machine of an EtherCAT master.
Definition: fsm_master.h:60
const ec_eoe_t * ec_master_get_eoe_handler_const(const ec_master_t *, uint16_t)
Get an EoE handler via its position in the list.
Definition: master.c:2084
EtherCAT RTDM device.
Definition: rtdm.h:38
#define EC_RATE_COUNT
Number of statistic rate intervals to maintain.
Definition: globals.h:60
ec_datagram_t sync_mon_datagram
Datagram used for DC synchronisation monitoring.
Definition: master.h:242
struct list_head eoe_handlers
Ethernet over EtherCAT handlers.
Definition: master.h:293
const ec_slave_t * ec_master_find_slave_const(const ec_master_t *, uint16_t, uint16_t)
Finds a slave in the bus, given the alias and position.
Definition: master.c:1877
Operation phase.
Definition: master.h:128
unsigned int allow_scan
True, if slave scanning is allowed.
Definition: master.h:250
size_t max_queue_size
Maximum size of datagram queue.
Definition: master.h:278
void ec_master_request_op(ec_master_t *)
Request OP state for configured slaves.
Definition: master.c:2292
EtherCAT datagram.
Definition: datagram.h:79
struct list_head fsm_exec_list
Slave FSM execution list.
Definition: master.h:281
unsigned int scan_index
Index of slave currently scanned.
Definition: master.h:249
u64 dc_ref_time
Common reference timestamp for DC start times.
Definition: master.h:237
struct list_head emerg_reg_requests
Emergency register access requests.
Definition: master.h:308
int ec_master_enter_idle_phase(ec_master_t *)
Transition function from ORPHANED to IDLE phase.
Definition: master.c:679
struct list_head domains
List of domains.
Definition: master.h:234
ec_slave_config_t * ec_master_get_config(const ec_master_t *, unsigned int)
Get a slave configuration via its position in the list.
Definition: master.c:1966
unsigned long jiffies
Jiffies of last statistic cycle.
Definition: master.h:172
const unsigned int rate_intervals[EC_RATE_COUNT]
List of intervals for statistics [s].
Definition: master.c:110
ec_sii_page_t * ec_master_find_cached_sii_page(const ec_master_t *, uint32_t, uint32_t, uint32_t, uint32_t, uint16_t)
Find a matching cached SII page.
Definition: master.c:2371
u64 last_rx_count
Number of frames received of last statistics cycle.
Definition: master.h:152
const uint8_t * macs[EC_MAX_NUM_DEVICES]
Device MAC addresses.
Definition: master.h:208
wait_queue_head_t request_queue
Wait queue for external requests from user space.
Definition: master.h:311
EtherCAT master state machine.
unsigned int run_on_cpu
Bind kernel threads to this cpu.
Definition: master.h:285
void * cb_data
Current callback data.
Definition: master.h:300
ec_slave_t * fsm_slave
Slave that is queried next for FSM exec.
Definition: master.h:280
unsigned int send_interval
Interval between two calls to ecrt_master_send().
Definition: master.h:276
EtherCAT slave.
Definition: slave.h:169
struct semaphore master_sem
Master semaphore.
Definition: master.h:205
uint8_t datagram_index
Current datagram index.
Definition: master.h:263
struct list_head datagram_queue
Datagram queue.
Definition: master.h:262
struct irq_work sc_reset_work_kicker
NMI-Safe kicker to trigger reset task above.
Definition: master.h:315
struct task_struct * eoe_thread
EoE thread.
Definition: master.h:292
unsigned int unmatched
unmatched datagrams (received, but not queued any longer)
Definition: master.h:139
unsigned int ext_ring_idx_fsm
Index in external datagram ring for FSM side.
Definition: master.h:274
Ethernet over EtherCAT (EoE)
ec_device_stats_t device_stats
Device statistics.
Definition: master.h:215
ec_datagram_t fsm_datagram
Datagram used for state machines.
Definition: master.h:218
ec_master_phase_t phase
Master phase.
Definition: master.h:219
Slave information interface memory page.
Definition: sii_page.h:47
ec_slave_t * slaves
Array of slaves on the bus.
Definition: master.h:227
unsigned int ec_master_domain_count(const ec_master_t *)
Get the number of domains.
Definition: master.c:1996
struct semaphore device_sem
Device semaphore.
Definition: master.h:214
EtherCAT device.
Definition: device.h:78
void ec_master_output_stats(ec_master_t *)
Output master statistics.
Definition: master.c:1306
ec_domain_t * ec_master_find_domain(ec_master_t *, unsigned int)
Get a domain via its position in the list.
Definition: master.c:2030
unsigned int timeouts
datagram timeouts
Definition: master.h:137
unsigned int debug_level
Master debug level.
Definition: master.h:284
Orphaned phase.
Definition: master.h:124
ec_slave_t * ec_master_find_slave(ec_master_t *, uint16_t, uint16_t)
Finds a slave in the bus, given the alias and position.
Definition: master.c:1861
unsigned int corrupted
corrupted frames
Definition: master.h:138
u64 last_tx_count
Number of frames sent of last statistics cycle.
Definition: master.h:150
void ec_master_receive_datagrams(ec_master_t *, ec_device_t *, const uint8_t *, size_t)
Processes a received frame.
Definition: master.c:1164
unsigned int ext_ring_idx_rt
Index in external datagram ring for RT side.
Definition: master.h:272
struct rt_mutex io_mutex
Mutex used in IDLE and OP phase.
Definition: master.h:296
unsigned int slave_count
Number of slaves on the bus.
Definition: master.h:228
unsigned int scan_busy
Current scan state.
Definition: master.h:248
void(* receive_cb)(void *)
Current receive datagrams callback.
Definition: master.h:299
void ec_master_clear(ec_master_t *)
Destructor.
Definition: master.c:415
void ec_master_calc_dc(ec_master_t *)
Distributed-clocks calculations.
Definition: master.c:2275
unsigned int active
Master has been activated.
Definition: master.h:220
wait_queue_head_t scan_queue
Queue for processes that wait for slave scanning.
Definition: master.h:253
int ec_master_debug_level(ec_master_t *, unsigned int)
Set the debug level.
Definition: master.c:2109
ec_datagram_t sync_datagram
Datagram used for DC drift compensation.
Definition: master.h:240
struct device * class_device
Master class device.
Definition: master.h:199
void ec_master_internal_send_cb(void *)
Internal sending callback.
Definition: master.c:584
void ec_master_set_send_interval(ec_master_t *, unsigned int)
Sets the expected interval between calls to ecrt_master_send and calculates the maximum amount of dat...
Definition: master.c:943
struct list_head configs
List of slave configurations.
Definition: master.h:233
ec_slave_config_t * dc_ref_config
Application-selected DC reference clock slave config.
Definition: master.h:244
int ec_master_init(ec_master_t *, unsigned int, const uint8_t *, const uint8_t *, dev_t, struct class *, unsigned int, unsigned int, unsigned int)
Master constructor.
Definition: master.c:169
uint16_t ec_master_eoe_handler_count(const ec_master_t *)
Get the number of EoE handlers.
Definition: master.c:2062
Device statistics.
Definition: master.h:148
u64 last_rx_bytes
Number of bytes received of last statistics cycle.
Definition: master.h:157
unsigned long output_jiffies
time of last output
Definition: master.h:141
ec_stats_t stats
Cyclic statistics.
Definition: master.h:287
Idle phase.
Definition: master.h:126
struct semaphore scan_sem
Semaphore protecting the scan_busy variable and the allow_scan flag.
Definition: master.h:251
void ec_master_queue_datagram_ext(ec_master_t *, ec_datagram_t *)
Places a datagram in the non-application datagram queue.
Definition: master.c:1012
void ec_master_leave_operation_phase(ec_master_t *)
Transition function from OPERATION to IDLE phase.
Definition: master.c:807
unsigned int sii_caching
SII caching mode.
Definition: master.h:286
u64 tx_bytes
Number of bytes sent.
Definition: master.h:154
void(* app_send_cb)(void *)
Application&#39;s send datagrams callback.
Definition: master.h:301
void * app_cb_data
Application callback data.
Definition: master.h:305
void ec_master_eoe_start(ec_master_t *)
Starts Ethernet over EtherCAT processing on demand.
Definition: master.c:1709
struct list_head sii_cache
List of cached SII pages.
Definition: master.h:230
ec_datagram_t ext_datagram_ring[EC_EXT_RING_SIZE]
External datagram ring.
Definition: master.h:270
wait_queue_head_t config_queue
Queue for processes that wait for slave configuration.
Definition: master.h:259
#define EC_EXT_RING_SIZE
Size of the external datagram ring.
Definition: master.h:113
EtherCAT domain structure.
unsigned int ec_master_config_count(const ec_master_t *)
Get the number of slave configurations provided by the application.
Definition: master.c:1933
u64 app_time
Time of the last ecrt_master_sync() call.
Definition: master.h:236
ec_datagram_t ref_sync_datagram
Datagram used for synchronizing the reference clock to the master clock.
Definition: master.h:238
u64 rx_count
Number of frames received.
Definition: master.h:151
void ec_master_leave_idle_phase(ec_master_t *)
Transition function from IDLE to ORPHANED phase.
Definition: master.c:712
struct work_struct sc_reset_work
Task to reset slave configuration.
Definition: master.h:313
ec_slave_config_t * ecrt_master_slave_config_err(ec_master_t *, uint16_t, uint16_t, uint32_t, uint32_t)
Same as ecrt_master_slave_config(), but with ERR_PTR() return value.
Definition: master.c:2776
EtherCAT master character device.
Definition: cdev.h:41
struct semaphore ext_queue_sem
Semaphore protecting the ext_datagram_queue.
Definition: master.h:267
EtherCAT slave configuration.
Definition: slave_config.h:111
EtherCAT device structure.
void(* app_receive_cb)(void *)
Application&#39;s receive datagrams callback.
Definition: master.h:303
ec_master_phase_t
EtherCAT master phase.
Definition: master.h:123
void ec_master_attach_slave_configs(ec_master_t *)
Attaches the slave configurations to the slaves.
Definition: master.c:1821
void ec_master_init_static(void)
Static variables initializer.
Definition: master.c:148
unsigned int index
Index.
Definition: master.h:195
void ec_master_clear_eoe_handlers(ec_master_t *)
Clear and free all EoE handlers.
Definition: master.c:462
u64 last_tx_bytes
Number of bytes sent of last statistics cycle.
Definition: master.h:155
Ethernet over EtherCAT (EoE) handler.
Definition: ethernet.h:74
ec_fsm_master_t fsm
Master state machine.
Definition: master.h:217
ec_cdev_t cdev
Master character device.
Definition: master.h:198
const ec_domain_t * ec_master_find_domain_const(const ec_master_t *, unsigned int)
Get a domain via its position in the list.
Definition: master.c:2045
u64 rx_bytes
Number of bytes received.
Definition: master.h:156
const ec_slave_config_t * ec_master_get_config_const(const ec_master_t *, unsigned int)
Get a slave configuration via its position in the list.
Definition: master.c:1981
unsigned int config_changed
The configuration changed.
Definition: master.h:221
EtherCAT master.
Definition: master.h:194
unsigned int injection_seq_rt
Datagram injection sequence number for the realtime side.
Definition: master.h:224
ec_device_t devices[EC_MAX_NUM_DEVICES]
EtherCAT devices.
Definition: master.h:207
unsigned int config_busy
State of slave configuration.
Definition: master.h:256
EtherCAT master character device.
int ec_master_enter_operation_phase(ec_master_t *)
Transition function from IDLE to OPERATION phase.
Definition: master.c:736
EtherCAT domain.
Definition: domain.h:46
void(* send_cb)(void *)
Current send datagrams callback.
Definition: master.h:298
struct task_struct * thread
Master thread.
Definition: master.h:289
ec_slave_t * dc_ref_clock
DC reference clock slave.
Definition: master.h:246
RTDM interface.
void ec_master_queue_datagram(ec_master_t *, ec_datagram_t *)
Places a datagram in the datagram queue.
Definition: master.c:979