1757 return 0; |
1757 return 0; |
1758 } |
1758 } |
1759 |
1759 |
1760 /*****************************************************************************/ |
1760 /*****************************************************************************/ |
1761 |
1761 |
1762 /** Set the direction of a sync manager. |
1762 /** Configure a sync manager. |
1763 */ |
1763 */ |
1764 int ec_cdev_ioctl_sc_sync( |
1764 int ec_cdev_ioctl_sc_sync( |
1765 ec_master_t *master, /**< EtherCAT master. */ |
1765 ec_master_t *master, /**< EtherCAT master. */ |
1766 unsigned long arg, /**< ioctl() argument. */ |
1766 unsigned long arg, /**< ioctl() argument. */ |
1767 ec_cdev_priv_t *priv /**< Private data structure of file handle. */ |
1767 ec_cdev_priv_t *priv /**< Private data structure of file handle. */ |
1791 ret = -ENOENT; |
1791 ret = -ENOENT; |
1792 goto out_up; |
1792 goto out_up; |
1793 } |
1793 } |
1794 |
1794 |
1795 for (i = 0; i < EC_MAX_SYNC_MANAGERS; i++) { |
1795 for (i = 0; i < EC_MAX_SYNC_MANAGERS; i++) { |
1796 ec_direction_t dir = data.syncs[i].dir; |
1796 if (data.syncs[i].config_this) { |
1797 if (dir == EC_DIR_INPUT || dir == EC_DIR_OUTPUT) { |
1797 if (ecrt_slave_config_sync_manager(sc, i, data.syncs[i].dir, |
1798 if (ecrt_slave_config_sync_manager(sc, i, dir)) { |
1798 data.syncs[i].watchdog_mode)) { |
1799 ret = -EINVAL; |
1799 ret = -EINVAL; |
1800 goto out_up; |
1800 goto out_up; |
1801 } |
1801 } |
1802 } |
1802 } |
1803 } |
1803 } |
|
1804 |
|
1805 out_up: |
|
1806 up(&master->master_sem); |
|
1807 out_return: |
|
1808 return ret; |
|
1809 } |
|
1810 |
|
1811 /*****************************************************************************/ |
|
1812 |
|
1813 /** Configure a slave's watchdogs. |
|
1814 */ |
|
1815 int ec_cdev_ioctl_sc_watchdog( |
|
1816 ec_master_t *master, /**< EtherCAT master. */ |
|
1817 unsigned long arg, /**< ioctl() argument. */ |
|
1818 ec_cdev_priv_t *priv /**< Private data structure of file handle. */ |
|
1819 ) |
|
1820 { |
|
1821 ec_ioctl_config_t data; |
|
1822 ec_slave_config_t *sc; |
|
1823 int ret = 0; |
|
1824 |
|
1825 if (unlikely(!priv->requested)) { |
|
1826 ret = -EPERM; |
|
1827 goto out_return; |
|
1828 } |
|
1829 |
|
1830 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) { |
|
1831 ret = -EFAULT; |
|
1832 goto out_return; |
|
1833 } |
|
1834 |
|
1835 if (down_interruptible(&master->master_sem)) { |
|
1836 ret = -EINTR; |
|
1837 goto out_return; |
|
1838 } |
|
1839 |
|
1840 if (!(sc = ec_master_get_config(master, data.config_index))) { |
|
1841 ret = -ENOENT; |
|
1842 goto out_up; |
|
1843 } |
|
1844 |
|
1845 ecrt_slave_config_watchdog(sc, |
|
1846 data.watchdog_divider, data.watchdog_intervals); |
1804 |
1847 |
1805 out_up: |
1848 out_up: |
1806 up(&master->master_sem); |
1849 up(&master->master_sem); |
1807 out_return: |
1850 out_return: |
1808 return ret; |
1851 return ret; |
3227 return ec_cdev_ioctl_sync_slaves(master, arg, priv); |
3270 return ec_cdev_ioctl_sync_slaves(master, arg, priv); |
3228 case EC_IOCTL_SC_SYNC: |
3271 case EC_IOCTL_SC_SYNC: |
3229 if (!(filp->f_mode & FMODE_WRITE)) |
3272 if (!(filp->f_mode & FMODE_WRITE)) |
3230 return -EPERM; |
3273 return -EPERM; |
3231 return ec_cdev_ioctl_sc_sync(master, arg, priv); |
3274 return ec_cdev_ioctl_sc_sync(master, arg, priv); |
|
3275 case EC_IOCTL_SC_WATCHDOG: |
|
3276 if (!(filp->f_mode & FMODE_WRITE)) |
|
3277 return -EPERM; |
|
3278 return ec_cdev_ioctl_sc_watchdog(master, arg, priv); |
3232 case EC_IOCTL_SC_ADD_PDO: |
3279 case EC_IOCTL_SC_ADD_PDO: |
3233 if (!(filp->f_mode & FMODE_WRITE)) |
3280 if (!(filp->f_mode & FMODE_WRITE)) |
3234 return -EPERM; |
3281 return -EPERM; |
3235 return ec_cdev_ioctl_sc_add_pdo(master, arg, priv); |
3282 return ec_cdev_ioctl_sc_add_pdo(master, arg, priv); |
3236 case EC_IOCTL_SC_CLEAR_PDOS: |
3283 case EC_IOCTL_SC_CLEAR_PDOS: |