OSDN Git Service

staging: comedi: comedidev.h: add 'scans_done' member to comedi_async
authorH Hartley Sweeten <hsweeten@visionengravers.com>
Wed, 5 Nov 2014 17:20:52 +0000 (10:20 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 5 Nov 2014 22:59:46 +0000 (14:59 -0800)
Introduce a new member to comedi_async to count the number of scans completed.
This member is cleared by comedi_buf_reset() along with the other comedi_async
members. It is incremented in comedi_inc_scan_progress() when the end of scan
is detected.

This member will be used to clean up the scan counting in the comedi drivers.

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
drivers/staging/comedi/comedidev.h
drivers/staging/comedi/drivers.c

index eb3fecf..19e7b22 100644 (file)
@@ -236,6 +236,7 @@ void comedi_buf_reset(struct comedi_subdevice *s)
        async->buf_read_ptr = 0;
 
        async->cur_chan = 0;
+       async->scans_done = 0;
        async->scan_progress = 0;
        async->munge_chan = 0;
        async->munge_count = 0;
index 90af11a..bff5a58 100644 (file)
@@ -121,6 +121,7 @@ struct comedi_buf_map {
  * @buf_read_ptr:      buffer position for reader
  * @cur_chan:          current position in chanlist for scan (for those
  *                     drivers that use it)
+ * @scans_done:                the number of scans completed (COMEDI_CB_EOS)
  * @scan_progress:     amount received or sent for current scan (in bytes)
  * @munge_chan:                current position in chanlist for "munging"
  * @munge_count:       "munge" count (in bytes, modulo 2**32)
@@ -201,6 +202,7 @@ struct comedi_async {
        unsigned int buf_write_ptr;
        unsigned int buf_read_ptr;
        unsigned int cur_chan;
+       unsigned int scans_done;
        unsigned int scan_progress;
        unsigned int munge_chan;
        unsigned int munge_count;
index 9a8c5fc..02a01ba 100644 (file)
@@ -352,6 +352,13 @@ void comedi_inc_scan_progress(struct comedi_subdevice *s,
 
        async->scan_progress += num_bytes;
        if (async->scan_progress >= scan_length) {
+               unsigned int nscans = async->scan_progress / scan_length;
+
+               if (async->scans_done < (UINT_MAX - nscans))
+                       async->scans_done += nscans;
+               else
+                       async->scans_done = UINT_MAX;
+
                async->scan_progress %= scan_length;
                async->events |= COMEDI_CB_EOS;
        }