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