}
 EXPORT_SYMBOL_GPL(comedi_buf_read_free);
 
-int comedi_buf_put(struct comedi_async *async, unsigned short x)
+int comedi_buf_put(struct comedi_subdevice *s, unsigned short x)
 {
+       struct comedi_async *async = s->async;
        unsigned int n = __comedi_buf_write_alloc(async, sizeof(short), 1);
 
        if (n < sizeof(short)) {
 
 unsigned int comedi_buf_read_alloc(struct comedi_async *, unsigned int);
 unsigned int comedi_buf_read_free(struct comedi_async *, unsigned int);
 
-int comedi_buf_put(struct comedi_async *, unsigned short);
+int comedi_buf_put(struct comedi_subdevice *s, unsigned short x);
 int comedi_buf_get(struct comedi_async *, unsigned short *);
 
 void comedi_buf_memcpy_to(struct comedi_async *async, unsigned int offset,
 
        d = spriv->io(0, _8255_DATA, 0, iobase);
        d |= (spriv->io(0, _8255_DATA + 1, 0, iobase) << 8);
 
-       comedi_buf_put(s->async, d);
+       comedi_buf_put(s, d);
        s->async->events |= COMEDI_CB_EOS;
 
        comedi_event(dev, s);
 
        n_chan = devpriv->ui_AiNbrofChannels;
 
        for (i = 0; i < n_chan; i++)
-               err &= comedi_buf_put(s->async, inw(dev->iobase + 0));
+               err &= comedi_buf_put(s, inw(dev->iobase + 0));
 
        s->async->events |= COMEDI_CB_EOS;
 
 
        outl(ctrl & ~APCI1032_CTRL_INT_ENA, dev->iobase + APCI1032_CTRL_REG);
 
        s->state = inl(dev->iobase + APCI1032_STATUS_REG) & 0xffff;
-       comedi_buf_put(s->async, s->state);
+       comedi_buf_put(s, s->state);
        s->async->events |= COMEDI_CB_BLOCK | COMEDI_CB_EOS;
        comedi_event(dev, s);
 
 
                                bits |= (1 << i);
                }
 
-               if (comedi_buf_put(s->async, bits)) {
+               if (comedi_buf_put(s, bits)) {
                        s->async->events |= COMEDI_CB_BLOCK | COMEDI_CB_EOS;
                        if (cmd->stop_src == TRIG_COUNT &&
                            subpriv->stop_count > 0) {
 
                writel(status, devpriv->mmio + 16);
 
                val = readl(devpriv->mmio + 28);
-               comedi_buf_put(s->async, val);
+               comedi_buf_put(s, val);
 
                s->async->events |= COMEDI_CB_EOA;
                comedi_event(dev, s);
 
                        break;
                }
 
-               comedi_buf_put(s->async, val & s->maxdata);
+               comedi_buf_put(s, val & s->maxdata);
 
                s->async->cur_chan++;
                if (s->async->cur_chan >= cmd->chanlist_len)
                        return ret;
                }
 
-               comedi_buf_put(s->async, val & s->maxdata);
+               comedi_buf_put(s, val & s->maxdata);
 
                s->async->cur_chan++;
                if (s->async->cur_chan >= cmd->chanlist_len) {
 
                        val |= (1U << n);
        }
        /* Write the scan to the buffer. */
-       if (comedi_buf_put(s->async, val)) {
+       if (comedi_buf_put(s, val)) {
                s->async->events |= (COMEDI_CB_BLOCK | COMEDI_CB_EOS);
        } else {
                /* Error!  Stop acquisition.  */
 
 
        handled = pc236_intr_check(dev);
        if (dev->attached && handled) {
-               comedi_buf_put(s->async, 0);
+               comedi_buf_put(s, 0);
                s->async->events |= COMEDI_CB_BLOCK | COMEDI_CB_EOS;
                comedi_event(dev, s);
        }
 
                        }
                }
                /* Read sample and store in Comedi's circular buffer. */
-               if (comedi_buf_put(async, pci230_ai_read(dev)) == 0) {
+               if (comedi_buf_put(s, pci230_ai_read(dev)) == 0) {
                        events |= COMEDI_CB_ERROR | COMEDI_CB_OVERFLOW;
                        comedi_error(dev, "AI buffer overflow");
                        break;
 
        if (!(ctrl & PARPORT_CTRL_IRQ_ENA))
                return IRQ_NONE;
 
-       comedi_buf_put(s->async, 0);
+       comedi_buf_put(s, 0);
        s->async->events |= COMEDI_CB_BLOCK | COMEDI_CB_EOS;
 
        comedi_event(dev, s);
 
                outb(0xff, dev->iobase + DMM32AT_CONV);
        }
 
-/*     for(i=0;i<cmd->chanlist_len;i++) */
-/*             comedi_buf_put(s->async,i*100); */
-
-/*     s->async->events |= COMEDI_CB_EOA; */
-/*     comedi_event(dev, s); */
-
        return 0;
 
 }
 
                        /* invert sign bit to make range unsigned */
                        samp = ((msb ^ 0x0080) << 8) + lsb;
-                       comedi_buf_put(s->async, samp);
+                       comedi_buf_put(s, samp);
                }
 
                if (devpriv->ai_scans_left != 0xffffffff) {     /* TRIG_COUNT */
 
 
                if (devpriv->ad_2scomp)
                        data ^= 1 << (board->adbits - 1);
-               ret = comedi_buf_put(s->async, data);
+               ret = comedi_buf_put(s, data);
 
                if (ret == 0)
                        s->async->events |= COMEDI_CB_OVERFLOW;
 
 
        for (i = 0; i < count; i++) {
                data = readw(devpriv->io_addr + DPR_ADC_buffer + rear);
-               comedi_buf_put(s->async, data);
+               comedi_buf_put(s, data);
                rear++;
                if (rear >= AI_FIFO_DEPTH)
                        rear = 0;
 
                        lval = inl(dev->iobase + ME4000_AI_DATA_REG) & 0xFFFF;
                        lval ^= 0x8000;
 
-                       if (!comedi_buf_put(s->async, lval)) {
+                       if (!comedi_buf_put(s, lval)) {
                                /*
                                 * Buffer overflow, so stop conversion
                                 * and disable all interrupts
                        lval = inl(dev->iobase + ME4000_AI_DATA_REG) & 0xFFFF;
                        lval ^= 0x8000;
 
-                       if (!comedi_buf_put(s->async, lval)) {
+                       if (!comedi_buf_put(s, lval)) {
                                dev_err(dev->class_dev, "Buffer overflow\n");
                                s->async->events |= COMEDI_CB_OVERFLOW;
                                break;
 
                return IRQ_NONE;
 
        if (status & NI6527_STATUS_EDGE) {
-               comedi_buf_put(s->async, 0);
+               comedi_buf_put(s, 0);
                s->async->events |= COMEDI_CB_EOS;
                comedi_event(dev, s);
        }
 
        writeb(ClrEdge | ClrOverflow,
               devpriv->mite->daq_io_addr + Clear_Register);
 
-       comedi_buf_put(s->async, 0);
+       comedi_buf_put(s, 0);
        s->async->events |= COMEDI_CB_EOS;
        comedi_event(dev, s);
        return IRQ_HANDLED;
 
        struct comedi_device *dev = d;
        struct comedi_subdevice *s = dev->read_subdev;
 
-       comedi_buf_put(s->async, inw(dev->iobase + AD_FIFO_REG));
+       comedi_buf_put(s, inw(dev->iobase + AD_FIFO_REG));
 
        comedi_event(dev, s);
        return IRQ_HANDLED;
 
                                          Group_1_FIFO);
                                data1 = auxdata & 0xffff;
                                data2 = (auxdata & 0xffff0000) >> 16;
-                               comedi_buf_put(async, data1);
-                               comedi_buf_put(async, data2);
+                               comedi_buf_put(s, data1);
+                               comedi_buf_put(s, data2);
                                flags = readb(devpriv->mite->daq_io_addr +
                                              Group_1_Flags);
                        }
 
 
        outb(PCL711_INT_STAT_CLR, dev->iobase + PCL711_INT_STAT_REG);
 
-       if (comedi_buf_put(s->async, data) == 0) {
+       if (comedi_buf_put(s, data) == 0) {
                s->async->events |= COMEDI_CB_OVERFLOW | COMEDI_CB_ERROR;
        } else {
                s->async->events |= COMEDI_CB_BLOCK | COMEDI_CB_EOS;
 
        if (devpriv->cmd_running) {
                pcl726_intr_cancel(dev, s);
 
-               comedi_buf_put(s->async, 0);
+               comedi_buf_put(s, 0);
                s->async->events |= (COMEDI_CB_BLOCK | COMEDI_CB_EOS);
                comedi_event(dev, s);
        }
 
                return;
        }
 
-       comedi_buf_put(s->async, pcl812_ai_get_sample(dev, s));
+       comedi_buf_put(s, pcl812_ai_get_sample(dev, s));
 
        /* Set up next channel. Added by abbotti 2010-01-20, but untested. */
        next_chan = s->async->cur_chan + 1;
        unsigned int i;
 
        for (i = len; i; i--) {
-               comedi_buf_put(s->async, ptr[bufptr++]);
+               comedi_buf_put(s, ptr[bufptr++]);
 
                if (!pcl812_ai_next_chan(dev, s))
                        break;
 
        int i;
 
        for (i = 0; i < len; i++) {
-               comedi_buf_put(s->async, ptr[bufptr++]);
+               comedi_buf_put(s, ptr[bufptr++]);
 
                if (!pcl816_ai_next_chan(dev, s))
                        return;
 
        if (pcl818_ai_dropout(dev, s, chan))
                return;
 
-       comedi_buf_put(s->async, val);
+       comedi_buf_put(s, val);
 
        pcl818_ai_next_chan(dev, s);
 }
                if (pcl818_ai_dropout(dev, s, chan))
                        break;
 
-               comedi_buf_put(s->async, val);
+               comedi_buf_put(s, val);
 
                if (!pcl818_ai_next_chan(dev, s))
                        break;
                if (pcl818_ai_dropout(dev, s, chan))
                        break;
 
-               comedi_buf_put(s->async, val);
+               comedi_buf_put(s, val);
 
                if (!pcl818_ai_next_chan(dev, s))
                        break;
 
        }
 
        /* Write the scan to the buffer. */
-       if (comedi_buf_put(s->async, val) &&
-           comedi_buf_put(s->async, val >> 16)) {
+       if (comedi_buf_put(s, val) &&
+           comedi_buf_put(s, val >> 16)) {
                s->async->events |= (COMEDI_CB_BLOCK | COMEDI_CB_EOS);
        } else {
                /* Overflow! Stop acquisition!! */
 
        }
 
        /* Write the scan to the buffer. */
-       if (comedi_buf_put(s->async, val) &&
-           comedi_buf_put(s->async, val >> 16)) {
+       if (comedi_buf_put(s, val) &&
+           comedi_buf_put(s, val >> 16)) {
                s->async->events |= (COMEDI_CB_BLOCK | COMEDI_CB_EOS);
        } else {
                /* Overflow! Stop acquisition!! */
 
                        data |= inb(dev->iobase + DAQP_FIFO) << 8;
                        data ^= 0x8000;
 
-                       comedi_buf_put(s->async, data);
+                       comedi_buf_put(s, data);
 
                        /* If there's a limit, decrement it
                         * and stop conversion if zero
 
                        d = comedi_offset_munge(s, d);
                d &= s->maxdata;
 
-               if (!comedi_buf_put(s->async, d))
+               if (!comedi_buf_put(s, d))
                        return -1;
 
                if (devpriv->ai_count > 0)      /* < 0, means read forever */
                        d = comedi_offset_munge(s, d);
                d &= s->maxdata;
 
-               if (!comedi_buf_put(s->async, d))
+               if (!comedi_buf_put(s, d))
                        return -1;
 
                if (devpriv->ai_count > 0)      /* < 0, means read forever */
 
                readaddr++;
 
                /* put data into read buffer */
-               /* comedi_buf_put(async, tempdata); */
                cfc_write_to_buffer(s, tempdata);
        }
 
 
                        val ^= ((s->maxdata + 1) >> 1);
 
                /* transfer data */
-               err = comedi_buf_put(s->async, val);
+               err = comedi_buf_put(s, val);
                if (unlikely(err == 0)) {
                        /* buffer overflow */
                        usbdux_ai_stop(dev, 0);