master/cdev.c
changeset 978 2962baf7e6d1
parent 974 5868944a6456
child 980 c07dd38243ba
equal deleted inserted replaced
977:167ae3e76cc7 978:2962baf7e6d1
   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                 data.sdo_count = ec_slave_sdo_count(slave);
       
   199                 data.sii_nwords = slave->sii_nwords;
   199 
   200 
   200                 if (slave->sii.name) {
   201                 if (slave->sii.name) {
   201                     strncpy(data.name, slave->sii.name,
   202                     strncpy(data.name, slave->sii.name,
   202                             EC_IOCTL_SLAVE_NAME_SIZE);
   203                             EC_IOCTL_SLAVE_NAME_SIZE);
   203                     data.name[EC_IOCTL_SLAVE_NAME_SIZE - 1] = 0;
   204                     data.name[EC_IOCTL_SLAVE_NAME_SIZE - 1] = 0;
   758 
   759 
   759                 ec_sdo_request_clear(&request.req);
   760                 ec_sdo_request_clear(&request.req);
   760                 break;
   761                 break;
   761             }
   762             }
   762 
   763 
       
   764         case EC_IOCTL_SII_READ:
       
   765             {
       
   766                 ec_ioctl_sii_read_t data;
       
   767                 const ec_slave_t *slave;
       
   768 
       
   769                 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
       
   770                     retval = -EFAULT;
       
   771                     break;
       
   772                 }
       
   773                 
       
   774                 if (!(slave = ec_master_find_slave(
       
   775                                 master, 0, data.slave_position))) {
       
   776                     EC_ERR("Slave %u does not exist!\n", data.slave_position);
       
   777                     retval = -EINVAL;
       
   778                     break;
       
   779                 }
       
   780 
       
   781                 if (!data.nwords
       
   782                         || data.offset + data.nwords > slave->sii_nwords) {
       
   783                     EC_ERR("Invalid SII read offset/size %u/%u for slave "
       
   784                             "SII size %u!\n", data.offset,
       
   785                             data.nwords, slave->sii_nwords);
       
   786                     retval = -EINVAL;
       
   787                     break;
       
   788                 }
       
   789 
       
   790                 if (copy_to_user((void __user *) data.words,
       
   791                             slave->sii_words + data.offset, data.nwords * 2)) {
       
   792                     retval = -EFAULT;
       
   793                     break;
       
   794                 }
       
   795                 break;
       
   796             }
       
   797 
   763         default:
   798         default:
   764             retval = -ENOTTY;
   799             retval = -ENOTTY;
   765     }
   800     }
   766 
   801 
   767     return retval;
   802     return retval;