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 |