On 20/10/14 19:52, H Hartley Sweeten wrote:
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.

Add a check to comedi_buf_read_samples() so that the single sample is read
from the buffer only if there is a full sample in the buffer. This allows
comedi_buf_read_samples() to mimic the action of comedi_buf_get() with the
added benifit of handling the events.

Even for more than one sample it would be better if comedi_buf_read_samples() only read a whole number of samples from the buffer, e.g. by rounding down the value from comedi_buf_read_n_available(). Then you wouldn't need to treat single samples as a special case.


Signed-off-by: H Hartley Sweeten <hswee...@visionengravers.com>
Cc: Ian Abbott <abbo...@mev.co.uk>
Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org>
---
  drivers/staging/comedi/comedi_buf.c | 5 +++++
  1 file changed, 5 insertions(+)

diff --git a/drivers/staging/comedi/comedi_buf.c 
b/drivers/staging/comedi/comedi_buf.c
index 4cf02cb..6b6143b 100644
--- a/drivers/staging/comedi/comedi_buf.c
+++ b/drivers/staging/comedi/comedi_buf.c
@@ -564,6 +564,7 @@ unsigned int comedi_buf_read_samples(struct 
comedi_subdevice *s,
                                     void *data, unsigned int nsamples)
  {
        unsigned long long nbytes = nsamples * bytes_per_sample(s);
+       unsigned int n = comedi_buf_read_n_available(s);

        if (nbytes > s->async->prealloc_bufsz)
                nbytes = s->async->prealloc_bufsz;
@@ -571,6 +572,10 @@ unsigned int comedi_buf_read_samples(struct 
comedi_subdevice *s,
        if (nbytes == 0)
                return 0;

+       /* single sample reads must return a full sample */
+       if (nsamples == 1 && n < nbytes)
+               return 0;
+
        nbytes = comedi_buf_read_alloc(s, nbytes);
        comedi_buf_memcpy_from(s, 0, data, nbytes);
        comedi_buf_read_free(s, nbytes);



--
-=( Ian Abbott @ MEV Ltd.    E-mail: <abbo...@mev.co.uk> )=-
-=(                          Web: http://www.mev.co.uk/  )=-
_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to