Staging: comedi: ni_65xx.c: fix insn_bits shift calculation.
authorIan Abbott <abbotti@mev.co.uk>
Mon, 21 Sep 2009 20:01:56 +0000 (16:01 -0400)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 9 Oct 2009 20:47:25 +0000 (13:47 -0700)
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>
drivers/staging/comedi/drivers/ni_65xx.c

index 6b118c15b49e3d147d99491f2b7c86d62aa011a2..b664ce083fc5e5e2d711a6d72904857a9edd94c7 100644 (file)
@@ -418,15 +418,15 @@ static int ni_65xx_dio_insn_bits(struct comedi_device *dev,
                return -EINVAL;
        base_bitfield_channel = CR_CHAN(insn->chanspec);
        for (j = 0; j < max_ports_per_bitfield; ++j) {
+               const unsigned port_offset = ni_65xx_port_by_channel(base_bitfield_channel) + j;
                const unsigned port =
-                   sprivate(s)->base_port +
-                   ni_65xx_port_by_channel(base_bitfield_channel) + j;
+                   sprivate(s)->base_port + port_offset;
                unsigned base_port_channel;
                unsigned port_mask, port_data, port_read_bits;
                int bitshift;
                if (port >= ni_65xx_total_num_ports(board(dev)))
                        break;
-               base_port_channel = port * ni_65xx_channels_per_port;
+               base_port_channel = port_offset * ni_65xx_channels_per_port;
                port_mask = data[0];
                port_data = data[1];
                bitshift = base_port_channel - base_bitfield_channel;