master/ioctl.c
changeset 2609 777d1a8b3a27
parent 2597 0e145bb05859
child 2610 f0fdcce9874b
equal deleted inserted replaced
2608:ec0b5d9a2ff1 2609:777d1a8b3a27
  2252     return ret;
  2252     return ret;
  2253 }
  2253 }
  2254 
  2254 
  2255 /*****************************************************************************/
  2255 /*****************************************************************************/
  2256 
  2256 
       
  2257 /** Configure wether a slave allows overlapping PDOs.
       
  2258  */
       
  2259 static ATTRIBUTES int ec_ioctl_sc_allow_overlapping_pdos(
       
  2260         ec_master_t *master, /**< EtherCAT master. */
       
  2261         void *arg, /**< ioctl() argument. */
       
  2262         ec_ioctl_context_t *ctx /**< Private data structure of file handle. */
       
  2263         )
       
  2264 {
       
  2265     ec_ioctl_config_t data;
       
  2266     ec_slave_config_t *sc;
       
  2267     int ret = 0;
       
  2268 
       
  2269     if (unlikely(!ctx->requested)) {
       
  2270         ret = -EPERM;
       
  2271         goto out_return;
       
  2272     }
       
  2273 
       
  2274     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
       
  2275         ret = -EFAULT;
       
  2276         goto out_return;
       
  2277     }
       
  2278 
       
  2279     if (down_interruptible(&master->master_sem)) {
       
  2280         ret = -EINTR;
       
  2281         goto out_return;
       
  2282     }
       
  2283 
       
  2284     if (!(sc = ec_master_get_config(master, data.config_index))) {
       
  2285         ret = -ENOENT;
       
  2286         goto out_up;
       
  2287     }
       
  2288 
       
  2289     ecrt_slave_config_overlapping_pdos(sc,
       
  2290             data.allow_overlapping_pdos);
       
  2291 
       
  2292 out_up:
       
  2293     up(&master->master_sem);
       
  2294 out_return:
       
  2295     return ret;
       
  2296 }
       
  2297 /*****************************************************************************/
       
  2298 
  2257 /** Add a PDO to the assignment.
  2299 /** Add a PDO to the assignment.
  2258  *
  2300  *
  2259  * \return Zero on success, otherwise a negative error code.
  2301  * \return Zero on success, otherwise a negative error code.
  2260  */
  2302  */
  2261 static ATTRIBUTES int ec_ioctl_sc_add_pdo(
  2303 static ATTRIBUTES int ec_ioctl_sc_add_pdo(
  4445                 ret = -EPERM;
  4487                 ret = -EPERM;
  4446                 break;
  4488                 break;
  4447             }
  4489             }
  4448             ret = ec_ioctl_sc_watchdog(master, arg, ctx);
  4490             ret = ec_ioctl_sc_watchdog(master, arg, ctx);
  4449             break;
  4491             break;
       
  4492         case EC_IOCTL_SC_OVERLAPPING_IO:
       
  4493             if (!ctx->writable) {
       
  4494                 ret = -EPERM;
       
  4495                 break;
       
  4496             }
       
  4497             ret = ec_ioctl_sc_allow_overlapping_pdos(master, arg, ctx);
       
  4498             break;
  4450         case EC_IOCTL_SC_ADD_PDO:
  4499         case EC_IOCTL_SC_ADD_PDO:
  4451             if (!ctx->writable) {
  4500             if (!ctx->writable) {
  4452                 ret = -EPERM;
  4501                 ret = -EPERM;
  4453                 break;
  4502                 break;
  4454             }
  4503             }