28 #include <linux/module.h> 29 #include <linux/vmalloc.h> 41 #define DEBUG_LATENCY 0 46 #define ATTRIBUTES __attribute__ ((__noinline__)) 52 # include "rtdm_details.h" 55 # define ec_ioctl_lock(lock) do {} while(0) 56 # define ec_ioctl_unlock(lock) do {} while(0) 57 # define ec_ioctl_lock_interruptible(lock) (0) 58 # define ec_copy_to_user(to, from, n, ctx) \ 59 rtdm_safe_copy_to_user(ec_ioctl_to_rtdm(ctx), to, from, n) 60 # define ec_copy_from_user(to, from, n, ctx) \ 61 rtdm_safe_copy_from_user(ec_ioctl_to_rtdm(ctx), to, from, n) 63 # define ec_ioctl_lock(lock) rt_mutex_lock(lock) 64 # define ec_ioctl_unlock(lock) rt_mutex_unlock(lock) 65 # if LINUX_VERSION_CODE >= KERNEL_VERSION(3, 17, 0) || \ 66 (defined(CONFIG_PREEMPT_RT_FULL) && \ 67 LINUX_VERSION_CODE >= KERNEL_VERSION(3, 2, 0)) 68 # define ec_ioctl_lock_interruptible(lock) \ 69 rt_mutex_lock_interruptible(lock) 71 # define ec_ioctl_lock_interruptible(lock) \ 72 rt_mutex_lock_interruptible(lock, 0) 74 # define ec_copy_to_user(to, from, n, ctx) copy_to_user(to, from, n) 75 # define ec_copy_from_user(to, from, n, ctx) copy_from_user(to, from, n) 76 #endif // EC_IOCTL_RTDM 88 strncpy(target, source, EC_IOCTL_STRING_SIZE);
89 target[EC_IOCTL_STRING_SIZE - 1] = 0;
103 ec_ioctl_context_t *ctx
106 ec_ioctl_module_t data;
108 data.ioctl_version_magic = EC_IOCTL_VERSION_MAGIC;
111 if (ec_copy_to_user((
void __user *) arg, &data,
sizeof(data), ctx))
128 ec_ioctl_master_t io;
129 unsigned int dev_idx, j;
131 if (down_interruptible(&master->
master_sem)) {
142 io.eoe_handler_count = 0;
144 io.phase = (uint8_t) master->
phase;
145 io.active = (uint8_t) master->
active;
151 if (down_interruptible(&master->
device_sem)) {
160 memcpy(io.devices[dev_idx].address, device->
dev->dev_addr,
163 memcpy(io.devices[dev_idx].address, master->
macs[dev_idx],
166 io.devices[dev_idx].attached = device->
dev ? 1 : 0;
167 io.devices[dev_idx].link_state = device->
link_state ? 1 : 0;
168 io.devices[dev_idx].tx_count = device->
tx_count;
169 io.devices[dev_idx].rx_count = device->
rx_count;
170 io.devices[dev_idx].tx_bytes = device->
tx_bytes;
171 io.devices[dev_idx].rx_bytes = device->
rx_bytes;
172 io.devices[dev_idx].tx_errors = device->
tx_errors;
174 io.devices[dev_idx].tx_frame_rates[j] =
176 io.devices[dev_idx].rx_frame_rates[j] =
178 io.devices[dev_idx].tx_byte_rates[j] =
180 io.devices[dev_idx].rx_byte_rates[j] =
191 io.tx_frame_rates[j] =
193 io.rx_frame_rates[j] =
195 io.tx_byte_rates[j] =
197 io.rx_byte_rates[j] =
210 if (copy_to_user((
void __user *) arg, &io,
sizeof(io))) {
228 ec_ioctl_slave_t data;
232 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
240 master, 0, data.position))) {
242 EC_MASTER_ERR(master,
"Slave %u does not exist!\n", data.position);
266 data.ports[i].desc = slave->
ports[i].
desc;
269 data.ports[i].link.signal_detected =
273 data.ports[i].next_slave =
276 data.ports[i].next_slave = 0xffff;
299 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
316 ec_ioctl_slave_sync_t data;
320 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
328 master, 0, data.slave_position))) {
331 data.slave_position);
337 EC_SLAVE_ERR(slave,
"Sync manager %u does not exist!\n",
342 sync = &slave->
sii.
syncs[data.sync_index];
347 data.enable = sync->
enable;
352 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
369 ec_ioctl_slave_sync_pdo_t data;
374 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
382 master, 0, data.slave_position))) {
385 data.slave_position);
391 EC_SLAVE_ERR(slave,
"Sync manager %u does not exist!\n",
396 sync = &slave->
sii.
syncs[data.sync_index];
398 &sync->
pdos, data.pdo_pos))) {
400 EC_SLAVE_ERR(slave,
"Sync manager %u does not contain a PDO with " 401 "position %u!\n", data.sync_index, data.pdo_pos);
405 data.index = pdo->
index;
411 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
428 ec_ioctl_slave_sync_pdo_entry_t data;
434 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
442 master, 0, data.slave_position))) {
445 data.slave_position);
451 EC_SLAVE_ERR(slave,
"Sync manager %u does not exist!\n",
456 sync = &slave->
sii.
syncs[data.sync_index];
458 &sync->
pdos, data.pdo_pos))) {
460 EC_SLAVE_ERR(slave,
"Sync manager %u does not contain a PDO with " 461 "position %u!\n", data.sync_index, data.pdo_pos);
466 pdo, data.entry_pos))) {
468 EC_SLAVE_ERR(slave,
"PDO 0x%04X does not contain an entry with " 469 "position %u!\n", data.pdo_pos, data.entry_pos);
473 data.index = entry->
index;
480 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
497 ec_ioctl_domain_t data;
499 unsigned int dev_idx;
501 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
525 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
542 ec_ioctl_domain_fmmu_t data;
546 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
563 " fmmu configurations.\n",
564 data.domain_index, data.fmmu_index + 1);
568 data.slave_config_alias = fmmu->
sc->
alias;
569 data.slave_config_position = fmmu->
sc->
position;
571 data.dir = fmmu->
dir;
577 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
594 ec_ioctl_domain_data_t data;
597 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
611 if (domain->
data_size != data.data_size) {
618 if (copy_to_user((
void __user *) data.target, domain->
data,
654 " Re-scanning on next possibility.\n");
670 ec_ioctl_slave_state_t data;
673 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
681 master, 0, data.slave_position))) {
684 data.slave_position);
705 ec_ioctl_slave_sdo_t data;
709 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
717 master, 0, data.slave_position))) {
720 data.slave_position);
725 slave, data.sdo_position))) {
727 EC_SLAVE_ERR(slave,
"SDO %u does not exist!\n", data.sdo_position);
731 data.sdo_index = sdo->
index;
737 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
754 ec_ioctl_slave_sdo_entry_t data;
759 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
767 master, 0, data.slave_position))) {
770 data.slave_position);
774 if (data.sdo_spec <= 0) {
776 slave, -data.sdo_spec))) {
778 EC_SLAVE_ERR(slave,
"SDO %u does not exist!\n", -data.sdo_spec);
783 slave, data.sdo_spec))) {
792 sdo, data.sdo_entry_subindex))) {
794 EC_SLAVE_ERR(slave,
"SDO entry 0x%04X:%02X does not exist!\n",
795 sdo->
index, data.sdo_entry_subindex);
817 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
834 ec_ioctl_slave_sdo_upload_t data;
838 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
842 if (!(target = kmalloc(data.target_size, GFP_KERNEL))) {
844 " for SDO upload.\n", data.target_size);
849 data.sdo_index, data.sdo_entry_subindex, target,
850 data.target_size, &data.data_size, &data.abort_code);
853 if (copy_to_user((
void __user *) data.target,
854 target, data.data_size)) {
862 if (__copy_to_user((
void __user *) arg, &data,
sizeof(data))) {
880 ec_ioctl_slave_sdo_download_t data;
884 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
888 if (!(sdo_data = kmalloc(data.data_size, GFP_KERNEL))) {
890 " for SDO download.\n", data.data_size);
894 if (copy_from_user(sdo_data, (
void __user *) data.data, data.data_size)) {
899 if (data.complete_access) {
901 data.slave_position, data.sdo_index, sdo_data, data.data_size,
905 data.sdo_index, data.sdo_entry_subindex, sdo_data,
906 data.data_size, &data.abort_code);
911 if (__copy_to_user((
void __user *) arg, &data,
sizeof(data))) {
929 ec_ioctl_slave_sii_t data;
933 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
941 master, 0, data.slave_position))) {
944 data.slave_position);
951 EC_SLAVE_ERR(slave,
"Invalid SII read offset/size %u/%u for slave SII" 952 " size %zu!\n", data.offset, data.nwords,
957 if (copy_to_user((
void __user *) data.words,
978 ec_ioctl_slave_sii_t data;
980 unsigned int byte_size;
984 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
992 byte_size =
sizeof(uint16_t) * data.
nwords;
993 if (!(words = kmalloc(byte_size, GFP_KERNEL))) {
995 " for SII contents.\n", byte_size);
999 if (copy_from_user(words,
1000 (
void __user *) data.words, byte_size)) {
1005 if (down_interruptible(&master->
master_sem)) {
1011 master, 0, data.slave_position))) {
1014 data.slave_position);
1020 INIT_LIST_HEAD(&request.
list);
1021 request.
slave = slave;
1022 request.
words = words;
1023 request.
offset = data.offset;
1024 request.
nwords = data.nwords;
1025 request.
state = EC_INT_REQUEST_QUEUED;
1034 request.
state != EC_INT_REQUEST_QUEUED)) {
1037 if (request.
state == EC_INT_REQUEST_QUEUED) {
1039 list_del(&request.
list);
1052 return request.
state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO;
1066 ec_ioctl_slave_reg_t io;
1071 if (copy_from_user(&io, (
void __user *) arg,
sizeof(io))) {
1090 if (down_interruptible(&master->
master_sem)) {
1096 master, 0, io.slave_position))) {
1111 request.
state != EC_INT_REQUEST_QUEUED)) {
1114 if (request.
state == EC_INT_REQUEST_QUEUED) {
1116 list_del(&request.
list);
1127 if (request.
state == EC_INT_REQUEST_SUCCESS) {
1128 if (copy_to_user((
void __user *) io.data, request.
data, io.size)) {
1134 return request.
state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO;
1148 ec_ioctl_slave_reg_t io;
1153 if (copy_from_user(&io, (
void __user *) arg,
sizeof(io))) {
1167 if (copy_from_user(request.
data, (
void __user *) io.data, io.size)) {
1177 if (down_interruptible(&master->
master_sem)) {
1204 request.
state != EC_INT_REQUEST_QUEUED)) {
1207 if (request.
state == EC_INT_REQUEST_QUEUED) {
1209 list_del(&request.
list);
1222 return request.
state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO;
1236 ec_ioctl_config_t data;
1240 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
1248 master, data.config_index))) {
1255 data.alias = sc->
alias;
1262 data.syncs[i].pdo_count =
1275 data.dc_sync[i] = sc->
dc_sync[i];
1280 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
1297 ec_ioctl_config_pdo_t data;
1301 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
1315 master, data.config_index))) {
1330 data.index = pdo->
index;
1336 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
1353 ec_ioctl_config_pdo_entry_t data;
1358 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
1372 master, data.config_index))) {
1388 pdo, data.entry_pos))) {
1394 data.index = entry->
index;
1401 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
1418 ec_ioctl_config_sdo_t *ioctl;
1422 if (!(ioctl = kmalloc(
sizeof(*ioctl), GFP_KERNEL))) {
1426 if (copy_from_user(ioctl, (
void __user *) arg,
sizeof(*ioctl))) {
1431 if (down_interruptible(&master->
master_sem)) {
1437 master, ioctl->config_index))) {
1440 ioctl->config_index);
1446 sc, ioctl->sdo_pos))) {
1453 ioctl->index = req->
index;
1456 memcpy(ioctl->data, req->
data,
1457 min((u32) ioctl->size, (u32) EC_MAX_SDO_DATA_SIZE));
1462 if (copy_to_user((
void __user *) arg, ioctl,
sizeof(*ioctl))) {
1482 ec_ioctl_config_idn_t *ioctl;
1486 if (!(ioctl = kmalloc(
sizeof(*ioctl), GFP_KERNEL))) {
1490 if (copy_from_user(ioctl, (
void __user *) arg,
sizeof(*ioctl))) {
1495 if (down_interruptible(&master->
master_sem)) {
1501 master, ioctl->config_index))) {
1504 ioctl->config_index);
1510 sc, ioctl->idn_pos))) {
1518 ioctl->idn = req->
idn;
1521 memcpy(ioctl->data, req->
data,
1522 min((u32) ioctl->size, (u32) EC_MAX_IDN_DATA_SIZE));
1526 if (copy_to_user((
void __user *) arg, ioctl,
sizeof(*ioctl))) {
1546 ec_ioctl_config_flag_t *ioctl;
1551 if (!(ioctl = kmalloc(
sizeof(*ioctl), GFP_KERNEL))) {
1555 if (copy_from_user(ioctl, (
void __user *) arg,
sizeof(*ioctl))) {
1560 if (down_interruptible(&master->
master_sem)) {
1566 master, ioctl->config_index))) {
1569 ioctl->config_index);
1575 sc, ioctl->flag_pos))) {
1582 size = min((u32) strlen(flag->
key), (u32) EC_MAX_FLAG_KEY_SIZE - 1);
1583 memcpy(ioctl->key, flag->
key, size);
1584 ioctl->key[size] = 0x00;
1585 ioctl->value = flag->
value;
1589 if (copy_to_user((
void __user *) arg, ioctl,
sizeof(*ioctl))) {
1611 ec_ioctl_eoe_ip_t *ioctl;
1615 if (!(ioctl = kmalloc(
sizeof(*ioctl), GFP_KERNEL))) {
1619 if (copy_from_user(ioctl, (
void __user *) arg,
sizeof(*ioctl))) {
1624 if (down_interruptible(&master->
master_sem)) {
1632 ioctl->config_index);
1639 ioctl->mac_address_included = req->mac_address_included;
1640 ioctl->ip_address_included = req->ip_address_included;
1641 ioctl->subnet_mask_included = req->subnet_mask_included;
1642 ioctl->gateway_included = req->gateway_included;
1643 ioctl->dns_included = req->dns_included;
1644 ioctl->name_included = req->name_included;
1646 memcpy(ioctl->mac_address, req->mac_address, EC_ETH_ALEN);
1647 ioctl->ip_address = req->ip_address;
1648 ioctl->subnet_mask = req->subnet_mask;
1649 ioctl->gateway = req->gateway;
1650 ioctl->dns = req->dns;
1655 if (copy_to_user((
void __user *) arg, ioctl,
sizeof(*ioctl))) {
1679 ec_ioctl_eoe_handler_t data;
1682 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
1699 data.slave_position = 0xffff;
1703 data.rx_bytes = eoe->
stats.tx_bytes;
1705 data.tx_bytes = eoe->
stats.rx_bytes;
1712 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
1733 ec_ioctl_eoe_ip_t io;
1737 if (copy_from_user(&io, (
void __user *) arg,
sizeof(io))) {
1744 req.mac_address_included = io.mac_address_included;
1745 req.ip_address_included = io.ip_address_included;
1746 req.subnet_mask_included = io.subnet_mask_included;
1747 req.gateway_included = io.gateway_included;
1748 req.dns_included = io.dns_included;
1749 req.name_included = io.name_included;
1751 memcpy(req.mac_address, io.mac_address, EC_ETH_ALEN);
1752 req.ip_address = io.ip_address;
1753 req.subnet_mask = io.subnet_mask;
1754 req.gateway = io.gateway;
1758 req.
state = EC_INT_REQUEST_QUEUED;
1760 if (down_interruptible(&master->
master_sem)) {
1765 master, 0, io.slave_position))) {
1781 req.
state != EC_INT_REQUEST_QUEUED)) {
1784 if (req.
state == EC_INT_REQUEST_QUEUED) {
1786 list_del(&req.
list);
1796 io.result = req.result;
1798 if (copy_to_user((
void __user *) arg, &io,
sizeof(io))) {
1802 return req.
state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO;
1816 ec_ioctl_context_t *ctx
1841 ec_ioctl_context_t *ctx
1846 if (unlikely(!ctx->requested))
1851 return PTR_ERR(domain);
1853 return domain->
index;
1865 ec_ioctl_context_t *ctx
1868 ec_ioctl_config_t data;
1871 if (unlikely(!ctx->requested))
1874 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
1879 data.vendor_id, data.product_code);
1883 data.config_index = 0;
1888 list_for_each_entry(entry, &master->
configs, list) {
1891 data.config_index++;
1896 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
1911 ec_ioctl_context_t *ctx
1914 unsigned long config_index = (
unsigned long) arg;
1918 if (unlikely(!ctx->requested)) {
1923 if (down_interruptible(&master->
master_sem)) {
1928 if (config_index != 0xFFFFFFFF) {
1952 ec_ioctl_context_t *ctx
1955 ec_ioctl_master_activate_t io;
1960 if (unlikely(!ctx->requested))
1963 io.process_data = NULL;
1967 ctx->process_data_size = 0;
1972 list_for_each_entry(domain, &master->
domains, list) {
1978 if (ctx->process_data_size) {
1979 ctx->process_data = vmalloc(ctx->process_data_size);
1980 if (!ctx->process_data) {
1981 ctx->process_data_size = 0;
1989 list_for_each_entry(domain, &master->
domains, list) {
1991 ctx->process_data + offset);
1995 #if defined(EC_IOCTL_RTDM) && !defined(EC_RTDM_XENOMAI_V3) 2002 " memory to user space (code %i).\n", ret);
2008 io.process_data_size = ctx->process_data_size;
2010 #ifndef EC_IOCTL_RTDM 2020 if (copy_to_user((
void __user *) arg, &io,
2021 sizeof(ec_ioctl_master_activate_t)))
2036 ec_ioctl_context_t *ctx
2039 if (unlikely(!ctx->requested))
2054 ec_ioctl_context_t *ctx
2057 size_t send_interval;
2059 if (unlikely(!ctx->requested)) {
2063 if (copy_from_user(&send_interval, (
void __user *) arg,
2064 sizeof(send_interval))) {
2086 ec_ioctl_context_t *ctx
2091 if (unlikely(!ctx->requested)) {
2095 if (ec_ioctl_lock_interruptible(&master->
io_mutex))
2099 ec_ioctl_unlock(&master->
io_mutex);
2112 ec_ioctl_context_t *ctx
2117 if (unlikely(!ctx->requested)) {
2121 if (ec_ioctl_lock_interruptible(&master->
io_mutex))
2125 ec_ioctl_unlock(&master->
io_mutex);
2138 ec_ioctl_context_t *ctx
2148 if (ec_copy_to_user((
void __user *) arg, &data,
sizeof(data), ctx))
2163 ec_ioctl_context_t *ctx
2166 ec_ioctl_link_state_t ioctl;
2170 if (ec_copy_from_user(&ioctl, (
void __user *) arg,
sizeof(ioctl), ctx)) {
2179 if (ec_copy_to_user((
void __user *) ioctl.state,
2180 &state,
sizeof(state), ctx)) {
2196 ec_ioctl_context_t *ctx
2201 if (unlikely(!ctx->requested))
2204 if (ec_copy_from_user(&time, (
void __user *) arg,
sizeof(time), ctx)) {
2220 ec_ioctl_context_t *ctx
2225 if (unlikely(!ctx->requested)) {
2229 if (ec_ioctl_lock_interruptible(&master->
io_mutex))
2233 ec_ioctl_unlock(&master->
io_mutex);
2246 ec_ioctl_context_t *ctx
2252 if (unlikely(!ctx->requested))
2255 if (ec_copy_from_user(&time, (
void __user *) arg,
sizeof(time), ctx)) {
2259 if (ec_ioctl_lock_interruptible(&master->
io_mutex))
2263 ec_ioctl_unlock(&master->
io_mutex);
2276 ec_ioctl_context_t *ctx
2281 if (unlikely(!ctx->requested)) {
2285 if (ec_ioctl_lock_interruptible(&master->
io_mutex))
2289 ec_ioctl_unlock(&master->
io_mutex);
2302 ec_ioctl_context_t *ctx
2308 if (unlikely(!ctx->requested)) {
2317 if (ec_copy_to_user((
void __user *) arg, &time,
sizeof(time), ctx)) {
2333 ec_ioctl_context_t *ctx
2338 if (unlikely(!ctx->requested)) {
2342 if (ec_ioctl_lock_interruptible(&master->
io_mutex))
2346 ec_ioctl_unlock(&master->
io_mutex);
2359 ec_ioctl_context_t *ctx
2364 if (unlikely(!ctx->requested))
2369 if (ec_copy_to_user((
void __user *) arg, &time_diff,
2370 sizeof(time_diff), ctx))
2385 ec_ioctl_context_t *ctx
2388 #ifdef EC_IOCTL_RTDM 2406 ec_ioctl_context_t *ctx
2423 ec_ioctl_context_t *ctx
2426 ec_ioctl_config_t data;
2431 if (unlikely(!ctx->requested)) {
2436 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
2441 if (down_interruptible(&master->
master_sem)) {
2452 if (data.syncs[i].config_this) {
2454 data.syncs[i].watchdog_mode);
2476 ec_ioctl_context_t *ctx
2479 ec_ioctl_config_t data;
2483 if (unlikely(!ctx->requested)) {
2488 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
2493 if (down_interruptible(&master->
master_sem)) {
2521 ec_ioctl_context_t *ctx
2524 ec_ioctl_config_t data;
2528 if (unlikely(!ctx->requested)) {
2533 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
2538 if (down_interruptible(&master->
master_sem)) {
2566 ec_ioctl_context_t *ctx
2569 ec_ioctl_config_pdo_t data;
2572 if (unlikely(!ctx->requested))
2575 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data)))
2600 ec_ioctl_context_t *ctx
2603 ec_ioctl_config_pdo_t data;
2606 if (unlikely(!ctx->requested))
2609 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data)))
2634 ec_ioctl_context_t *ctx
2637 ec_ioctl_add_pdo_entry_t data;
2640 if (unlikely(!ctx->requested))
2643 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data)))
2657 data.entry_index, data.entry_subindex, data.entry_bit_length);
2669 ec_ioctl_context_t *ctx
2672 ec_ioctl_config_pdo_t data;
2675 if (unlikely(!ctx->requested))
2678 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data)))
2703 ec_ioctl_context_t *ctx
2706 ec_ioctl_reg_pdo_entry_t data;
2711 if (unlikely(!ctx->requested))
2714 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data)))
2733 data.entry_subindex, domain, &data.bit_position);
2735 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
2750 ec_ioctl_context_t *ctx
2753 ec_ioctl_reg_pdo_pos_t io;
2758 if (unlikely(!ctx->requested)) {
2762 if (copy_from_user(&io, (
void __user *) arg,
sizeof(io))) {
2766 if (down_interruptible(&master->
master_sem)) {
2783 io.pdo_pos, io.entry_pos, domain, &io.bit_position);
2785 if (copy_to_user((
void __user *) arg, &io,
sizeof(io)))
2800 ec_ioctl_context_t *ctx
2803 ec_ioctl_config_t data;
2807 if (unlikely(!ctx->requested))
2810 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data)))
2822 data.dc_sync[0].cycle_time,
2823 data.dc_sync[0].shift_time,
2824 data.dc_sync[1].cycle_time,
2825 data.dc_sync[1].shift_time);
2841 ec_ioctl_context_t *ctx
2844 ec_ioctl_sc_sdo_t data;
2846 uint8_t *sdo_data = NULL;
2849 if (unlikely(!ctx->requested))
2852 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data)))
2858 if (!(sdo_data = kmalloc(data.size, GFP_KERNEL))) {
2862 if (copy_from_user(sdo_data, (
void __user *) data.data, data.size)) {
2867 if (down_interruptible(&master->
master_sem)) {
2880 if (data.complete_access) {
2882 data.index, sdo_data, data.size);
2900 ec_ioctl_context_t *ctx
2903 ec_ioctl_sc_emerg_t io;
2907 if (unlikely(!ctx->requested))
2910 if (copy_from_user(&io, (
void __user *) arg,
sizeof(io)))
2913 if (down_interruptible(&master->
master_sem)) {
2938 ec_ioctl_context_t *ctx
2941 ec_ioctl_sc_emerg_t io;
2946 if (unlikely(!ctx->requested)) {
2950 if (ec_copy_from_user(&io, (
void __user *) arg,
sizeof(io), ctx)) {
2966 if (ec_copy_to_user((
void __user *) io.target, msg,
sizeof(msg), ctx)) {
2982 ec_ioctl_context_t *ctx
2985 ec_ioctl_sc_emerg_t io;
2988 if (unlikely(!ctx->requested)) {
2992 if (ec_copy_from_user(&io, (
void __user *) arg,
sizeof(io), ctx)) {
3015 ec_ioctl_context_t *ctx
3018 ec_ioctl_sc_emerg_t io;
3022 if (unlikely(!ctx->requested)) {
3026 if (ec_copy_from_user(&io, (
void __user *) arg,
sizeof(io), ctx)) {
3044 if (ec_copy_to_user((
void __user *) arg, &io,
sizeof(io), ctx)) {
3060 ec_ioctl_context_t *ctx
3063 ec_ioctl_sdo_request_t data;
3067 if (unlikely(!ctx->requested))
3070 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
3074 data.request_index = 0;
3086 data.request_index++;
3092 data.sdo_subindex, data.size);
3094 return PTR_ERR(req);
3096 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
3111 ec_ioctl_context_t *ctx
3114 ec_ioctl_soe_request_t data;
3118 if (unlikely(!ctx->requested))
3121 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
3125 data.request_index = 0;
3137 data.request_index++;
3143 data.idn, data.size);
3145 return PTR_ERR(req);
3148 if (copy_to_user((
void __user *) arg, &data,
sizeof(data))) {
3164 ec_ioctl_context_t *ctx
3167 ec_ioctl_reg_request_t io;
3171 if (unlikely(!ctx->requested)) {
3175 if (copy_from_user(&io, (
void __user *) arg,
sizeof(io))) {
3179 io.request_index = 0;
3181 if (down_interruptible(&master->
master_sem)) {
3199 return PTR_ERR(reg);
3202 if (copy_to_user((
void __user *) arg, &io,
sizeof(io))) {
3218 ec_ioctl_context_t *ctx
3221 ec_ioctl_voe_t data;
3225 if (unlikely(!ctx->requested))
3228 if (copy_from_user(&data, (
void __user *) arg,
sizeof(data))) {
3251 return PTR_ERR(voe);
3253 if (copy_to_user((
void __user *) arg, &data,
sizeof(data)))
3268 ec_ioctl_context_t *ctx
3271 ec_ioctl_sc_state_t data;
3276 if (unlikely(!ctx->requested))
3279 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx)) {
3294 if (ec_copy_to_user((
void __user *) data.state,
3295 &state,
sizeof(state), ctx))
3310 ec_ioctl_context_t *ctx
3313 ec_ioctl_sc_idn_t ioctl;
3315 uint8_t *data = NULL;
3318 if (unlikely(!ctx->requested))
3321 if (copy_from_user(&ioctl, (
void __user *) arg,
sizeof(ioctl)))
3327 if (!(data = kmalloc(ioctl.size, GFP_KERNEL))) {
3331 if (copy_from_user(data, (
void __user *) ioctl.data, ioctl.size)) {
3336 if (down_interruptible(&master->
master_sem)) {
3350 sc, ioctl.drive_no, ioctl.idn, ioctl.al_state, data, ioctl.size);
3364 ec_ioctl_context_t *ctx
3367 ec_ioctl_sc_flag_t ioctl;
3372 if (unlikely(!ctx->requested)) {
3376 if (copy_from_user(&ioctl, (
void __user *) arg,
sizeof(ioctl))) {
3380 if (!ioctl.key_size) {
3384 if (!(key = kmalloc(ioctl.key_size + 1, GFP_KERNEL))) {
3388 if (copy_from_user(key, (
void __user *) ioctl.key, ioctl.key_size)) {
3392 key[ioctl.key_size] =
'\0';
3394 if (down_interruptible(&master->
master_sem)) {
3421 ec_ioctl_context_t *ctx
3424 ec_ioctl_sc_state_timeout_t ioctl;
3428 if (unlikely(!ctx->requested)) {
3432 if (copy_from_user(&ioctl, (
void __user *) arg,
sizeof(ioctl))) {
3436 if (down_interruptible(&master->
master_sem)) {
3448 ioctl.to_state, ioctl.timeout_ms);
3463 ec_ioctl_context_t *ctx
3466 ec_ioctl_eoe_ip_t io;
3469 if (unlikely(!ctx->requested)) {
3473 if (copy_from_user(&io, (
void __user *) arg,
sizeof(io))) {
3477 if (down_interruptible(&master->
master_sem)) {
3489 if (io.mac_address_included) {
3492 if (io.ip_address_included) {
3495 if (io.subnet_mask_included) {
3498 if (io.gateway_included) {
3501 if (io.dns_included) {
3504 if (io.name_included) {
3522 ec_ioctl_context_t *ctx
3527 if (unlikely(!ctx->requested)) {
3531 if (down_interruptible(&master->
master_sem)) {
3535 list_for_each_entry(domain, &master->
domains, list) {
3536 if (domain->
index == (
unsigned long) arg) {
3556 ec_ioctl_context_t *ctx
3562 if (unlikely(!ctx->requested))
3565 if (down_interruptible(&master->
master_sem)) {
3569 list_for_each_entry(domain, &master->
domains, list) {
3570 if (domain->
index == (
unsigned long) arg) {
3590 ec_ioctl_context_t *ctx
3595 if (unlikely(!ctx->requested))
3617 ec_ioctl_context_t *ctx
3623 if (unlikely(!ctx->requested))
3633 if (ec_ioctl_lock_interruptible(&master->
io_mutex))
3637 ec_ioctl_unlock(&master->
io_mutex);
3650 ec_ioctl_context_t *ctx
3653 ec_ioctl_domain_state_t data;
3658 if (unlikely(!ctx->requested))
3661 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx)) {
3676 if (ec_copy_to_user((
void __user *) data.state, &state,
sizeof(state),
3692 ec_ioctl_context_t *ctx
3695 ec_ioctl_sdo_request_t data;
3699 if (unlikely(!ctx->requested))
3702 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
3728 ec_ioctl_context_t *ctx
3731 ec_ioctl_sdo_request_t data;
3735 if (unlikely(!ctx->requested))
3738 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
3766 ec_ioctl_context_t *ctx
3769 ec_ioctl_sdo_request_t data;
3773 if (unlikely(!ctx->requested))
3776 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
3796 if (ec_copy_to_user((
void __user *) arg, &data,
sizeof(data), ctx))
3811 ec_ioctl_context_t *ctx
3814 ec_ioctl_sdo_request_t data;
3818 if (unlikely(!ctx->requested))
3821 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
3847 ec_ioctl_context_t *ctx
3850 ec_ioctl_sdo_request_t data;
3854 if (unlikely(!ctx->requested))
3857 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
3861 EC_MASTER_ERR(master,
"SDO download: Data size may not be zero!\n");
3879 if (ec_copy_from_user(req->
data, (
void __user *) data.data,
3896 ec_ioctl_context_t *ctx
3899 ec_ioctl_sdo_request_t data;
3903 if (unlikely(!ctx->requested))
3906 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
3936 ec_ioctl_context_t *ctx
3939 ec_ioctl_soe_request_t data;
3943 if (unlikely(!ctx->requested))
3946 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
3972 ec_ioctl_context_t *ctx
3975 ec_ioctl_soe_request_t data;
3979 if (unlikely(!ctx->requested))
3982 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
4008 ec_ioctl_context_t *ctx
4011 ec_ioctl_soe_request_t data;
4015 if (unlikely(!ctx->requested))
4018 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
4040 if (ec_copy_to_user((
void __user *) arg, &data,
sizeof(data), ctx))
4055 ec_ioctl_context_t *ctx
4058 ec_ioctl_soe_request_t data;
4062 if (unlikely(!ctx->requested))
4065 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
4091 ec_ioctl_context_t *ctx
4094 ec_ioctl_soe_request_t data;
4098 if (unlikely(!ctx->requested))
4101 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
4105 EC_MASTER_ERR(master,
"IDN write: Data size may not be zero!\n");
4123 if (ec_copy_from_user(req->
data, (
void __user *) data.data,
4140 ec_ioctl_context_t *ctx
4143 ec_ioctl_soe_request_t data;
4147 if (unlikely(!ctx->requested))
4150 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
4180 ec_ioctl_context_t *ctx
4183 ec_ioctl_reg_request_t io;
4187 if (unlikely(!ctx->requested)) {
4191 if (ec_copy_from_user(&io, (
void __user *) arg,
sizeof(io), ctx)) {
4195 if (io.mem_size <= 0) {
4211 min(reg->
mem_size, io.mem_size), ctx)) {
4227 ec_ioctl_context_t *ctx
4230 ec_ioctl_reg_request_t io;
4234 if (unlikely(!ctx->requested)) {
4238 if (ec_copy_from_user(&io, (
void __user *) arg,
sizeof(io), ctx)) {
4256 if (ec_copy_to_user((
void __user *) arg, &io,
sizeof(io), ctx)) {
4272 ec_ioctl_context_t *ctx
4275 ec_ioctl_reg_request_t io;
4279 if (unlikely(!ctx->requested)) {
4283 if (ec_copy_from_user(&io, (
void __user *) arg,
sizeof(io), ctx)) {
4298 if (io.transfer_size > reg->
mem_size) {
4302 if (ec_copy_from_user(reg->
data, (
void __user *) io.data,
4303 io.transfer_size, ctx)) {
4319 ec_ioctl_context_t *ctx
4322 ec_ioctl_reg_request_t io;
4326 if (unlikely(!ctx->requested)) {
4330 if (ec_copy_from_user(&io, (
void __user *) arg,
sizeof(io), ctx)) {
4345 if (io.transfer_size > reg->
mem_size) {
4361 ec_ioctl_context_t *ctx
4364 ec_ioctl_voe_t data;
4368 uint16_t vendor_type;
4370 if (unlikely(!ctx->requested))
4373 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
4376 if (ec_copy_from_user(&vendor_id, data.vendor_id,
sizeof(vendor_id), ctx))
4379 if (ec_copy_from_user(&vendor_type, data.vendor_type,
4380 sizeof(vendor_type), ctx))
4406 ec_ioctl_context_t *ctx
4409 ec_ioctl_voe_t data;
4413 uint16_t vendor_type;
4416 if (unlikely(!ctx->requested))
4419 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
4437 if (likely(data.vendor_id))
4438 if (ec_copy_to_user(data.vendor_id, &vendor_id,
4439 sizeof(vendor_id), ctx))
4442 if (likely(data.vendor_type))
4443 if (ec_copy_to_user(data.vendor_type, &vendor_type,
4444 sizeof(vendor_type), ctx))
4459 ec_ioctl_context_t *ctx
4462 ec_ioctl_voe_t data;
4466 if (unlikely(!ctx->requested))
4469 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
4495 ec_ioctl_context_t *ctx
4498 ec_ioctl_voe_t data;
4502 if (unlikely(!ctx->requested))
4505 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
4531 ec_ioctl_context_t *ctx
4534 ec_ioctl_voe_t data;
4538 if (unlikely(!ctx->requested))
4541 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
4560 (
void __user *) data.data, data.size, ctx))
4576 ec_ioctl_context_t *ctx
4579 ec_ioctl_voe_t data;
4583 if (unlikely(!ctx->requested))
4586 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
4600 if (ec_ioctl_lock_interruptible(&master->
io_mutex))
4604 ec_ioctl_unlock(&master->
io_mutex);
4610 if (ec_copy_to_user((
void __user *) arg, &data,
sizeof(data), ctx))
4625 ec_ioctl_context_t *ctx
4628 ec_ioctl_voe_t data;
4632 if (unlikely(!ctx->requested))
4635 if (ec_copy_from_user(&data, (
void __user *) arg,
sizeof(data), ctx))
4667 ec_ioctl_slave_foe_t io;
4672 if (copy_from_user(&io, (
void __user *) arg,
sizeof(io))) {
4685 if (down_interruptible(&master->
master_sem)) {
4698 EC_SLAVE_DBG(slave, 1,
"Scheduling FoE read request.\n");
4707 request.
state != EC_INT_REQUEST_QUEUED)) {
4710 if (request.
state == EC_INT_REQUEST_QUEUED) {
4711 list_del(&request.
list);
4723 io.result = request.
result;
4726 if (request.
state != EC_INT_REQUEST_SUCCESS) {
4730 if (request.
data_size > io.buffer_size) {
4731 EC_SLAVE_ERR(slave,
"%s(): Buffer too small.\n", __func__);
4736 if (copy_to_user((
void __user *) io.buffer,
4737 request.
buffer, io.data_size)) {
4744 if (__copy_to_user((
void __user *) arg, &io,
sizeof(io))) {
4763 ec_ioctl_slave_foe_t io;
4768 if (copy_from_user(&io, (
void __user *) arg,
sizeof(io))) {
4780 if (copy_from_user(request.
buffer,
4781 (
void __user *) io.buffer, io.buffer_size)) {
4789 if (down_interruptible(&master->
master_sem)) {
4802 EC_SLAVE_DBG(slave, 1,
"Scheduling FoE write request.\n");
4811 request.
state != EC_INT_REQUEST_QUEUED)) {
4814 if (request.
state == EC_INT_REQUEST_QUEUED) {
4816 list_del(&request.
list);
4827 io.result = request.
result;
4830 ret = request.
state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO;
4832 if (__copy_to_user((
void __user *) arg, &io,
sizeof(io))) {
4851 ec_ioctl_slave_soe_read_t ioctl;
4855 if (copy_from_user(&ioctl, (
void __user *) arg,
sizeof(ioctl))) {
4859 data = kmalloc(ioctl.mem_size, GFP_KERNEL);
4861 EC_MASTER_ERR(master,
"Failed to allocate %zu bytes of IDN data.\n",
4867 ioctl.drive_no, ioctl.idn, data, ioctl.mem_size, &ioctl.data_size,
4874 if (copy_to_user((
void __user *) ioctl.data,
4875 data, ioctl.data_size)) {
4881 if (__copy_to_user((
void __user *) arg, &ioctl,
sizeof(ioctl))) {
4900 ec_ioctl_slave_soe_write_t ioctl;
4904 if (copy_from_user(&ioctl, (
void __user *) arg,
sizeof(ioctl))) {
4908 data = kmalloc(ioctl.data_size, GFP_KERNEL);
4910 EC_MASTER_ERR(master,
"Failed to allocate %zu bytes of IDN data.\n",
4914 if (copy_from_user(data, (
void __user *) ioctl.data, ioctl.data_size)) {
4920 ioctl.drive_no, ioctl.idn, data, ioctl.data_size,
4927 if (__copy_to_user((
void __user *) arg, &ioctl,
sizeof(ioctl))) {
4944 #ifndef EC_IOCTL_RTDM 4947 ec_ioctl_context_t *ctx,
4961 ec_ioctl_context_t *ctx,
4969 case EC_IOCTL_MODULE:
4972 case EC_IOCTL_MASTER_RESCAN:
4973 if (!ctx->writable) {
4979 case EC_IOCTL_MASTER_STATE:
4982 case EC_IOCTL_MASTER_LINK_STATE:
4985 case EC_IOCTL_SDO_REQUEST_TIMEOUT:
4986 if (!ctx->writable) {
4992 case EC_IOCTL_SDO_REQUEST_DATA:
4995 case EC_IOCTL_SOE_REQUEST_TIMEOUT:
4996 if (!ctx->writable) {
5002 case EC_IOCTL_SOE_REQUEST_DATA:
5005 case EC_IOCTL_REG_REQUEST_DATA:
5008 case EC_IOCTL_VOE_SEND_HEADER:
5009 if (!ctx->writable) {
5015 case EC_IOCTL_VOE_DATA:
5019 #ifdef EC_IOCTL_RTDM 5038 #ifdef EC_IOCTL_RTDM 5039 long ec_ioctl_rtdm_rt
5045 ec_ioctl_context_t *ctx,
5051 cycles_t a = get_cycles(), b;
5058 if (!ctx->writable) {
5064 case EC_IOCTL_RECEIVE:
5065 if (!ctx->writable) {
5071 case EC_IOCTL_APP_TIME:
5072 if (!ctx->writable) {
5078 case EC_IOCTL_SYNC_REF:
5079 if (!ctx->writable) {
5085 case EC_IOCTL_SYNC_REF_TO:
5086 if (!ctx->writable) {
5092 case EC_IOCTL_SYNC_SLAVES:
5093 if (!ctx->writable) {
5099 case EC_IOCTL_REF_CLOCK_TIME:
5100 if (!ctx->writable) {
5106 case EC_IOCTL_SYNC_MON_QUEUE:
5107 if (!ctx->writable) {
5113 case EC_IOCTL_SYNC_MON_PROCESS:
5114 if (!ctx->writable) {
5120 case EC_IOCTL_RESET:
5121 if (!ctx->writable) {
5127 case EC_IOCTL_SC_EMERG_POP:
5128 if (!ctx->writable) {
5134 case EC_IOCTL_SC_EMERG_CLEAR:
5135 if (!ctx->writable) {
5141 case EC_IOCTL_SC_EMERG_OVERRUNS:
5144 case EC_IOCTL_SC_STATE:
5147 case EC_IOCTL_DOMAIN_PROCESS:
5148 if (!ctx->writable) {
5154 case EC_IOCTL_DOMAIN_QUEUE:
5155 if (!ctx->writable) {
5161 case EC_IOCTL_DOMAIN_STATE:
5164 case EC_IOCTL_SDO_REQUEST_INDEX:
5165 if (!ctx->writable) {
5171 case EC_IOCTL_SDO_REQUEST_STATE:
5174 case EC_IOCTL_SDO_REQUEST_READ:
5175 if (!ctx->writable) {
5181 case EC_IOCTL_SDO_REQUEST_WRITE:
5182 if (!ctx->writable) {
5188 case EC_IOCTL_SOE_REQUEST_IDN:
5189 if (!ctx->writable) {
5195 case EC_IOCTL_SOE_REQUEST_STATE:
5198 case EC_IOCTL_SOE_REQUEST_READ:
5199 if (!ctx->writable) {
5205 case EC_IOCTL_SOE_REQUEST_WRITE:
5206 if (!ctx->writable) {
5212 case EC_IOCTL_REG_REQUEST_STATE:
5215 case EC_IOCTL_REG_REQUEST_WRITE:
5216 if (!ctx->writable) {
5222 case EC_IOCTL_REG_REQUEST_READ:
5223 if (!ctx->writable) {
5229 case EC_IOCTL_VOE_REC_HEADER:
5232 case EC_IOCTL_VOE_READ:
5233 if (!ctx->writable) {
5239 case EC_IOCTL_VOE_READ_NOSYNC:
5240 if (!ctx->writable) {
5246 case EC_IOCTL_VOE_WRITE:
5247 if (!ctx->writable) {
5253 case EC_IOCTL_VOE_EXEC:
5254 if (!ctx->writable) {
5267 t = (
unsigned int) ((b - a) * 1000LL) / cpu_khz;
5284 #ifdef EC_IOCTL_RTDM 5285 long ec_ioctl_rtdm_nrt
5291 ec_ioctl_context_t *ctx,
5296 #if DEBUG_LATENCY && !defined(EC_IOCTL_RTDM) 5297 cycles_t a = get_cycles(), b;
5303 case EC_IOCTL_MASTER:
5306 case EC_IOCTL_SLAVE:
5309 case EC_IOCTL_SLAVE_SYNC:
5312 case EC_IOCTL_SLAVE_SYNC_PDO:
5315 case EC_IOCTL_SLAVE_SYNC_PDO_ENTRY:
5318 case EC_IOCTL_DOMAIN:
5321 case EC_IOCTL_DOMAIN_FMMU:
5324 case EC_IOCTL_DOMAIN_DATA:
5327 case EC_IOCTL_MASTER_DEBUG:
5328 if (!ctx->writable) {
5334 case EC_IOCTL_SLAVE_STATE:
5335 if (!ctx->writable) {
5341 case EC_IOCTL_SLAVE_SDO:
5344 case EC_IOCTL_SLAVE_SDO_ENTRY:
5347 case EC_IOCTL_SLAVE_SDO_UPLOAD:
5348 if (!ctx->writable) {
5354 case EC_IOCTL_SLAVE_SDO_DOWNLOAD:
5355 if (!ctx->writable) {
5361 case EC_IOCTL_SLAVE_SII_READ:
5364 case EC_IOCTL_SLAVE_SII_WRITE:
5365 if (!ctx->writable) {
5371 case EC_IOCTL_SLAVE_REG_READ:
5372 if (!ctx->writable) {
5378 case EC_IOCTL_SLAVE_REG_WRITE:
5379 if (!ctx->writable) {
5385 case EC_IOCTL_SLAVE_FOE_READ:
5386 if (!ctx->writable) {
5392 case EC_IOCTL_SLAVE_FOE_WRITE:
5393 if (!ctx->writable) {
5399 case EC_IOCTL_SLAVE_SOE_READ:
5400 if (!ctx->writable) {
5406 case EC_IOCTL_SLAVE_SOE_WRITE:
5407 if (!ctx->writable) {
5414 case EC_IOCTL_SLAVE_EOE_IP_PARAM:
5415 if (!ctx->writable) {
5422 case EC_IOCTL_CONFIG:
5425 case EC_IOCTL_CONFIG_PDO:
5428 case EC_IOCTL_CONFIG_PDO_ENTRY:
5431 case EC_IOCTL_CONFIG_SDO:
5434 case EC_IOCTL_CONFIG_IDN:
5437 case EC_IOCTL_CONFIG_FLAG:
5441 case EC_IOCTL_CONFIG_EOE_IP_PARAM:
5444 case EC_IOCTL_EOE_HANDLER:
5451 case EC_IOCTL_REQUEST:
5452 if (!ctx->writable) {
5458 case EC_IOCTL_CREATE_DOMAIN:
5459 if (!ctx->writable) {
5465 case EC_IOCTL_CREATE_SLAVE_CONFIG:
5466 if (!ctx->writable) {
5472 case EC_IOCTL_SELECT_REF_CLOCK:
5473 if (!ctx->writable) {
5479 case EC_IOCTL_ACTIVATE:
5480 if (!ctx->writable) {
5486 case EC_IOCTL_DEACTIVATE:
5487 if (!ctx->writable) {
5493 case EC_IOCTL_SC_SYNC:
5494 if (!ctx->writable) {
5500 case EC_IOCTL_SC_WATCHDOG:
5501 if (!ctx->writable) {
5507 case EC_IOCTL_SC_PDO_MODE:
5508 if (!ctx->writable) {
5514 case EC_IOCTL_SC_ADD_PDO:
5515 if (!ctx->writable) {
5521 case EC_IOCTL_SC_CLEAR_PDOS:
5522 if (!ctx->writable) {
5528 case EC_IOCTL_SC_ADD_ENTRY:
5529 if (!ctx->writable) {
5535 case EC_IOCTL_SC_CLEAR_ENTRIES:
5536 if (!ctx->writable) {
5542 case EC_IOCTL_SC_REG_PDO_ENTRY:
5543 if (!ctx->writable) {
5549 case EC_IOCTL_SC_REG_PDO_POS:
5550 if (!ctx->writable) {
5556 case EC_IOCTL_SC_DC:
5557 if (!ctx->writable) {
5563 case EC_IOCTL_SC_SDO:
5564 if (!ctx->writable) {
5570 case EC_IOCTL_SC_EMERG_SIZE:
5571 if (!ctx->writable) {
5577 case EC_IOCTL_SC_SDO_REQUEST:
5578 if (!ctx->writable) {
5584 case EC_IOCTL_SC_SOE_REQUEST:
5585 if (!ctx->writable) {
5591 case EC_IOCTL_SC_REG_REQUEST:
5592 if (!ctx->writable) {
5598 case EC_IOCTL_SC_VOE:
5599 if (!ctx->writable) {
5605 case EC_IOCTL_SC_IDN:
5606 if (!ctx->writable) {
5612 case EC_IOCTL_SC_FLAG:
5613 if (!ctx->writable) {
5619 case EC_IOCTL_SC_STATE_TIMEOUT:
5620 if (!ctx->writable) {
5627 case EC_IOCTL_SC_EOE_IP_PARAM:
5628 if (!ctx->writable) {
5635 case EC_IOCTL_DOMAIN_SIZE:
5638 case EC_IOCTL_DOMAIN_OFFSET:
5641 case EC_IOCTL_SET_SEND_INTERVAL:
5642 if (!ctx->writable) {
5648 case EC_IOCTL_SII_CACHING:
5649 if (!ctx->writable) {
5656 #ifdef EC_IOCTL_RTDM 5664 #if DEBUG_LATENCY && !defined(EC_IOCTL_RTDM) 5666 t = (
unsigned int) ((b - a) * 1000LL) / cpu_khz;
ec_sii_general_flags_t general_flags
General flags.
uint16_t ring_position
Ring position for emergency requests.
const ec_slave_config_t * sc
EtherCAT slave config.
ec_internal_request_state_t state
Request state.
unsigned int ec_slave_config_flag_count(const ec_slave_config_t *sc)
Get the number of feature flags.
uint16_t offset
SII word offset.
ec_request_state_t ecrt_sdo_request_state(const ec_sdo_request_t *req)
Get the current state of the SDO request.
uint16_t ring_position
Ring position.
uint32_t revision_number
Revision number.
static ATTRIBUTES int ec_ioctl_slave_sii_write(ec_master_t *master, void *arg)
Write a slave's SII.
const ec_sdo_entry_t * ec_sdo_get_entry_const(const ec_sdo_t *sdo, uint8_t subindex)
Get an SDO entry from an SDO via its subindex.
static ATTRIBUTES int ec_ioctl_voe_read(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Starts a VoE read operation.
static ATTRIBUTES int ec_ioctl_domain_offset(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Gets the domain's offset in the total process data.
static ATTRIBUTES int ec_ioctl_domain_queue(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Queue the domain.
static long ec_ioctl_both(ec_master_t *master, ec_ioctl_context_t *ctx, unsigned int cmd, void *arg)
Called when an ioctl() command is issued.
uint16_t ec_slave_sdo_count(const ec_slave_t *slave)
Get the number of SDOs in the dictionary.
int ecrt_master_deactivate(ec_master_t *master)
Deactivates the master.
uint16_t boot_rx_mailbox_offset
Bootstrap rx mailbox address.
static ATTRIBUTES int ec_ioctl_soe_request_write(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Starts an SoE IDN write operation.
static ATTRIBUTES int ec_ioctl_config_ip(ec_master_t *master, void *arg)
Get configured EoE IP parameters for a given slave configuration.
#define EC_DATAGRAM_NAME_SIZE
Size of the datagram description string.
ec_sii_t sii
Extracted SII data.
size_t word_count
Size of the SII contents in words.
ec_reg_request_t * ec_slave_config_find_reg_request(ec_slave_config_t *sc, unsigned int pos)
Finds a register handler via its position in the list.
int ecrt_master_sii_caching(ec_master_t *master, ec_sii_caching_fields_t fields)
Set the SII caching method.
int ecrt_sdo_request_write(ec_sdo_request_t *req)
Schedule an SDO write operation.
int ecrt_slave_config_pdo_assign_clear(ec_slave_config_t *sc, uint8_t sync_index)
Clear a sync manager's PDO assignment.
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.
int ecrt_voe_handler_read(ec_voe_handler_t *voe)
Start a VoE read operation.
static ATTRIBUTES int ec_ioctl_sdo_request_read(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Starts an SDO read operation.
u64 tx_count
Number of frames sent.
struct list_head sii_requests
SII write requests.
const ec_soe_request_t * ec_slave_config_get_idn_by_pos_const(const ec_slave_config_t *sc, unsigned int pos)
Finds an IDN configuration via its position in the list.
ec_sdo_request_t * ecrt_slave_config_create_sdo_request_err(ec_slave_config_t *sc, uint16_t index, uint8_t subindex, size_t size)
Same as ecrt_slave_config_create_sdo_request(), but with ERR_PTR() return value.
#define EC_SLAVE_DBG(slave, level, fmt, args...)
Convenience macro for printing slave-specific debug messages to syslog.
static ATTRIBUTES int ec_ioctl_config_idn(ec_master_t *master, void *arg)
Get slave configuration IDN information.
int ecrt_master_send(ec_master_t *master)
Sends all datagrams in the queue.
static ATTRIBUTES int ec_ioctl_config_pdo(ec_master_t *master, void *arg)
Get slave configuration PDO information.
size_t data_size
Size of the process data.
int ecrt_sdo_request_timeout(ec_sdo_request_t *req, uint32_t timeout)
Set the timeout for an SDO request.
ec_slave_t * slave
pointer to the corresponding slave
s32 tx_byte_rates[EC_RATE_COUNT]
Transmit rates in byte/s for different statistics cycle periods.
static ATTRIBUTES int ec_ioctl_sc_sdo(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Configures an SDO.
static ATTRIBUTES int ec_ioctl_sc_emerg_overruns(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Get the number of emergency overruns.
ec_internal_request_state_t state
State of the request.
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.
size_t ec_voe_handler_mem_size(const ec_voe_handler_t *voe)
Get usable memory size.
int ecrt_soe_request_timeout(ec_soe_request_t *req, uint32_t timeout)
Set the timeout for an SoE request.
ec_slave_port_t ports[EC_MAX_PORTS]
Ports.
unsigned int tx_queue_size
Transmit queue size.
const ec_flag_t * ec_slave_config_get_flag_by_pos_const(const ec_slave_config_t *sc, unsigned int pos)
Finds a flag via its position in the list.
static ATTRIBUTES int ec_ioctl_sc_emerg_pop(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Get an emergency message from the ring.
ec_soe_request_t * ec_slave_config_find_soe_request(ec_slave_config_t *sc, unsigned int pos)
Finds a SoE request via its position in the list.
int ecrt_slave_config_watchdog(ec_slave_config_t *sc, uint16_t divider, uint16_t intervals)
Configure a slave's watchdog times.
uint8_t * ecrt_sdo_request_data(const ec_sdo_request_t *req)
Access to the SDO request's data.
ec_slave_state_t current_state
Current application state.
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.
static ATTRIBUTES int ec_ioctl_domain_data(ec_master_t *master, void *arg)
Get domain data.
#define ec_master_num_devices(MASTER)
Number of Ethernet devices.
int ecrt_slave_config_reg_pdo_entry(ec_slave_config_t *sc, uint16_t index, uint8_t subindex, ec_domain_t *domain, unsigned int *bit_position)
Registers a PDO entry for process data exchange in a domain.
#define EC_RATE_COUNT
Number of statistic rate intervals to maintain.
size_t nwords
Number of words.
ec_internal_request_state_t state
SDO request state.
uint16_t address
Register address.
uint16_t bit_length
Data size in bit.
ec_direction_t dir
Direction.
size_t mem_size
Size of data memory.
static ATTRIBUTES int ec_ioctl_config_flag(ec_master_t *master, void *arg)
Get slave configuration feature flag information.
void ec_foe_request_write(ec_foe_request_t *req)
Prepares a write request (master to slave).
uint32_t product_code
Slave product code.
ec_slave_port_link_t link
Port link status.
int ecrt_master_sync_reference_clock(ec_master_t *master)
Queues the DC reference clock drift compensation datagram for sending.
void ec_master_internal_receive_cb(void *cb_data)
Internal receiving callback.
uint16_t position
Index after alias.
size_t mem_size
Size of SDO data memory.
int ecrt_slave_config_sdo(ec_slave_config_t *sc, uint16_t index, uint8_t subindex, const uint8_t *data, size_t size)
Add an SDO configuration.
int ecrt_domain_state(const ec_domain_t *domain, ec_domain_state_t *state)
Reads the state of a domain.
static ATTRIBUTES int ec_ioctl_master_rescan(ec_master_t *master, void *arg)
Issue a bus scan.
int ecrt_sdo_request_read(ec_sdo_request_t *req)
Schedule an SDO read operation.
static ATTRIBUTES int ec_ioctl_sc_clear_pdos(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Clears the PDO assignment.
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.
unsigned int rescan_required
A bus rescan is required.
static ATTRIBUTES int ec_ioctl_soe_request_state(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Gets an SoE request's state.
void ecrt_master_callbacks(ec_master_t *master, void(*send_cb)(void *), void(*receive_cb)(void *), void *cb_data)
Sets the locking callbacks.
const ec_sdo_request_t * ec_slave_config_get_sdo_by_pos_const(const ec_slave_config_t *sc, unsigned int pos)
Finds an SDO configuration via its position in the list.
int ecrt_voe_handler_write(ec_voe_handler_t *voe, size_t size)
Start a VoE write operation.
int ecrt_slave_config_sync_manager(ec_slave_config_t *sc, uint8_t sync_index, ec_direction_t dir, ec_watchdog_mode_t watchdog_mode)
Configure a sync manager.
uint32_t serial_number
Serial number.
int ec_foe_request_alloc(ec_foe_request_t *req, size_t size)
Pre-allocates the data memory.
s32 tx_frame_rates[EC_RATE_COUNT]
Transmit rates in frames/s for different statistics cycle periods.
ec_sii_coe_details_t coe_details
CoE detail flags.
char * order
Order number.
int ec_reg_request_init(ec_reg_request_t *reg, size_t size)
Register request constructor.
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.
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.
unsigned int scan_index
Index of slave currently scanned.
u64 dc_ref_time
Common reference timestamp for DC start times.
static ATTRIBUTES int ec_ioctl_voe_data(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Reads the received VoE data.
static ATTRIBUTES int ec_ioctl_set_send_interval(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Set max.
unsigned int data_size
Covered PDO size.
struct list_head emerg_reg_requests
Emergency register access requests.
static ATTRIBUTES int ec_ioctl_sc_clear_entries(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Clears the mapping of a PDO.
uint16_t alias
Slave alias.
static ATTRIBUTES int ec_ioctl_receive(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Receive frames.
static ATTRIBUTES int ec_ioctl_sc_add_entry(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Add an entry to a PDO's mapping.
struct list_head domains
List of domains.
static ATTRIBUTES int ec_ioctl_slave_sync_pdo(ec_master_t *master, void *arg)
Get slave sync manager PDO information.
static ATTRIBUTES int ec_ioctl_sdo_request_index(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Sets an SDO request's SDO index and subindex.
ec_eoe_request_t eoe_ip_param_request
EoE IP parameters.
int ecrt_slave_config_emerg_overruns(const ec_slave_config_t *sc)
Read the number of CoE emergency overruns.
static ATTRIBUTES int ec_ioctl_sii_caching(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Set SII caching method.
struct list_head reg_requests
Register access requests.
int ecrt_soe_request_idn(ec_soe_request_t *req, uint8_t drive_no, uint16_t idn)
Set the request's drive and Sercos ID numbers.
int ecrt_slave_config_idn(ec_slave_config_t *sc, uint8_t drive_no, uint16_t idn, ec_al_state_t state, const uint8_t *data, size_t size)
Add an SoE IDN configuration.
static ATTRIBUTES int ec_ioctl_sync_mon_queue(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Queue the sync monitoring datagram.
static ATTRIBUTES int ec_ioctl_sdo_request_timeout(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Sets an SDO request's timeout.
int ecrt_slave_config_state_timeout(ec_slave_config_t *sc, ec_al_state_t from, ec_al_state_t to, unsigned int timeout_ms)
Sets the application-layer state transition timeout in ms.
uint8_t * data
Pointer to SDO data.
int16_t current_on_ebus
Power consumption in mA.
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.
uint8_t link_state
device link state
int ecrt_slave_config_eoe_dns_address(ec_slave_config_t *sc, struct in_addr dns_address)
Sets the IPv4 address of the DNS server for Ethernet-over-EtherCAT (EoE) operation.
unsigned int ec_pdo_list_count(const ec_pdo_list_t *pl)
Get the number of PDOs in the list.
static ATTRIBUTES int ec_ioctl_ref_clock_time(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Get the system time of the reference clock.
ec_master_t * ecrt_request_master_err(unsigned int)
Request a master.
uint16_t boot_tx_mailbox_size
Bootstrap transmit mailbox size.
uint8_t signal_detected
Detected signal on RX port.
const uint8_t * macs[EC_MAX_NUM_DEVICES]
Device MAC addresses.
uint8_t * ecrt_reg_request_data(const ec_reg_request_t *reg)
Access to the register request's data.
uint32_t result
FoE request abort code.
int ecrt_slave_config_reg_pdo_entry_pos(ec_slave_config_t *sc, uint8_t sync_index, unsigned int pdo_pos, unsigned int entry_pos, ec_domain_t *domain, unsigned int *bit_position)
Registers a PDO entry using its position.
u64 rx_count
Number of frames received.
#define EC_MAX_HOSTNAME_SIZE
Maximum hostname size.
size_t data_size
Size of SDO data.
wait_queue_head_t request_queue
Wait queue for external requests from user space.
void ec_eoe_request_init(ec_eoe_request_t *req)
EoE request constructor.
ec_pdo_mode_t pdo_config_mode
Whether/how to read resp.
static ATTRIBUTES int ec_ioctl_reg_request_state(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Gets an register request's state.
void ecrt_domain_external_memory(ec_domain_t *domain, uint8_t *mem)
Provide external memory to store the domain's process data.
int ecrt_slave_config_state(const ec_slave_config_t *sc, ec_slave_config_state_t *state)
Outputs the state of the slave configuration.
unsigned int sync_count
Number of sync managers.
struct list_head list
List head.
ec_domain_t * ecrt_master_create_domain_err(ec_master_t *master)
Same as ecrt_master_create_domain(), but with ERR_PTR() return value.
uint32_t tx_rate
transmit rate (bps)
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.
char * key
Flag key (null-terminated ASCII string.
uint16_t std_rx_mailbox_size
Standard receive mailbox size.
static ATTRIBUTES int ec_ioctl_sc_create_sdo_request(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Create an SDO request.
static ATTRIBUTES int ec_ioctl_sc_add_pdo(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Add a PDO to the assignment.
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.
static ATTRIBUTES int ec_ioctl_slave_reg_read(ec_master_t *master, void *arg)
Read a slave's registers.
static ATTRIBUTES int ec_ioctl_sc_dc(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Sets the DC AssignActivate word and the sync signal times.
uint16_t std_tx_mailbox_offset
Standard transmit mailbox address.
s32 rx_frame_rates[EC_RATE_COUNT]
Receive rates in frames/s for different statistics cycle periods.
ec_al_state_t al_state
AL state (only valid for IDN config).
ec_direction_t dir
Direction.
EtherCAT master structure.
uint8_t * data
Memory for the process data.
int ecrt_domain_queue(ec_domain_t *domain)
(Re-)queues all domain datagrams in the master's datagram queue.
ec_sync_signal_t dc_sync[EC_SYNC_SIGNAL_COUNT]
DC sync signals.
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.
static ATTRIBUTES int ec_ioctl_master_link_state(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Get the link state.
#define EC_MASTER_DBG(master, level, fmt, args...)
Convenience macro for printing master-specific debug messages to syslog.
uint16_t boot_tx_mailbox_offset
Bootstrap tx mailbox address.
static ATTRIBUTES int ec_ioctl_sync_mon_process(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Processes the sync monitoring datagram.
const ec_pdo_entry_t * ec_pdo_find_entry_by_pos_const(const ec_pdo_t *pdo, unsigned int pos)
Finds a PDO entry via its position in the list.
int ecrt_slave_config_emerg_clear(ec_slave_config_t *sc)
Clears CoE emergency ring buffer and the overrun counter.
static ATTRIBUTES int ec_ioctl_sc_state_timeout(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Sets an AL state transition timeout.
ec_slave_t * slave
EtherCAT slave.
uint16_t index
PDO entry index.
struct semaphore master_sem
Master semaphore.
uint8_t loop_closed
Loop closed.
static ATTRIBUTES int ec_ioctl_voe_exec(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Executes the VoE state machine.
unsigned int ec_pdo_entry_count(const ec_pdo_t *pdo)
Get the number of PDO entries.
uint32_t logical_start_address
Logical start address.
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.
static long ec_ioctl_nrt(ec_master_t *master, ec_ioctl_context_t *ctx, unsigned int cmd, void *arg)
ioctl() function to use.
void ec_foe_request_clear(ec_foe_request_t *req)
FoE request destructor.
size_t buffer_size
Size of FoE data memory.
uint8_t * ecrt_soe_request_data(const ec_soe_request_t *req)
Access to the SoE request's data.
struct irq_work sc_reset_work_kicker
NMI-Safe kicker to trigger reset task above.
ec_voe_handler_t * ecrt_slave_config_create_voe_handler_err(ec_slave_config_t *sc, size_t size)
Same as ecrt_slave_config_create_voe_handler(), but with ERR_PTR() return value.
int ecrt_sdo_request_index(ec_sdo_request_t *req, uint16_t index, uint8_t subindex)
Set the SDO index and subindex.
static ATTRIBUTES int ec_ioctl_slave_sdo_entry(ec_master_t *master, void *arg)
Get slave SDO entry information.
char * description
Description.
int ec_master_debug_level(ec_master_t *master, unsigned int level)
Set the debug level.
Slave configuration state.
static ATTRIBUTES int ec_ioctl_reg_request_read(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Starts an register read operation.
static ATTRIBUTES int ec_ioctl_slave_reg_write(ec_master_t *master, void *arg)
Write a slave's registers.
s32 tx_frame_rates[EC_RATE_COUNT]
Transmit rates in frames/s for different statistics cycle periods.
s32 rx_byte_rates[EC_RATE_COUNT]
Receive rates in byte/s for different statistics cycle periods.
Ethernet over EtherCAT (EoE)
ec_sync_config_t sync_configs[EC_MAX_SYNC_MANAGERS]
Sync manager configurations.
ec_pdo_mode_t pdo_assign_mode
Whether/how to read resp.
ec_device_stats_t device_stats
Device statistics.
static ATTRIBUTES int ec_ioctl_sdo_request_write(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Starts an SDO write operation.
void(* state)(ec_voe_handler_t *)
State function.
struct list_head reg_requests
List of register requests.
ec_master_phase_t phase
Master phase.
static ATTRIBUTES int ec_ioctl_slave_eoe_ip_param(ec_master_t *master, void *arg)
Request EoE IP parameter setting.
static ATTRIBUTES int ec_ioctl_master_debug(ec_master_t *master, void *arg)
Set master debug level.
static ATTRIBUTES int ec_ioctl_reset(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Reset configuration.
uint8_t * buffer
Pointer to FoE data.
static ATTRIBUTES int ec_ioctl_voe_rec_header(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Gets the received VoE header.
uint8_t sync_index
Index of sync manager to use.
Slave configutation feature flag.
static ATTRIBUTES int ec_ioctl_sdo_request_data(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Read SDO data.
static ATTRIBUTES int ec_ioctl_sc_pdo_mode(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Configure a slave's PDO handling mode.
size_t ecrt_domain_size(const ec_domain_t *domain)
Returns the current size of the domain's process data.
static ATTRIBUTES int ec_ioctl_sc_flag(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Configures a feature flag.
struct semaphore device_sem
Device semaphore.
s32 rx_byte_rates[EC_RATE_COUNT]
Receive rates in byte/s for different statistics cycle periods.
struct list_head sdo_requests
List of SDO requests.
uint16_t mailbox_protocols
Supported mailbox protocols.
ec_domain_t * ec_master_find_domain(ec_master_t *master, unsigned int index)
Get a domain via its position in the list.
int ecrt_master_application_time(ec_master_t *master, uint64_t app_time)
Sets the application time.
static ATTRIBUTES int ec_ioctl_reg_request_data(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Read register data.
ec_reg_request_t * ecrt_slave_config_create_reg_request_err(ec_slave_config_t *sc, size_t size)
Same as ecrt_slave_config_create_reg_request(), but with ERR_PTR() return value.
#define EC_SLAVE_ERR(slave, fmt, args...)
Convenience macro for printing slave-specific errors to syslog.
static ATTRIBUTES int ec_ioctl_slave_sdo_upload(ec_master_t *master, void *arg)
Upload SDO.
unsigned int ec_master_domain_count(const ec_master_t *master)
Get the number of domains.
ec_slave_dc_range_t base_dc_range
DC range.
uint8_t bit_length
entry length in bit
uint16_t std_rx_mailbox_offset
Standard receive mailbox address.
static ATTRIBUTES int ec_ioctl_sync_ref(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Sync the reference clock.
uint8_t base_fmmu_bit_operation
FMMU bit operation is supported.
static ATTRIBUTES int ec_ioctl_soe_request_index(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Sets an SoE request's drive number and IDN.
s32 loss_rates[EC_RATE_COUNT]
Frame loss rates for different statistics cycle periods.
uint32_t transmission_delay
DC system time transmission delay (offset from reference clock).
struct rt_mutex io_mutex
Mutex used in IDLE and OP phase.
unsigned int slave_count
Number of slaves on the bus.
unsigned int scan_busy
Current scan state.
ec_pdo_list_t pdos
Current PDO assignment.
int ecrt_voe_handler_received_header(const ec_voe_handler_t *voe, uint32_t *vendor_id, uint16_t *vendor_type)
Reads the header data of a received VoE message.
struct list_head voe_handlers
List of VoE handlers.
uint16_t dc_assign_activate
Vendor-specific AssignActivate word.
s32 rx_frame_rates[EC_RATE_COUNT]
Receive rates in frames/s for different statistics cycle periods.
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.
static ATTRIBUTES int ec_ioctl_sc_create_soe_request(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Create an SoE request.
unsigned int index
Index (just a number).
s32 tx_byte_rates[EC_RATE_COUNT]
Transmit rates in byte/s for different statistics cycle periods.
size_t ecrt_sdo_request_data_size(const ec_sdo_request_t *req)
Returns the current SDO data size.
#define ATTRIBUTES
Optional compiler attributes fo ioctl() functions.
int ecrt_reg_request_write(ec_reg_request_t *reg, uint16_t address, size_t size)
Schedule an register write operation.
uint16_t watchdog_intervals
Process data watchdog intervals (see spec.
static ATTRIBUTES int ec_ioctl_slave_sdo_download(ec_master_t *master, void *arg)
Download SDO.
int ecrt_slave_config_flag(ec_slave_config_t *sc, const char *key, int32_t value)
Adds a feature flag to a slave configuration.
ec_slave_port_desc_t desc
Port descriptors.
#define EC_MASTER_WARN(master, fmt, args...)
Convenience macro for printing master-specific warnings to syslog.
static ATTRIBUTES int ec_ioctl_master(ec_master_t *master, void *arg)
Get master information.
static ATTRIBUTES int ec_ioctl_sc_emerg_clear(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Clear the emergency ring.
Vendor specific over EtherCAT handler.
unsigned int active
Master has been activated.
static ATTRIBUTES int ec_ioctl_sc_reg_pdo_pos(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Registers a PDO entry by its position.
struct list_head soe_requests
List of SoE requests.
size_t ecrt_soe_request_data_size(const ec_soe_request_t *req)
Returns the current IDN data size.
long ec_ioctl(ec_master_t *master, ec_ioctl_context_t *ctx, unsigned int cmd, void *arg)
Called when an ioctl() command is issued.
unsigned int ec_slave_config_sdo_count(const ec_slave_config_t *sc)
Get the number of SDO configurations.
const ec_sdo_t * ec_slave_get_sdo_by_pos_const(const ec_slave_t *slave, uint16_t sdo_position)
Get an SDO from the dictionary, given its position in the list.
ec_request_state_t ecrt_soe_request_state(const ec_soe_request_t *req)
Get the current state of the SoE request.
u64 rx_bytes
Number of bytes received.
uint8_t has_dc_system_time
The slave supports the DC system time register.
int ecrt_slave_config_pdo_assign_add(ec_slave_config_t *sc, uint8_t sync_index, uint16_t pdo_index)
Add a PDO to a sync manager's PDO assignment.
int ecrt_slave_config_dc(ec_slave_config_t *sc, uint16_t assign_activate, uint32_t sync0_cycle_time, int32_t sync0_shift_time, uint32_t sync1_cycle_time, int32_t sync1_shift_time)
Configure distributed clocks.
ec_request_state_t ecrt_reg_request_state(const ec_reg_request_t *reg)
Get the current state of the register request.
int ecrt_slave_config_eoe_ip_address(ec_slave_config_t *sc, struct in_addr ip_address)
Sets the IP address for Ethernet-over-EtherCAT (EoE) operation.
void ec_foe_request_init(ec_foe_request_t *req, uint8_t *file_name)
FoE request constructor.
static ATTRIBUTES int ec_ioctl_module(void *arg, ec_ioctl_context_t *ctx)
Get module information.
u64 tx_count
Number of frames sent.
static ATTRIBUTES int ec_ioctl_domain_process(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Process the domain.
unsigned int ec_domain_fmmu_count(const ec_domain_t *domain)
Get the number of FMMU configurations of the domain.
#define EC_MASTER_ERR(master, fmt, args...)
Convenience macro for printing master-specific errors to syslog.
int ecrt_master_select_reference_clock(ec_master_t *master, ec_slave_config_t *sc)
Selects the reference clock for distributed clocks.
uint8_t subindex
PDO entry subindex.
static ATTRIBUTES int ec_ioctl_select_ref_clock(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Select the DC reference clock.
uint8_t control_register
Control register value.
static ATTRIBUTES int ec_ioctl_voe_read_nosync(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Starts a VoE read operation without sending a sync message first.
static ATTRIBUTES int ec_ioctl_config_pdo_entry(ec_master_t *master, void *arg)
Get slave configuration PDO entry information.
Values read by the master.
ec_direction_t dir
Sync manager direction.
int ec_rtdm_mmap(ec_ioctl_context_t *ioctl_ctx, void **user_address)
Memory-map process data to user space.
int ecrt_master_sync_monitor_queue(ec_master_t *master)
Queues the DC synchrony monitoring datagram for sending.
static ATTRIBUTES int ec_ioctl_domain_fmmu(ec_master_t *master, void *arg)
Get domain FMMU information.
static ATTRIBUTES int ec_ioctl_domain(ec_master_t *master, void *arg)
Get domain information.
uint16_t data_type
Data type.
static ATTRIBUTES int ec_ioctl_sc_watchdog(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Configure a slave's watchdogs.
static ATTRIBUTES int ec_ioctl_request(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Request the master from userspace.
struct list_head configs
List of slave configurations.
ec_slave_t * slave
Slave pointer.
static ATTRIBUTES int ec_ioctl_sync_ref_to(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Sync the reference clock.
unsigned int opened
net_device is opened
static ATTRIBUTES int ec_ioctl_create_slave_config(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Create a slave configuration.
uint16_t watchdog_divider
Watchdog divider as a number of 40ns intervals (see spec.
ec_sdo_request_t * ec_slave_config_find_sdo_request(ec_slave_config_t *sc, unsigned int pos)
Finds a CoE SDO request via its position in the list.
static ATTRIBUTES int ec_ioctl_domain_state(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Get the domain state.
size_t data_size
Size of FoE data.
static ATTRIBUTES int ec_ioctl_master_state(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Get the master state.
static ATTRIBUTES int ec_ioctl_sync_slaves(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Sync the slave clocks.
int ecrt_slave_config_pdo_mapping_clear(ec_slave_config_t *sc, uint16_t pdo_index)
Clear the mapping of a given PDO.
static ATTRIBUTES int ec_ioctl_soe_request_data(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Read SoE IDN data.
Ethernet-over-EtherCAT set IP parameter request.
uint16_t working_counter[EC_MAX_NUM_DEVICES]
Last working counter values.
uint8_t * file_name
Pointer to the filename.
const ec_sdo_t * ec_slave_get_sdo_const(const ec_slave_t *slave, uint16_t index)
Get an SDO from the dictionary.
uint32_t logical_base_address
Logical offset address of the process data.
uint8_t read_access[EC_SDO_ENTRY_ACCESS_COUNT]
Read access.
ec_watchdog_mode_t watchdog_mode
Watchdog mode.
struct net_device_stats stats
device statistics
static ATTRIBUTES int ec_ioctl_config_sdo(ec_master_t *master, void *arg)
Get slave configuration SDO information.
uint8_t subindex
SDO subindex.
static ATTRIBUTES int ec_ioctl_domain_size(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Gets the domain's data size.
uint16_t expected_working_counter
Expected working counter.
static ATTRIBUTES int ec_ioctl_config(ec_master_t *master, void *arg)
Get slave configuration information.
unsigned int ec_slave_config_idn_count(const ec_slave_config_t *sc)
Get the number of IDN configurations.
u64 tx_errors
Number of transmit errors.
uint16_t effective_alias
Effective alias address.
unsigned int sii_caching
SII caching mode.
size_t data_size
Size of SDO data.
ec_internal_request_state_t state
Request state.
static ATTRIBUTES int ec_ioctl_slave_sdo(ec_master_t *master, void *arg)
Get slave SDO information.
ec_soe_request_t * ecrt_slave_config_create_soe_request_err(ec_slave_config_t *sc, uint8_t drive_no, uint16_t idn, size_t size)
Same as ecrt_slave_config_create_soe_request(), but with ERR_PTR() return value.
struct list_head foe_requests
FoE requests.
ec_direction_t dir
Direction.
u64 tx_bytes
Number of bytes sent.
static ATTRIBUTES int ec_ioctl_slave(ec_master_t *master, void *arg)
Get slave information.
uint16_t ec_master_eoe_handler_count(const ec_master_t *master)
Get the number of EoE handlers.
static ATTRIBUTES int ec_ioctl_slave_sync(ec_master_t *master, void *arg)
Get slave sync manager information.
int ecrt_domain_process(ec_domain_t *domain)
Determines the states of the domain's datagrams.
uint8_t enable
Enable bit.
int ecrt_slave_config_eoe_default_gateway(ec_slave_config_t *sc, struct in_addr gateway_address)
Sets the gateway address for Ethernet-over-EtherCAT (EoE) operation.
uint8_t * data
Pointer to data memory.
Vendor specific over EtherCAT protocol handler.
uint16_t boot_rx_mailbox_size
Bootstrap receive mailbox size.
#define EC_MAX_PORTS
Maximum number of slave ports.
static ATTRIBUTES int ec_ioctl_slave_soe_write(ec_master_t *master, void *arg)
Write an IDN to a slave via SoE.
uint16_t * words
Complete SII image.
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.
uint8_t * ecrt_voe_handler_data(const ec_voe_handler_t *voe)
Access to the VoE handler's data.
int ecrt_slave_config_emerg_pop(ec_slave_config_t *sc, uint8_t *target)
Read and remove one record from the CoE emergency ring buffer.
static ATTRIBUTES int ec_ioctl_slave_soe_read(ec_master_t *master, void *arg)
Read an SoE IDN.
static void ec_ioctl_strcpy(char *target, const char *source)
Copies a string to an ioctl structure.
int ecrt_slave_config_complete_sdo(ec_slave_config_t *sc, uint16_t index, const uint8_t *data, size_t size)
Add configuration data for a complete SDO.
static ATTRIBUTES int ec_ioctl_app_time(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Set the master DC application time.
ec_slave_t * next_slave
Connected slaves.
ec_direction_t dir
Direction.
ec_sii_page_t sii_page
The SII contents, either fetched or taken from the cache.
static ATTRIBUTES int ec_ioctl_slave_foe_read(ec_master_t *master, void *arg)
Read a file from a slave via FoE.
uint32_t vendor_id
Slave vendor ID.
uint8_t drive_no
Drive number.
uint32_t receive_time
Port receive times for delay measurement.
uint8_t max_subindex
Maximum subindex.
int ecrt_voe_handler_send_header(ec_voe_handler_t *voe, uint32_t vendor_id, uint16_t vendor_type)
Sets the VoE header for future send operations.
static ATTRIBUTES int ec_ioctl_sc_emerg_size(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Set the emergency ring buffer size.
void ec_master_internal_send_cb(void *cb_data)
Internal sending callback.
int ecrt_slave_config_eoe_hostname(ec_slave_config_t *sc, const char *name)
Sets the host name for Ethernet-over-EtherCAT (EoE) operation.
int ecrt_slave_config_pdo_mode(ec_slave_config_t *sc, ec_pdo_mode_t assign_mode, ec_pdo_mode_t config_mode)
Selects how a slave's PDO assignment and PDO configuration are read from resp.
ec_pdo_list_t pdos
Current PDO assignment.
int32_t value
Flag value (meaning depends on key).
static ATTRIBUTES int ec_ioctl_sc_idn(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Configures an IDN.
u64 app_time
Time of the last ecrt_master_sync() call.
void ec_slave_request_state(ec_slave_t *slave, ec_slave_state_t state)
Request a slave state and resets the error flag.
uint16_t physical_start_address
Physical start address.
void ec_foe_request_read(ec_foe_request_t *req)
Prepares a read request (slave to master).
uint8_t base_dc_supported
Distributed clocks are supported.
u64 rx_count
Number of frames received.
int ecrt_master_activate(ec_master_t *master)
Finishes the configuration phase and prepares for cyclic operation.
struct work_struct sc_reset_work
Task to reset slave configuration.
unsigned int ec_master_count(void)
Get the number of masters.
void ec_reg_request_clear(ec_reg_request_t *reg)
Register request destructor.
static ATTRIBUTES int ec_ioctl_slave_sii_read(ec_master_t *master, void *arg)
Read a slave's SII.
static ATTRIBUTES int ec_ioctl_slave_sync_pdo_entry(ec_master_t *master, void *arg)
Get slave sync manager PDO entry information.
int ecrt_soe_request_read(ec_soe_request_t *req)
Schedule an SoE IDN read operation.
size_t ecrt_voe_handler_data_size(const ec_voe_handler_t *voe)
Returns the current data size.
ec_request_state_t ecrt_voe_handler_execute(ec_voe_handler_t *voe)
Execute the handler.
static ATTRIBUTES int ec_ioctl_reg_request_write(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Starts an register write operation.
static ATTRIBUTES int ec_ioctl_sc_sync(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Configure a sync manager.
EtherCAT slave configuration.
static ATTRIBUTES int ec_ioctl_sc_reg_pdo_entry(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Registers a PDO entry.
int ecrt_master_receive(ec_master_t *master)
Fetches received frames from the hardware and processes the datagrams.
static ATTRIBUTES int ec_ioctl_send(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Send frames.
uint32_t error_code
Error code from an FoE Error Request.
struct net_device * dev
pointer to the assigned net_device
uint32_t ecrt_master_sync_monitor_process(const ec_master_t *master)
Processes the DC synchrony monitoring datagram.
static ATTRIBUTES int ec_ioctl_sc_state(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Get the slave configuration's state.
EtherCAT master character device IOCTL commands.
Request was processed successfully.
EtherCAT slave configuration structure.
ec_internal_request_state_t state
FoE request state.
uint8_t write_access[EC_SDO_ENTRY_ACCESS_COUNT]
Write access.
static ATTRIBUTES int ec_ioctl_soe_request_read(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Starts an SoE IDN read operation.
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.
ec_device_index_t device_index
Index of device the slave responds on.
static ATTRIBUTES int ec_ioctl_voe_send_header(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Sets the VoE send header.
static ATTRIBUTES int ec_ioctl_voe_write(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Starts a VoE write operation.
unsigned int ec_master_config_count(const ec_master_t *master)
Get the number of slave configurations provided by the application.
static ATTRIBUTES int ec_ioctl_sc_create_voe_handler(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Create a VoE handler.
uint16_t default_length
Data length in bytes.
uint32_t product_code
Vendor-specific product code.
static ATTRIBUTES int ec_ioctl_slave_foe_write(ec_master_t *master, void *arg)
Write a file to a slave via FoE.
ec_direction_t dir
FMMU direction.
const ec_pdo_t * ec_pdo_list_find_pdo_by_pos_const(const ec_pdo_list_t *pl, unsigned int pos)
Finds a PDO via its position in the list.
Ethernet over EtherCAT (EoE) handler.
static ATTRIBUTES int ec_ioctl_deactivate(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Deactivates the master.
int ecrt_slave_config_eoe_mac_address(ec_slave_config_t *sc, const unsigned char *mac_address)
Sets the link/MAC address for Ethernet-over-EtherCAT (EoE) operation.
ec_fsm_master_t fsm
Master state machine.
u64 rx_bytes
Number of bytes received.
int ecrt_soe_request_write(ec_soe_request_t *req)
Schedule an SoE IDN write operation.
static ATTRIBUTES int ec_ioctl_eoe_handler(ec_master_t *master, void *arg)
Get EoE handler information.
#define EC_COE_EMERGENCY_MSG_SIZE
Size of a CoE emergency message in byte.
static ATTRIBUTES int ec_ioctl_soe_request_timeout(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Sets an CoE request's timeout.
int ecrt_slave_config_eoe_subnet_mask(ec_slave_config_t *sc, struct in_addr subnet_mask)
Sets the subnet mask for Ethernet-over-EtherCAT (EoE) operation.
int ecrt_slave_config_pdo_mapping_add(ec_slave_config_t *sc, uint16_t pdo_index, uint16_t entry_index, uint8_t entry_subindex, uint8_t entry_bit_length)
Add a PDO entry to the given PDO's mapping.
int ecrt_slave_config_emerg_size(ec_slave_config_t *sc, size_t elements)
Set the size of the CoE emergency ring buffer.
unsigned int error_flag
Stop processing after an error.
ec_sync_t * syncs
SYNC MANAGER categories.
size_t mem_size
Size of SDO data memory.
static ATTRIBUTES int ec_ioctl_create_domain(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Create a domain.
uint16_t std_tx_mailbox_size
Standard transmit mailbox size.
struct list_head list
List item.
struct list_head eoe_requests
EoE set IP parameter requests.
uint8_t link_up
Link detected.
uint16_t idn
Sercos ID-Number.
static ATTRIBUTES int ec_ioctl_slave_state(ec_master_t *master, void *arg)
Set slave state.
static ATTRIBUTES int ec_ioctl_activate(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Activates the master.
#define EC_MAX_SYNC_MANAGERS
Maximum number of sync managers per slave.
ec_device_t devices[EC_MAX_NUM_DEVICES]
EtherCAT devices.
u64 tx_bytes
Number of bytes sent.
static ATTRIBUTES int ec_ioctl_sc_create_reg_request(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Create a register request.
ec_internal_request_state_t state
Request state.
#define EC_SYNC_SIGNAL_COUNT
Number of DC sync signals.
int ecrt_reg_request_read(ec_reg_request_t *reg, uint16_t address, size_t size)
Schedule a register read operation.
struct list_head list
List item.
int ecrt_master_sync_slave_clocks(ec_master_t *master)
Queues the DC clock drift compensation datagram for sending.
const uint16_t * words
Pointer to the data words.
int ecrt_master_state(const ec_master_t *master, ec_master_state_t *state)
Reads the current master state.
Sercos-over-EtherCAT request.
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...
uint8_t * data
Pointer to SDO data.
struct net_device * dev
net_device for virtual ethernet device
static ATTRIBUTES int ec_ioctl_sc_ip(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Configures EoE IP parameters.
static ATTRIBUTES int ec_ioctl_sdo_request_state(ec_master_t *master, void *arg, ec_ioctl_context_t *ctx)
Gets an SDO request's state.
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.
uint32_t vendor_id
Vendor ID.
uint8_t complete_access
SDO shall be transferred completely.
uint32_t delay_to_next_dc
Delay to next slave with DC support behind this port [ns].
ec_slave_t * dc_ref_clock
DC reference clock slave.
ec_voe_handler_t * ec_slave_config_find_voe_handler(ec_slave_config_t *sc, unsigned int pos)
Finds a VoE handler via its position in the list.
ec_master_t * master
EtherCAT master owning the domain.
struct list_head list
List item.
unsigned int has_general
General category present.
unsigned int tx_queued_frames
number of frames in the queue
int ecrt_voe_handler_read_nosync(ec_voe_handler_t *voe)
Start a VoE read operation without querying the sync manager status.
unsigned int sii_parallel_words
How many SII words the slave can read at once.
const ec_fmmu_config_t * ec_domain_find_fmmu(const ec_domain_t *domain, unsigned int pos)
Get a certain FMMU configuration via its position in the list.