master/cdev.c
changeset 980 c07dd38243ba
parent 978 2962baf7e6d1
child 981 5a2bd04c555c
equal deleted inserted replaced
979:405cc2d033e0 980:c07dd38243ba
   761                 break;
   761                 break;
   762             }
   762             }
   763 
   763 
   764         case EC_IOCTL_SII_READ:
   764         case EC_IOCTL_SII_READ:
   765             {
   765             {
   766                 ec_ioctl_sii_read_t data;
   766                 ec_ioctl_sii_t data;
   767                 const ec_slave_t *slave;
   767                 const ec_slave_t *slave;
   768 
   768 
   769                 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
   769                 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
   770                     retval = -EFAULT;
   770                     retval = -EFAULT;
   771                     break;
   771                     break;
   793                     break;
   793                     break;
   794                 }
   794                 }
   795                 break;
   795                 break;
   796             }
   796             }
   797 
   797 
       
   798         case EC_IOCTL_SII_WRITE:
       
   799             {
       
   800                 ec_ioctl_sii_t data;
       
   801                 ec_slave_t *slave;
       
   802                 unsigned int byte_size;
       
   803                 uint16_t *words;
       
   804 
       
   805                 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) {
       
   806                     retval = -EFAULT;
       
   807                     break;
       
   808                 }
       
   809                 
       
   810                 if (!(slave = ec_master_find_slave(
       
   811                                 master, 0, data.slave_position))) {
       
   812                     EC_ERR("Slave %u does not exist!\n", data.slave_position);
       
   813                     retval = -EINVAL;
       
   814                     break;
       
   815                 }
       
   816 
       
   817                 if (!data.nwords)
       
   818                     break;
       
   819 
       
   820                 byte_size = sizeof(uint16_t) * data.nwords;
       
   821                 if (!(words = kmalloc(byte_size, GFP_KERNEL))) {
       
   822                     EC_ERR("Failed to allocate %u bytes for SII contents.\n",
       
   823                             byte_size);
       
   824                     retval = -ENOMEM;
       
   825                     break;
       
   826                 }
       
   827 
       
   828                 if (copy_from_user(words,
       
   829                             (void __user *) data.words, byte_size)) {
       
   830                     retval = -EFAULT;
       
   831                     kfree(words);
       
   832                     break;
       
   833                 }
       
   834 
       
   835                 if (ec_slave_write_sii(slave,
       
   836                             data.offset, data.nwords, words)) {
       
   837                     retval = -EIO;
       
   838                     kfree(words);
       
   839                     break;
       
   840                 }
       
   841 
       
   842                 kfree(words);
       
   843                 break;
       
   844             }
       
   845 
   798         default:
   846         default:
   799             retval = -ENOTTY;
   847             retval = -ENOTTY;
   800     }
   848     }
   801 
   849 
   802     return retval;
   850     return retval;