master/ioctl.c
branchstable-1.5
changeset 2443 2c3ccdde3919
parent 2438 9c3e629a220c
child 2447 e93efb4af231
equal deleted inserted replaced
2442:86ebf18a029f 2443:2c3ccdde3919
   975 static int ec_ioctl_slave_reg_read(
   975 static int ec_ioctl_slave_reg_read(
   976         ec_master_t *master, /**< EtherCAT master. */
   976         ec_master_t *master, /**< EtherCAT master. */
   977         void *arg /**< ioctl() argument. */
   977         void *arg /**< ioctl() argument. */
   978         )
   978         )
   979 {
   979 {
   980     ec_ioctl_slave_reg_t data;
   980     ec_ioctl_slave_reg_t io;
   981     ec_slave_t *slave;
   981     ec_slave_t *slave;
   982     uint8_t *contents;
       
   983     ec_reg_request_t request;
   982     ec_reg_request_t request;
   984 
   983     int ret;
   985     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
   984 
   986         return -EFAULT;
   985     if (copy_from_user(&io, (void __user *) arg, sizeof(io))) {
   987     }
   986         return -EFAULT;
   988 
   987     }
   989     if (!data.length)
   988 
       
   989     if (!io.size) {
   990         return 0;
   990         return 0;
   991 
   991     }
   992     if (!(contents = kmalloc(data.length, GFP_KERNEL))) {
   992 
   993         EC_MASTER_ERR(master, "Failed to allocate %u bytes"
   993     // init register request
   994                 " for register data.\n", data.length);
   994     ret = ec_reg_request_init(&request, io.size);
   995         return -ENOMEM;
   995     if (ret) {
   996     }
   996         return ret;
   997 
   997     }
   998     if (down_interruptible(&master->master_sem))
   998 
       
   999     ecrt_reg_request_read(&request, io.address, io.size);
       
  1000 
       
  1001     if (down_interruptible(&master->master_sem)) {
       
  1002         ec_reg_request_clear(&request);
   999         return -EINTR;
  1003         return -EINTR;
       
  1004     }
  1000 
  1005 
  1001     if (!(slave = ec_master_find_slave(
  1006     if (!(slave = ec_master_find_slave(
  1002                     master, 0, data.slave_position))) {
  1007                     master, 0, io.slave_position))) {
  1003         up(&master->master_sem);
  1008         up(&master->master_sem);
       
  1009         ec_reg_request_clear(&request);
  1004         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
  1010         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
  1005                 data.slave_position);
  1011                 io.slave_position);
  1006         return -EINVAL;
  1012         return -EINVAL;
  1007     }
  1013     }
  1008 
  1014 
  1009     // init register request
       
  1010     INIT_LIST_HEAD(&request.list);
       
  1011     request.slave = slave;
       
  1012     request.dir = EC_DIR_INPUT;
       
  1013     request.data = contents;
       
  1014     request.offset = data.offset;
       
  1015     request.length = data.length;
       
  1016     request.state = EC_INT_REQUEST_QUEUED;
       
  1017 
       
  1018     // schedule request.
  1015     // schedule request.
  1019     list_add_tail(&request.list, &master->reg_requests);
  1016     list_add_tail(&request.list, &slave->reg_requests);
  1020 
  1017 
  1021     up(&master->master_sem);
  1018     up(&master->master_sem);
  1022 
  1019 
  1023     // wait for processing through FSM
  1020     // wait for processing through FSM
  1024     if (wait_event_interruptible(master->reg_queue,
  1021     if (wait_event_interruptible(slave->reg_queue,
  1025                 request.state != EC_INT_REQUEST_QUEUED)) {
  1022                 request.state != EC_INT_REQUEST_QUEUED)) {
  1026         // interrupted by signal
  1023         // interrupted by signal
  1027         down(&master->master_sem);
  1024         down(&master->master_sem);
  1028         if (request.state == EC_INT_REQUEST_QUEUED) {
  1025         if (request.state == EC_INT_REQUEST_QUEUED) {
  1029             // abort request
  1026             // abort request
  1030             list_del(&request.list);
  1027             list_del(&request.list);
  1031             up(&master->master_sem);
  1028             up(&master->master_sem);
  1032             kfree(contents);
  1029             ec_reg_request_clear(&request);
  1033             return -EINTR;
  1030             return -EINTR;
  1034         }
  1031         }
  1035         up(&master->master_sem);
  1032         up(&master->master_sem);
  1036     }
  1033     }
  1037 
  1034 
  1038     // wait until master FSM has finished processing
  1035     // wait until master FSM has finished processing
  1039     wait_event(master->reg_queue, request.state != EC_INT_REQUEST_BUSY);
  1036     wait_event(slave->reg_queue, request.state != EC_INT_REQUEST_BUSY);
  1040 
  1037 
  1041     if (request.state == EC_INT_REQUEST_SUCCESS) {
  1038     if (request.state == EC_INT_REQUEST_SUCCESS) {
  1042         if (copy_to_user((void __user *) data.data, contents, data.length))
  1039         if (copy_to_user((void __user *) io.data, request.data, io.size)) {
  1043             return -EFAULT;
  1040             return -EFAULT;
  1044     }
  1041         }
  1045     kfree(contents);
  1042     }
       
  1043     ec_reg_request_clear(&request);
  1046 
  1044 
  1047     return request.state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO;
  1045     return request.state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO;
  1048 }
  1046 }
  1049 
  1047 
  1050 /*****************************************************************************/
  1048 /*****************************************************************************/
  1054 static int ec_ioctl_slave_reg_write(
  1052 static int ec_ioctl_slave_reg_write(
  1055         ec_master_t *master, /**< EtherCAT master. */
  1053         ec_master_t *master, /**< EtherCAT master. */
  1056         void *arg /**< ioctl() argument. */
  1054         void *arg /**< ioctl() argument. */
  1057         )
  1055         )
  1058 {
  1056 {
  1059     ec_ioctl_slave_reg_t data;
  1057     ec_ioctl_slave_reg_t io;
  1060     ec_slave_t *slave;
  1058     ec_slave_t *slave;
  1061     uint8_t *contents;
       
  1062     ec_reg_request_t request;
  1059     ec_reg_request_t request;
  1063 
  1060     int ret;
  1064     if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
  1061 
  1065         return -EFAULT;
  1062     if (copy_from_user(&io, (void __user *) arg, sizeof(io))) {
  1066     }
  1063         return -EFAULT;
  1067 
  1064     }
  1068     if (!data.length)
  1065 
       
  1066     if (!io.size) {
  1069         return 0;
  1067         return 0;
  1070 
  1068     }
  1071     if (!(contents = kmalloc(data.length, GFP_KERNEL))) {
  1069 
  1072         EC_MASTER_ERR(master, "Failed to allocate %u bytes"
  1070     // init register request
  1073                 " for register data.\n", data.length);
  1071     ret = ec_reg_request_init(&request, io.size);
  1074         return -ENOMEM;
  1072     if (ret) {
  1075     }
  1073         return ret;
  1076 
  1074     }
  1077     if (copy_from_user(contents, (void __user *) data.data, data.length)) {
  1075 
  1078         kfree(contents);
  1076     if (copy_from_user(request.data, (void __user *) io.data, io.size)) {
  1079         return -EFAULT;
  1077         ec_reg_request_clear(&request);
  1080     }
  1078         return -EFAULT;
  1081 
  1079     }
  1082     if (down_interruptible(&master->master_sem))
  1080 
       
  1081     ecrt_reg_request_write(&request, io.address, io.size);
       
  1082 
       
  1083     if (down_interruptible(&master->master_sem)) {
       
  1084         ec_reg_request_clear(&request);
  1083         return -EINTR;
  1085         return -EINTR;
       
  1086     }
  1084 
  1087 
  1085     if (!(slave = ec_master_find_slave(
  1088     if (!(slave = ec_master_find_slave(
  1086                     master, 0, data.slave_position))) {
  1089                     master, 0, io.slave_position))) {
  1087         up(&master->master_sem);
  1090         up(&master->master_sem);
       
  1091         ec_reg_request_clear(&request);
  1088         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
  1092         EC_MASTER_ERR(master, "Slave %u does not exist!\n",
  1089                 data.slave_position);
  1093                 io.slave_position);
  1090         kfree(contents);
       
  1091         return -EINVAL;
  1094         return -EINVAL;
  1092     }
  1095     }
  1093 
  1096 
  1094     // init register request
       
  1095     INIT_LIST_HEAD(&request.list);
       
  1096     request.slave = slave;
       
  1097     request.dir = EC_DIR_OUTPUT;
       
  1098     request.data = contents;
       
  1099     request.offset = data.offset;
       
  1100     request.length = data.length;
       
  1101     request.state = EC_INT_REQUEST_QUEUED;
       
  1102 
       
  1103     // schedule request.
  1097     // schedule request.
  1104     list_add_tail(&request.list, &master->reg_requests);
  1098     list_add_tail(&request.list, &slave->reg_requests);
  1105 
  1099 
  1106     up(&master->master_sem);
  1100     up(&master->master_sem);
  1107 
  1101 
  1108     // wait for processing through FSM
  1102     // wait for processing through FSM
  1109     if (wait_event_interruptible(master->reg_queue,
  1103     if (wait_event_interruptible(slave->reg_queue,
  1110                 request.state != EC_INT_REQUEST_QUEUED)) {
  1104                 request.state != EC_INT_REQUEST_QUEUED)) {
  1111         // interrupted by signal
  1105         // interrupted by signal
  1112         down(&master->master_sem);
  1106         down(&master->master_sem);
  1113         if (request.state == EC_INT_REQUEST_QUEUED) {
  1107         if (request.state == EC_INT_REQUEST_QUEUED) {
  1114             // abort request
  1108             // abort request
  1115             list_del(&request.list);
  1109             list_del(&request.list);
  1116             up(&master->master_sem);
  1110             up(&master->master_sem);
  1117             kfree(contents);
  1111             ec_reg_request_clear(&request);
  1118             return -EINTR;
  1112             return -EINTR;
  1119         }
  1113         }
  1120         up(&master->master_sem);
  1114         up(&master->master_sem);
  1121     }
  1115     }
  1122 
  1116 
  1123     // wait until master FSM has finished processing
  1117     // wait until master FSM has finished processing
  1124     wait_event(master->reg_queue, request.state != EC_INT_REQUEST_BUSY);
  1118     wait_event(slave->reg_queue, request.state != EC_INT_REQUEST_BUSY);
  1125 
  1119 
  1126     kfree(contents);
  1120     ec_reg_request_clear(&request);
  1127 
  1121 
  1128     return request.state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO;
  1122     return request.state == EC_INT_REQUEST_SUCCESS ? 0 : -EIO;
  1129 }
  1123 }
  1130 
  1124 
  1131 /*****************************************************************************/
  1125 /*****************************************************************************/
  1606             return -ENOMEM;
  1600             return -ENOMEM;
  1607         }
  1601         }
  1608 
  1602 
  1609         /* Set the memory as external process data memory for the
  1603         /* Set the memory as external process data memory for the
  1610          * domains.
  1604          * domains.
  1611 		 */
  1605          */
  1612         offset = 0;
  1606         offset = 0;
  1613         list_for_each_entry(domain, &master->domains, list) {
  1607         list_for_each_entry(domain, &master->domains, list) {
  1614             ecrt_domain_external_memory(domain,
  1608             ecrt_domain_external_memory(domain,
  1615                     ctx->process_data + offset);
  1609                     ctx->process_data + offset);
  1616             offset += ecrt_domain_size(domain);
  1610             offset += ecrt_domain_size(domain);
  1617         }
  1611         }
  1618 
  1612 
  1619 #ifdef EC_IOCTL_RTDM
  1613 #ifdef EC_IOCTL_RTDM
  1620 		/* RTDM uses a different approach for memory-mapping, which has to be
  1614         /* RTDM uses a different approach for memory-mapping, which has to be
  1621 		 * initiated by the kernel.
  1615          * initiated by the kernel.
  1622 		 */
  1616          */
  1623 		ret = ec_rtdm_mmap(ctx, &io.process_data);
  1617         ret = ec_rtdm_mmap(ctx, &io.process_data);
  1624         if (ret < 0) {
  1618         if (ret < 0) {
  1625             EC_MASTER_ERR(master, "Failed to map process data"
  1619             EC_MASTER_ERR(master, "Failed to map process data"
  1626                     " memory to user space (code %i).\n", ret);
  1620                     " memory to user space (code %i).\n", ret);
  1627             return ret;
  1621             return ret;
  1628         }
  1622         }
  2486     return 0;
  2480     return 0;
  2487 }
  2481 }
  2488 
  2482 
  2489 /*****************************************************************************/
  2483 /*****************************************************************************/
  2490 
  2484 
       
  2485 /** Create a register request.
       
  2486  */
       
  2487 static int ec_ioctl_sc_create_reg_request(
       
  2488         ec_master_t *master, /**< EtherCAT master. */
       
  2489         void *arg, /**< ioctl() argument. */
       
  2490         ec_ioctl_context_t *ctx /**< Private data structure of file handle. */
       
  2491         )
       
  2492 {
       
  2493     ec_ioctl_reg_request_t io;
       
  2494     ec_slave_config_t *sc;
       
  2495     ec_reg_request_t *reg;
       
  2496 
       
  2497     if (unlikely(!ctx->requested)) {
       
  2498         return -EPERM;
       
  2499     }
       
  2500 
       
  2501     if (copy_from_user(&io, (void __user *) arg, sizeof(io))) {
       
  2502         return -EFAULT;
       
  2503     }
       
  2504 
       
  2505     io.request_index = 0;
       
  2506 
       
  2507     if (down_interruptible(&master->master_sem)) {
       
  2508         return -EINTR;
       
  2509     }
       
  2510 
       
  2511     sc = ec_master_get_config(master, io.config_index);
       
  2512     if (!sc) {
       
  2513         up(&master->master_sem);
       
  2514         return -ENOENT;
       
  2515     }
       
  2516 
       
  2517     list_for_each_entry(reg, &sc->reg_requests, list) {
       
  2518         io.request_index++;
       
  2519     }
       
  2520 
       
  2521     up(&master->master_sem); /** \fixme sc could be invalidated */
       
  2522 
       
  2523     reg = ecrt_slave_config_create_reg_request_err(sc, io.mem_size);
       
  2524     if (IS_ERR(reg)) {
       
  2525         return PTR_ERR(reg);
       
  2526     }
       
  2527 
       
  2528     if (copy_to_user((void __user *) arg, &io, sizeof(io))) {
       
  2529         return -EFAULT;
       
  2530     }
       
  2531 
       
  2532     return 0;
       
  2533 }
       
  2534 
       
  2535 /*****************************************************************************/
       
  2536 
  2491 /** Create a VoE handler.
  2537 /** Create a VoE handler.
  2492  */
  2538  */
  2493 static int ec_ioctl_sc_create_voe_handler(
  2539 static int ec_ioctl_sc_create_voe_handler(
  2494         ec_master_t *master, /**< EtherCAT master. */
  2540         ec_master_t *master, /**< EtherCAT master. */
  2495         void *arg, /**< ioctl() argument. */
  2541         void *arg, /**< ioctl() argument. */
  2972 
  3018 
  2973     if (copy_to_user((void __user *) data.data, ecrt_sdo_request_data(req),
  3019     if (copy_to_user((void __user *) data.data, ecrt_sdo_request_data(req),
  2974                 ecrt_sdo_request_data_size(req)))
  3020                 ecrt_sdo_request_data_size(req)))
  2975         return -EFAULT;
  3021         return -EFAULT;
  2976 
  3022 
       
  3023     return 0;
       
  3024 }
       
  3025 
       
  3026 /*****************************************************************************/
       
  3027 
       
  3028 /** Read register data.
       
  3029  */
       
  3030 static int ec_ioctl_reg_request_data(
       
  3031         ec_master_t *master, /**< EtherCAT master. */
       
  3032         void *arg, /**< ioctl() argument. */
       
  3033         ec_ioctl_context_t *ctx /**< Private data structure of file handle. */
       
  3034         )
       
  3035 {
       
  3036     ec_ioctl_reg_request_t io;
       
  3037     ec_slave_config_t *sc;
       
  3038     ec_reg_request_t *reg;
       
  3039 
       
  3040     if (unlikely(!ctx->requested)) {
       
  3041         return -EPERM;
       
  3042     }
       
  3043 
       
  3044     if (copy_from_user(&io, (void __user *) arg, sizeof(io))) {
       
  3045         return -EFAULT;
       
  3046     }
       
  3047 
       
  3048     if (io.mem_size <= 0) {
       
  3049         return 0;
       
  3050     }
       
  3051 
       
  3052     /* no locking of master_sem needed, because neither sc nor reg will not be
       
  3053      * deleted in the meantime. */
       
  3054 
       
  3055     if (!(sc = ec_master_get_config(master, io.config_index))) {
       
  3056         return -ENOENT;
       
  3057     }
       
  3058 
       
  3059     if (!(reg = ec_slave_config_find_reg_request(sc, io.request_index))) {
       
  3060         return -ENOENT;
       
  3061     }
       
  3062 
       
  3063     if (copy_to_user((void __user *) io.data, ecrt_reg_request_data(reg),
       
  3064                 min(reg->mem_size, io.mem_size))) {
       
  3065         return -EFAULT;
       
  3066     }
       
  3067 
       
  3068     return 0;
       
  3069 }
       
  3070 
       
  3071 /*****************************************************************************/
       
  3072 
       
  3073 /** Gets an register request's state.
       
  3074  */
       
  3075 static int ec_ioctl_reg_request_state(
       
  3076         ec_master_t *master, /**< EtherCAT master. */
       
  3077         void *arg, /**< ioctl() argument. */
       
  3078         ec_ioctl_context_t *ctx /**< Private data structure of file handle. */
       
  3079         )
       
  3080 {
       
  3081     ec_ioctl_reg_request_t io;
       
  3082     ec_slave_config_t *sc;
       
  3083     ec_reg_request_t *reg;
       
  3084 
       
  3085     if (unlikely(!ctx->requested)) {
       
  3086         return -EPERM;
       
  3087     }
       
  3088 
       
  3089     if (copy_from_user(&io, (void __user *) arg, sizeof(io))) {
       
  3090         return -EFAULT;
       
  3091     }
       
  3092 
       
  3093     /* no locking of master_sem needed, because neither sc nor reg will not be
       
  3094      * deleted in the meantime. */
       
  3095 
       
  3096     if (!(sc = ec_master_get_config(master, io.config_index))) {
       
  3097         return -ENOENT;
       
  3098     }
       
  3099 
       
  3100     if (!(reg = ec_slave_config_find_reg_request(sc, io.request_index))) {
       
  3101         return -ENOENT;
       
  3102     }
       
  3103 
       
  3104     io.state = ecrt_reg_request_state(reg);
       
  3105     io.new_data = io.state == EC_REQUEST_SUCCESS && reg->dir == EC_DIR_INPUT;
       
  3106 
       
  3107     if (copy_to_user((void __user *) arg, &io, sizeof(io))) {
       
  3108         return -EFAULT;
       
  3109     }
       
  3110 
       
  3111     return 0;
       
  3112 }
       
  3113 
       
  3114 /*****************************************************************************/
       
  3115 
       
  3116 /** Starts an register write operation.
       
  3117  */
       
  3118 static int ec_ioctl_reg_request_write(
       
  3119         ec_master_t *master, /**< EtherCAT master. */
       
  3120         void *arg, /**< ioctl() argument. */
       
  3121         ec_ioctl_context_t *ctx /**< Private data structure of file handle. */
       
  3122         )
       
  3123 {
       
  3124     ec_ioctl_reg_request_t io;
       
  3125     ec_slave_config_t *sc;
       
  3126     ec_reg_request_t *reg;
       
  3127 
       
  3128     if (unlikely(!ctx->requested)) {
       
  3129         return -EPERM;
       
  3130     }
       
  3131 
       
  3132     if (copy_from_user(&io, (void __user *) arg, sizeof(io))) {
       
  3133         return -EFAULT;
       
  3134     }
       
  3135 
       
  3136     /* no locking of master_sem needed, because neither sc nor reg will not be
       
  3137      * deleted in the meantime. */
       
  3138 
       
  3139     if (!(sc = ec_master_get_config(master, io.config_index))) {
       
  3140         return -ENOENT;
       
  3141     }
       
  3142 
       
  3143     if (!(reg = ec_slave_config_find_reg_request(sc, io.request_index))) {
       
  3144         return -ENOENT;
       
  3145     }
       
  3146 
       
  3147     if (io.transfer_size > reg->mem_size) {
       
  3148         return -EOVERFLOW;
       
  3149     }
       
  3150 
       
  3151     if (copy_from_user(reg->data, (void __user *) io.data,
       
  3152                 io.transfer_size)) {
       
  3153         return -EFAULT;
       
  3154     }
       
  3155 
       
  3156     ecrt_reg_request_write(reg, io.address, io.transfer_size);
       
  3157     return 0;
       
  3158 }
       
  3159 
       
  3160 /*****************************************************************************/
       
  3161 
       
  3162 /** Starts an register read operation.
       
  3163  */
       
  3164 static int ec_ioctl_reg_request_read(
       
  3165         ec_master_t *master, /**< EtherCAT master. */
       
  3166         void *arg, /**< ioctl() argument. */
       
  3167         ec_ioctl_context_t *ctx /**< Private data structure of file handle. */
       
  3168         )
       
  3169 {
       
  3170     ec_ioctl_reg_request_t io;
       
  3171     ec_slave_config_t *sc;
       
  3172     ec_reg_request_t *reg;
       
  3173 
       
  3174     if (unlikely(!ctx->requested)) {
       
  3175         return -EPERM;
       
  3176     }
       
  3177 
       
  3178     if (copy_from_user(&io, (void __user *) arg, sizeof(io))) {
       
  3179         return -EFAULT;
       
  3180     }
       
  3181 
       
  3182     /* no locking of master_sem needed, because neither sc nor reg will not be
       
  3183      * deleted in the meantime. */
       
  3184 
       
  3185     if (!(sc = ec_master_get_config(master, io.config_index))) {
       
  3186         return -ENOENT;
       
  3187     }
       
  3188 
       
  3189     if (!(reg = ec_slave_config_find_reg_request(sc, io.request_index))) {
       
  3190         return -ENOENT;
       
  3191     }
       
  3192 
       
  3193     if (io.transfer_size > reg->mem_size) {
       
  3194         return -EOVERFLOW;
       
  3195     }
       
  3196 
       
  3197     ecrt_reg_request_read(reg, io.address, io.transfer_size);
  2977     return 0;
  3198     return 0;
  2978 }
  3199 }
  2979 
  3200 
  2980 /*****************************************************************************/
  3201 /*****************************************************************************/
  2981 
  3202 
  3546 #endif
  3767 #endif
  3547 
  3768 
  3548 /** Called when an ioctl() command is issued.
  3769 /** Called when an ioctl() command is issued.
  3549  */
  3770  */
  3550 long EC_IOCTL(ec_master_t *master, ec_ioctl_context_t *ctx,
  3771 long EC_IOCTL(ec_master_t *master, ec_ioctl_context_t *ctx,
  3551 		unsigned int cmd, void *arg)
  3772         unsigned int cmd, void *arg)
  3552 {
  3773 {
  3553 #if DEBUG_LATENCY
  3774 #if DEBUG_LATENCY
  3554     cycles_t a = get_cycles(), b;
  3775     cycles_t a = get_cycles(), b;
  3555     unsigned int t;
  3776     unsigned int t;
  3556 #endif
  3777 #endif
  3874                 ret = -EPERM;
  4095                 ret = -EPERM;
  3875                 break;
  4096                 break;
  3876             }
  4097             }
  3877             ret = ec_ioctl_sc_create_sdo_request(master, arg, ctx);
  4098             ret = ec_ioctl_sc_create_sdo_request(master, arg, ctx);
  3878             break;
  4099             break;
       
  4100         case EC_IOCTL_SC_REG_REQUEST:
       
  4101             if (!ctx->writable) {
       
  4102                 ret = -EPERM;
       
  4103                 break;
       
  4104             }
       
  4105             ret = ec_ioctl_sc_create_reg_request(master, arg, ctx);
       
  4106             break;
  3879         case EC_IOCTL_SC_VOE:
  4107         case EC_IOCTL_SC_VOE:
  3880             if (!ctx->writable) {
  4108             if (!ctx->writable) {
  3881                 ret = -EPERM;
  4109                 ret = -EPERM;
  3882                 break;
  4110                 break;
  3883             }
  4111             }
  3944             }
  4172             }
  3945             ret = ec_ioctl_sdo_request_write(master, arg, ctx);
  4173             ret = ec_ioctl_sdo_request_write(master, arg, ctx);
  3946             break;
  4174             break;
  3947         case EC_IOCTL_SDO_REQUEST_DATA:
  4175         case EC_IOCTL_SDO_REQUEST_DATA:
  3948             ret = ec_ioctl_sdo_request_data(master, arg, ctx);
  4176             ret = ec_ioctl_sdo_request_data(master, arg, ctx);
       
  4177             break;
       
  4178         case EC_IOCTL_REG_REQUEST_DATA:
       
  4179             ret = ec_ioctl_reg_request_data(master, arg, ctx);
       
  4180             break;
       
  4181         case EC_IOCTL_REG_REQUEST_STATE:
       
  4182             ret = ec_ioctl_reg_request_state(master, arg, ctx);
       
  4183             break;
       
  4184         case EC_IOCTL_REG_REQUEST_WRITE:
       
  4185             if (!ctx->writable) {
       
  4186                 ret = -EPERM;
       
  4187                 break;
       
  4188             }
       
  4189             ret = ec_ioctl_reg_request_write(master, arg, ctx);
       
  4190             break;
       
  4191         case EC_IOCTL_REG_REQUEST_READ:
       
  4192             if (!ctx->writable) {
       
  4193                 ret = -EPERM;
       
  4194                 break;
       
  4195             }
       
  4196             ret = ec_ioctl_reg_request_read(master, arg, ctx);
  3949             break;
  4197             break;
  3950         case EC_IOCTL_VOE_SEND_HEADER:
  4198         case EC_IOCTL_VOE_SEND_HEADER:
  3951             if (!ctx->writable) {
  4199             if (!ctx->writable) {
  3952                 ret = -EPERM;
  4200                 ret = -EPERM;
  3953                 break;
  4201                 break;