Skip to content

Commit d3c4c1f

Browse files
dpenklergregkh
authored andcommitted
staging: gpib: Fix no EOI on 1 and 2 byte writes
EOI (End Or Identify) is a hardware line on the GPIB bus that can be asserted with the last byte of a message to indicate the end of the transfer to the receiving device. In this driver, a write with send_eoi true is done in 3 parts: Send first byte directly Send remaining but 1 bytes using the fifo Send the last byte directly with EOI asserted The first byte in a write is always sent by writing to the tms9914 chip directly to setup for the subsequent fifo transfer. We were not checking for a 1 byte write with send_eoi true resulting in EOI not being asserted. Since the fifo transfer was not executed (fifotransfersize == 0) the retval in the test after the fifo transfer code was still 1 from the preceding direct write. This caused it to return without executing the final direct write which would have sent an unsollicited extra byte. For a 2 byte message the first byte was sent directly. But since the fifo transfer was not executed (fifotransfersize == 1) and the retval in the test after the fifo transfer code was still 1 from the preceding first byte write it returned before the final direct byte write with send_eoi true. The second byte was then sent as a separate 1 byte write to complete the 2 byte write count again without EOI being asserted as above. Only send the first byte directly if more than 1 byte is to be transferred with send_eoi true. Also check for retval < 0 for the error return in case the fifo code is not used (1 or 2 byte message with send_eoi true). Fixes: 09a4655 ("staging: gpib: Add HP/Agilent/Keysight 8235xx PCI GPIB driver") Cc: stable <[email protected]> Tested-by: Dave Penkler <[email protected]> Signed-off-by: Dave Penkler <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 3a86608 commit d3c4c1f

File tree

1 file changed

+7
-5
lines changed

1 file changed

+7
-5
lines changed

drivers/staging/gpib/agilent_82350b/agilent_82350b.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -182,10 +182,12 @@ static int agilent_82350b_accel_write(struct gpib_board *board, u8 *buffer,
182182
return retval;
183183
#endif
184184

185-
retval = agilent_82350b_write(board, buffer, 1, 0, &num_bytes);
186-
*bytes_written += num_bytes;
187-
if (retval < 0)
188-
return retval;
185+
if (fifotransferlength > 0) {
186+
retval = agilent_82350b_write(board, buffer, 1, 0, &num_bytes);
187+
*bytes_written += num_bytes;
188+
if (retval < 0)
189+
return retval;
190+
}
189191

190192
write_byte(tms_priv, tms_priv->imr0_bits & ~HR_BOIE, IMR0);
191193
for (i = 1; i < fifotransferlength;) {
@@ -217,7 +219,7 @@ static int agilent_82350b_accel_write(struct gpib_board *board, u8 *buffer,
217219
break;
218220
}
219221
write_byte(tms_priv, tms_priv->imr0_bits, IMR0);
220-
if (retval)
222+
if (retval < 0)
221223
return retval;
222224

223225
if (send_eoi) {

0 commit comments

Comments
 (0)