master/cdev.c
changeset 1507 68e89abadd19
parent 1500 ed1a733efbc5
child 1509 a864688e7de5
equal deleted inserted replaced
1506:41ca84fb6bb2 1507:68e89abadd19
   106 /** Constructor.
   106 /** Constructor.
   107  * 
   107  * 
   108  * \return 0 in case of success, else < 0
   108  * \return 0 in case of success, else < 0
   109  */
   109  */
   110 int ec_cdev_init(
   110 int ec_cdev_init(
   111 		ec_cdev_t *cdev, /**< EtherCAT master character device. */
   111         ec_cdev_t *cdev, /**< EtherCAT master character device. */
   112 		ec_master_t *master, /**< Parent master. */
   112         ec_master_t *master, /**< Parent master. */
   113 		dev_t dev_num /**< Device number. */
   113         dev_t dev_num /**< Device number. */
   114 		)
   114         )
   115 {
   115 {
   116     int ret;
   116     int ret;
   117 
   117 
   118     cdev->master = master;
   118     cdev->master = master;
   119 
   119 
   120     cdev_init(&cdev->cdev, &eccdev_fops);
   120     cdev_init(&cdev->cdev, &eccdev_fops);
   121     cdev->cdev.owner = THIS_MODULE;
   121     cdev->cdev.owner = THIS_MODULE;
   122 
   122 
   123     ret = cdev_add(&cdev->cdev,
   123     ret = cdev_add(&cdev->cdev,
   124 		 MKDEV(MAJOR(dev_num), master->index), 1);
   124             MKDEV(MAJOR(dev_num), master->index), 1);
   125     if (ret) {
   125     if (ret) {
   126 		EC_ERR("Failed to add character device!\n");
   126         EC_ERR("Failed to add character device!\n");
   127     }
   127     }
   128 
   128 
   129     return ret;
   129     return ret;
   130 }
   130 }
   131 
   131 
  1447         ec_master_t *master, /**< EtherCAT master. */
  1447         ec_master_t *master, /**< EtherCAT master. */
  1448         unsigned long arg /**< ioctl() argument. */
  1448         unsigned long arg /**< ioctl() argument. */
  1449         )
  1449         )
  1450 {
  1450 {
  1451     ec_ioctl_eoe_handler_t data;
  1451     ec_ioctl_eoe_handler_t data;
  1452 	const ec_eoe_t *eoe;
  1452     const ec_eoe_t *eoe;
  1453 
  1453 
  1454     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  1454     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  1455         return -EFAULT;
  1455         return -EFAULT;
  1456     }
  1456     }
  1457 
  1457 
  1462         up(&master->master_sem);
  1462         up(&master->master_sem);
  1463         EC_ERR("EoE handler %u does not exist!\n", data.eoe_index);
  1463         EC_ERR("EoE handler %u does not exist!\n", data.eoe_index);
  1464         return -EINVAL;
  1464         return -EINVAL;
  1465     }
  1465     }
  1466 
  1466 
  1467 	if (eoe->slave) {
  1467     if (eoe->slave) {
  1468 		data.slave_position = eoe->slave->ring_position;
  1468         data.slave_position = eoe->slave->ring_position;
  1469 	} else {
  1469     } else {
  1470 		data.slave_position = 0xffff;
  1470         data.slave_position = 0xffff;
  1471 	}
  1471     }
  1472 	snprintf(data.name, EC_DATAGRAM_NAME_SIZE, eoe->dev->name);
  1472     snprintf(data.name, EC_DATAGRAM_NAME_SIZE, eoe->dev->name);
  1473     data.open = eoe->opened;
  1473     data.open = eoe->opened;
  1474     data.rx_bytes = eoe->stats.tx_bytes;
  1474     data.rx_bytes = eoe->stats.tx_bytes;
  1475     data.rx_rate = eoe->tx_rate;
  1475     data.rx_rate = eoe->tx_rate;
  1476     data.tx_bytes = eoe->stats.rx_bytes;
  1476     data.tx_bytes = eoe->stats.rx_bytes;
  1477     data.tx_rate = eoe->tx_rate;
  1477     data.tx_rate = eoe->tx_rate;
  1494         ec_master_t *master, /**< EtherCAT master. */
  1494         ec_master_t *master, /**< EtherCAT master. */
  1495         unsigned long arg, /**< ioctl() argument. */
  1495         unsigned long arg, /**< ioctl() argument. */
  1496         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1496         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1497         )
  1497         )
  1498 {
  1498 {
  1499 	ec_master_t *m;
  1499     ec_master_t *m;
  1500     int ret = 0;
  1500     int ret = 0;
  1501 
  1501 
  1502     m = ecrt_request_master_err(master->index);
  1502     m = ecrt_request_master_err(master->index);
  1503     if (IS_ERR(m)) {
  1503     if (IS_ERR(m)) {
  1504         ret = PTR_ERR(m);
  1504         ret = PTR_ERR(m);
  1519         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1519         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1520         )
  1520         )
  1521 {
  1521 {
  1522     ec_domain_t *domain;
  1522     ec_domain_t *domain;
  1523 
  1523 
  1524 	if (unlikely(!priv->requested))
  1524     if (unlikely(!priv->requested))
  1525 		return -EPERM;
  1525         return -EPERM;
  1526 
  1526 
  1527     domain = ecrt_master_create_domain_err(master);
  1527     domain = ecrt_master_create_domain_err(master);
  1528     if (IS_ERR(domain))
  1528     if (IS_ERR(domain))
  1529         return PTR_ERR(domain);
  1529         return PTR_ERR(domain);
  1530 
  1530 
  1542         )
  1542         )
  1543 {
  1543 {
  1544     ec_ioctl_config_t data;
  1544     ec_ioctl_config_t data;
  1545     ec_slave_config_t *sc, *entry;
  1545     ec_slave_config_t *sc, *entry;
  1546 
  1546 
  1547 	if (unlikely(!priv->requested))
  1547     if (unlikely(!priv->requested))
  1548 		return -EPERM;
  1548         return -EPERM;
  1549 
  1549 
  1550     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  1550     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  1551         return -EFAULT;
  1551         return -EFAULT;
  1552     }
  1552     }
  1553 
  1553 
  1587 {
  1587 {
  1588     ec_domain_t *domain;
  1588     ec_domain_t *domain;
  1589     off_t offset;
  1589     off_t offset;
  1590     int ret;
  1590     int ret;
  1591     
  1591     
  1592 	if (unlikely(!priv->requested))
  1592     if (unlikely(!priv->requested))
  1593 		return -EPERM;
  1593         return -EPERM;
  1594 
  1594 
  1595     /* Get the sum of the domains' process data sizes. */
  1595     /* Get the sum of the domains' process data sizes. */
  1596     
  1596     
  1597     priv->process_data_size = 0;
  1597     priv->process_data_size = 0;
  1598 
  1598 
  1643         ec_master_t *master, /**< EtherCAT master. */
  1643         ec_master_t *master, /**< EtherCAT master. */
  1644         unsigned long arg, /**< ioctl() argument. */
  1644         unsigned long arg, /**< ioctl() argument. */
  1645         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1645         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1646         )
  1646         )
  1647 {
  1647 {
  1648 	if (unlikely(!priv->requested))
  1648     if (unlikely(!priv->requested))
  1649 		return -EPERM;
  1649         return -EPERM;
  1650 
  1650 
  1651     down(&master->io_sem);
  1651     down(&master->io_sem);
  1652     ecrt_master_send(master);
  1652     ecrt_master_send(master);
  1653     up(&master->io_sem);
  1653     up(&master->io_sem);
  1654     return 0;
  1654     return 0;
  1662         ec_master_t *master, /**< EtherCAT master. */
  1662         ec_master_t *master, /**< EtherCAT master. */
  1663         unsigned long arg, /**< ioctl() argument. */
  1663         unsigned long arg, /**< ioctl() argument. */
  1664         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1664         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1665         )
  1665         )
  1666 {
  1666 {
  1667 	if (unlikely(!priv->requested))
  1667     if (unlikely(!priv->requested))
  1668 		return -EPERM;
  1668         return -EPERM;
  1669 
  1669 
  1670     down(&master->io_sem);
  1670     down(&master->io_sem);
  1671     ecrt_master_receive(master);
  1671     ecrt_master_receive(master);
  1672     up(&master->io_sem);
  1672     up(&master->io_sem);
  1673     return 0;
  1673     return 0;
  1683         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1683         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1684         )
  1684         )
  1685 {
  1685 {
  1686     ec_master_state_t data;
  1686     ec_master_state_t data;
  1687     
  1687     
  1688 	if (unlikely(!priv->requested))
  1688     if (unlikely(!priv->requested))
  1689 		return -EPERM;
  1689         return -EPERM;
  1690 
  1690 
  1691     ecrt_master_state(master, &data);
  1691     ecrt_master_state(master, &data);
  1692 
  1692 
  1693     if (copy_to_user((void __user *) arg, &data, sizeof(data)))
  1693     if (copy_to_user((void __user *) arg, &data, sizeof(data)))
  1694         return -EFAULT;
  1694         return -EFAULT;
  1706         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1706         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1707         )
  1707         )
  1708 {
  1708 {
  1709     ec_ioctl_app_time_t data;
  1709     ec_ioctl_app_time_t data;
  1710     
  1710     
  1711 	if (unlikely(!priv->requested))
  1711     if (unlikely(!priv->requested))
  1712 		return -EPERM;
  1712         return -EPERM;
  1713 
  1713 
  1714     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  1714     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  1715         return -EFAULT;
  1715         return -EFAULT;
  1716     }
  1716     }
  1717 
  1717 
  1727         ec_master_t *master, /**< EtherCAT master. */
  1727         ec_master_t *master, /**< EtherCAT master. */
  1728         unsigned long arg, /**< ioctl() argument. */
  1728         unsigned long arg, /**< ioctl() argument. */
  1729         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1729         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1730         )
  1730         )
  1731 {
  1731 {
  1732 	if (unlikely(!priv->requested))
  1732     if (unlikely(!priv->requested))
  1733 		return -EPERM;
  1733         return -EPERM;
  1734 
  1734 
  1735     down(&master->io_sem);
  1735     down(&master->io_sem);
  1736     ecrt_master_sync_reference_clock(master);
  1736     ecrt_master_sync_reference_clock(master);
  1737     up(&master->io_sem);
  1737     up(&master->io_sem);
  1738     return 0;
  1738     return 0;
  1746         ec_master_t *master, /**< EtherCAT master. */
  1746         ec_master_t *master, /**< EtherCAT master. */
  1747         unsigned long arg, /**< ioctl() argument. */
  1747         unsigned long arg, /**< ioctl() argument. */
  1748         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1748         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  1749         )
  1749         )
  1750 {
  1750 {
  1751 	if (unlikely(!priv->requested))
  1751     if (unlikely(!priv->requested))
  1752 		return -EPERM;
  1752         return -EPERM;
  1753 
  1753 
  1754     down(&master->io_sem);
  1754     down(&master->io_sem);
  1755     ecrt_master_sync_slave_clocks(master);
  1755     ecrt_master_sync_slave_clocks(master);
  1756     up(&master->io_sem);
  1756     up(&master->io_sem);
  1757     return 0;
  1757     return 0;
  1770     ec_ioctl_config_t data;
  1770     ec_ioctl_config_t data;
  1771     ec_slave_config_t *sc;
  1771     ec_slave_config_t *sc;
  1772     unsigned int i;
  1772     unsigned int i;
  1773     int ret = 0;
  1773     int ret = 0;
  1774 
  1774 
  1775 	if (unlikely(!priv->requested)) {
  1775     if (unlikely(!priv->requested)) {
  1776         ret = -EPERM;
  1776         ret = -EPERM;
  1777         goto out_return;
  1777         goto out_return;
  1778     }
  1778     }
  1779 
  1779 
  1780     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  1780     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  1819         )
  1819         )
  1820 {
  1820 {
  1821     ec_ioctl_config_pdo_t data;
  1821     ec_ioctl_config_pdo_t data;
  1822     ec_slave_config_t *sc;
  1822     ec_slave_config_t *sc;
  1823 
  1823 
  1824 	if (unlikely(!priv->requested))
  1824     if (unlikely(!priv->requested))
  1825         return -EPERM;
  1825         return -EPERM;
  1826 
  1826 
  1827     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  1827     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  1828         return -EFAULT;
  1828         return -EFAULT;
  1829 
  1829 
  1851         )
  1851         )
  1852 {
  1852 {
  1853     ec_ioctl_config_pdo_t data;
  1853     ec_ioctl_config_pdo_t data;
  1854     ec_slave_config_t *sc;
  1854     ec_slave_config_t *sc;
  1855 
  1855 
  1856 	if (unlikely(!priv->requested))
  1856     if (unlikely(!priv->requested))
  1857         return -EPERM;
  1857         return -EPERM;
  1858 
  1858 
  1859     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  1859     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  1860         return -EFAULT;
  1860         return -EFAULT;
  1861 
  1861 
  1884         )
  1884         )
  1885 {
  1885 {
  1886     ec_ioctl_add_pdo_entry_t data;
  1886     ec_ioctl_add_pdo_entry_t data;
  1887     ec_slave_config_t *sc;
  1887     ec_slave_config_t *sc;
  1888 
  1888 
  1889 	if (unlikely(!priv->requested))
  1889     if (unlikely(!priv->requested))
  1890         return -EPERM;
  1890         return -EPERM;
  1891 
  1891 
  1892     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  1892     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  1893         return -EFAULT;
  1893         return -EFAULT;
  1894 
  1894 
  1917         )
  1917         )
  1918 {
  1918 {
  1919     ec_ioctl_config_pdo_t data;
  1919     ec_ioctl_config_pdo_t data;
  1920     ec_slave_config_t *sc;
  1920     ec_slave_config_t *sc;
  1921 
  1921 
  1922 	if (unlikely(!priv->requested))
  1922     if (unlikely(!priv->requested))
  1923         return -EPERM;
  1923         return -EPERM;
  1924 
  1924 
  1925     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  1925     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  1926         return -EFAULT;
  1926         return -EFAULT;
  1927 
  1927 
  1952     ec_ioctl_reg_pdo_entry_t data;
  1952     ec_ioctl_reg_pdo_entry_t data;
  1953     ec_slave_config_t *sc;
  1953     ec_slave_config_t *sc;
  1954     ec_domain_t *domain;
  1954     ec_domain_t *domain;
  1955     int ret;
  1955     int ret;
  1956 
  1956 
  1957 	if (unlikely(!priv->requested))
  1957     if (unlikely(!priv->requested))
  1958         return -EPERM;
  1958         return -EPERM;
  1959 
  1959 
  1960     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  1960     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  1961         return -EFAULT;
  1961         return -EFAULT;
  1962 
  1962 
  1995         )
  1995         )
  1996 {
  1996 {
  1997     ec_ioctl_config_t data;
  1997     ec_ioctl_config_t data;
  1998     ec_slave_config_t *sc;
  1998     ec_slave_config_t *sc;
  1999 
  1999 
  2000 	if (unlikely(!priv->requested))
  2000     if (unlikely(!priv->requested))
  2001         return -EPERM;
  2001         return -EPERM;
  2002 
  2002 
  2003     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2003     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2004         return -EFAULT;
  2004         return -EFAULT;
  2005 
  2005 
  2035     ec_ioctl_sc_sdo_t data;
  2035     ec_ioctl_sc_sdo_t data;
  2036     ec_slave_config_t *sc;
  2036     ec_slave_config_t *sc;
  2037     uint8_t *sdo_data = NULL;
  2037     uint8_t *sdo_data = NULL;
  2038     int ret;
  2038     int ret;
  2039 
  2039 
  2040 	if (unlikely(!priv->requested))
  2040     if (unlikely(!priv->requested))
  2041         return -EPERM;
  2041         return -EPERM;
  2042 
  2042 
  2043     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2043     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2044         return -EFAULT;
  2044         return -EFAULT;
  2045 
  2045 
  2086 {
  2086 {
  2087     ec_ioctl_sdo_request_t data;
  2087     ec_ioctl_sdo_request_t data;
  2088     ec_slave_config_t *sc;
  2088     ec_slave_config_t *sc;
  2089     ec_sdo_request_t *req;
  2089     ec_sdo_request_t *req;
  2090 
  2090 
  2091 	if (unlikely(!priv->requested))
  2091     if (unlikely(!priv->requested))
  2092 		return -EPERM;
  2092         return -EPERM;
  2093 
  2093 
  2094     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  2094     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  2095         return -EFAULT;
  2095         return -EFAULT;
  2096     }
  2096     }
  2097 
  2097 
  2135 {
  2135 {
  2136     ec_ioctl_voe_t data;
  2136     ec_ioctl_voe_t data;
  2137     ec_slave_config_t *sc;
  2137     ec_slave_config_t *sc;
  2138     ec_voe_handler_t *voe;
  2138     ec_voe_handler_t *voe;
  2139 
  2139 
  2140 	if (unlikely(!priv->requested))
  2140     if (unlikely(!priv->requested))
  2141 		return -EPERM;
  2141         return -EPERM;
  2142 
  2142 
  2143     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  2143     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  2144         return -EFAULT;
  2144         return -EFAULT;
  2145     }
  2145     }
  2146 
  2146 
  2183 {
  2183 {
  2184     ec_ioctl_sc_state_t data;
  2184     ec_ioctl_sc_state_t data;
  2185     const ec_slave_config_t *sc;
  2185     const ec_slave_config_t *sc;
  2186     ec_slave_config_state_t state;
  2186     ec_slave_config_state_t state;
  2187     
  2187     
  2188 	if (unlikely(!priv->requested))
  2188     if (unlikely(!priv->requested))
  2189 		return -EPERM;
  2189         return -EPERM;
  2190 
  2190 
  2191     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  2191     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  2192         return -EFAULT;
  2192         return -EFAULT;
  2193     }
  2193     }
  2194 
  2194 
  2221         )
  2221         )
  2222 {
  2222 {
  2223     int offset = 0;
  2223     int offset = 0;
  2224     const ec_domain_t *domain;
  2224     const ec_domain_t *domain;
  2225 
  2225 
  2226 	if (unlikely(!priv->requested))
  2226     if (unlikely(!priv->requested))
  2227         return -EPERM;
  2227         return -EPERM;
  2228 
  2228 
  2229     if (down_interruptible(&master->master_sem)) {
  2229     if (down_interruptible(&master->master_sem)) {
  2230         return -EINTR;
  2230         return -EINTR;
  2231     }
  2231     }
  2252         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  2252         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  2253         )
  2253         )
  2254 {
  2254 {
  2255     ec_domain_t *domain;
  2255     ec_domain_t *domain;
  2256 
  2256 
  2257 	if (unlikely(!priv->requested))
  2257     if (unlikely(!priv->requested))
  2258         return -EPERM;
  2258         return -EPERM;
  2259 
  2259 
  2260     if (down_interruptible(&master->master_sem))
  2260     if (down_interruptible(&master->master_sem))
  2261         return -EINTR;
  2261         return -EINTR;
  2262 
  2262 
  2280         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  2280         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
  2281         )
  2281         )
  2282 {
  2282 {
  2283     ec_domain_t *domain;
  2283     ec_domain_t *domain;
  2284 
  2284 
  2285 	if (unlikely(!priv->requested))
  2285     if (unlikely(!priv->requested))
  2286         return -EPERM;
  2286         return -EPERM;
  2287 
  2287 
  2288     if (down_interruptible(&master->master_sem))
  2288     if (down_interruptible(&master->master_sem))
  2289         return -EINTR;
  2289         return -EINTR;
  2290 
  2290 
  2310 {
  2310 {
  2311     ec_ioctl_domain_state_t data;
  2311     ec_ioctl_domain_state_t data;
  2312     const ec_domain_t *domain;
  2312     const ec_domain_t *domain;
  2313     ec_domain_state_t state;
  2313     ec_domain_state_t state;
  2314     
  2314     
  2315 	if (unlikely(!priv->requested))
  2315     if (unlikely(!priv->requested))
  2316 		return -EPERM;
  2316         return -EPERM;
  2317 
  2317 
  2318     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  2318     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  2319         return -EFAULT;
  2319         return -EFAULT;
  2320     }
  2320     }
  2321 
  2321 
  2349 {
  2349 {
  2350     ec_ioctl_sdo_request_t data;
  2350     ec_ioctl_sdo_request_t data;
  2351     ec_slave_config_t *sc;
  2351     ec_slave_config_t *sc;
  2352     ec_sdo_request_t *req;
  2352     ec_sdo_request_t *req;
  2353 
  2353 
  2354 	if (unlikely(!priv->requested))
  2354     if (unlikely(!priv->requested))
  2355         return -EPERM;
  2355         return -EPERM;
  2356 
  2356 
  2357     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2357     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2358         return -EFAULT;
  2358         return -EFAULT;
  2359 
  2359 
  2388 {
  2388 {
  2389     ec_ioctl_sdo_request_t data;
  2389     ec_ioctl_sdo_request_t data;
  2390     ec_slave_config_t *sc;
  2390     ec_slave_config_t *sc;
  2391     ec_sdo_request_t *req;
  2391     ec_sdo_request_t *req;
  2392 
  2392 
  2393 	if (unlikely(!priv->requested))
  2393     if (unlikely(!priv->requested))
  2394         return -EPERM;
  2394         return -EPERM;
  2395 
  2395 
  2396     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2396     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2397         return -EFAULT;
  2397         return -EFAULT;
  2398 
  2398 
  2435 {
  2435 {
  2436     ec_ioctl_sdo_request_t data;
  2436     ec_ioctl_sdo_request_t data;
  2437     ec_slave_config_t *sc;
  2437     ec_slave_config_t *sc;
  2438     ec_sdo_request_t *req;
  2438     ec_sdo_request_t *req;
  2439 
  2439 
  2440 	if (unlikely(!priv->requested))
  2440     if (unlikely(!priv->requested))
  2441         return -EPERM;
  2441         return -EPERM;
  2442 
  2442 
  2443     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2443     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2444         return -EFAULT;
  2444         return -EFAULT;
  2445 
  2445 
  2475     ec_ioctl_sdo_request_t data;
  2475     ec_ioctl_sdo_request_t data;
  2476     ec_slave_config_t *sc;
  2476     ec_slave_config_t *sc;
  2477     ec_sdo_request_t *req;
  2477     ec_sdo_request_t *req;
  2478     int ret;
  2478     int ret;
  2479 
  2479 
  2480 	if (unlikely(!priv->requested))
  2480     if (unlikely(!priv->requested))
  2481         return -EPERM;
  2481         return -EPERM;
  2482 
  2482 
  2483     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2483     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2484         return -EFAULT;
  2484         return -EFAULT;
  2485 
  2485 
  2527 {
  2527 {
  2528     ec_ioctl_sdo_request_t data;
  2528     ec_ioctl_sdo_request_t data;
  2529     ec_slave_config_t *sc;
  2529     ec_slave_config_t *sc;
  2530     ec_sdo_request_t *req;
  2530     ec_sdo_request_t *req;
  2531 
  2531 
  2532 	if (unlikely(!priv->requested))
  2532     if (unlikely(!priv->requested))
  2533         return -EPERM;
  2533         return -EPERM;
  2534 
  2534 
  2535     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2535     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2536         return -EFAULT;
  2536         return -EFAULT;
  2537 
  2537 
  2571     ec_slave_config_t *sc;
  2571     ec_slave_config_t *sc;
  2572     ec_voe_handler_t *voe;
  2572     ec_voe_handler_t *voe;
  2573     uint32_t vendor_id;
  2573     uint32_t vendor_id;
  2574     uint16_t vendor_type;
  2574     uint16_t vendor_type;
  2575 
  2575 
  2576 	if (unlikely(!priv->requested))
  2576     if (unlikely(!priv->requested))
  2577         return -EPERM;
  2577         return -EPERM;
  2578 
  2578 
  2579     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2579     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2580         return -EFAULT;
  2580         return -EFAULT;
  2581 
  2581 
  2618     ec_slave_config_t *sc;
  2618     ec_slave_config_t *sc;
  2619     ec_voe_handler_t *voe;
  2619     ec_voe_handler_t *voe;
  2620     uint32_t vendor_id;
  2620     uint32_t vendor_id;
  2621     uint16_t vendor_type;
  2621     uint16_t vendor_type;
  2622 
  2622 
  2623 	if (unlikely(!priv->requested))
  2623     if (unlikely(!priv->requested))
  2624         return -EPERM;
  2624         return -EPERM;
  2625 
  2625 
  2626     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2626     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2627         return -EFAULT;
  2627         return -EFAULT;
  2628 
  2628 
  2666 {
  2666 {
  2667     ec_ioctl_voe_t data;
  2667     ec_ioctl_voe_t data;
  2668     ec_slave_config_t *sc;
  2668     ec_slave_config_t *sc;
  2669     ec_voe_handler_t *voe;
  2669     ec_voe_handler_t *voe;
  2670 
  2670 
  2671 	if (unlikely(!priv->requested))
  2671     if (unlikely(!priv->requested))
  2672         return -EPERM;
  2672         return -EPERM;
  2673 
  2673 
  2674     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2674     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2675         return -EFAULT;
  2675         return -EFAULT;
  2676 
  2676 
  2705 {
  2705 {
  2706     ec_ioctl_voe_t data;
  2706     ec_ioctl_voe_t data;
  2707     ec_slave_config_t *sc;
  2707     ec_slave_config_t *sc;
  2708     ec_voe_handler_t *voe;
  2708     ec_voe_handler_t *voe;
  2709 
  2709 
  2710 	if (unlikely(!priv->requested))
  2710     if (unlikely(!priv->requested))
  2711         return -EPERM;
  2711         return -EPERM;
  2712 
  2712 
  2713     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2713     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2714         return -EFAULT;
  2714         return -EFAULT;
  2715 
  2715 
  2744 {
  2744 {
  2745     ec_ioctl_voe_t data;
  2745     ec_ioctl_voe_t data;
  2746     ec_slave_config_t *sc;
  2746     ec_slave_config_t *sc;
  2747     ec_voe_handler_t *voe;
  2747     ec_voe_handler_t *voe;
  2748 
  2748 
  2749 	if (unlikely(!priv->requested))
  2749     if (unlikely(!priv->requested))
  2750         return -EPERM;
  2750         return -EPERM;
  2751 
  2751 
  2752     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2752     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2753         return -EFAULT;
  2753         return -EFAULT;
  2754 
  2754 
  2792 {
  2792 {
  2793     ec_ioctl_voe_t data;
  2793     ec_ioctl_voe_t data;
  2794     ec_slave_config_t *sc;
  2794     ec_slave_config_t *sc;
  2795     ec_voe_handler_t *voe;
  2795     ec_voe_handler_t *voe;
  2796 
  2796 
  2797 	if (unlikely(!priv->requested))
  2797     if (unlikely(!priv->requested))
  2798         return -EPERM;
  2798         return -EPERM;
  2799 
  2799 
  2800     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2800     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2801         return -EFAULT;
  2801         return -EFAULT;
  2802 
  2802 
  2839 {
  2839 {
  2840     ec_ioctl_voe_t data;
  2840     ec_ioctl_voe_t data;
  2841     ec_slave_config_t *sc;
  2841     ec_slave_config_t *sc;
  2842     ec_voe_handler_t *voe;
  2842     ec_voe_handler_t *voe;
  2843 
  2843 
  2844 	if (unlikely(!priv->requested))
  2844     if (unlikely(!priv->requested))
  2845         return -EPERM;
  2845         return -EPERM;
  2846 
  2846 
  2847     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2847     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
  2848         return -EFAULT;
  2848         return -EFAULT;
  2849 
  2849 
  2930     wait_event(master->foe_queue, request.req.state != EC_INT_REQUEST_BUSY);
  2930     wait_event(master->foe_queue, request.req.state != EC_INT_REQUEST_BUSY);
  2931 
  2931 
  2932     data.result = request.req.result;
  2932     data.result = request.req.result;
  2933     data.error_code = request.req.error_code;
  2933     data.error_code = request.req.error_code;
  2934 
  2934 
  2935 	if (master->debug_level) {
  2935     if (master->debug_level) {
  2936 		EC_DBG("Read %d bytes via FoE (result = 0x%x).\n",
  2936         EC_DBG("Read %d bytes via FoE (result = 0x%x).\n",
  2937 				request.req.data_size, request.req.result);
  2937                 request.req.data_size, request.req.result);
  2938 	}
  2938     }
  2939 
  2939 
  2940     if (request.req.state != EC_INT_REQUEST_SUCCESS) {
  2940     if (request.req.state != EC_INT_REQUEST_SUCCESS) {
  2941         data.data_size = 0;
  2941         data.data_size = 0;
  2942         retval = -EIO;
  2942         retval = -EIO;
  2943     } else {
  2943     } else {
  3010         EC_ERR("Slave %u does not exist!\n", data.slave_position);
  3010         EC_ERR("Slave %u does not exist!\n", data.slave_position);
  3011         ec_foe_request_clear(&request.req);
  3011         ec_foe_request_clear(&request.req);
  3012         return -EINVAL;
  3012         return -EINVAL;
  3013     }
  3013     }
  3014 
  3014 
  3015 	if (master->debug_level) {
  3015     if (master->debug_level) {
  3016 		EC_DBG("Scheduling FoE write request.\n");
  3016         EC_DBG("Scheduling FoE write request.\n");
  3017 	}
  3017     }
  3018 
  3018 
  3019     // schedule FoE write request.
  3019     // schedule FoE write request.
  3020     list_add_tail(&request.list, &master->foe_requests);
  3020     list_add_tail(&request.list, &master->foe_requests);
  3021 
  3021 
  3022     up(&master->master_sem);
  3022     up(&master->master_sem);
  3048         retval = -EFAULT;
  3048         retval = -EFAULT;
  3049     }
  3049     }
  3050 
  3050 
  3051     ec_foe_request_clear(&request.req);
  3051     ec_foe_request_clear(&request.req);
  3052 
  3052 
  3053 	if (master->debug_level) {
  3053     if (master->debug_level) {
  3054 		printk ("Finished FoE writing.\n");
  3054         printk("Finished FoE writing.\n");
  3055 	}
  3055     }
  3056 
  3056 
  3057     return retval;
  3057     return retval;
  3058 }
  3058 }
  3059 
  3059 
  3060 /******************************************************************************
  3060 /******************************************************************************
  3187             return ec_cdev_ioctl_config_sdo(master, arg);
  3187             return ec_cdev_ioctl_config_sdo(master, arg);
  3188         case EC_IOCTL_EOE_HANDLER:
  3188         case EC_IOCTL_EOE_HANDLER:
  3189             return ec_cdev_ioctl_eoe_handler(master, arg);
  3189             return ec_cdev_ioctl_eoe_handler(master, arg);
  3190         case EC_IOCTL_REQUEST:
  3190         case EC_IOCTL_REQUEST:
  3191             if (!(filp->f_mode & FMODE_WRITE))
  3191             if (!(filp->f_mode & FMODE_WRITE))
  3192 				return -EPERM;
  3192                 return -EPERM;
  3193 			return ec_cdev_ioctl_request(master, arg, priv);
  3193             return ec_cdev_ioctl_request(master, arg, priv);
  3194         case EC_IOCTL_CREATE_DOMAIN:
  3194         case EC_IOCTL_CREATE_DOMAIN:
  3195             if (!(filp->f_mode & FMODE_WRITE))
  3195             if (!(filp->f_mode & FMODE_WRITE))
  3196 				return -EPERM;
  3196                 return -EPERM;
  3197 			return ec_cdev_ioctl_create_domain(master, arg, priv);
  3197             return ec_cdev_ioctl_create_domain(master, arg, priv);
  3198         case EC_IOCTL_CREATE_SLAVE_CONFIG:
  3198         case EC_IOCTL_CREATE_SLAVE_CONFIG:
  3199             if (!(filp->f_mode & FMODE_WRITE))
  3199             if (!(filp->f_mode & FMODE_WRITE))
  3200 				return -EPERM;
  3200                 return -EPERM;
  3201 			return ec_cdev_ioctl_create_slave_config(master, arg, priv);
  3201             return ec_cdev_ioctl_create_slave_config(master, arg, priv);
  3202         case EC_IOCTL_ACTIVATE:
  3202         case EC_IOCTL_ACTIVATE:
  3203             if (!(filp->f_mode & FMODE_WRITE))
  3203             if (!(filp->f_mode & FMODE_WRITE))
  3204 				return -EPERM;
  3204                 return -EPERM;
  3205 			return ec_cdev_ioctl_activate(master, arg, priv);
  3205             return ec_cdev_ioctl_activate(master, arg, priv);
  3206         case EC_IOCTL_SEND:
  3206         case EC_IOCTL_SEND:
  3207             if (!(filp->f_mode & FMODE_WRITE))
  3207             if (!(filp->f_mode & FMODE_WRITE))
  3208 				return -EPERM;
  3208                 return -EPERM;
  3209 			return ec_cdev_ioctl_send(master, arg, priv);
  3209             return ec_cdev_ioctl_send(master, arg, priv);
  3210         case EC_IOCTL_RECEIVE:
  3210         case EC_IOCTL_RECEIVE:
  3211             if (!(filp->f_mode & FMODE_WRITE))
  3211             if (!(filp->f_mode & FMODE_WRITE))
  3212 				return -EPERM;
  3212                 return -EPERM;
  3213 			return ec_cdev_ioctl_receive(master, arg, priv);
  3213             return ec_cdev_ioctl_receive(master, arg, priv);
  3214         case EC_IOCTL_MASTER_STATE:
  3214         case EC_IOCTL_MASTER_STATE:
  3215 			return ec_cdev_ioctl_master_state(master, arg, priv);
  3215             return ec_cdev_ioctl_master_state(master, arg, priv);
  3216         case EC_IOCTL_APP_TIME:
  3216         case EC_IOCTL_APP_TIME:
  3217             if (!(filp->f_mode & FMODE_WRITE))
  3217             if (!(filp->f_mode & FMODE_WRITE))
  3218 				return -EPERM;
  3218                 return -EPERM;
  3219 			return ec_cdev_ioctl_app_time(master, arg, priv);
  3219             return ec_cdev_ioctl_app_time(master, arg, priv);
  3220         case EC_IOCTL_SYNC_REF:
  3220         case EC_IOCTL_SYNC_REF:
  3221             if (!(filp->f_mode & FMODE_WRITE))
  3221             if (!(filp->f_mode & FMODE_WRITE))
  3222 				return -EPERM;
  3222                 return -EPERM;
  3223 			return ec_cdev_ioctl_sync_ref(master, arg, priv);
  3223             return ec_cdev_ioctl_sync_ref(master, arg, priv);
  3224         case EC_IOCTL_SYNC_SLAVES:
  3224         case EC_IOCTL_SYNC_SLAVES:
  3225             if (!(filp->f_mode & FMODE_WRITE))
  3225             if (!(filp->f_mode & FMODE_WRITE))
  3226 				return -EPERM;
  3226                 return -EPERM;
  3227 			return ec_cdev_ioctl_sync_slaves(master, arg, priv);
  3227             return ec_cdev_ioctl_sync_slaves(master, arg, priv);
  3228         case EC_IOCTL_SC_SYNC:
  3228         case EC_IOCTL_SC_SYNC:
  3229             if (!(filp->f_mode & FMODE_WRITE))
  3229             if (!(filp->f_mode & FMODE_WRITE))
  3230 				return -EPERM;
  3230                 return -EPERM;
  3231 			return ec_cdev_ioctl_sc_sync(master, arg, priv);
  3231             return ec_cdev_ioctl_sc_sync(master, arg, priv);
  3232         case EC_IOCTL_SC_ADD_PDO:
  3232         case EC_IOCTL_SC_ADD_PDO:
  3233             if (!(filp->f_mode & FMODE_WRITE))
  3233             if (!(filp->f_mode & FMODE_WRITE))
  3234 				return -EPERM;
  3234                 return -EPERM;
  3235 			return ec_cdev_ioctl_sc_add_pdo(master, arg, priv);
  3235             return ec_cdev_ioctl_sc_add_pdo(master, arg, priv);
  3236         case EC_IOCTL_SC_CLEAR_PDOS:
  3236         case EC_IOCTL_SC_CLEAR_PDOS:
  3237             if (!(filp->f_mode & FMODE_WRITE))
  3237             if (!(filp->f_mode & FMODE_WRITE))
  3238 				return -EPERM;
  3238                 return -EPERM;
  3239 			return ec_cdev_ioctl_sc_clear_pdos(master, arg, priv);
  3239             return ec_cdev_ioctl_sc_clear_pdos(master, arg, priv);
  3240         case EC_IOCTL_SC_ADD_ENTRY:
  3240         case EC_IOCTL_SC_ADD_ENTRY:
  3241             if (!(filp->f_mode & FMODE_WRITE))
  3241             if (!(filp->f_mode & FMODE_WRITE))
  3242 				return -EPERM;
  3242                 return -EPERM;
  3243 			return ec_cdev_ioctl_sc_add_entry(master, arg, priv);
  3243             return ec_cdev_ioctl_sc_add_entry(master, arg, priv);
  3244         case EC_IOCTL_SC_CLEAR_ENTRIES:
  3244         case EC_IOCTL_SC_CLEAR_ENTRIES:
  3245             if (!(filp->f_mode & FMODE_WRITE))
  3245             if (!(filp->f_mode & FMODE_WRITE))
  3246 				return -EPERM;
  3246                 return -EPERM;
  3247 			return ec_cdev_ioctl_sc_clear_entries(master, arg, priv);
  3247             return ec_cdev_ioctl_sc_clear_entries(master, arg, priv);
  3248         case EC_IOCTL_SC_REG_PDO_ENTRY:
  3248         case EC_IOCTL_SC_REG_PDO_ENTRY:
  3249             if (!(filp->f_mode & FMODE_WRITE))
  3249             if (!(filp->f_mode & FMODE_WRITE))
  3250 				return -EPERM;
  3250                 return -EPERM;
  3251 			return ec_cdev_ioctl_sc_reg_pdo_entry(master, arg, priv);
  3251             return ec_cdev_ioctl_sc_reg_pdo_entry(master, arg, priv);
  3252         case EC_IOCTL_SC_DC:
  3252         case EC_IOCTL_SC_DC:
  3253             if (!(filp->f_mode & FMODE_WRITE))
  3253             if (!(filp->f_mode & FMODE_WRITE))
  3254 				return -EPERM;
  3254                 return -EPERM;
  3255 			return ec_cdev_ioctl_sc_dc(master, arg, priv);
  3255             return ec_cdev_ioctl_sc_dc(master, arg, priv);
  3256         case EC_IOCTL_SC_SDO:
  3256         case EC_IOCTL_SC_SDO:
  3257             if (!(filp->f_mode & FMODE_WRITE))
  3257             if (!(filp->f_mode & FMODE_WRITE))
  3258 				return -EPERM;
  3258                 return -EPERM;
  3259 			return ec_cdev_ioctl_sc_sdo(master, arg, priv);
  3259             return ec_cdev_ioctl_sc_sdo(master, arg, priv);
  3260         case EC_IOCTL_SC_SDO_REQUEST:
  3260         case EC_IOCTL_SC_SDO_REQUEST:
  3261             if (!(filp->f_mode & FMODE_WRITE))
  3261             if (!(filp->f_mode & FMODE_WRITE))
  3262 				return -EPERM;
  3262                 return -EPERM;
  3263 			return ec_cdev_ioctl_sc_create_sdo_request(master, arg, priv);
  3263             return ec_cdev_ioctl_sc_create_sdo_request(master, arg, priv);
  3264         case EC_IOCTL_SC_VOE:
  3264         case EC_IOCTL_SC_VOE:
  3265             if (!(filp->f_mode & FMODE_WRITE))
  3265             if (!(filp->f_mode & FMODE_WRITE))
  3266 				return -EPERM;
  3266                 return -EPERM;
  3267 			return ec_cdev_ioctl_sc_create_voe_handler(master, arg, priv);
  3267             return ec_cdev_ioctl_sc_create_voe_handler(master, arg, priv);
  3268         case EC_IOCTL_SC_STATE:
  3268         case EC_IOCTL_SC_STATE:
  3269 			return ec_cdev_ioctl_sc_state(master, arg, priv);
  3269             return ec_cdev_ioctl_sc_state(master, arg, priv);
  3270         case EC_IOCTL_DOMAIN_OFFSET:
  3270         case EC_IOCTL_DOMAIN_OFFSET:
  3271 			return ec_cdev_ioctl_domain_offset(master, arg, priv);
  3271             return ec_cdev_ioctl_domain_offset(master, arg, priv);
  3272         case EC_IOCTL_DOMAIN_PROCESS:
  3272         case EC_IOCTL_DOMAIN_PROCESS:
  3273             if (!(filp->f_mode & FMODE_WRITE))
  3273             if (!(filp->f_mode & FMODE_WRITE))
  3274 				return -EPERM;
  3274                 return -EPERM;
  3275 			return ec_cdev_ioctl_domain_process(master, arg, priv);
  3275             return ec_cdev_ioctl_domain_process(master, arg, priv);
  3276         case EC_IOCTL_DOMAIN_QUEUE:
  3276         case EC_IOCTL_DOMAIN_QUEUE:
  3277             if (!(filp->f_mode & FMODE_WRITE))
  3277             if (!(filp->f_mode & FMODE_WRITE))
  3278 				return -EPERM;
  3278                 return -EPERM;
  3279 			return ec_cdev_ioctl_domain_queue(master, arg, priv);
  3279             return ec_cdev_ioctl_domain_queue(master, arg, priv);
  3280         case EC_IOCTL_DOMAIN_STATE:
  3280         case EC_IOCTL_DOMAIN_STATE:
  3281 			return ec_cdev_ioctl_domain_state(master, arg, priv);
  3281             return ec_cdev_ioctl_domain_state(master, arg, priv);
  3282         case EC_IOCTL_SDO_REQUEST_TIMEOUT:
  3282         case EC_IOCTL_SDO_REQUEST_TIMEOUT:
  3283             if (!(filp->f_mode & FMODE_WRITE))
  3283             if (!(filp->f_mode & FMODE_WRITE))
  3284 				return -EPERM;
  3284                 return -EPERM;
  3285 			return ec_cdev_ioctl_sdo_request_timeout(master, arg, priv);
  3285             return ec_cdev_ioctl_sdo_request_timeout(master, arg, priv);
  3286         case EC_IOCTL_SDO_REQUEST_STATE:
  3286         case EC_IOCTL_SDO_REQUEST_STATE:
  3287 			return ec_cdev_ioctl_sdo_request_state(master, arg, priv);
  3287             return ec_cdev_ioctl_sdo_request_state(master, arg, priv);
  3288         case EC_IOCTL_SDO_REQUEST_READ:
  3288         case EC_IOCTL_SDO_REQUEST_READ:
  3289             if (!(filp->f_mode & FMODE_WRITE))
  3289             if (!(filp->f_mode & FMODE_WRITE))
  3290 				return -EPERM;
  3290                 return -EPERM;
  3291 			return ec_cdev_ioctl_sdo_request_read(master, arg, priv);
  3291             return ec_cdev_ioctl_sdo_request_read(master, arg, priv);
  3292         case EC_IOCTL_SDO_REQUEST_WRITE:
  3292         case EC_IOCTL_SDO_REQUEST_WRITE:
  3293             if (!(filp->f_mode & FMODE_WRITE))
  3293             if (!(filp->f_mode & FMODE_WRITE))
  3294 				return -EPERM;
  3294                 return -EPERM;
  3295 			return ec_cdev_ioctl_sdo_request_write(master, arg, priv);
  3295             return ec_cdev_ioctl_sdo_request_write(master, arg, priv);
  3296         case EC_IOCTL_SDO_REQUEST_DATA:
  3296         case EC_IOCTL_SDO_REQUEST_DATA:
  3297 			return ec_cdev_ioctl_sdo_request_data(master, arg, priv);
  3297             return ec_cdev_ioctl_sdo_request_data(master, arg, priv);
  3298         case EC_IOCTL_VOE_SEND_HEADER:
  3298         case EC_IOCTL_VOE_SEND_HEADER:
  3299             if (!(filp->f_mode & FMODE_WRITE))
  3299             if (!(filp->f_mode & FMODE_WRITE))
  3300 				return -EPERM;
  3300                 return -EPERM;
  3301 			return ec_cdev_ioctl_voe_send_header(master, arg, priv);
  3301             return ec_cdev_ioctl_voe_send_header(master, arg, priv);
  3302         case EC_IOCTL_VOE_REC_HEADER:
  3302         case EC_IOCTL_VOE_REC_HEADER:
  3303 			return ec_cdev_ioctl_voe_rec_header(master, arg, priv);
  3303             return ec_cdev_ioctl_voe_rec_header(master, arg, priv);
  3304         case EC_IOCTL_VOE_READ:
  3304         case EC_IOCTL_VOE_READ:
  3305             if (!(filp->f_mode & FMODE_WRITE))
  3305             if (!(filp->f_mode & FMODE_WRITE))
  3306 				return -EPERM;
  3306                 return -EPERM;
  3307 			return ec_cdev_ioctl_voe_read(master, arg, priv);
  3307             return ec_cdev_ioctl_voe_read(master, arg, priv);
  3308         case EC_IOCTL_VOE_READ_NOSYNC:
  3308         case EC_IOCTL_VOE_READ_NOSYNC:
  3309             if (!(filp->f_mode & FMODE_WRITE))
  3309             if (!(filp->f_mode & FMODE_WRITE))
  3310 				return -EPERM;
  3310                 return -EPERM;
  3311 			return ec_cdev_ioctl_voe_read_nosync(master, arg, priv);
  3311             return ec_cdev_ioctl_voe_read_nosync(master, arg, priv);
  3312         case EC_IOCTL_VOE_WRITE:
  3312         case EC_IOCTL_VOE_WRITE:
  3313             if (!(filp->f_mode & FMODE_WRITE))
  3313             if (!(filp->f_mode & FMODE_WRITE))
  3314 				return -EPERM;
  3314                 return -EPERM;
  3315 			return ec_cdev_ioctl_voe_write(master, arg, priv);
  3315             return ec_cdev_ioctl_voe_write(master, arg, priv);
  3316         case EC_IOCTL_VOE_EXEC:
  3316         case EC_IOCTL_VOE_EXEC:
  3317             if (!(filp->f_mode & FMODE_WRITE))
  3317             if (!(filp->f_mode & FMODE_WRITE))
  3318 				return -EPERM;
  3318                 return -EPERM;
  3319 			return ec_cdev_ioctl_voe_exec(master, arg, priv);
  3319             return ec_cdev_ioctl_voe_exec(master, arg, priv);
  3320         case EC_IOCTL_VOE_DATA:
  3320         case EC_IOCTL_VOE_DATA:
  3321 			return ec_cdev_ioctl_voe_data(master, arg, priv);
  3321             return ec_cdev_ioctl_voe_data(master, arg, priv);
  3322         default:
  3322         default:
  3323             return -ENOTTY;
  3323             return -ENOTTY;
  3324     }
  3324     }
  3325 }
  3325 }
  3326 
  3326