master/cdev.c
changeset 1314 b3d06a8807b3
parent 1313 ed15eef57d5c
child 1326 ef907b0b5125
equal deleted inserted replaced
1313:ed15eef57d5c 1314:b3d06a8807b3
  2220     }
  2220     }
  2221 
  2221 
  2222     up(&master->master_sem);
  2222     up(&master->master_sem);
  2223 
  2223 
  2224     ecrt_voe_handler_read(voe);
  2224     ecrt_voe_handler_read(voe);
       
  2225     return 0;
       
  2226 }
       
  2227 
       
  2228 /*****************************************************************************/
       
  2229 
       
  2230 /** Starts a VoE read operation without sending a sync message first.
       
  2231  */
       
  2232 int ec_cdev_ioctl_voe_read_nosync(
       
  2233         ec_master_t *master, /**< EtherCAT master. */
       
  2234         unsigned long arg, /**< ioctl() argument. */
       
  2235         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  2236         )
       
  2237 {
       
  2238     ec_ioctl_voe_t data;
       
  2239     ec_slave_config_t *sc;
       
  2240     ec_voe_handler_t *voe;
       
  2241 
       
  2242 	if (unlikely(!priv->requested))
       
  2243         return -EPERM;
       
  2244 
       
  2245     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
       
  2246         return -EFAULT;
       
  2247 
       
  2248     if (down_interruptible(&master->master_sem))
       
  2249         return -EINTR;
       
  2250 
       
  2251     if (!(sc = ec_master_get_config(master, data.config_index))) {
       
  2252         up(&master->master_sem);
       
  2253         return -ENOENT;
       
  2254     }
       
  2255 
       
  2256     if (!(voe = ec_slave_config_find_voe_handler(sc, data.voe_index))) {
       
  2257         up(&master->master_sem);
       
  2258         return -ENOENT;
       
  2259     }
       
  2260 
       
  2261     up(&master->master_sem);
       
  2262 
       
  2263     ecrt_voe_handler_read_nosync(voe);
  2225     return 0;
  2264     return 0;
  2226 }
  2265 }
  2227 
  2266 
  2228 /*****************************************************************************/
  2267 /*****************************************************************************/
  2229 
  2268 
  2557         case EC_IOCTL_VOE_REC_HEADER:
  2596         case EC_IOCTL_VOE_REC_HEADER:
  2558 			return ec_cdev_ioctl_voe_rec_header(master, arg, priv);
  2597 			return ec_cdev_ioctl_voe_rec_header(master, arg, priv);
  2559         case EC_IOCTL_VOE_READ:
  2598         case EC_IOCTL_VOE_READ:
  2560             if (!(filp->f_mode & FMODE_WRITE))
  2599             if (!(filp->f_mode & FMODE_WRITE))
  2561 				return -EPERM;
  2600 				return -EPERM;
       
  2601         case EC_IOCTL_VOE_READ_NOSYNC:
       
  2602             if (!(filp->f_mode & FMODE_WRITE))
       
  2603 				return -EPERM;
       
  2604 			return ec_cdev_ioctl_voe_read_nosync(master, arg, priv);
  2562 			return ec_cdev_ioctl_voe_read(master, arg, priv);
  2605 			return ec_cdev_ioctl_voe_read(master, arg, priv);
  2563         case EC_IOCTL_VOE_WRITE:
  2606         case EC_IOCTL_VOE_WRITE:
  2564             if (!(filp->f_mode & FMODE_WRITE))
  2607             if (!(filp->f_mode & FMODE_WRITE))
  2565 				return -EPERM;
  2608 				return -EPERM;
  2566 			return ec_cdev_ioctl_voe_write(master, arg, priv);
  2609 			return ec_cdev_ioctl_voe_write(master, arg, priv);