aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2013-01-21 16:02:59 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2013-01-21 17:25:07 -0500
commit5b6cbd87d3b9324e2c4200dd5b1b275999044ad8 (patch)
treee2caad7f35d59fe14c81d80d21b6408cff2b34f1 /drivers
parent37fbb4acda89447b8b37e0cc5d1bd8f7ce9b1bb4 (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.c178
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
845static 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
864static 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
926error:
927 kfree(insns);
928 kfree(data);
929
930 if (ret < 0)
931 return ret;
932 return i;
933}
934
935static int check_insn_config_length(struct comedi_insn *insn, 845static 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
1092static 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
1154error:
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 *