diff options
author | H Hartley Sweeten <hsweeten@visionengravers.com> | 2013-01-21 16:02:59 -0500 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2013-01-21 17:25:07 -0500 |
commit | 5b6cbd87d3b9324e2c4200dd5b1b275999044ad8 (patch) | |
tree | e2caad7f35d59fe14c81d80d21b6408cff2b34f1 /drivers | |
parent | 37fbb4acda89447b8b37e0cc5d1bd8f7ce9b1bb4 (diff) |
staging: comedi: comedi_fops: remove last forward declaration
There is still a forward declaration in this file for parse_insn().
Remove the need for it by moving do_insnlist_ioctl() down a bit.
Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Cc: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/staging/comedi/comedi_fops.c | 178 |
1 files changed, 88 insertions, 90 deletions
diff --git a/drivers/staging/comedi/comedi_fops.c b/drivers/staging/comedi/comedi_fops.c index dc3588a2c98b..b798e42ee014 100644 --- a/drivers/staging/comedi/comedi_fops.c +++ b/drivers/staging/comedi/comedi_fops.c | |||
@@ -842,96 +842,6 @@ copyback: | |||
842 | return 0; | 842 | return 0; |
843 | } | 843 | } |
844 | 844 | ||
845 | static int parse_insn(struct comedi_device *dev, struct comedi_insn *insn, | ||
846 | unsigned int *data, void *file); | ||
847 | /* | ||
848 | * COMEDI_INSNLIST | ||
849 | * synchronous instructions | ||
850 | * | ||
851 | * arg: | ||
852 | * pointer to sync cmd structure | ||
853 | * | ||
854 | * reads: | ||
855 | * sync cmd struct at arg | ||
856 | * instruction list | ||
857 | * data (for writes) | ||
858 | * | ||
859 | * writes: | ||
860 | * data (for reads) | ||
861 | */ | ||
862 | /* arbitrary limits */ | ||
863 | #define MAX_SAMPLES 256 | ||
864 | static int do_insnlist_ioctl(struct comedi_device *dev, | ||
865 | struct comedi_insnlist __user *arg, void *file) | ||
866 | { | ||
867 | struct comedi_insnlist insnlist; | ||
868 | struct comedi_insn *insns = NULL; | ||
869 | unsigned int *data = NULL; | ||
870 | int i = 0; | ||
871 | int ret = 0; | ||
872 | |||
873 | if (copy_from_user(&insnlist, arg, sizeof(insnlist))) | ||
874 | return -EFAULT; | ||
875 | |||
876 | data = kmalloc(sizeof(unsigned int) * MAX_SAMPLES, GFP_KERNEL); | ||
877 | if (!data) { | ||
878 | DPRINTK("kmalloc failed\n"); | ||
879 | ret = -ENOMEM; | ||
880 | goto error; | ||
881 | } | ||
882 | |||
883 | insns = kcalloc(insnlist.n_insns, sizeof(*insns), GFP_KERNEL); | ||
884 | if (!insns) { | ||
885 | DPRINTK("kmalloc failed\n"); | ||
886 | ret = -ENOMEM; | ||
887 | goto error; | ||
888 | } | ||
889 | |||
890 | if (copy_from_user(insns, insnlist.insns, | ||
891 | sizeof(*insns) * insnlist.n_insns)) { | ||
892 | DPRINTK("copy_from_user failed\n"); | ||
893 | ret = -EFAULT; | ||
894 | goto error; | ||
895 | } | ||
896 | |||
897 | for (i = 0; i < insnlist.n_insns; i++) { | ||
898 | if (insns[i].n > MAX_SAMPLES) { | ||
899 | DPRINTK("number of samples too large\n"); | ||
900 | ret = -EINVAL; | ||
901 | goto error; | ||
902 | } | ||
903 | if (insns[i].insn & INSN_MASK_WRITE) { | ||
904 | if (copy_from_user(data, insns[i].data, | ||
905 | insns[i].n * sizeof(unsigned int))) { | ||
906 | DPRINTK("copy_from_user failed\n"); | ||
907 | ret = -EFAULT; | ||
908 | goto error; | ||
909 | } | ||
910 | } | ||
911 | ret = parse_insn(dev, insns + i, data, file); | ||
912 | if (ret < 0) | ||
913 | goto error; | ||
914 | if (insns[i].insn & INSN_MASK_READ) { | ||
915 | if (copy_to_user(insns[i].data, data, | ||
916 | insns[i].n * sizeof(unsigned int))) { | ||
917 | DPRINTK("copy_to_user failed\n"); | ||
918 | ret = -EFAULT; | ||
919 | goto error; | ||
920 | } | ||
921 | } | ||
922 | if (need_resched()) | ||
923 | schedule(); | ||
924 | } | ||
925 | |||
926 | error: | ||
927 | kfree(insns); | ||
928 | kfree(data); | ||
929 | |||
930 | if (ret < 0) | ||
931 | return ret; | ||
932 | return i; | ||
933 | } | ||
934 | |||
935 | static int check_insn_config_length(struct comedi_insn *insn, | 845 | static int check_insn_config_length(struct comedi_insn *insn, |
936 | unsigned int *data) | 846 | unsigned int *data) |
937 | { | 847 | { |
@@ -1163,6 +1073,94 @@ out: | |||
1163 | } | 1073 | } |
1164 | 1074 | ||
1165 | /* | 1075 | /* |
1076 | * COMEDI_INSNLIST | ||
1077 | * synchronous instructions | ||
1078 | * | ||
1079 | * arg: | ||
1080 | * pointer to sync cmd structure | ||
1081 | * | ||
1082 | * reads: | ||
1083 | * sync cmd struct at arg | ||
1084 | * instruction list | ||
1085 | * data (for writes) | ||
1086 | * | ||
1087 | * writes: | ||
1088 | * data (for reads) | ||
1089 | */ | ||
1090 | /* arbitrary limits */ | ||
1091 | #define MAX_SAMPLES 256 | ||
1092 | static int do_insnlist_ioctl(struct comedi_device *dev, | ||
1093 | struct comedi_insnlist __user *arg, void *file) | ||
1094 | { | ||
1095 | struct comedi_insnlist insnlist; | ||
1096 | struct comedi_insn *insns = NULL; | ||
1097 | unsigned int *data = NULL; | ||
1098 | int i = 0; | ||
1099 | int ret = 0; | ||
1100 | |||
1101 | if (copy_from_user(&insnlist, arg, sizeof(insnlist))) | ||
1102 | return -EFAULT; | ||
1103 | |||
1104 | data = kmalloc(sizeof(unsigned int) * MAX_SAMPLES, GFP_KERNEL); | ||
1105 | if (!data) { | ||
1106 | DPRINTK("kmalloc failed\n"); | ||
1107 | ret = -ENOMEM; | ||
1108 | goto error; | ||
1109 | } | ||
1110 | |||
1111 | insns = kcalloc(insnlist.n_insns, sizeof(*insns), GFP_KERNEL); | ||
1112 | if (!insns) { | ||
1113 | DPRINTK("kmalloc failed\n"); | ||
1114 | ret = -ENOMEM; | ||
1115 | goto error; | ||
1116 | } | ||
1117 | |||
1118 | if (copy_from_user(insns, insnlist.insns, | ||
1119 | sizeof(*insns) * insnlist.n_insns)) { | ||
1120 | DPRINTK("copy_from_user failed\n"); | ||
1121 | ret = -EFAULT; | ||
1122 | goto error; | ||
1123 | } | ||
1124 | |||
1125 | for (i = 0; i < insnlist.n_insns; i++) { | ||
1126 | if (insns[i].n > MAX_SAMPLES) { | ||
1127 | DPRINTK("number of samples too large\n"); | ||
1128 | ret = -EINVAL; | ||
1129 | goto error; | ||
1130 | } | ||
1131 | if (insns[i].insn & INSN_MASK_WRITE) { | ||
1132 | if (copy_from_user(data, insns[i].data, | ||
1133 | insns[i].n * sizeof(unsigned int))) { | ||
1134 | DPRINTK("copy_from_user failed\n"); | ||
1135 | ret = -EFAULT; | ||
1136 | goto error; | ||
1137 | } | ||
1138 | } | ||
1139 | ret = parse_insn(dev, insns + i, data, file); | ||
1140 | if (ret < 0) | ||
1141 | goto error; | ||
1142 | if (insns[i].insn & INSN_MASK_READ) { | ||
1143 | if (copy_to_user(insns[i].data, data, | ||
1144 | insns[i].n * sizeof(unsigned int))) { | ||
1145 | DPRINTK("copy_to_user failed\n"); | ||
1146 | ret = -EFAULT; | ||
1147 | goto error; | ||
1148 | } | ||
1149 | } | ||
1150 | if (need_resched()) | ||
1151 | schedule(); | ||
1152 | } | ||
1153 | |||
1154 | error: | ||
1155 | kfree(insns); | ||
1156 | kfree(data); | ||
1157 | |||
1158 | if (ret < 0) | ||
1159 | return ret; | ||
1160 | return i; | ||
1161 | } | ||
1162 | |||
1163 | /* | ||
1166 | * COMEDI_INSN | 1164 | * COMEDI_INSN |
1167 | * synchronous instructions | 1165 | * synchronous instructions |
1168 | * | 1166 | * |