linux/drivers/staging/comedi
Ian Abbott 745f7d0d19 staging: comedi: ni_mio_common: fix E series ni_ai_insn_read() data
commit 857a661020 upstream.

Commit 0557344e21 ("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 9c340ac934 ("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.

Fixes: 0557344e21 ("staging: comedi: ni_mio_common: fix local var for 32-bit read")
Signed-off-by: Ian Abbott <abbotti@mev.co.uk>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
History 2017-01-09 08:32:18 +01:00
..
drivers staging: comedi: ni_mio_common: fix E series ni_ai_insn_read() data 2017-01-09 08:32:18 +01:00
kcomedilib staging: comedi: kcomedilib: Fixed coding style issue 2015-09-12 18:24:38 -07:00
comedi.h staging:comedi:Use unsigned int instead of unsigned 2016-06-17 20:43:07 -07:00
comedi_buf.c Staging: comedi: comedi_buf: Replace 'unsigned' with 'unsigned int' 2016-03-28 07:30:36 -07:00
comedi_compat32.c staging: comedi: fix cast warning in comedi_compat32.c 2015-07-14 18:21:15 -07:00
comedi_compat32.h staging: comedi: comedi_compat32.h: reformat copyright comment 2015-01-28 11:19:34 -08:00
comedi_fops.c staging: comedi: Use vma_pages function on vma object instead of explicit computation 2016-09-20 14:01:21 +02:00
comedi_internal.h staging: comedi: add new comedi_buf_write_n_available() 2015-10-13 10:28:40 -07:00
comedi_pci.c staging: comedi: comedi_pci.c: Fix kernel-doc Return tags 2015-10-02 11:43:21 +02:00
comedi_pci.h staging: comedi: comedi_pci.h: move PCI stuff out of comedidev.h 2015-03-20 14:08:18 +01:00
comedi_pcmcia.c staging: comedi: comedi_pcmcia.c: improve function documentation 2015-10-02 11:43:21 +02:00
comedi_pcmcia.h STAGING: COMEDI: Wrap line over 80 characters 2016-02-07 18:38:37 -08:00
comedi_usb.c staging: comedi: comedi_usb.c: improve function documentation 2015-10-02 11:43:21 +02:00
comedi_usb.h staging: comedi: comedi_usb.h: move USB stuff out of comedidev.h 2015-01-28 11:18:51 -08:00
comedidev.h Staging: comedi: Fix 'unsigned' warning style 2016-03-29 12:45:23 -07:00
comedilib.h staging: comedi: comedilib.h: Coding style warning fix for block comments 2015-12-21 16:01:12 -08:00
drivers.c Staging: comedi: Align the * in block comments 2016-10-02 17:29:11 +02:00
Kconfig staging: comedi: adv_pci_dio: separate out PCI-1760 support 2015-12-18 14:54:24 -08:00
Makefile staging: comedi: split out PCI support into new module 2014-11-07 09:24:33 -08:00
proc.c Staging: comedi: proc: title block update 2014-03-19 04:41:04 +00:00
range.c staging: comedi: improve comedi_check_chanlist() documentation 2015-08-05 11:55:44 -07:00
TODO comedi: note a coverity discovered hole that needs fixing 2016-03-05 14:56:55 -08:00