master/cdev.c
changeset 1981 c14b6bb14fdf
parent 1980 a89e2bedf004
child 1984 02c8728bf9e4
equal deleted inserted replaced
1980:a89e2bedf004 1981:c14b6bb14fdf
  2029     up(&master->master_sem);
  2029     up(&master->master_sem);
  2030 out_return:
  2030 out_return:
  2031     return ret;
  2031     return ret;
  2032 }
  2032 }
  2033 
  2033 
       
  2034 
       
  2035 /*****************************************************************************/
       
  2036 
       
  2037 /** Configure wether a slave allows overlapping PDOs.
       
  2038  */
       
  2039 int ec_cdev_ioctl_sc_allow_overlapping_pdos(
       
  2040         ec_master_t *master, /**< EtherCAT master. */
       
  2041         unsigned long arg, /**< ioctl() argument. */
       
  2042         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  2043         )
       
  2044 {
       
  2045     ec_ioctl_config_t data;
       
  2046     ec_slave_config_t *sc;
       
  2047     int ret = 0;
       
  2048 
       
  2049     if (unlikely(!priv->requested)) {
       
  2050         ret = -EPERM;
       
  2051         goto out_return;
       
  2052     }
       
  2053 
       
  2054     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
       
  2055         ret = -EFAULT;
       
  2056         goto out_return;
       
  2057     }
       
  2058 
       
  2059     if (down_interruptible(&master->master_sem)) {
       
  2060         ret = -EINTR;
       
  2061         goto out_return;
       
  2062     }
       
  2063 
       
  2064     if (!(sc = ec_master_get_config(master, data.config_index))) {
       
  2065         ret = -ENOENT;
       
  2066         goto out_up;
       
  2067     }
       
  2068 
       
  2069     ecrt_slave_config_overlapping_pdos(sc,
       
  2070             data.allow_overlapping_pdos);
       
  2071 
       
  2072 out_up:
       
  2073     up(&master->master_sem);
       
  2074 out_return:
       
  2075     return ret;
       
  2076 }
       
  2077 
  2034 /*****************************************************************************/
  2078 /*****************************************************************************/
  2035 
  2079 
  2036 /** Add a PDO to the assignment.
  2080 /** Add a PDO to the assignment.
  2037  */
  2081  */
  2038 int ec_cdev_ioctl_sc_add_pdo(
  2082 int ec_cdev_ioctl_sc_add_pdo(
  3723             return ec_cdev_ioctl_sc_sync(master, arg, priv);
  3767             return ec_cdev_ioctl_sc_sync(master, arg, priv);
  3724         case EC_IOCTL_SC_WATCHDOG:
  3768         case EC_IOCTL_SC_WATCHDOG:
  3725             if (!(filp->f_mode & FMODE_WRITE))
  3769             if (!(filp->f_mode & FMODE_WRITE))
  3726                 return -EPERM;
  3770                 return -EPERM;
  3727             return ec_cdev_ioctl_sc_watchdog(master, arg, priv);
  3771             return ec_cdev_ioctl_sc_watchdog(master, arg, priv);
       
  3772         case EC_IOCTL_SC_OVERLAPPING_IO:
       
  3773             if (!(filp->f_mode & FMODE_WRITE))
       
  3774                 return -EPERM;
       
  3775             return ec_cdev_ioctl_sc_allow_overlapping_pdos(master,arg,priv);
  3728         case EC_IOCTL_SC_ADD_PDO:
  3776         case EC_IOCTL_SC_ADD_PDO:
  3729             if (!(filp->f_mode & FMODE_WRITE))
  3777             if (!(filp->f_mode & FMODE_WRITE))
  3730                 return -EPERM;
  3778                 return -EPERM;
  3731             return ec_cdev_ioctl_sc_add_pdo(master, arg, priv);
  3779             return ec_cdev_ioctl_sc_add_pdo(master, arg, priv);
  3732         case EC_IOCTL_SC_CLEAR_PDOS:
  3780         case EC_IOCTL_SC_CLEAR_PDOS: