2252 return ret; |
2252 return ret; |
2253 } |
2253 } |
2254 |
2254 |
2255 /*****************************************************************************/ |
2255 /*****************************************************************************/ |
2256 |
2256 |
|
2257 /** Configure wether a slave allows overlapping PDOs. |
|
2258 */ |
|
2259 static ATTRIBUTES int ec_ioctl_sc_allow_overlapping_pdos( |
|
2260 ec_master_t *master, /**< EtherCAT master. */ |
|
2261 void *arg, /**< ioctl() argument. */ |
|
2262 ec_ioctl_context_t *ctx /**< Private data structure of file handle. */ |
|
2263 ) |
|
2264 { |
|
2265 ec_ioctl_config_t data; |
|
2266 ec_slave_config_t *sc; |
|
2267 int ret = 0; |
|
2268 |
|
2269 if (unlikely(!ctx->requested)) { |
|
2270 ret = -EPERM; |
|
2271 goto out_return; |
|
2272 } |
|
2273 |
|
2274 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) { |
|
2275 ret = -EFAULT; |
|
2276 goto out_return; |
|
2277 } |
|
2278 |
|
2279 if (down_interruptible(&master->master_sem)) { |
|
2280 ret = -EINTR; |
|
2281 goto out_return; |
|
2282 } |
|
2283 |
|
2284 if (!(sc = ec_master_get_config(master, data.config_index))) { |
|
2285 ret = -ENOENT; |
|
2286 goto out_up; |
|
2287 } |
|
2288 |
|
2289 ecrt_slave_config_overlapping_pdos(sc, |
|
2290 data.allow_overlapping_pdos); |
|
2291 |
|
2292 out_up: |
|
2293 up(&master->master_sem); |
|
2294 out_return: |
|
2295 return ret; |
|
2296 } |
|
2297 /*****************************************************************************/ |
|
2298 |
2257 /** Add a PDO to the assignment. |
2299 /** Add a PDO to the assignment. |
2258 * |
2300 * |
2259 * \return Zero on success, otherwise a negative error code. |
2301 * \return Zero on success, otherwise a negative error code. |
2260 */ |
2302 */ |
2261 static ATTRIBUTES int ec_ioctl_sc_add_pdo( |
2303 static ATTRIBUTES int ec_ioctl_sc_add_pdo( |
4445 ret = -EPERM; |
4487 ret = -EPERM; |
4446 break; |
4488 break; |
4447 } |
4489 } |
4448 ret = ec_ioctl_sc_watchdog(master, arg, ctx); |
4490 ret = ec_ioctl_sc_watchdog(master, arg, ctx); |
4449 break; |
4491 break; |
|
4492 case EC_IOCTL_SC_OVERLAPPING_IO: |
|
4493 if (!ctx->writable) { |
|
4494 ret = -EPERM; |
|
4495 break; |
|
4496 } |
|
4497 ret = ec_ioctl_sc_allow_overlapping_pdos(master, arg, ctx); |
|
4498 break; |
4450 case EC_IOCTL_SC_ADD_PDO: |
4499 case EC_IOCTL_SC_ADD_PDO: |
4451 if (!ctx->writable) { |
4500 if (!ctx->writable) { |
4452 ret = -EPERM; |
4501 ret = -EPERM; |
4453 break; |
4502 break; |
4454 } |
4503 } |