master/ioctl.c
branchstable-1.5
changeset 2434 fa52128477f6
parent 2433 3bdd7a747fae
child 2435 4151f6f4c3e1
equal deleted inserted replaced
2433:3bdd7a747fae 2434:fa52128477f6
  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             }