staging: comedi: comedi_buf: make comedi_buf_read_samples() always return full samples
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Wed, 22 Oct 2014 21:36:42 +0000 (14:36 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 29 Oct 2014 08:01:19 +0000 (16:01 +0800)
A number of drivers currently use comedi_buf_get() to read single samples
from the the async buffer. This works but the drivers have to handle the
COMEDI_CB_BLOCK and COMEDI_CB_EOS events. Converting those drivers to use
comedi_buf_read_samples() moves the handling of those events into the core.

Modify comedi_buf_read_samples() so that the async buffer is checked for
the number of full samples available. Use that to clamp the number of
samples that will be read. This makes sure that only full samples are
read from the async buffer making comedi_buf_read_samples() mimic the
action of comedi_buf_get() with the added benifit of handling the events.

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/comedi_buf.c

index 9074da2cbe0aae04dfd7fc429fc76d9d96c224a8..fb2e91a0e7243adfcd4f49b5cb8974c00d719067 100644 (file)
@@ -566,15 +566,15 @@ unsigned int comedi_buf_read_samples(struct comedi_subdevice *s,
        unsigned int max_samples;
        unsigned int nbytes;
 
-       max_samples = s->async->prealloc_bufsz / bytes_per_sample(s);
+       /* clamp nsamples to the number of full samples available */
+       max_samples = comedi_buf_read_n_available(s) / bytes_per_sample(s);
        if (nsamples > max_samples)
                nsamples = max_samples;
 
-       nbytes = nsamples * bytes_per_sample(s);
-       if (nbytes == 0)
+       if (nsamples == 0)
                return 0;
 
-       nbytes = comedi_buf_read_alloc(s, nbytes);
+       nbytes = comedi_buf_read_alloc(s, nsamples * bytes_per_sample(s));
        comedi_buf_memcpy_from(s, 0, data, nbytes);
        comedi_buf_read_free(s, nbytes);
        comedi_inc_scan_progress(s, nbytes);