2578 return 0; |
2578 return 0; |
2579 } |
2579 } |
2580 |
2580 |
2581 /*****************************************************************************/ |
2581 /*****************************************************************************/ |
2582 |
2582 |
|
2583 /** Sets an SDO request's SDO index and subindex. |
|
2584 */ |
|
2585 static int ec_ioctl_sdo_request_index( |
|
2586 ec_master_t *master, /**< EtherCAT master. */ |
|
2587 void *arg, /**< ioctl() argument. */ |
|
2588 ec_ioctl_context_t *ctx /**< Private data structure of file handle. */ |
|
2589 ) |
|
2590 { |
|
2591 ec_ioctl_sdo_request_t data; |
|
2592 ec_slave_config_t *sc; |
|
2593 ec_sdo_request_t *req; |
|
2594 |
|
2595 if (unlikely(!ctx->requested)) |
|
2596 return -EPERM; |
|
2597 |
|
2598 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) |
|
2599 return -EFAULT; |
|
2600 |
|
2601 /* no locking of master_sem needed, because neither sc nor req will not be |
|
2602 * deleted in the meantime. */ |
|
2603 |
|
2604 if (!(sc = ec_master_get_config(master, data.config_index))) { |
|
2605 return -ENOENT; |
|
2606 } |
|
2607 |
|
2608 if (!(req = ec_slave_config_find_sdo_request(sc, data.request_index))) { |
|
2609 return -ENOENT; |
|
2610 } |
|
2611 |
|
2612 ecrt_sdo_request_index(req, data.sdo_index, data.sdo_subindex); |
|
2613 return 0; |
|
2614 } |
|
2615 |
|
2616 /*****************************************************************************/ |
|
2617 |
2583 /** Sets an SDO request's timeout. |
2618 /** Sets an SDO request's timeout. |
2584 */ |
2619 */ |
2585 static int ec_ioctl_sdo_request_timeout( |
2620 static int ec_ioctl_sdo_request_timeout( |
2586 ec_master_t *master, /**< EtherCAT master. */ |
2621 ec_master_t *master, /**< EtherCAT master. */ |
2587 void *arg, /**< ioctl() argument. */ |
2622 void *arg, /**< ioctl() argument. */ |
3684 ret = ec_ioctl_domain_queue(master, arg, ctx); |
3719 ret = ec_ioctl_domain_queue(master, arg, ctx); |
3685 break; |
3720 break; |
3686 case EC_IOCTL_DOMAIN_STATE: |
3721 case EC_IOCTL_DOMAIN_STATE: |
3687 ret = ec_ioctl_domain_state(master, arg, ctx); |
3722 ret = ec_ioctl_domain_state(master, arg, ctx); |
3688 break; |
3723 break; |
|
3724 case EC_IOCTL_SDO_REQUEST_INDEX: |
|
3725 if (!ctx->writable) { |
|
3726 ret = -EPERM; |
|
3727 break; |
|
3728 } |
|
3729 ret = ec_ioctl_sdo_request_index(master, arg, ctx); |
|
3730 break; |
3689 case EC_IOCTL_SDO_REQUEST_TIMEOUT: |
3731 case EC_IOCTL_SDO_REQUEST_TIMEOUT: |
3690 if (!ctx->writable) { |
3732 if (!ctx->writable) { |
3691 ret = -EPERM; |
3733 ret = -EPERM; |
3692 break; |
3734 break; |
3693 } |
3735 } |