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 <hsweeten@xxxxxxxxxxxxxxxxxxx> Cc: Ian Abbott <abbotti@xxxxxxxxx> Cc: Greg Kroah-Hartman <gregkh@xxxxxxxxxxxxxxxxxxx> --- 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: <abbotti@xxxxxxxxx> )=- -=( Web: http://www.mev.co.uk/ )=- _______________________________________________ devel mailing list devel@xxxxxxxxxxxxxxxxxxxxxx http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel