unsigned int *data)
 {
        struct vmk80xx_private *devpriv = dev->private;
-       unsigned char *rx_buf, *tx_buf;
+       unsigned char *rx_buf = devpriv->usb_rx_buf;
+       unsigned char *tx_buf = devpriv->usb_tx_buf;
        int reg, cmd;
-       int retval;
+       int ret;
 
        if (devpriv->model == VMK8061_MODEL) {
                reg = VMK8061_DO_REG;
 
        down(&devpriv->limit_sem);
 
-       rx_buf = devpriv->usb_rx_buf;
-       tx_buf = devpriv->usb_tx_buf;
-
-       if (data[0]) {
-               tx_buf[reg] &= ~data[0];
-               tx_buf[reg] |= (data[0] & data[1]);
-
-               retval = vmk80xx_write_packet(dev, cmd);
-
-               if (retval)
+       if (comedi_dio_update_state(s, data)) {
+               tx_buf[reg] = s->state;
+               ret = vmk80xx_write_packet(dev, cmd);
+               if (ret)
                        goto out;
        }
 
        if (devpriv->model == VMK8061_MODEL) {
                tx_buf[0] = VMK8061_CMD_RD_DO;
-
-               retval = vmk80xx_read_packet(dev);
-
-               if (!retval) {
-                       data[1] = rx_buf[reg];
-                       retval = 2;
-               }
+               ret = vmk80xx_read_packet(dev);
+               if (ret)
+                       goto out;
+               data[1] = rx_buf[reg];
        } else {
-               data[1] = tx_buf[reg];
-               retval = 2;
+               data[1] = s->state;
        }
 
 out:
        up(&devpriv->limit_sem);
 
-       return retval;
+       return ret ? ret : insn->n;
 }
 
 static int vmk80xx_cnt_insn_read(struct comedi_device *dev,