2415 return 0; |
2415 return 0; |
2416 } |
2416 } |
2417 |
2417 |
2418 /*****************************************************************************/ |
2418 /*****************************************************************************/ |
2419 |
2419 |
|
2420 /** Configures an IDN. |
|
2421 */ |
|
2422 int ec_cdev_ioctl_sc_idn( |
|
2423 ec_master_t *master, /**< EtherCAT master. */ |
|
2424 unsigned long arg, /**< ioctl() argument. */ |
|
2425 ec_cdev_priv_t *priv /**< Private data structure of file handle. */ |
|
2426 ) |
|
2427 { |
|
2428 ec_ioctl_sc_idn_t ioctl; |
|
2429 ec_slave_config_t *sc; |
|
2430 uint8_t *data = NULL; |
|
2431 int ret; |
|
2432 |
|
2433 if (unlikely(!priv->requested)) |
|
2434 return -EPERM; |
|
2435 |
|
2436 if (copy_from_user(&ioctl, (void __user *) arg, sizeof(ioctl))) |
|
2437 return -EFAULT; |
|
2438 |
|
2439 if (!ioctl.size) |
|
2440 return -EINVAL; |
|
2441 |
|
2442 if (!(data = kmalloc(ioctl.size, GFP_KERNEL))) { |
|
2443 return -ENOMEM; |
|
2444 } |
|
2445 |
|
2446 if (copy_from_user(data, (void __user *) ioctl.data, ioctl.size)) { |
|
2447 kfree(data); |
|
2448 return -EFAULT; |
|
2449 } |
|
2450 |
|
2451 if (down_interruptible(&master->master_sem)) { |
|
2452 kfree(data); |
|
2453 return -EINTR; |
|
2454 } |
|
2455 |
|
2456 if (!(sc = ec_master_get_config(master, ioctl.config_index))) { |
|
2457 up(&master->master_sem); |
|
2458 kfree(data); |
|
2459 return -ENOENT; |
|
2460 } |
|
2461 |
|
2462 up(&master->master_sem); // FIXME |
|
2463 |
|
2464 ret = ecrt_slave_config_idn(sc, ioctl.idn, data, ioctl.size); |
|
2465 kfree(data); |
|
2466 return ret; |
|
2467 } |
|
2468 |
|
2469 /*****************************************************************************/ |
|
2470 |
2420 /** Gets the domain's offset in the total process data. |
2471 /** Gets the domain's offset in the total process data. |
2421 */ |
2472 */ |
2422 int ec_cdev_ioctl_domain_offset( |
2473 int ec_cdev_ioctl_domain_offset( |
2423 ec_master_t *master, /**< EtherCAT master. */ |
2474 ec_master_t *master, /**< EtherCAT master. */ |
2424 unsigned long arg, /**< ioctl() argument. */ |
2475 unsigned long arg, /**< ioctl() argument. */ |
3685 if (!(filp->f_mode & FMODE_WRITE)) |
3736 if (!(filp->f_mode & FMODE_WRITE)) |
3686 return -EPERM; |
3737 return -EPERM; |
3687 return ec_cdev_ioctl_sc_create_voe_handler(master, arg, priv); |
3738 return ec_cdev_ioctl_sc_create_voe_handler(master, arg, priv); |
3688 case EC_IOCTL_SC_STATE: |
3739 case EC_IOCTL_SC_STATE: |
3689 return ec_cdev_ioctl_sc_state(master, arg, priv); |
3740 return ec_cdev_ioctl_sc_state(master, arg, priv); |
|
3741 case EC_IOCTL_SC_IDN: |
|
3742 if (!(filp->f_mode & FMODE_WRITE)) |
|
3743 return -EPERM; |
|
3744 return ec_cdev_ioctl_sc_idn(master, arg, priv); |
3690 case EC_IOCTL_DOMAIN_OFFSET: |
3745 case EC_IOCTL_DOMAIN_OFFSET: |
3691 return ec_cdev_ioctl_domain_offset(master, arg, priv); |
3746 return ec_cdev_ioctl_domain_offset(master, arg, priv); |
3692 case EC_IOCTL_DOMAIN_PROCESS: |
3747 case EC_IOCTL_DOMAIN_PROCESS: |
3693 if (!(filp->f_mode & FMODE_WRITE)) |
3748 if (!(filp->f_mode & FMODE_WRITE)) |
3694 return -EPERM; |
3749 return -EPERM; |