master/cdev.c
changeset 1862 05d224a66270
parent 1857 ed8b490b5bc3
child 1909 ea3eb4c74c1b
child 1978 d9b6e641eaeb
equal deleted inserted replaced
1861:5b285964b4e7 1862:05d224a66270
  2415     return 0;
  2415     return 0;
  2416 }
  2416 }
  2417 
  2417 
  2418 /*****************************************************************************/
  2418 /*****************************************************************************/
  2419 
  2419 
       
  2420 /** Configures an IDN.
       
  2421  */
       
  2422 int ec_cdev_ioctl_sc_idn(
       
  2423         ec_master_t *master, /**< EtherCAT master. */
       
  2424         unsigned long arg, /**< ioctl() argument. */
       
  2425         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  2426         )
       
  2427 {
       
  2428     ec_ioctl_sc_idn_t ioctl;
       
  2429     ec_slave_config_t *sc;
       
  2430     uint8_t *data = NULL;
       
  2431     int ret;
       
  2432 
       
  2433     if (unlikely(!priv->requested))
       
  2434         return -EPERM;
       
  2435 
       
  2436     if (copy_from_user(&ioctl, (void __user *) arg, sizeof(ioctl)))
       
  2437         return -EFAULT;
       
  2438 
       
  2439     if (!ioctl.size)
       
  2440         return -EINVAL;
       
  2441 
       
  2442     if (!(data = kmalloc(ioctl.size, GFP_KERNEL))) {
       
  2443         return -ENOMEM;
       
  2444     }
       
  2445 
       
  2446     if (copy_from_user(data, (void __user *) ioctl.data, ioctl.size)) {
       
  2447         kfree(data);
       
  2448         return -EFAULT;
       
  2449     }
       
  2450 
       
  2451     if (down_interruptible(&master->master_sem)) {
       
  2452         kfree(data);
       
  2453         return -EINTR;
       
  2454     }
       
  2455 
       
  2456     if (!(sc = ec_master_get_config(master, ioctl.config_index))) {
       
  2457         up(&master->master_sem);
       
  2458         kfree(data);
       
  2459         return -ENOENT;
       
  2460     }
       
  2461 
       
  2462     up(&master->master_sem); // FIXME
       
  2463 
       
  2464     ret = ecrt_slave_config_idn(sc, ioctl.idn, data, ioctl.size);
       
  2465     kfree(data);
       
  2466     return ret;
       
  2467 }
       
  2468 
       
  2469 /*****************************************************************************/
       
  2470 
  2420 /** Gets the domain's offset in the total process data.
  2471 /** Gets the domain's offset in the total process data.
  2421  */
  2472  */
  2422 int ec_cdev_ioctl_domain_offset(
  2473 int ec_cdev_ioctl_domain_offset(
  2423         ec_master_t *master, /**< EtherCAT master. */
  2474         ec_master_t *master, /**< EtherCAT master. */
  2424         unsigned long arg, /**< ioctl() argument. */
  2475         unsigned long arg, /**< ioctl() argument. */
  3685             if (!(filp->f_mode & FMODE_WRITE))
  3736             if (!(filp->f_mode & FMODE_WRITE))
  3686                 return -EPERM;
  3737                 return -EPERM;
  3687             return ec_cdev_ioctl_sc_create_voe_handler(master, arg, priv);
  3738             return ec_cdev_ioctl_sc_create_voe_handler(master, arg, priv);
  3688         case EC_IOCTL_SC_STATE:
  3739         case EC_IOCTL_SC_STATE:
  3689             return ec_cdev_ioctl_sc_state(master, arg, priv);
  3740             return ec_cdev_ioctl_sc_state(master, arg, priv);
       
  3741         case EC_IOCTL_SC_IDN:
       
  3742             if (!(filp->f_mode & FMODE_WRITE))
       
  3743                 return -EPERM;
       
  3744             return ec_cdev_ioctl_sc_idn(master, arg, priv);
  3690         case EC_IOCTL_DOMAIN_OFFSET:
  3745         case EC_IOCTL_DOMAIN_OFFSET:
  3691             return ec_cdev_ioctl_domain_offset(master, arg, priv);
  3746             return ec_cdev_ioctl_domain_offset(master, arg, priv);
  3692         case EC_IOCTL_DOMAIN_PROCESS:
  3747         case EC_IOCTL_DOMAIN_PROCESS:
  3693             if (!(filp->f_mode & FMODE_WRITE))
  3748             if (!(filp->f_mode & FMODE_WRITE))
  3694                 return -EPERM;
  3749                 return -EPERM;