patch "staging: comedi: usbduxsigma: don't clobber ai_timer in command test" added to staging-next
Subsystems (2)
This is a note to let you know that I've just added the patch titled
staging: comedi: usbduxsigma: don't clobber ai_timer in command test
to my staging git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/staging.git
in the staging-next branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will also be merged in the next major kernel release during the merge window.
If you have any questions about this process, please let me know.
Quoted 1 line
From
423b24c37dd5794a674c74b0ed56392003a69891Mon Sep 17 00:00:00 2001
From: Ian Abbott <[email protected]>
Date: Thu, 23 Jul 2015 16:46:57 +0100
Subject: staging: comedi: usbduxsigma: don't clobber ai_timer in command test
devpriv->ai_timer is used while an asynchronous command is running on the AI subdevice. It also gets modified by the subdevice's cmdtest handler for checking new asynchronous commands (usbduxsigma_ai_cmdtest()), which is not correct as it's allowed to check new commands while an old command is still running. Fix it by moving the code which sets up devpriv->ai_timer and devpriv->ai_interval into the subdevice's cmd handler, usbduxsigma_ai_cmd().
Note that the removed code in usbduxsigma_ai_cmdtest() checked that devpriv->ai_timer did not end up less than than 1, but that could not happen because cmd->scan_begin_arg had already been checked to be at least the minimum required value (at least when cmd->scan_begin_src == TRIG_TIMER, which had also been checked to be the case).
--- drivers/staging/comedi/drivers/usbduxsigma.c | 37 ++++++++++++---------------- 1 file changed, 16 insertions(+), 21 deletions(-)
drivers/staging/comedi/drivers/usbduxsigma.c +16 -21
@@ -551,27 +551,6 @@ static int usbduxsigma_ai_cmdtest(struct comedi_device *dev,if (err)return 3 ; -/* Step 4: fix up any arguments */ - -if (high_speed) { -/* -* every 2 channels get a time window of 125us. Thus, if we -* sample all 16 channels we need 1ms. If we sample only one -* channel we need only 125us -*/ - devpriv->ai_interval = interval; - devpriv->ai_timer = cmd->scan_begin_arg / (125000 * interval); - }else { -/* interval always 1ms */ - devpriv->ai_interval =1 ; - devpriv->ai_timer = cmd->scan_begin_arg /1000000 ; - } -if (devpriv->ai_timer <1 ) - err |= -EINVAL ; - -if (err) -return 4 ; -return 0 ; }
@@ -669,6 +648,22 @@ static int usbduxsigma_ai_cmd(struct comedi_device *dev,down (&devpriv->sem); +if (devpriv->high_speed) { +/* +* every 2 channels get a time window of 125us. Thus, if we +* sample all 16 channels we need 1ms. If we sample only one +* channel we need only 125us +*/ +unsigned int interval =usbduxsigma_chans_to_interval (len); + + devpriv->ai_interval = interval; + devpriv->ai_timer = cmd->scan_begin_arg / (125000 * interval); + }else { +/* interval always 1ms */ + devpriv->ai_interval =1 ; + devpriv->ai_timer = cmd->scan_begin_arg /1000000 ; + } +for (i =0 ; i < len; i++) {unsigned int chan =CR_CHAN (cmd->chanlist[i]);
Signature · 1 line
2.4.6