lkml.org 
[lkml]   [2019]   [Nov]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 64/66] staging: comedi: usbduxfast: usbduxfast_ai_cmdtest rounding error
    Date
    From: Bernd Porr <mail@berndporr.me.uk>

    commit 5618332e5b955b4bff06d0b88146b971c8dd7b32 upstream.

    The userspace comedilib function 'get_cmd_generic_timed' fills
    the cmd structure with an informed guess and then calls the
    function 'usbduxfast_ai_cmdtest' in this driver 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 addition
    the case of steps being 0 wasn't checked which is also now done.

    Signed-off-by: Bernd Porr <mail@berndporr.me.uk>
    Cc: <stable@vger.kernel.org> # 4.4+
    Reviewed-by: Ian Abbott <abbotti@mev.co.uk>
    Link: https://lore.kernel.org/r/20191118230759.1727-1-mail@berndporr.me.uk
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

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

    --- 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, mail@berndporr.me.uk
    + * Copyright (C) 2004-2019 Bernd Porr, mail@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 <mail@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
    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
    */
    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);

    \
     
     \ /
      Last update: 2019-11-27 22:16    [W:2.316 / U:0.320 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site