On 04/11/14 16:50, H Hartley Sweeten wrote:
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 <hswee...@visionengravers.com>
Cc: Ian Abbott <abbo...@mev.co.uk>
Cc: Greg Kroah-Hartman <gre...@linuxfoundation.org>
---
  drivers/staging/comedi/comedi_buf.c | 1 +
  drivers/staging/comedi/comedidev.h  | 2 ++
  drivers/staging/comedi/drivers.c    | 1 +
  3 files changed, 4 insertions(+)

diff --git a/drivers/staging/comedi/comedi_buf.c 
b/drivers/staging/comedi/comedi_buf.c
index eb3fecf..19e7b22 100644
--- a/drivers/staging/comedi/comedi_buf.c
+++ b/drivers/staging/comedi/comedi_buf.c
@@ -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;
diff --git a/drivers/staging/comedi/comedidev.h 
b/drivers/staging/comedi/comedidev.h
index 90af11a..bff5a58 100644
--- a/drivers/staging/comedi/comedidev.h
+++ b/drivers/staging/comedi/comedidev.h
@@ -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;
diff --git a/drivers/staging/comedi/drivers.c b/drivers/staging/comedi/drivers.c
index 9a8c5fc..4fc992b 100644
--- a/drivers/staging/comedi/drivers.c
+++ b/drivers/staging/comedi/drivers.c
@@ -352,6 +352,7 @@ void comedi_inc_scan_progress(struct comedi_subdevice *s,

        async->scan_progress += num_bytes;
        if (async->scan_progress >= scan_length) {
+               async->scans_done += async->scan_progress / scan_length;
                async->scan_progress %= scan_length;
                async->events |= COMEDI_CB_EOS;
        }


The patch is fine, but as a follow-up patch, async->scans_done could be clamped to UINT_MAX (or possibly async->cmd.stop_arg, but UINT_MAX is easier), e.g.:

                unsigned int scans = async->scan_progress / scan_length;

                if (async->scans_done < UINT_MAX - scans)
                        async->scans_done += scans;
                else
                        async->scans_done = UINT_MAX;
                async->scan_progress -= scans * scan_length;
                async->events |= COMEDI_CB_EOS;

--
-=( 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