master/cdev.c
changeset 1352 275d2fdeab48
parent 1350 cd278db5a872
child 1361 9c16b62326fa
equal deleted inserted replaced
1351:cf8f08631c8e 1352:275d2fdeab48
  1872     return ret;
  1872     return ret;
  1873 }
  1873 }
  1874 
  1874 
  1875 /*****************************************************************************/
  1875 /*****************************************************************************/
  1876 
  1876 
       
  1877 /** Create an SDO request.
       
  1878  */
       
  1879 int ec_cdev_ioctl_sc_create_sdo_request(
       
  1880         ec_master_t *master, /**< EtherCAT master. */
       
  1881         unsigned long arg, /**< ioctl() argument. */
       
  1882         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  1883         )
       
  1884 {
       
  1885     ec_ioctl_sdo_request_t data;
       
  1886     ec_slave_config_t *sc;
       
  1887     ec_sdo_request_t *req;
       
  1888 
       
  1889 	if (unlikely(!priv->requested))
       
  1890 		return -EPERM;
       
  1891 
       
  1892     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
       
  1893         return -EFAULT;
       
  1894     }
       
  1895 
       
  1896     data.request_index = 0;
       
  1897 
       
  1898     if (down_interruptible(&master->master_sem))
       
  1899         return -EINTR;
       
  1900 
       
  1901     sc = ec_master_get_config(master, data.config_index);
       
  1902     if (!sc) {
       
  1903         up(&master->master_sem);
       
  1904         return -ENOENT;
       
  1905     }
       
  1906 
       
  1907     list_for_each_entry(req, &sc->sdo_requests, list) {
       
  1908         data.request_index++;
       
  1909     }
       
  1910 
       
  1911     up(&master->master_sem);
       
  1912 
       
  1913     req = ecrt_slave_config_create_sdo_request_err(sc, data.sdo_index,
       
  1914             data.sdo_subindex, data.size);
       
  1915     if (IS_ERR(req))
       
  1916         return PTR_ERR(req);
       
  1917 
       
  1918     if (copy_to_user((void __user *) arg, &data, sizeof(data)))
       
  1919         return -EFAULT;
       
  1920 
       
  1921     return 0;
       
  1922 }
       
  1923 
       
  1924 /*****************************************************************************/
       
  1925 
  1877 /** Create a VoE handler.
  1926 /** Create a VoE handler.
  1878  */
  1927  */
  1879 int ec_cdev_ioctl_sc_create_voe_handler(
  1928 int ec_cdev_ioctl_sc_create_voe_handler(
  1880         ec_master_t *master, /**< EtherCAT master. */
  1929         ec_master_t *master, /**< EtherCAT master. */
  1881         unsigned long arg, /**< ioctl() argument. */
  1930         unsigned long arg, /**< ioctl() argument. */
  2081     up(&master->master_sem);
  2130     up(&master->master_sem);
  2082 
  2131 
  2083     if (copy_to_user((void __user *) data.state, &state, sizeof(state)))
  2132     if (copy_to_user((void __user *) data.state, &state, sizeof(state)))
  2084         return -EFAULT;
  2133         return -EFAULT;
  2085 
  2134 
       
  2135     return 0;
       
  2136 }
       
  2137 
       
  2138 /*****************************************************************************/
       
  2139 
       
  2140 /** Sets an SDO request's timeout.
       
  2141  */
       
  2142 int ec_cdev_ioctl_sdo_request_timeout(
       
  2143         ec_master_t *master, /**< EtherCAT master. */
       
  2144         unsigned long arg, /**< ioctl() argument. */
       
  2145         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  2146         )
       
  2147 {
       
  2148     ec_ioctl_sdo_request_t data;
       
  2149     ec_slave_config_t *sc;
       
  2150     ec_sdo_request_t *req;
       
  2151 
       
  2152 	if (unlikely(!priv->requested))
       
  2153         return -EPERM;
       
  2154 
       
  2155     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
       
  2156         return -EFAULT;
       
  2157 
       
  2158     if (down_interruptible(&master->master_sem))
       
  2159         return -EINTR;
       
  2160 
       
  2161     if (!(sc = ec_master_get_config(master, data.config_index))) {
       
  2162         up(&master->master_sem);
       
  2163         return -ENOENT;
       
  2164     }
       
  2165 
       
  2166     if (!(req = ec_slave_config_find_sdo_request(sc, data.request_index))) {
       
  2167         up(&master->master_sem);
       
  2168         return -ENOENT;
       
  2169     }
       
  2170 
       
  2171     up(&master->master_sem);
       
  2172 
       
  2173     ecrt_sdo_request_timeout(req, data.timeout);
       
  2174     return 0;
       
  2175 }
       
  2176 
       
  2177 /*****************************************************************************/
       
  2178 
       
  2179 /** Gets an SDO request's state.
       
  2180  */
       
  2181 int ec_cdev_ioctl_sdo_request_state(
       
  2182         ec_master_t *master, /**< EtherCAT master. */
       
  2183         unsigned long arg, /**< ioctl() argument. */
       
  2184         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  2185         )
       
  2186 {
       
  2187     ec_ioctl_sdo_request_t data;
       
  2188     ec_slave_config_t *sc;
       
  2189     ec_sdo_request_t *req;
       
  2190 
       
  2191 	if (unlikely(!priv->requested))
       
  2192         return -EPERM;
       
  2193 
       
  2194     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
       
  2195         return -EFAULT;
       
  2196 
       
  2197     if (down_interruptible(&master->master_sem))
       
  2198         return -EINTR;
       
  2199 
       
  2200     if (!(sc = ec_master_get_config(master, data.config_index))) {
       
  2201         up(&master->master_sem);
       
  2202         return -ENOENT;
       
  2203     }
       
  2204 
       
  2205     if (!(req = ec_slave_config_find_sdo_request(sc, data.request_index))) {
       
  2206         up(&master->master_sem);
       
  2207         return -ENOENT;
       
  2208     }
       
  2209 
       
  2210     data.state = ecrt_sdo_request_state(req);
       
  2211     if (data.state == EC_REQUEST_SUCCESS && req->dir == EC_DIR_INPUT)
       
  2212         data.size = ecrt_sdo_request_data_size(req);
       
  2213     else
       
  2214         data.size = 0;
       
  2215 
       
  2216     up(&master->master_sem);
       
  2217 
       
  2218     if (copy_to_user((void __user *) arg, &data, sizeof(data)))
       
  2219         return -EFAULT;
       
  2220 
       
  2221     return 0;
       
  2222 }
       
  2223 
       
  2224 /*****************************************************************************/
       
  2225 
       
  2226 /** Starts an SDO read operation.
       
  2227  */
       
  2228 int ec_cdev_ioctl_sdo_request_read(
       
  2229         ec_master_t *master, /**< EtherCAT master. */
       
  2230         unsigned long arg, /**< ioctl() argument. */
       
  2231         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  2232         )
       
  2233 {
       
  2234     ec_ioctl_sdo_request_t data;
       
  2235     ec_slave_config_t *sc;
       
  2236     ec_sdo_request_t *req;
       
  2237 
       
  2238 	if (unlikely(!priv->requested))
       
  2239         return -EPERM;
       
  2240 
       
  2241     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
       
  2242         return -EFAULT;
       
  2243 
       
  2244     if (down_interruptible(&master->master_sem))
       
  2245         return -EINTR;
       
  2246 
       
  2247     if (!(sc = ec_master_get_config(master, data.config_index))) {
       
  2248         up(&master->master_sem);
       
  2249         return -ENOENT;
       
  2250     }
       
  2251 
       
  2252     if (!(req = ec_slave_config_find_sdo_request(sc, data.request_index))) {
       
  2253         up(&master->master_sem);
       
  2254         return -ENOENT;
       
  2255     }
       
  2256 
       
  2257     up(&master->master_sem);
       
  2258 
       
  2259     ecrt_sdo_request_read(req);
       
  2260     return 0;
       
  2261 }
       
  2262 
       
  2263 /*****************************************************************************/
       
  2264 
       
  2265 /** Starts an SDO write operation.
       
  2266  */
       
  2267 int ec_cdev_ioctl_sdo_request_write(
       
  2268         ec_master_t *master, /**< EtherCAT master. */
       
  2269         unsigned long arg, /**< ioctl() argument. */
       
  2270         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  2271         )
       
  2272 {
       
  2273     ec_ioctl_sdo_request_t data;
       
  2274     ec_slave_config_t *sc;
       
  2275     ec_sdo_request_t *req;
       
  2276 
       
  2277 	if (unlikely(!priv->requested))
       
  2278         return -EPERM;
       
  2279 
       
  2280     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
       
  2281         return -EFAULT;
       
  2282 
       
  2283     if (down_interruptible(&master->master_sem))
       
  2284         return -EINTR;
       
  2285 
       
  2286     if (!(sc = ec_master_get_config(master, data.config_index))) {
       
  2287         up(&master->master_sem);
       
  2288         return -ENOENT;
       
  2289     }
       
  2290 
       
  2291     if (!(req = ec_slave_config_find_sdo_request(sc, data.request_index))) {
       
  2292         up(&master->master_sem);
       
  2293         return -ENOENT;
       
  2294     }
       
  2295 
       
  2296     up(&master->master_sem);
       
  2297 
       
  2298     ecrt_sdo_request_write(req);
       
  2299     return 0;
       
  2300 }
       
  2301 
       
  2302 /*****************************************************************************/
       
  2303 
       
  2304 /** Read SDO data.
       
  2305  */
       
  2306 int ec_cdev_ioctl_sdo_request_data(
       
  2307         ec_master_t *master, /**< EtherCAT master. */
       
  2308         unsigned long arg, /**< ioctl() argument. */
       
  2309         ec_cdev_priv_t *priv /**< Private data structure of file handle. */
       
  2310         )
       
  2311 {
       
  2312     ec_ioctl_sdo_request_t data;
       
  2313     ec_slave_config_t *sc;
       
  2314     ec_sdo_request_t *req;
       
  2315 
       
  2316 	if (unlikely(!priv->requested))
       
  2317         return -EPERM;
       
  2318 
       
  2319     if (copy_from_user(&data, (void __user *) arg, sizeof(data)))
       
  2320         return -EFAULT;
       
  2321 
       
  2322     if (down_interruptible(&master->master_sem))
       
  2323         return -EINTR;
       
  2324 
       
  2325     if (!(sc = ec_master_get_config(master, data.config_index))) {
       
  2326         up(&master->master_sem);
       
  2327         return -ENOENT;
       
  2328     }
       
  2329 
       
  2330     if (!(req = ec_slave_config_find_sdo_request(sc, data.request_index))) {
       
  2331         up(&master->master_sem);
       
  2332         return -ENOENT;
       
  2333     }
       
  2334 
       
  2335     up(&master->master_sem);
       
  2336 
       
  2337     ecrt_sdo_request_timeout(req, data.timeout);
  2086     return 0;
  2338     return 0;
  2087 }
  2339 }
  2088 
  2340 
  2089 /*****************************************************************************/
  2341 /*****************************************************************************/
  2090 
  2342 
  2644 {
  2896 {
  2645     ec_cdev_priv_t *priv = (ec_cdev_priv_t *) filp->private_data;
  2897     ec_cdev_priv_t *priv = (ec_cdev_priv_t *) filp->private_data;
  2646     ec_master_t *master = priv->cdev->master;
  2898     ec_master_t *master = priv->cdev->master;
  2647 
  2899 
  2648     if (master->debug_level)
  2900     if (master->debug_level)
  2649         EC_DBG("ioctl(filp = 0x%x, cmd = 0x%x (0x%x), arg = 0x%x)\n",
  2901         EC_DBG("ioctl(filp = 0x%x, cmd = 0x%08x (0x%02x), arg = 0x%x)\n",
  2650                 (u32) filp, (u32) cmd, (u32) _IOC_NR(cmd), (u32) arg);
  2902                 (u32) filp, (u32) cmd, (u32) _IOC_NR(cmd), (u32) arg);
  2651 
  2903 
  2652     switch (cmd) {
  2904     switch (cmd) {
  2653         case EC_IOCTL_MASTER:
  2905         case EC_IOCTL_MASTER:
  2654             return ec_cdev_ioctl_master(master, arg);
  2906             return ec_cdev_ioctl_master(master, arg);
  2762 			return ec_cdev_ioctl_sc_reg_pdo_entry(master, arg, priv);
  3014 			return ec_cdev_ioctl_sc_reg_pdo_entry(master, arg, priv);
  2763         case EC_IOCTL_SC_SDO:
  3015         case EC_IOCTL_SC_SDO:
  2764             if (!(filp->f_mode & FMODE_WRITE))
  3016             if (!(filp->f_mode & FMODE_WRITE))
  2765 				return -EPERM;
  3017 				return -EPERM;
  2766 			return ec_cdev_ioctl_sc_sdo(master, arg, priv);
  3018 			return ec_cdev_ioctl_sc_sdo(master, arg, priv);
       
  3019         case EC_IOCTL_SC_SDO_REQUEST:
       
  3020             if (!(filp->f_mode & FMODE_WRITE))
       
  3021 				return -EPERM;
       
  3022 			return ec_cdev_ioctl_sc_create_sdo_request(master, arg, priv);
  2767         case EC_IOCTL_SC_VOE:
  3023         case EC_IOCTL_SC_VOE:
  2768             if (!(filp->f_mode & FMODE_WRITE))
  3024             if (!(filp->f_mode & FMODE_WRITE))
  2769 				return -EPERM;
  3025 				return -EPERM;
  2770 			return ec_cdev_ioctl_sc_create_voe_handler(master, arg, priv);
  3026 			return ec_cdev_ioctl_sc_create_voe_handler(master, arg, priv);
  2771         case EC_IOCTL_SC_STATE:
  3027         case EC_IOCTL_SC_STATE:
  2780             if (!(filp->f_mode & FMODE_WRITE))
  3036             if (!(filp->f_mode & FMODE_WRITE))
  2781 				return -EPERM;
  3037 				return -EPERM;
  2782 			return ec_cdev_ioctl_domain_queue(master, arg, priv);
  3038 			return ec_cdev_ioctl_domain_queue(master, arg, priv);
  2783         case EC_IOCTL_DOMAIN_STATE:
  3039         case EC_IOCTL_DOMAIN_STATE:
  2784 			return ec_cdev_ioctl_domain_state(master, arg, priv);
  3040 			return ec_cdev_ioctl_domain_state(master, arg, priv);
       
  3041         case EC_IOCTL_SDO_REQUEST_TIMEOUT:
       
  3042             if (!(filp->f_mode & FMODE_WRITE))
       
  3043 				return -EPERM;
       
  3044 			return ec_cdev_ioctl_sdo_request_timeout(master, arg, priv);
       
  3045         case EC_IOCTL_SDO_REQUEST_STATE:
       
  3046 			return ec_cdev_ioctl_sdo_request_state(master, arg, priv);
       
  3047         case EC_IOCTL_SDO_REQUEST_READ:
       
  3048             if (!(filp->f_mode & FMODE_WRITE))
       
  3049 				return -EPERM;
       
  3050 			return ec_cdev_ioctl_sdo_request_read(master, arg, priv);
       
  3051         case EC_IOCTL_SDO_REQUEST_WRITE:
       
  3052             if (!(filp->f_mode & FMODE_WRITE))
       
  3053 				return -EPERM;
       
  3054 			return ec_cdev_ioctl_sdo_request_write(master, arg, priv);
       
  3055         case EC_IOCTL_SDO_REQUEST_DATA:
       
  3056 			return ec_cdev_ioctl_sdo_request_data(master, arg, priv);
  2785         case EC_IOCTL_VOE_SEND_HEADER:
  3057         case EC_IOCTL_VOE_SEND_HEADER:
  2786             if (!(filp->f_mode & FMODE_WRITE))
  3058             if (!(filp->f_mode & FMODE_WRITE))
  2787 				return -EPERM;
  3059 				return -EPERM;
  2788 			return ec_cdev_ioctl_voe_send_header(master, arg, priv);
  3060 			return ec_cdev_ioctl_voe_send_header(master, arg, priv);
  2789         case EC_IOCTL_VOE_REC_HEADER:
  3061         case EC_IOCTL_VOE_REC_HEADER: