Skip to contentSkip to conversation

scx200_acb: Fix the state machine

PATCH New Greg KH 1 participant 1 message Jul 12, 2006

Subsystems (2)
lore
Share & tools
lore

Greg KH

author
#0 lore raw

PATCH 3/13 scx200_acb: Fix the state machine

From: Thomas Andrews <tandrews at grok.co.za>

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 Jean Delvare <khali at linux-fr.org>
Signed-off-by Greg Kroah-Hartman <gregkh at suse.de>
---
 drivers/i2c/busses/scx200_acb.c |   12 ++++++------
 1 files changed, 6 insertions(+), 6 deletions(-)
drivers/i2c/busses/scx200_acb.c +6 -6
index 22a3eda..454086a 100644
@@ -184,21 +184,21 @@ static void scx200_acb_machine(struct sc
 		break;
 
 	case state_read:
-		/* Set ACK if receiving the last byte */
-		if (iface->len = 1)
+		/* Set ACK if _next_ byte will be the last one */
+		if (iface->len = 2)
 			outb(inb(ACBCTL1) | ACBCTL1_ACK, ACBCTL1);
 		else
 			outb(inb(ACBCTL1) & ~ACBCTL1_ACK, ACBCTL1);
 
-		*iface->ptr++ = inb(ACBSDA);
-		--iface->len;
-
-		if (iface->len = 0) {
+		if (iface->len = 1) {
 			iface->result = 0;
 			iface->state = state_idle;
 			outb(inb(ACBCTL1) | ACBCTL1_STOP, ACBCTL1);
 		}
 
+		*iface->ptr++ = inb(ACBSDA);
+		--iface->len;
+
 		break;
 
 	case state_write:
Signature · 1 line
1.4.1