169 if (down_interruptible(&master->master_sem)) |
169 if (down_interruptible(&master->master_sem)) |
170 return -EINTR; |
170 return -EINTR; |
171 data.slave_count = master->slave_count; |
171 data.slave_count = master->slave_count; |
172 data.config_count = ec_master_config_count(master); |
172 data.config_count = ec_master_config_count(master); |
173 data.domain_count = ec_master_domain_count(master); |
173 data.domain_count = ec_master_domain_count(master); |
|
174 #ifdef EC_EOE |
174 data.eoe_handler_count = ec_master_eoe_handler_count(master); |
175 data.eoe_handler_count = ec_master_eoe_handler_count(master); |
|
176 #endif |
175 data.phase = (uint8_t) master->phase; |
177 data.phase = (uint8_t) master->phase; |
|
178 data.active = (uint8_t) master->active; |
176 data.scan_busy = master->scan_busy; |
179 data.scan_busy = master->scan_busy; |
177 up(&master->master_sem); |
180 up(&master->master_sem); |
178 |
181 |
179 if (down_interruptible(&master->device_sem)) |
182 if (down_interruptible(&master->device_sem)) |
180 return -EINTR; |
183 return -EINTR; |
1254 data.position = sc->position; |
1257 data.position = sc->position; |
1255 data.vendor_id = sc->vendor_id; |
1258 data.vendor_id = sc->vendor_id; |
1256 data.product_code = sc->product_code; |
1259 data.product_code = sc->product_code; |
1257 for (i = 0; i < EC_MAX_SYNC_MANAGERS; i++) { |
1260 for (i = 0; i < EC_MAX_SYNC_MANAGERS; i++) { |
1258 data.syncs[i].dir = sc->sync_configs[i].dir; |
1261 data.syncs[i].dir = sc->sync_configs[i].dir; |
|
1262 data.syncs[i].watchdog_mode = sc->sync_configs[i].watchdog_mode; |
1259 data.syncs[i].pdo_count = |
1263 data.syncs[i].pdo_count = |
1260 ec_pdo_list_count(&sc->sync_configs[i].pdos); |
1264 ec_pdo_list_count(&sc->sync_configs[i].pdos); |
1261 } |
1265 } |
|
1266 data.watchdog_divider = sc->watchdog_divider; |
|
1267 data.watchdog_intervals = sc->watchdog_intervals; |
1262 data.sdo_count = ec_slave_config_sdo_count(sc); |
1268 data.sdo_count = ec_slave_config_sdo_count(sc); |
1263 data.slave_position = sc->slave ? sc->slave->ring_position : -1; |
1269 data.slave_position = sc->slave ? sc->slave->ring_position : -1; |
1264 data.dc_assign_activate = sc->dc_assign_activate; |
1270 data.dc_assign_activate = sc->dc_assign_activate; |
1265 for (i = 0; i < EC_SYNC_SIGNAL_COUNT; i++) { |
1271 for (i = 0; i < EC_SYNC_SIGNAL_COUNT; i++) { |
1266 data.dc_sync[i] = sc->dc_sync[i]; |
1272 data.dc_sync[i] = sc->dc_sync[i]; |
1427 } |
1433 } |
1428 |
1434 |
1429 data.index = req->index; |
1435 data.index = req->index; |
1430 data.subindex = req->subindex; |
1436 data.subindex = req->subindex; |
1431 data.size = req->data_size; |
1437 data.size = req->data_size; |
1432 memcpy(&data.data, req->data, min((u32) data.size, (u32) 4)); |
1438 memcpy(&data.data, req->data, |
|
1439 min((u32) data.size, (u32) EC_MAX_SDO_DATA_SIZE)); |
1433 |
1440 |
1434 up(&master->master_sem); |
1441 up(&master->master_sem); |
1435 |
1442 |
1436 if (copy_to_user((void __user *) arg, &data, sizeof(data))) |
1443 if (copy_to_user((void __user *) arg, &data, sizeof(data))) |
1437 return -EFAULT; |
1444 return -EFAULT; |
1438 |
1445 |
1439 return 0; |
1446 return 0; |
1440 } |
1447 } |
1441 |
1448 |
1442 /*****************************************************************************/ |
1449 /*****************************************************************************/ |
|
1450 |
|
1451 #ifdef EC_EOE |
1443 |
1452 |
1444 /** Get EoE handler information. |
1453 /** Get EoE handler information. |
1445 */ |
1454 */ |
1446 int ec_cdev_ioctl_eoe_handler( |
1455 int ec_cdev_ioctl_eoe_handler( |
1447 ec_master_t *master, /**< EtherCAT master. */ |
1456 ec_master_t *master, /**< EtherCAT master. */ |
1620 offset += ecrt_domain_size(domain); |
1631 offset += ecrt_domain_size(domain); |
1621 } |
1632 } |
1622 } |
1633 } |
1623 |
1634 |
1624 ecrt_master_callbacks(master, ec_master_internal_send_cb, |
1635 ecrt_master_callbacks(master, ec_master_internal_send_cb, |
1625 ec_master_internal_receive_cb); |
1636 ec_master_internal_receive_cb, master); |
1626 |
1637 |
1627 ret = ecrt_master_activate(master); |
1638 ret = ecrt_master_activate(master); |
1628 if (ret < 0) |
1639 if (ret < 0) |
1629 return ret; |
1640 return ret; |
1630 |
1641 |
1635 return 0; |
1646 return 0; |
1636 } |
1647 } |
1637 |
1648 |
1638 /*****************************************************************************/ |
1649 /*****************************************************************************/ |
1639 |
1650 |
|
1651 /** Deactivates the master. |
|
1652 */ |
|
1653 int ec_cdev_ioctl_deactivate( |
|
1654 ec_master_t *master, /**< EtherCAT master. */ |
|
1655 unsigned long arg, /**< ioctl() argument. */ |
|
1656 ec_cdev_priv_t *priv /**< Private data structure of file handle. */ |
|
1657 ) |
|
1658 { |
|
1659 if (unlikely(!priv->requested)) |
|
1660 return -EPERM; |
|
1661 |
|
1662 ecrt_master_deactivate(master); |
|
1663 return 0; |
|
1664 } |
|
1665 |
|
1666 /*****************************************************************************/ |
|
1667 |
1640 /** Send frames. |
1668 /** Send frames. |
1641 */ |
1669 */ |
1642 int ec_cdev_ioctl_send( |
1670 int ec_cdev_ioctl_send( |
1643 ec_master_t *master, /**< EtherCAT master. */ |
1671 ec_master_t *master, /**< EtherCAT master. */ |
1644 unsigned long arg, /**< ioctl() argument. */ |
1672 unsigned long arg, /**< ioctl() argument. */ |
1752 return -EPERM; |
1780 return -EPERM; |
1753 |
1781 |
1754 down(&master->io_sem); |
1782 down(&master->io_sem); |
1755 ecrt_master_sync_slave_clocks(master); |
1783 ecrt_master_sync_slave_clocks(master); |
1756 up(&master->io_sem); |
1784 up(&master->io_sem); |
|
1785 return 0; |
|
1786 } |
|
1787 |
|
1788 /*****************************************************************************/ |
|
1789 |
|
1790 /** Queue the sync monitoring datagram. |
|
1791 */ |
|
1792 int ec_cdev_ioctl_sync_mon_queue( |
|
1793 ec_master_t *master, /**< EtherCAT master. */ |
|
1794 unsigned long arg, /**< ioctl() argument. */ |
|
1795 ec_cdev_priv_t *priv /**< Private data structure of file handle. */ |
|
1796 ) |
|
1797 { |
|
1798 if (unlikely(!priv->requested)) |
|
1799 return -EPERM; |
|
1800 |
|
1801 down(&master->io_sem); |
|
1802 ecrt_master_sync_monitor_queue(master); |
|
1803 up(&master->io_sem); |
|
1804 return 0; |
|
1805 } |
|
1806 |
|
1807 /*****************************************************************************/ |
|
1808 |
|
1809 /** Processes the sync monitoring datagram. |
|
1810 */ |
|
1811 int ec_cdev_ioctl_sync_mon_process( |
|
1812 ec_master_t *master, /**< EtherCAT master. */ |
|
1813 unsigned long arg, /**< ioctl() argument. */ |
|
1814 ec_cdev_priv_t *priv /**< Private data structure of file handle. */ |
|
1815 ) |
|
1816 { |
|
1817 uint32_t time_diff; |
|
1818 |
|
1819 if (unlikely(!priv->requested)) |
|
1820 return -EPERM; |
|
1821 |
|
1822 down(&master->io_sem); |
|
1823 time_diff = ecrt_master_sync_monitor_process(master); |
|
1824 up(&master->io_sem); |
|
1825 |
|
1826 if (copy_to_user((void __user *) arg, &time_diff, sizeof(time_diff))) |
|
1827 return -EFAULT; |
|
1828 |
1757 return 0; |
1829 return 0; |
1758 } |
1830 } |
1759 |
1831 |
1760 /*****************************************************************************/ |
1832 /*****************************************************************************/ |
1761 |
1833 |
2109 return -ENOENT; |
2181 return -ENOENT; |
2110 } |
2182 } |
2111 |
2183 |
2112 up(&master->master_sem); // FIXME |
2184 up(&master->master_sem); // FIXME |
2113 |
2185 |
2114 ret = ecrt_slave_config_sdo(sc, data.index, data.subindex, sdo_data, |
2186 if (data.complete_access) { |
2115 data.size); |
2187 ret = ecrt_slave_config_complete_sdo(sc, data.index, sdo_data, data.size); |
|
2188 } else { |
|
2189 ret = ecrt_slave_config_sdo(sc, data.index, data.subindex, sdo_data, |
|
2190 data.size); |
|
2191 } |
2116 kfree(sdo_data); |
2192 kfree(sdo_data); |
2117 return ret; |
2193 return ret; |
2118 } |
2194 } |
2119 |
2195 |
2120 /*****************************************************************************/ |
2196 /*****************************************************************************/ |
3226 return ec_cdev_ioctl_config_pdo(master, arg); |
3302 return ec_cdev_ioctl_config_pdo(master, arg); |
3227 case EC_IOCTL_CONFIG_PDO_ENTRY: |
3303 case EC_IOCTL_CONFIG_PDO_ENTRY: |
3228 return ec_cdev_ioctl_config_pdo_entry(master, arg); |
3304 return ec_cdev_ioctl_config_pdo_entry(master, arg); |
3229 case EC_IOCTL_CONFIG_SDO: |
3305 case EC_IOCTL_CONFIG_SDO: |
3230 return ec_cdev_ioctl_config_sdo(master, arg); |
3306 return ec_cdev_ioctl_config_sdo(master, arg); |
|
3307 #ifdef EC_EOE |
3231 case EC_IOCTL_EOE_HANDLER: |
3308 case EC_IOCTL_EOE_HANDLER: |
3232 return ec_cdev_ioctl_eoe_handler(master, arg); |
3309 return ec_cdev_ioctl_eoe_handler(master, arg); |
|
3310 #endif |
3233 case EC_IOCTL_REQUEST: |
3311 case EC_IOCTL_REQUEST: |
3234 if (!(filp->f_mode & FMODE_WRITE)) |
3312 if (!(filp->f_mode & FMODE_WRITE)) |
3235 return -EPERM; |
3313 return -EPERM; |
3236 return ec_cdev_ioctl_request(master, arg, priv); |
3314 return ec_cdev_ioctl_request(master, arg, priv); |
3237 case EC_IOCTL_CREATE_DOMAIN: |
3315 case EC_IOCTL_CREATE_DOMAIN: |
3244 return ec_cdev_ioctl_create_slave_config(master, arg, priv); |
3322 return ec_cdev_ioctl_create_slave_config(master, arg, priv); |
3245 case EC_IOCTL_ACTIVATE: |
3323 case EC_IOCTL_ACTIVATE: |
3246 if (!(filp->f_mode & FMODE_WRITE)) |
3324 if (!(filp->f_mode & FMODE_WRITE)) |
3247 return -EPERM; |
3325 return -EPERM; |
3248 return ec_cdev_ioctl_activate(master, arg, priv); |
3326 return ec_cdev_ioctl_activate(master, arg, priv); |
|
3327 case EC_IOCTL_DEACTIVATE: |
|
3328 if (!(filp->f_mode & FMODE_WRITE)) |
|
3329 return -EPERM; |
|
3330 return ec_cdev_ioctl_deactivate(master, arg, priv); |
3249 case EC_IOCTL_SEND: |
3331 case EC_IOCTL_SEND: |
3250 if (!(filp->f_mode & FMODE_WRITE)) |
3332 if (!(filp->f_mode & FMODE_WRITE)) |
3251 return -EPERM; |
3333 return -EPERM; |
3252 return ec_cdev_ioctl_send(master, arg, priv); |
3334 return ec_cdev_ioctl_send(master, arg, priv); |
3253 case EC_IOCTL_RECEIVE: |
3335 case EC_IOCTL_RECEIVE: |
3266 return ec_cdev_ioctl_sync_ref(master, arg, priv); |
3348 return ec_cdev_ioctl_sync_ref(master, arg, priv); |
3267 case EC_IOCTL_SYNC_SLAVES: |
3349 case EC_IOCTL_SYNC_SLAVES: |
3268 if (!(filp->f_mode & FMODE_WRITE)) |
3350 if (!(filp->f_mode & FMODE_WRITE)) |
3269 return -EPERM; |
3351 return -EPERM; |
3270 return ec_cdev_ioctl_sync_slaves(master, arg, priv); |
3352 return ec_cdev_ioctl_sync_slaves(master, arg, priv); |
|
3353 case EC_IOCTL_SYNC_MON_QUEUE: |
|
3354 if (!(filp->f_mode & FMODE_WRITE)) |
|
3355 return -EPERM; |
|
3356 return ec_cdev_ioctl_sync_mon_queue(master, arg, priv); |
|
3357 case EC_IOCTL_SYNC_MON_PROCESS: |
|
3358 if (!(filp->f_mode & FMODE_WRITE)) |
|
3359 return -EPERM; |
|
3360 return ec_cdev_ioctl_sync_mon_process(master, arg, priv); |
3271 case EC_IOCTL_SC_SYNC: |
3361 case EC_IOCTL_SC_SYNC: |
3272 if (!(filp->f_mode & FMODE_WRITE)) |
3362 if (!(filp->f_mode & FMODE_WRITE)) |
3273 return -EPERM; |
3363 return -EPERM; |
3274 return ec_cdev_ioctl_sc_sync(master, arg, priv); |
3364 return ec_cdev_ioctl_sc_sync(master, arg, priv); |
3275 case EC_IOCTL_SC_WATCHDOG: |
3365 case EC_IOCTL_SC_WATCHDOG: |