patch "staging: comedi: ni_mio_common: fix E series ni_ai_insn_read() data" added to staging-testing
Subsystems (2)
This is a note to let you know that I've just added the patch titled
staging: comedi: ni_mio_common: fix E series ni_ai_insn_read() data
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-testing 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 be merged to the staging-next branch sometime soon, after it passes testing, and the merge window is open.
If you have any questions about this process, please let me know.
Quoted 1 line
From
857a661020a2de3a0304edf33ad656abee100891Mon Sep 17 00:00:00 2001
From: Ian Abbott <[email protected]>
Date: Mon, 14 Nov 2016 20:16:22 +0000
Subject: staging: comedi: ni_mio_common: fix E series ni_ai_insn_read() data
Commit 0557344e2149 ("staging: comedi: ni_mio_common: fix local var for 32-bit read") changed the type of local variable d from unsigned short to unsigned int to fix a bug introduced in
commit 9c340ac934db ("staging: comedi: ni_stc.h: add read/write callbacks to struct ni_private") when reading AI data for NI PCI-6110 and PCI-6111 cards. Unfortunately, other parts of the function rely on the variable being unsigned short when an offset value in local variable signbits is added to d before writing the value to the data array:
d += signbits; data[n] = d;
The signbits variable will be non-zero in bipolar mode, and is used to convert the hardware's 2's complement, 16-bit numbers to Comedi's straight binary sample format (with 0 representing the most negative voltage). This breaks because d is now 32 bits wide instead of 16 bits wide, so after the addition of signbits, data[n] ends up being set to values above 65536 for negative voltages. This affects all supported "E series" cards except PCI-6143 (and PXI-6143). Fix it by ANDing the value written to the data[n] with the mask 0xffff.
----
Needs backporting to stable kernels 3.18 onwards.
--- drivers/staging/comedi/drivers/ni_mio_common.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-)
drivers/staging/comedi/drivers/ni_mio_common.c +2 -3
@@ -1875,7 +1875,7 @@ static int ni_ai_insn_read(struct comedi_device *dev,return -ETIME ; } d += signbits; - data[n] = d; + data[n] = d &0xffff ; } }else if (devpriv->is_6143) {for (n =0 ; n < insn->n; n++) {
@@ -1924,9 +1924,8 @@ static int ni_ai_insn_read(struct comedi_device *dev, data[n] = dl; }else { d =ni_readw (dev,NI_E_AI_FIFO_DATA_REG ); -/* subtle: needs to be short addition */ d += signbits; - data[n] = d; + data[n] = d &0xffff ; } } }
Signature · 1 line
2.10.2