173 data.domain_count = ec_master_domain_count(master); |
173 data.domain_count = ec_master_domain_count(master); |
174 #ifdef EC_EOE |
174 #ifdef EC_EOE |
175 data.eoe_handler_count = ec_master_eoe_handler_count(master); |
175 data.eoe_handler_count = ec_master_eoe_handler_count(master); |
176 #endif |
176 #endif |
177 data.phase = (uint8_t) master->phase; |
177 data.phase = (uint8_t) master->phase; |
|
178 data.active = (uint8_t) master->active; |
178 data.scan_busy = master->scan_busy; |
179 data.scan_busy = master->scan_busy; |
179 up(&master->master_sem); |
180 up(&master->master_sem); |
180 |
181 |
181 if (down_interruptible(&master->device_sem)) |
182 if (down_interruptible(&master->device_sem)) |
182 return -EINTR; |
183 return -EINTR; |
1645 return 0; |
1646 return 0; |
1646 } |
1647 } |
1647 |
1648 |
1648 /*****************************************************************************/ |
1649 /*****************************************************************************/ |
1649 |
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 |
1650 /** Send frames. |
1668 /** Send frames. |
1651 */ |
1669 */ |
1652 int ec_cdev_ioctl_send( |
1670 int ec_cdev_ioctl_send( |
1653 ec_master_t *master, /**< EtherCAT master. */ |
1671 ec_master_t *master, /**< EtherCAT master. */ |
1654 unsigned long arg, /**< ioctl() argument. */ |
1672 unsigned long arg, /**< ioctl() argument. */ |
1762 return -EPERM; |
1780 return -EPERM; |
1763 |
1781 |
1764 down(&master->io_sem); |
1782 down(&master->io_sem); |
1765 ecrt_master_sync_slave_clocks(master); |
1783 ecrt_master_sync_slave_clocks(master); |
1766 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 |
1767 return 0; |
1829 return 0; |
1768 } |
1830 } |
1769 |
1831 |
1770 /*****************************************************************************/ |
1832 /*****************************************************************************/ |
1771 |
1833 |
3260 return ec_cdev_ioctl_create_slave_config(master, arg, priv); |
3322 return ec_cdev_ioctl_create_slave_config(master, arg, priv); |
3261 case EC_IOCTL_ACTIVATE: |
3323 case EC_IOCTL_ACTIVATE: |
3262 if (!(filp->f_mode & FMODE_WRITE)) |
3324 if (!(filp->f_mode & FMODE_WRITE)) |
3263 return -EPERM; |
3325 return -EPERM; |
3264 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); |
3265 case EC_IOCTL_SEND: |
3331 case EC_IOCTL_SEND: |
3266 if (!(filp->f_mode & FMODE_WRITE)) |
3332 if (!(filp->f_mode & FMODE_WRITE)) |
3267 return -EPERM; |
3333 return -EPERM; |
3268 return ec_cdev_ioctl_send(master, arg, priv); |
3334 return ec_cdev_ioctl_send(master, arg, priv); |
3269 case EC_IOCTL_RECEIVE: |
3335 case EC_IOCTL_RECEIVE: |
3282 return ec_cdev_ioctl_sync_ref(master, arg, priv); |
3348 return ec_cdev_ioctl_sync_ref(master, arg, priv); |
3283 case EC_IOCTL_SYNC_SLAVES: |
3349 case EC_IOCTL_SYNC_SLAVES: |
3284 if (!(filp->f_mode & FMODE_WRITE)) |
3350 if (!(filp->f_mode & FMODE_WRITE)) |
3285 return -EPERM; |
3351 return -EPERM; |
3286 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); |
3287 case EC_IOCTL_SC_SYNC: |
3361 case EC_IOCTL_SC_SYNC: |
3288 if (!(filp->f_mode & FMODE_WRITE)) |
3362 if (!(filp->f_mode & FMODE_WRITE)) |
3289 return -EPERM; |
3363 return -EPERM; |
3290 return ec_cdev_ioctl_sc_sync(master, arg, priv); |
3364 return ec_cdev_ioctl_sc_sync(master, arg, priv); |
3291 case EC_IOCTL_SC_WATCHDOG: |
3365 case EC_IOCTL_SC_WATCHDOG: |