equal
deleted
inserted
replaced
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; |