146 case EC_IOCTL_MASTER: |
146 case EC_IOCTL_MASTER: |
147 { |
147 { |
148 ec_ioctl_master_t data; |
148 ec_ioctl_master_t data; |
149 |
149 |
150 data.slave_count = master->slave_count; |
150 data.slave_count = master->slave_count; |
|
151 data.config_count = ec_master_config_count(master); |
151 data.mode = (uint8_t) master->mode; |
152 data.mode = (uint8_t) master->mode; |
152 |
153 |
153 memcpy(data.devices[0].address, master->main_mac, ETH_ALEN); |
154 memcpy(data.devices[0].address, master->main_mac, ETH_ALEN); |
154 data.devices[0].attached = master->main_device.dev ? 1 : 0; |
155 data.devices[0].attached = master->main_device.dev ? 1 : 0; |
155 data.devices[0].tx_count = master->main_device.tx_count; |
156 data.devices[0].tx_count = master->main_device.tx_count; |
208 data.sdo_count = ec_slave_sdo_count(slave); |
209 data.sdo_count = ec_slave_sdo_count(slave); |
209 data.sii_nwords = slave->sii_nwords; |
210 data.sii_nwords = slave->sii_nwords; |
210 |
211 |
211 if (slave->sii.name) { |
212 if (slave->sii.name) { |
212 strncpy(data.name, slave->sii.name, |
213 strncpy(data.name, slave->sii.name, |
213 EC_IOCTL_SLAVE_NAME_SIZE); |
214 EC_IOCTL_STRING_SIZE); |
214 data.name[EC_IOCTL_SLAVE_NAME_SIZE - 1] = 0; |
215 data.name[EC_IOCTL_STRING_SIZE - 1] = 0; |
215 } else { |
216 } else { |
216 data.name[0] = 0; |
217 data.name[0] = 0; |
217 } |
218 } |
218 |
219 |
219 if (copy_to_user((void __user *) arg, &data, sizeof(data))) { |
220 if (copy_to_user((void __user *) arg, &data, sizeof(data))) { |
851 |
851 |
852 kfree(words); |
852 kfree(words); |
853 break; |
853 break; |
854 } |
854 } |
855 |
855 |
|
856 case EC_IOCTL_CONFIG: |
|
857 { |
|
858 ec_ioctl_config_t data; |
|
859 const ec_slave_config_t *sc; |
|
860 |
|
861 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) { |
|
862 retval = -EFAULT; |
|
863 break; |
|
864 } |
|
865 |
|
866 if (!(sc = ec_master_get_config_const( |
|
867 master, data.config_index))) { |
|
868 EC_ERR("Slave config %u does not exist!\n", |
|
869 data.config_index); |
|
870 retval = -EINVAL; |
|
871 break; |
|
872 } |
|
873 |
|
874 data.alias = sc->alias; |
|
875 data.position = sc->position; |
|
876 data.vendor_id = sc->vendor_id; |
|
877 data.product_code = sc->product_code; |
|
878 data.pdo_count[EC_DIR_OUTPUT] = |
|
879 ec_pdo_list_count(&sc->pdos[EC_DIR_OUTPUT]); |
|
880 data.pdo_count[EC_DIR_INPUT] = |
|
881 ec_pdo_list_count(&sc->pdos[EC_DIR_INPUT]); |
|
882 data.sdo_count = ec_slave_config_sdo_count(sc); |
|
883 data.attached = sc->slave != NULL; |
|
884 |
|
885 if (copy_to_user((void __user *) arg, &data, sizeof(data))) { |
|
886 retval = -EFAULT; |
|
887 break; |
|
888 } |
|
889 break; |
|
890 } |
|
891 |
|
892 case EC_IOCTL_CONFIG_PDO: |
|
893 { |
|
894 ec_ioctl_config_pdo_t data; |
|
895 const ec_slave_config_t *sc; |
|
896 const ec_pdo_t *pdo; |
|
897 |
|
898 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) { |
|
899 retval = -EFAULT; |
|
900 break; |
|
901 } |
|
902 |
|
903 if (!(sc = ec_master_get_config_const( |
|
904 master, data.config_index))) { |
|
905 EC_ERR("Slave config %u does not exist!\n", |
|
906 data.config_index); |
|
907 retval = -EINVAL; |
|
908 break; |
|
909 } |
|
910 |
|
911 if (data.direction > EC_DIR_INPUT) { |
|
912 EC_ERR("Invalid direction %u!\n", data.direction); |
|
913 retval = -EINVAL; |
|
914 break; |
|
915 } |
|
916 |
|
917 if (!(pdo = ec_pdo_list_find_pdo_by_pos_const( |
|
918 &sc->pdos[data.direction], data.pdo_pos))) { |
|
919 EC_ERR("Invalid Pdo position!\n"); |
|
920 retval = -EINVAL; |
|
921 break; |
|
922 } |
|
923 |
|
924 data.index = pdo->index; |
|
925 data.entry_count = ec_pdo_entry_count(pdo); |
|
926 |
|
927 if (pdo->name) { |
|
928 strncpy(data.name, pdo->name, EC_IOCTL_STRING_SIZE); |
|
929 data.name[EC_IOCTL_STRING_SIZE - 1] = 0; |
|
930 } else { |
|
931 data.name[0] = 0; |
|
932 } |
|
933 |
|
934 if (copy_to_user((void __user *) arg, &data, sizeof(data))) { |
|
935 retval = -EFAULT; |
|
936 break; |
|
937 } |
|
938 break; |
|
939 } |
|
940 |
|
941 case EC_IOCTL_CONFIG_PDO_ENTRY: |
|
942 { |
|
943 ec_ioctl_config_pdo_entry_t data; |
|
944 const ec_slave_config_t *sc; |
|
945 const ec_pdo_t *pdo; |
|
946 const ec_pdo_entry_t *entry; |
|
947 |
|
948 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) { |
|
949 retval = -EFAULT; |
|
950 break; |
|
951 } |
|
952 |
|
953 if (!(sc = ec_master_get_config_const( |
|
954 master, data.config_index))) { |
|
955 EC_ERR("Slave config %u does not exist!\n", |
|
956 data.config_index); |
|
957 retval = -EINVAL; |
|
958 break; |
|
959 } |
|
960 |
|
961 if (data.direction > EC_DIR_INPUT) { |
|
962 EC_ERR("Invalid direction %u!\n", data.direction); |
|
963 retval = -EINVAL; |
|
964 break; |
|
965 } |
|
966 |
|
967 if (!(pdo = ec_pdo_list_find_pdo_by_pos_const( |
|
968 &sc->pdos[data.direction], data.pdo_pos))) { |
|
969 EC_ERR("Invalid Pdo position!\n"); |
|
970 retval = -EINVAL; |
|
971 break; |
|
972 } |
|
973 |
|
974 if (!(entry = ec_pdo_find_entry_by_pos_const( |
|
975 pdo, data.entry_pos))) { |
|
976 EC_ERR("Entry not found!\n"); |
|
977 retval = -EINVAL; |
|
978 break; |
|
979 } |
|
980 |
|
981 data.index = entry->index; |
|
982 data.subindex = entry->subindex; |
|
983 data.bit_length = entry->bit_length; |
|
984 if (entry->name) { |
|
985 strncpy(data.name, entry->name, EC_IOCTL_STRING_SIZE); |
|
986 data.name[EC_IOCTL_STRING_SIZE - 1] = 0; |
|
987 } else { |
|
988 data.name[0] = 0; |
|
989 } |
|
990 |
|
991 if (copy_to_user((void __user *) arg, &data, sizeof(data))) { |
|
992 retval = -EFAULT; |
|
993 break; |
|
994 } |
|
995 break; |
|
996 } |
|
997 |
|
998 case EC_IOCTL_CONFIG_SDO: |
|
999 { |
|
1000 ec_ioctl_config_sdo_t data; |
|
1001 const ec_slave_config_t *sc; |
|
1002 const ec_sdo_request_t *req; |
|
1003 |
|
1004 if (copy_from_user(&data, (void __user *) arg, sizeof(data))) { |
|
1005 retval = -EFAULT; |
|
1006 break; |
|
1007 } |
|
1008 |
|
1009 if (!(sc = ec_master_get_config_const( |
|
1010 master, data.config_index))) { |
|
1011 EC_ERR("Slave config %u does not exist!\n", |
|
1012 data.config_index); |
|
1013 retval = -EINVAL; |
|
1014 break; |
|
1015 } |
|
1016 |
|
1017 if (!(req = ec_slave_config_get_sdo_by_pos_const( |
|
1018 sc, data.sdo_pos))) { |
|
1019 EC_ERR("Invalid Sdo position!\n"); |
|
1020 retval = -EINVAL; |
|
1021 break; |
|
1022 } |
|
1023 |
|
1024 data.index = req->index; |
|
1025 data.subindex = req->subindex; |
|
1026 data.size = req->data_size; |
|
1027 memcpy(&data.data, req->data, min((u32) data.size, (u32) 4)); |
|
1028 |
|
1029 if (copy_to_user((void __user *) arg, &data, sizeof(data))) { |
|
1030 retval = -EFAULT; |
|
1031 break; |
|
1032 } |
|
1033 break; |
|
1034 } |
|
1035 |
856 default: |
1036 default: |
857 retval = -ENOTTY; |
1037 retval = -ENOTTY; |
858 } |
1038 } |
859 |
1039 |
860 return retval; |
1040 return retval; |