master/cdev.c
changeset 1259 5f9d1abbee71
parent 1258 900f1124e8f8
child 1264 e7882f246d7a
equal deleted inserted replaced
1258:900f1124e8f8 1259:5f9d1abbee71
  1558     return 0;
  1558     return 0;
  1559 }
  1559 }
  1560 
  1560 
  1561 /*****************************************************************************/
  1561 /*****************************************************************************/
  1562 
  1562 
       
  1563 /** Get the master state.
       
  1564  */
       
  1565 int ec_cdev_ioctl_master_state(
       
  1566         ec_master_t *master, /**< EtherCAT master. */
       
  1567         unsigned long arg, /**< ioctl() argument. */
       
  1568         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1569         )
       
  1570 {
       
  1571     ec_master_state_t data;
       
  1572     
       
  1573 	if (unlikely(!priv->requested))
       
  1574 		return -EPERM;
       
  1575 
       
  1576     ecrt_master_state(master, &data);
       
  1577 
       
  1578     if (copy_to_user((void __user *) arg, &data, sizeof(data)))
       
  1579         return -EFAULT;
       
  1580 
       
  1581     return 0;
       
  1582 }
       
  1583 
       
  1584 /*****************************************************************************/
       
  1585 
  1563 /** Set the direction of a sync manager.
  1586 /** Set the direction of a sync manager.
  1564  */
  1587  */
  1565 int ec_cdev_ioctl_sc_sync(
  1588 int ec_cdev_ioctl_sc_sync(
  1566         ec_master_t *master, /**< EtherCAT master. */
  1589         ec_master_t *master, /**< EtherCAT master. */
  1567         unsigned long arg, /**< ioctl() argument. */
  1590         unsigned long arg, /**< ioctl() argument. */
  1837     return ret;
  1860     return ret;
  1838 }
  1861 }
  1839 
  1862 
  1840 /*****************************************************************************/
  1863 /*****************************************************************************/
  1841 
  1864 
       
  1865 /** Get the slave configuration's state.
       
  1866  */
       
  1867 int ec_cdev_ioctl_sc_state(
       
  1868         ec_master_t *master, /**< EtherCAT master. */
       
  1869         unsigned long arg, /**< ioctl() argument. */
       
  1870         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1871         )
       
  1872 {
       
  1873     ec_ioctl_sc_state_t data;
       
  1874     const ec_slave_config_t *sc;
       
  1875     ec_slave_config_state_t state;
       
  1876     
       
  1877 	if (unlikely(!priv->requested))
       
  1878 		return -EPERM;
       
  1879 
       
  1880     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
       
  1881         return -EFAULT;
       
  1882     }
       
  1883 
       
  1884     if (down_interruptible(&master->master_sem))
       
  1885         return -EINTR;
       
  1886 
       
  1887     if (!(sc = ec_master_get_config_const(master, data.config_index))) {
       
  1888         up(&master->master_sem);
       
  1889         return -ESRCH;
       
  1890     }
       
  1891 
       
  1892     ecrt_slave_config_state(sc, &state);
       
  1893 
       
  1894     up(&master->master_sem);
       
  1895 
       
  1896     if (copy_to_user((void __user *) data.state, &state, sizeof(state)))
       
  1897         return -EFAULT;
       
  1898 
       
  1899     return 0;
       
  1900 }
       
  1901 
       
  1902 /*****************************************************************************/
       
  1903 
  1842 /** Gets the domain's offset in the total process data.
  1904 /** Gets the domain's offset in the total process data.
  1843  */
  1905  */
  1844 int ec_cdev_ioctl_domain_offset(
  1906 int ec_cdev_ioctl_domain_offset(
  1845         ec_master_t *master, /**< EtherCAT master. */
  1907         ec_master_t *master, /**< EtherCAT master. */
  1846         unsigned long arg, /**< ioctl() argument. */
  1908         unsigned long arg, /**< ioctl() argument. */
  1920         return -ESRCH;
  1982         return -ESRCH;
  1921     }
  1983     }
  1922 
  1984 
  1923     ecrt_domain_queue(domain);
  1985     ecrt_domain_queue(domain);
  1924     up(&master->master_sem);
  1986     up(&master->master_sem);
       
  1987     return 0;
       
  1988 }
       
  1989 
       
  1990 /*****************************************************************************/
       
  1991 
       
  1992 /** Get the domain state.
       
  1993  */
       
  1994 int ec_cdev_ioctl_domain_state(
       
  1995         ec_master_t *master, /**< EtherCAT master. */
       
  1996         unsigned long arg, /**< ioctl() argument. */
       
  1997         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1998         )
       
  1999 {
       
  2000     ec_ioctl_domain_state_t data;
       
  2001     const ec_domain_t *domain;
       
  2002     ec_domain_state_t state;
       
  2003     
       
  2004 	if (unlikely(!priv->requested))
       
  2005 		return -EPERM;
       
  2006 
       
  2007     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
       
  2008         return -EFAULT;
       
  2009     }
       
  2010 
       
  2011     if (down_interruptible(&master->master_sem))
       
  2012         return -EINTR;
       
  2013 
       
  2014     if (!(domain = ec_master_find_domain_const(master, data.domain_index))) {
       
  2015         up(&master->master_sem);
       
  2016         return -ESRCH;
       
  2017     }
       
  2018 
       
  2019     ecrt_domain_state(domain, &state);
       
  2020 
       
  2021     up(&master->master_sem);
       
  2022 
       
  2023     if (copy_to_user((void __user *) data.state, &state, sizeof(state)))
       
  2024         return -EFAULT;
       
  2025 
  1925     return 0;
  2026     return 0;
  1926 }
  2027 }
  1927 
  2028 
  1928 /******************************************************************************
  2029 /******************************************************************************
  1929  * File operations
  2030  * File operations
  2065 			return ec_cdev_ioctl_send(master, arg, priv);
  2166 			return ec_cdev_ioctl_send(master, arg, priv);
  2066         case EC_IOCTL_RECEIVE:
  2167         case EC_IOCTL_RECEIVE:
  2067             if (!(filp->f_mode & FMODE_WRITE))
  2168             if (!(filp->f_mode & FMODE_WRITE))
  2068 				return -EPERM;
  2169 				return -EPERM;
  2069 			return ec_cdev_ioctl_receive(master, arg, priv);
  2170 			return ec_cdev_ioctl_receive(master, arg, priv);
       
  2171         case EC_IOCTL_MASTER_STATE:
       
  2172 			return ec_cdev_ioctl_master_state(master, arg, priv);
  2070         case EC_IOCTL_SC_SYNC:
  2173         case EC_IOCTL_SC_SYNC:
  2071             if (!(filp->f_mode & FMODE_WRITE))
  2174             if (!(filp->f_mode & FMODE_WRITE))
  2072 				return -EPERM;
  2175 				return -EPERM;
  2073 			return ec_cdev_ioctl_sc_sync(master, arg, priv);
  2176 			return ec_cdev_ioctl_sc_sync(master, arg, priv);
  2074         case EC_IOCTL_SC_ADD_PDO:
  2177         case EC_IOCTL_SC_ADD_PDO:
  2093 			return ec_cdev_ioctl_sc_reg_pdo_entry(master, arg, priv);
  2196 			return ec_cdev_ioctl_sc_reg_pdo_entry(master, arg, priv);
  2094         case EC_IOCTL_SC_SDO:
  2197         case EC_IOCTL_SC_SDO:
  2095             if (!(filp->f_mode & FMODE_WRITE))
  2198             if (!(filp->f_mode & FMODE_WRITE))
  2096 				return -EPERM;
  2199 				return -EPERM;
  2097 			return ec_cdev_ioctl_sc_sdo(master, arg, priv);
  2200 			return ec_cdev_ioctl_sc_sdo(master, arg, priv);
       
  2201         case EC_IOCTL_SC_STATE:
       
  2202 			return ec_cdev_ioctl_sc_state(master, arg, priv);
  2098         case EC_IOCTL_DOMAIN_OFFSET:
  2203         case EC_IOCTL_DOMAIN_OFFSET:
  2099 			return ec_cdev_ioctl_domain_offset(master, arg, priv);
  2204 			return ec_cdev_ioctl_domain_offset(master, arg, priv);
  2100         case EC_IOCTL_DOMAIN_PROCESS:
  2205         case EC_IOCTL_DOMAIN_PROCESS:
  2101             if (!(filp->f_mode & FMODE_WRITE))
  2206             if (!(filp->f_mode & FMODE_WRITE))
  2102 				return -EPERM;
  2207 				return -EPERM;
  2103 			return ec_cdev_ioctl_domain_process(master, arg, priv);
  2208 			return ec_cdev_ioctl_domain_process(master, arg, priv);
  2104         case EC_IOCTL_DOMAIN_QUEUE:
  2209         case EC_IOCTL_DOMAIN_QUEUE:
  2105             if (!(filp->f_mode & FMODE_WRITE))
  2210             if (!(filp->f_mode & FMODE_WRITE))
  2106 				return -EPERM;
  2211 				return -EPERM;
  2107 			return ec_cdev_ioctl_domain_queue(master, arg, priv);
  2212 			return ec_cdev_ioctl_domain_queue(master, arg, priv);
       
  2213         case EC_IOCTL_DOMAIN_STATE:
       
  2214 			return ec_cdev_ioctl_domain_state(master, arg, priv);
  2108         default:
  2215         default:
  2109             return -ENOTTY;
  2216             return -ENOTTY;
  2110     }
  2217     }
  2111 }
  2218 }
  2112 
  2219