Commit b88acf65 authored by Thomas Andrews's avatar Thomas Andrews Committed by Adrian Bunk

Fix the scx200_acb state machine:

* Nack was sent one byte too late on reads >= 2 bytes.
* Stop bit was set one byte too late on reads.
Signed-off-by: default avatarJean Delvare <khali@linux-fr.org>
Signed-off-by: default avatarAdrian Bunk <bunk@stusta.de>
parent b235e283
...@@ -178,21 +178,21 @@ static void scx200_acb_machine(struct scx200_acb_iface *iface, u8 status) ...@@ -178,21 +178,21 @@ static void scx200_acb_machine(struct scx200_acb_iface *iface, u8 status)
break; break;
case state_read: case state_read:
/* Set ACK if receiving the last byte */ /* Set ACK if _next_ byte will be the last one */
if (iface->len == 1) if (iface->len == 2)
outb(inb(ACBCTL1) | ACBCTL1_ACK, ACBCTL1); outb(inb(ACBCTL1) | ACBCTL1_ACK, ACBCTL1);
else else
outb(inb(ACBCTL1) & ~ACBCTL1_ACK, ACBCTL1); outb(inb(ACBCTL1) & ~ACBCTL1_ACK, ACBCTL1);
*iface->ptr++ = inb(ACBSDA); if (iface->len == 1) {
--iface->len;
if (iface->len == 0) {
iface->result = 0; iface->result = 0;
iface->state = state_idle; iface->state = state_idle;
outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1); outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1);
} }
*iface->ptr++ = inb(ACBSDA);
--iface->len;
break; break;
case state_write: case state_write:
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment