1785 return 0; |
1785 return 0; |
1786 } |
1786 } |
1787 |
1787 |
1788 /*****************************************************************************/ |
1788 /*****************************************************************************/ |
1789 |
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 |
|
1829 return 0; |
|
1830 } |
|
1831 |
|
1832 /*****************************************************************************/ |
|
1833 |
1790 /** Configure a sync manager. |
1834 /** Configure a sync manager. |
1791 */ |
1835 */ |
1792 int ec_cdev_ioctl_sc_sync( |
1836 int ec_cdev_ioctl_sc_sync( |
1793 ec_master_t *master, /**< EtherCAT master. */ |
1837 ec_master_t *master, /**< EtherCAT master. */ |
1794 unsigned long arg, /**< ioctl() argument. */ |
1838 unsigned long arg, /**< ioctl() argument. */ |
3304 return ec_cdev_ioctl_sync_ref(master, arg, priv); |
3348 return ec_cdev_ioctl_sync_ref(master, arg, priv); |
3305 case EC_IOCTL_SYNC_SLAVES: |
3349 case EC_IOCTL_SYNC_SLAVES: |
3306 if (!(filp->f_mode & FMODE_WRITE)) |
3350 if (!(filp->f_mode & FMODE_WRITE)) |
3307 return -EPERM; |
3351 return -EPERM; |
3308 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); |
3309 case EC_IOCTL_SC_SYNC: |
3361 case EC_IOCTL_SC_SYNC: |
3310 if (!(filp->f_mode & FMODE_WRITE)) |
3362 if (!(filp->f_mode & FMODE_WRITE)) |
3311 return -EPERM; |
3363 return -EPERM; |
3312 return ec_cdev_ioctl_sc_sync(master, arg, priv); |
3364 return ec_cdev_ioctl_sc_sync(master, arg, priv); |
3313 case EC_IOCTL_SC_WATCHDOG: |
3365 case EC_IOCTL_SC_WATCHDOG: |