staging: comedi: usbduxfast: chanlist check is Step 5 of (*do_cmdtest)

The channel list should be checked in Step 5 of the (*do_cmdtest) not
as part of the (*do_cmd). Factor the check out of usbduxfast_ai_cmd().

Tidy up the factored out code. The channel number 'i' will never be
greater than NUMCHANNELS due to the subdevice setup and the checks
done in the code. The up/down of the semaphore is also not needed
because the (*do_cmdtest) never actually tries to access the hardware.

Signed-off-by: H Hartley Sweeten <hsweeten@visionengravers.com>
Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
H Hartley Sweeten 2015-08-24 10:13:54 -07:00 committed by Greg Kroah-Hartman
parent a399d81d41
commit 99555fc25a

View File

@ -332,6 +332,31 @@ static int usbduxfast_submit_urb(struct comedi_device *dev)
return 0;
}
static int usbduxfast_ai_check_chanlist(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_cmd *cmd)
{
unsigned int gain0 = CR_RANGE(cmd->chanlist[0]);
int i;
for (i = 0; i < cmd->chanlist_len; ++i) {
unsigned int chan = CR_CHAN(cmd->chanlist[i]);
unsigned int gain = CR_RANGE(cmd->chanlist[i]);
if (chan != i) {
dev_err(dev->class_dev,
"channels are not consecutive\n");
return -EINVAL;
}
if (gain != gain0 && cmd->chanlist_len > 3) {
dev_err(dev->class_dev,
"gain must be the same for all channels\n");
return -EINVAL;
}
}
return 0;
}
static int usbduxfast_ai_cmdtest(struct comedi_device *dev,
struct comedi_subdevice *s,
struct comedi_cmd *cmd)
@ -417,7 +442,13 @@ static int usbduxfast_ai_cmdtest(struct comedi_device *dev,
if (err)
return 3;
/* step 4: fix up any arguments */
/* Step 4: fix up any arguments */
/* Step 5: check channel list if it exists */
if (cmd->chanlist && cmd->chanlist_len > 0)
err |= usbduxfast_ai_check_chanlist(dev, s, cmd);
if (err)
return 5;
return 0;
}
@ -460,8 +491,8 @@ static int usbduxfast_ai_cmd(struct comedi_device *dev,
{
struct usbduxfast_private *devpriv = dev->private;
struct comedi_cmd *cmd = &s->async->cmd;
unsigned int chan, gain, rngmask = 0xff;
int i, j, ret;
unsigned int rngmask = 0xff;
int j, ret;
int result;
long steps, steps_tmp;
@ -481,27 +512,6 @@ static int usbduxfast_ai_cmd(struct comedi_device *dev,
*/
devpriv->ignore = PACKETS_TO_IGNORE;
gain = CR_RANGE(cmd->chanlist[0]);
for (i = 0; i < cmd->chanlist_len; ++i) {
chan = CR_CHAN(cmd->chanlist[i]);
if (chan != i) {
dev_err(dev->class_dev,
"channels are not consecutive\n");
up(&devpriv->sem);
return -EINVAL;
}
if ((gain != CR_RANGE(cmd->chanlist[i]))
&& (cmd->chanlist_len > 3)) {
dev_err(dev->class_dev,
"gain must be the same for all channels\n");
up(&devpriv->sem);
return -EINVAL;
}
if (i >= NUMCHANNELS) {
dev_err(dev->class_dev, "chanlist too long\n");
break;
}
}
steps = 0;
if (cmd->convert_src == TRIG_TIMER)
steps = (cmd->convert_arg * 30) / 1000;