summaryrefslogtreecommitdiffstats
path: root/drivers/staging/comedi/comedi_buf.c
diff options
context:
space:
mode:
authorH Hartley Sweeten <hsweeten@visionengravers.com>2014-10-22 14:36:42 -0700
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2014-10-29 16:01:19 +0800
commit8de27e7010cbd8c75a4e04a9807adacc7a8d70b2 (patch)
treec9673022fa6dd0891a58637f1bfc5820c2252be6 /drivers/staging/comedi/comedi_buf.c
parent109bf06e2a88a04607c93d8223e4be0af09ebc8c (diff)
downloadop-kernel-dev-8de27e7010cbd8c75a4e04a9807adacc7a8d70b2.zip
op-kernel-dev-8de27e7010cbd8c75a4e04a9807adacc7a8d70b2.tar.gz
staging: comedi: comedi_buf: make comedi_buf_read_samples() always return full samples
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>
Diffstat (limited to 'drivers/staging/comedi/comedi_buf.c')
-rw-r--r--drivers/staging/comedi/comedi_buf.c8
1 files changed, 4 insertions, 4 deletions
diff --git a/drivers/staging/comedi/comedi_buf.c b/drivers/staging/comedi/comedi_buf.c
index 9074da2..fb2e91a 100644
--- a/drivers/staging/comedi/comedi_buf.c
+++ b/drivers/staging/comedi/comedi_buf.c
@@ -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);
OpenPOWER on IntegriCloud