master/cdev.c
changeset 1509 a864688e7de5
parent 1507 68e89abadd19
child 1513 60ca68d853b8
equal deleted inserted replaced
1508:60a116ed3897 1509:a864688e7de5
  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: