master/cdev.c
changeset 965 1aee4aa1def3
parent 960 36e460ffbb5e
child 968 b0e894257743
equal deleted inserted replaced
964:957f21465052 965:1aee4aa1def3
   193                 data.serial_number = slave->sii.serial_number;
   193                 data.serial_number = slave->sii.serial_number;
   194                 data.alias = slave->sii.alias;
   194                 data.alias = slave->sii.alias;
   195                 data.state = slave->current_state;
   195                 data.state = slave->current_state;
   196 
   196 
   197                 data.sync_count = slave->sii.sync_count;
   197                 data.sync_count = slave->sii.sync_count;
       
   198                 data.sdo_count = ec_slave_sdo_count(slave);
   198 
   199 
   199                 if (slave->sii.name) {
   200                 if (slave->sii.name) {
   200                     strncpy(data.name, slave->sii.name,
   201                     strncpy(data.name, slave->sii.name,
   201                             EC_IOCTL_SLAVE_NAME_SIZE);
   202                             EC_IOCTL_SLAVE_NAME_SIZE);
   202                     data.name[EC_IOCTL_SLAVE_NAME_SIZE - 1] = 0;
   203                     data.name[EC_IOCTL_SLAVE_NAME_SIZE - 1] = 0;
   497 
   498 
   498                 ec_slave_request_state(slave, data.requested_state);
   499                 ec_slave_request_state(slave, data.requested_state);
   499                 break;
   500                 break;
   500             }
   501             }
   501 
   502 
       
   503         case EC_IOCTL_SDO:
       
   504             {
       
   505                 ec_ioctl_sdo_t data;
       
   506                 const ec_slave_t *slave;
       
   507                 const ec_sdo_t *sdo;
       
   508 
       
   509                 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
       
   510                     retval = -EFAULT;
       
   511                     break;
       
   512                 }
       
   513                 
       
   514                 if (!(slave = ec_master_find_slave(
       
   515                                 master, 0, data.slave_position))) {
       
   516                     EC_ERR("Slave %u does not exist!\n", data.slave_position);
       
   517                     retval = -EINVAL;
       
   518                     break;
       
   519                 }
       
   520 
       
   521                 if (!(sdo = ec_slave_get_sdo_by_pos_const(
       
   522                                 slave, data.sdo_position))) {
       
   523                     EC_ERR("Sdo %u does not exist in slave %u!\n",
       
   524                             data.sdo_position, data.slave_position);
       
   525                     retval = -EINVAL;
       
   526                     break;
       
   527                 }
       
   528 
       
   529                 data.sdo_index = sdo->index;
       
   530                 data.max_subindex = sdo->max_subindex;
       
   531 
       
   532                 if (sdo->name) {
       
   533                     strncpy(data.name, sdo->name, EC_IOCTL_SDO_NAME_SIZE);
       
   534                     data.name[EC_IOCTL_SDO_NAME_SIZE - 1] = 0;
       
   535                 } else {
       
   536                     data.name[0] = 0;
       
   537                 }
       
   538 
       
   539                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
       
   540                     retval = -EFAULT;
       
   541                     break;
       
   542                 }
       
   543                 break;
       
   544             }
       
   545 
       
   546         case EC_IOCTL_SDO_ENTRY:
       
   547             {
       
   548                 ec_ioctl_sdo_entry_t data;
       
   549                 const ec_slave_t *slave;
       
   550                 const ec_sdo_t *sdo;
       
   551                 const ec_sdo_entry_t *entry;
       
   552 
       
   553                 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
       
   554                     retval = -EFAULT;
       
   555                     break;
       
   556                 }
       
   557                 
       
   558                 if (!(slave = ec_master_find_slave(
       
   559                                 master, 0, data.slave_position))) {
       
   560                     EC_ERR("Slave %u does not exist!\n", data.slave_position);
       
   561                     retval = -EINVAL;
       
   562                     break;
       
   563                 }
       
   564 
       
   565                 if (!(sdo = ec_slave_get_sdo_by_pos_const(
       
   566                                 slave, data.sdo_position))) {
       
   567                     EC_ERR("Sdo %u does not exist in slave %u!\n",
       
   568                             data.sdo_position, data.slave_position);
       
   569                     retval = -EINVAL;
       
   570                     break;
       
   571                 }
       
   572 
       
   573                 if (!(entry = ec_sdo_get_entry_const(
       
   574                                 sdo, data.sdo_entry_subindex))) {
       
   575                     EC_ERR("Sdo entry %u does not exist in Sdo %u "
       
   576                             "in slave %u!\n", data.sdo_entry_subindex,
       
   577                             data.sdo_position, data.slave_position);
       
   578                     retval = -EINVAL;
       
   579                     break;
       
   580                 }
       
   581 
       
   582                 data.data_type = entry->data_type;
       
   583                 data.bit_length = entry->bit_length;
       
   584 
       
   585                 if (entry->description) {
       
   586                     strncpy(data.description, entry->description,
       
   587                             EC_IOCTL_SDO_ENTRY_DESCRIPTION_SIZE);
       
   588                     data.description[EC_IOCTL_SDO_ENTRY_DESCRIPTION_SIZE - 1]
       
   589                         = 0;
       
   590                 } else {
       
   591                     data.description[0] = 0;
       
   592                 }
       
   593 
       
   594                 if (copy_to_user((void __user *) arg, &data, sizeof(data))) {
       
   595                     retval = -EFAULT;
       
   596                     break;
       
   597                 }
       
   598                 break;
       
   599             }
       
   600 
   502         default:
   601         default:
   503             retval = -ENOIOCTLCMD;
   602             retval = -ENOIOCTLCMD;
   504     }
   603     }
   505 
   604 
   506     return retval;
   605     return retval;