1953 uint32_t time_diff; |
1953 uint32_t time_diff; |
1954 |
1954 |
1955 if (unlikely(!ctx->requested)) |
1955 if (unlikely(!ctx->requested)) |
1956 return -EPERM; |
1956 return -EPERM; |
1957 |
1957 |
1958 down(&master->io_sem); |
|
1959 time_diff = ecrt_master_sync_monitor_process(master); |
1958 time_diff = ecrt_master_sync_monitor_process(master); |
1960 up(&master->io_sem); |
|
1961 |
1959 |
1962 if (copy_to_user((void __user *) arg, &time_diff, sizeof(time_diff))) |
1960 if (copy_to_user((void __user *) arg, &time_diff, sizeof(time_diff))) |
1963 return -EFAULT; |
1961 return -EFAULT; |
1964 |
1962 |
1965 return 0; |
1963 return 0; |
2395 ec_ioctl_sc_emerg_t io; |
2393 ec_ioctl_sc_emerg_t io; |
2396 ec_slave_config_t *sc; |
2394 ec_slave_config_t *sc; |
2397 u8 msg[EC_COE_EMERGENCY_MSG_SIZE]; |
2395 u8 msg[EC_COE_EMERGENCY_MSG_SIZE]; |
2398 int ret; |
2396 int ret; |
2399 |
2397 |
2400 if (unlikely(!ctx->requested)) |
2398 if (unlikely(!ctx->requested)) { |
2401 return -EPERM; |
2399 return -EPERM; |
2402 |
2400 } |
2403 if (copy_from_user(&io, (void __user *) arg, sizeof(io))) |
2401 |
2404 return -EFAULT; |
2402 if (copy_from_user(&io, (void __user *) arg, sizeof(io))) { |
2405 |
2403 return -EFAULT; |
2406 if (down_interruptible(&master->master_sem)) { |
2404 } |
2407 return -EINTR; |
2405 |
2408 } |
2406 /* no locking of master_sem needed, because configuration will not be |
|
2407 * deleted in the meantime. */ |
2409 |
2408 |
2410 if (!(sc = ec_master_get_config(master, io.config_index))) { |
2409 if (!(sc = ec_master_get_config(master, io.config_index))) { |
2411 up(&master->master_sem); |
|
2412 return -ENOENT; |
2410 return -ENOENT; |
2413 } |
2411 } |
2414 |
2412 |
2415 ret = ecrt_slave_config_emerg_pop(sc, msg); |
2413 ret = ecrt_slave_config_emerg_pop(sc, msg); |
2416 |
|
2417 up(&master->master_sem); |
|
2418 |
|
2419 if (ret < 0) { |
2414 if (ret < 0) { |
2420 return ret; |
2415 return ret; |
2421 } |
2416 } |
2422 |
2417 |
2423 if (copy_to_user((void __user *) io.target, msg, sizeof(msg))) { |
2418 if (copy_to_user((void __user *) io.target, msg, sizeof(msg))) { |
2439 { |
2434 { |
2440 ec_ioctl_sc_emerg_t io; |
2435 ec_ioctl_sc_emerg_t io; |
2441 ec_slave_config_t *sc; |
2436 ec_slave_config_t *sc; |
2442 int ret; |
2437 int ret; |
2443 |
2438 |
2444 if (unlikely(!ctx->requested)) |
2439 if (unlikely(!ctx->requested)) { |
2445 return -EPERM; |
2440 return -EPERM; |
2446 |
2441 } |
2447 if (copy_from_user(&io, (void __user *) arg, sizeof(io))) |
2442 |
2448 return -EFAULT; |
2443 if (copy_from_user(&io, (void __user *) arg, sizeof(io))) { |
2449 |
2444 return -EFAULT; |
2450 if (down_interruptible(&master->master_sem)) { |
2445 } |
2451 return -EINTR; |
2446 |
2452 } |
2447 /* no locking of master_sem needed, because configuration will not be |
|
2448 * deleted in the meantime. */ |
2453 |
2449 |
2454 if (!(sc = ec_master_get_config(master, io.config_index))) { |
2450 if (!(sc = ec_master_get_config(master, io.config_index))) { |
2455 up(&master->master_sem); |
2451 return -ENOENT; |
2456 return -ENOENT; |
2452 } |
2457 } |
2453 |
2458 |
2454 return ecrt_slave_config_emerg_clear(sc); |
2459 ret = ecrt_slave_config_emerg_clear(sc); |
|
2460 |
|
2461 up(&master->master_sem); |
|
2462 |
|
2463 return ret; |
|
2464 } |
2455 } |
2465 |
2456 |
2466 /*****************************************************************************/ |
2457 /*****************************************************************************/ |
2467 |
2458 |
2468 /** Get the number of emergency overruns. |
2459 /** Get the number of emergency overruns. |
2475 { |
2466 { |
2476 ec_ioctl_sc_emerg_t io; |
2467 ec_ioctl_sc_emerg_t io; |
2477 ec_slave_config_t *sc; |
2468 ec_slave_config_t *sc; |
2478 int ret; |
2469 int ret; |
2479 |
2470 |
2480 if (unlikely(!ctx->requested)) |
2471 if (unlikely(!ctx->requested)) { |
2481 return -EPERM; |
2472 return -EPERM; |
2482 |
2473 } |
2483 if (copy_from_user(&io, (void __user *) arg, sizeof(io))) |
2474 |
2484 return -EFAULT; |
2475 if (copy_from_user(&io, (void __user *) arg, sizeof(io))) { |
2485 |
2476 return -EFAULT; |
2486 if (down_interruptible(&master->master_sem)) { |
2477 } |
2487 return -EINTR; |
2478 |
2488 } |
2479 /* no locking of master_sem needed, because configuration will not be |
|
2480 * deleted in the meantime. */ |
2489 |
2481 |
2490 if (!(sc = ec_master_get_config(master, io.config_index))) { |
2482 if (!(sc = ec_master_get_config(master, io.config_index))) { |
2491 up(&master->master_sem); |
|
2492 return -ENOENT; |
2483 return -ENOENT; |
2493 } |
2484 } |
2494 |
2485 |
2495 ret = ecrt_slave_config_emerg_overruns(sc); |
2486 ret = ecrt_slave_config_emerg_overruns(sc); |
2496 |
|
2497 up(&master->master_sem); |
|
2498 |
|
2499 if (ret < 0) { |
2487 if (ret < 0) { |
2500 return ret; |
2488 return ret; |
2501 } |
2489 } |
2502 |
2490 |
2503 io.overruns = ret; |
2491 io.overruns = ret; |