staging: comedi: usbdux: fix usbdux_counter_write()
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Thu, 25 Jul 2013 23:06:47 +0000 (16:06 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 26 Jul 2013 22:09:56 +0000 (15:09 -0700)
Comedi (*insn_write) operations are supposed to write insn->n values.
Fix this function to work like the core expects.

Rename the local variable used for the private data pointer to the
comedi "norm".

Remove the unnecessary sanity check of the private data pointer. This
function can only be called is the private data was allocated during
the attach.

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>
drivers/staging/comedi/drivers/usbdux.c

index 05bea98444db556aaa19e7dd135c6bd69b0bc7d8..82624a24eb3eb48fdfc698c251b447bc02f5dce4 100644 (file)
@@ -1369,27 +1369,30 @@ counter_read_exit:
 
 static int usbdux_counter_write(struct comedi_device *dev,
                                struct comedi_subdevice *s,
-                               struct comedi_insn *insn, unsigned int *data)
+                               struct comedi_insn *insn,
+                               unsigned int *data)
 {
-       struct usbdux_private *this_usbduxsub = dev->private;
-       int err;
+       struct usbdux_private *devpriv = dev->private;
+       unsigned int chan = CR_CHAN(insn->chanspec);
+       int16_t *p = (int16_t *)&devpriv->dux_commands[2];
+       int ret = 0;
+       int i;
 
-       if (!this_usbduxsub)
-               return -EFAULT;
+       down(&devpriv->sem);
 
-       down(&this_usbduxsub->sem);
-       this_usbduxsub->dux_commands[1] = insn->chanspec;
-       *((int16_t *) (this_usbduxsub->dux_commands + 2)) = cpu_to_le16(*data);
+       devpriv->dux_commands[1] = chan;
 
-       err = send_dux_commands(dev, WRITECOUNTERCOMMAND);
-       if (err < 0) {
-               up(&this_usbduxsub->sem);
-               return err;
+       for (i = 0; i < insn->n; i++) {
+               *p = cpu_to_le16(data[i]);
+
+               ret = send_dux_commands(dev, WRITECOUNTERCOMMAND);
+               if (ret < 0)
+                       break;
        }
 
-       up(&this_usbduxsub->sem);
+       up(&devpriv->sem);
 
-       return 1;
+       return ret ? ret : insn->n;
 }
 
 static int usbdux_counter_config(struct comedi_device *dev,