Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Staging: comedi: ni_65xx.c: fix insn_bits shift calculation.

Fix insn_bits bitshift calculation for subdevice with non-zero
base_port.

Thanks to cJ-comedi at zougloub dot eu for spotting the bug.

Signed-off-by: Frank Mori Hess <fmhess@users.sourceforge.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

authored by

Ian Abbott and committed by
Greg Kroah-Hartman
2b49d7c4 5044a2c0

+3 -3
+3 -3
drivers/staging/comedi/drivers/ni_65xx.c
··· 418 418 return -EINVAL; 419 419 base_bitfield_channel = CR_CHAN(insn->chanspec); 420 420 for (j = 0; j < max_ports_per_bitfield; ++j) { 421 + const unsigned port_offset = ni_65xx_port_by_channel(base_bitfield_channel) + j; 421 422 const unsigned port = 422 - sprivate(s)->base_port + 423 - ni_65xx_port_by_channel(base_bitfield_channel) + j; 423 + sprivate(s)->base_port + port_offset; 424 424 unsigned base_port_channel; 425 425 unsigned port_mask, port_data, port_read_bits; 426 426 int bitshift; 427 427 if (port >= ni_65xx_total_num_ports(board(dev))) 428 428 break; 429 - base_port_channel = port * ni_65xx_channels_per_port; 429 + base_port_channel = port_offset * ni_65xx_channels_per_port; 430 430 port_mask = data[0]; 431 431 port_data = data[1]; 432 432 bitshift = base_port_channel - base_bitfield_channel;