master/cdev.c
changeset 1247 5f1f1a3e6636
parent 1246 4042bda8c980
child 1255 38b7e05b20c1
equal deleted inserted replaced
1246:4042bda8c980 1247:5f1f1a3e6636
  1447     up(&master->master_sem);
  1447     up(&master->master_sem);
  1448 
  1448 
  1449     if (copy_to_user((void __user *) arg, &data, sizeof(data)))
  1449     if (copy_to_user((void __user *) arg, &data, sizeof(data)))
  1450         return -EFAULT;
  1450         return -EFAULT;
  1451 
  1451 
       
  1452     return 0;
       
  1453 }
       
  1454 
       
  1455 /*****************************************************************************/
       
  1456 
       
  1457 /** Activates the master.
       
  1458  */
       
  1459 int ec_cdev_ioctl_activate(
       
  1460         ec_master_t *master, /**< EtherCAT master. */
       
  1461         unsigned long arg, /**< ioctl() argument. */
       
  1462         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1463         )
       
  1464 {
       
  1465 	if (unlikely(!priv->requested))
       
  1466 		return -EPERM;
       
  1467 
       
  1468     if (ecrt_master_activate(master))
       
  1469         return -EIO;
       
  1470 
       
  1471     return 0;
       
  1472 }
       
  1473 
       
  1474 /*****************************************************************************/
       
  1475 
       
  1476 /** Send frames.
       
  1477  */
       
  1478 int ec_cdev_ioctl_send(
       
  1479         ec_master_t *master, /**< EtherCAT master. */
       
  1480         unsigned long arg, /**< ioctl() argument. */
       
  1481         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1482         )
       
  1483 {
       
  1484 	if (unlikely(!priv->requested))
       
  1485 		return -EPERM;
       
  1486 
       
  1487     spin_lock_bh(&master->internal_lock);
       
  1488     ecrt_master_send(master);
       
  1489     spin_unlock_bh(&master->internal_lock);
       
  1490     return 0;
       
  1491 }
       
  1492 
       
  1493 /*****************************************************************************/
       
  1494 
       
  1495 /** Receive frames.
       
  1496  */
       
  1497 int ec_cdev_ioctl_receive(
       
  1498         ec_master_t *master, /**< EtherCAT master. */
       
  1499         unsigned long arg, /**< ioctl() argument. */
       
  1500         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1501         )
       
  1502 {
       
  1503 	if (unlikely(!priv->requested))
       
  1504 		return -EPERM;
       
  1505 
       
  1506     spin_lock_bh(&master->internal_lock);
       
  1507     ecrt_master_receive(master);
       
  1508     spin_unlock_bh(&master->internal_lock);
  1452     return 0;
  1509     return 0;
  1453 }
  1510 }
  1454 
  1511 
  1455 /******************************************************************************
  1512 /******************************************************************************
  1456  * File operations
  1513  * File operations
  1575 			return ec_cdev_ioctl_create_domain(master, arg, priv);
  1632 			return ec_cdev_ioctl_create_domain(master, arg, priv);
  1576         case EC_IOCTL_CREATE_SLAVE_CONFIG:
  1633         case EC_IOCTL_CREATE_SLAVE_CONFIG:
  1577             if (!(filp->f_mode & FMODE_WRITE))
  1634             if (!(filp->f_mode & FMODE_WRITE))
  1578 				return -EPERM;
  1635 				return -EPERM;
  1579 			return ec_cdev_ioctl_create_slave_config(master, arg, priv);
  1636 			return ec_cdev_ioctl_create_slave_config(master, arg, priv);
       
  1637         case EC_IOCTL_ACTIVATE:
       
  1638             if (!(filp->f_mode & FMODE_WRITE))
       
  1639 				return -EPERM;
       
  1640 			return ec_cdev_ioctl_activate(master, arg, priv);
       
  1641         case EC_IOCTL_SEND:
       
  1642             if (!(filp->f_mode & FMODE_WRITE))
       
  1643 				return -EPERM;
       
  1644 			return ec_cdev_ioctl_send(master, arg, priv);
       
  1645         case EC_IOCTL_RECEIVE:
       
  1646             if (!(filp->f_mode & FMODE_WRITE))
       
  1647 				return -EPERM;
       
  1648 			return ec_cdev_ioctl_receive(master, arg, priv);
  1580         default:
  1649         default:
  1581             return -ENOTTY;
  1650             return -ENOTTY;
  1582     }
  1651     }
  1583 }
  1652 }
  1584 
  1653