|
@@ -369,28 +369,23 @@ static int ni_65xx_dio_insn_bits(struct comedi_device *dev,
|
|
|
{
|
|
|
const struct ni_65xx_board *board = comedi_board(dev);
|
|
|
struct ni_65xx_private *devpriv = dev->private;
|
|
|
- unsigned base_bitfield_channel;
|
|
|
- const unsigned max_ports_per_bitfield = 5;
|
|
|
+ int base_bitfield_channel;
|
|
|
unsigned read_bits = 0;
|
|
|
- unsigned j;
|
|
|
+ int last_port_offset = ni_65xx_port_by_channel(s->n_chan - 1);
|
|
|
+ int port_offset;
|
|
|
|
|
|
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 + port_offset;
|
|
|
- unsigned base_port_channel;
|
|
|
+ for (port_offset = ni_65xx_port_by_channel(base_bitfield_channel);
|
|
|
+ port_offset <= last_port_offset; port_offset++) {
|
|
|
+ unsigned port = sprivate(s)->base_port + port_offset;
|
|
|
+ int base_port_channel = port_offset * ni_65xx_channels_per_port;
|
|
|
unsigned port_mask, port_data, port_read_bits;
|
|
|
- int bitshift;
|
|
|
- if (port >= ni_65xx_total_num_ports(board))
|
|
|
+ int bitshift = base_port_channel - base_bitfield_channel;
|
|
|
+
|
|
|
+ if (bitshift >= 32)
|
|
|
break;
|
|
|
- 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;
|
|
|
- if (bitshift >= 32 || bitshift <= -32)
|
|
|
- break;
|
|
|
if (bitshift > 0) {
|
|
|
port_mask >>= bitshift;
|
|
|
port_data >>= bitshift;
|