On 18/11/2019 17:21, Bernd Porr wrote:
'get_cmd_generic_timed' fills the cmd structure with an informed
guess and then calls 'usbduxfast_ai_cmdtest' repeatedly while
'usbduxfast_ai_cmdtest' is modifying the cmd struct until it
no longer changes. However, because of rounding errors this never
converged because 'steps = (cmd->convert_arg * 30) / 1000' and then
back to 'cmd->convert_arg = (steps * 1000) / 30' won't be the same
because of rounding errors. 'Steps' should only be converted back to
the 'convert_arg' if 'steps' has actually been modified. In addion
the case of steps being 0 wasn't checked which is also now done.

Signed-off-by: Bernd Porr <m...@berndporr.me.uk>

The patch subject needs changing as it refers to usbduxsigma, and this patch is for usbduxfast.

While we're at it, there is a typo in the patch description "addion" => "addition".

Also, make it clear that 'get_cmd_generic_timed' is the user-space comedilib function 'comedi_get_cmd_generic_timed()'.

---
  drivers/staging/comedi/drivers/usbduxfast.c | 21 ++++++++++++++-------
  1 file changed, 14 insertions(+), 7 deletions(-)

diff --git a/drivers/staging/comedi/drivers/usbduxfast.c 
b/drivers/staging/comedi/drivers/usbduxfast.c
index 04bc488385e6..4af012968cb6 100644
--- a/drivers/staging/comedi/drivers/usbduxfast.c
+++ b/drivers/staging/comedi/drivers/usbduxfast.c
@@ -1,6 +1,6 @@
  // SPDX-License-Identifier: GPL-2.0+
  /*
- *  Copyright (C) 2004-2014 Bernd Porr, m...@berndporr.me.uk
+ *  Copyright (C) 2004-2019 Bernd Porr, m...@berndporr.me.uk
   */
/*
@@ -8,7 +8,7 @@
   * Description: University of Stirling USB DAQ & INCITE Technology Limited
   * Devices: [ITL] USB-DUX-FAST (usbduxfast)
   * Author: Bernd Porr <m...@berndporr.me.uk>
- * Updated: 10 Oct 2014
+ * Updated: 16 Nov 2019
   * Status: stable
   */
@@ -22,6 +22,7 @@
   *
   *
   * Revision history:
+ * 1.0: Fixed a rounding error in usbduxfast_ai_cmdtest
   * 0.9: Dropping the first data packet which seems to be from the last 
transfer.
   *      Buffer overflows in the FX2 are handed over to comedi.
   * 0.92: Dropping now 4 packets. The quad buffer has to be emptied.
@@ -350,6 +351,7 @@ static int usbduxfast_ai_cmdtest(struct comedi_device *dev,
                                 struct comedi_cmd *cmd)
  {
        int err = 0;
+       int err2 = 0;
        unsigned int steps;
        unsigned int arg;
@@ -399,11 +401,16 @@ static int usbduxfast_ai_cmdtest(struct comedi_device *dev,
         */
        steps = (cmd->convert_arg * 30) / 1000;
        if (cmd->chanlist_len !=  1)
-               err |= comedi_check_trigger_arg_min(&steps,
-                                                   MIN_SAMPLING_PERIOD);
-       err |= comedi_check_trigger_arg_max(&steps, MAX_SAMPLING_PERIOD);
-       arg = (steps * 1000) / 30;
-       err |= comedi_check_trigger_arg_is(&cmd->convert_arg, arg);
+               err2 |= comedi_check_trigger_arg_min(&steps,
+                                                    MIN_SAMPLING_PERIOD);
+       else
+               err2 |= comedi_check_trigger_arg_min(&steps, 1);
+       err2 |= comedi_check_trigger_arg_max(&steps, MAX_SAMPLING_PERIOD);
+       if (err2) {
+               err |= err2;
+               arg = (steps * 1000) / 30;
+               err |= comedi_check_trigger_arg_is(&cmd->convert_arg, arg);
+       }
if (cmd->stop_src == TRIG_COUNT)
                err |= comedi_check_trigger_arg_min(&cmd->stop_arg, 1);


The actual patch looks good. A 'Cc:' line for "stable" kernel versions 4.4 and later could be added:

Cc: <sta...@vger.kernel.org> # 4.4+

Please mark the updated patch as '[PATCH v2]' in the subject.  Thanks.

--
-=( Ian Abbott <abbo...@mev.co.uk> || Web: www.mev.co.uk )=-
-=( MEV Ltd. is a company registered in England & Wales. )=-
-=( Registered number: 02862268.  Registered address:    )=-
-=( 15 West Park Road, Bramhall, STOCKPORT, SK7 3JZ, UK. )=-
_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to