master/ioctl.c
branchstable-1.5
changeset 2484 1cf54e2452c4
parent 2483 ec53d873dc5e
child 2486 807983200019
equal deleted inserted replaced
2483:ec53d873dc5e 2484:1cf54e2452c4
  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;