Skip to contentSkip to conversation

i2c-xiic.c must always write 16-bit words to TX_FIFO

PATCH Applied Steven A. Falco 2 participants 2 messages Apr 22, 2013 – Apr 23, 2013 1 message not in the archive

Subsystems (2)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 i2c-xiic.c must always write 16-bit words to TX_FIFO

The TX_FIFO register is 10 bits wide. The lower 8 bits are the data to be written, while the upper two bits are flags to indicate stop/start.

The driver apparently attempted to optimize write access, by only writing a byte in those cases where the stop/start bits are zero. However, we have seen cases where the lower byte is duplicated onto the upper byte by the hardware, which causes inadvertent stop/starts.

This patch changes the write access to the transmit FIFO to always be 16 bits wide.

Signed off by: Steven A. Falco <sfalco-7/[email protected]>

---

We had the unfortunate case where we were writing a data byte of 0x02, which got duplicated onto the upper byte. Thus, the actual data written was 0x202, which set the stop bit, and corrupted the transaction. By always writing the full 16 bits, this is avoided.

drivers/i2c/busses/i2c-xiic.c +2 -4
index 332c720..3d0f052 100644
@@ -312,10 +312,8 @@ static void xiic_fill_tx_fifo(struct xiic_i2c *i2c)
 			/* last message in transfer -> STOP */
 			data |= XIIC_TX_DYN_STOP_MASK;
 			dev_dbg(i2c->adap.dev.parent, "%s TX STOP\n", __func__);
-
-			xiic_setreg16(i2c, XIIC_DTR_REG_OFFSET, data);
-		} else
-			xiic_setreg8(i2c, XIIC_DTR_REG_OFFSET, data);
+		}
+		xiic_setreg16(i2c, XIIC_DTR_REG_OFFSET, data);
 	}
 }
 
Applied
#2 lore raw
In reply to a message not in the archive
Quoted 8 lines · Steven A. Falco

The TX_FIFO register is 10 bits wide. The lower 8 bits are the data to be written, while the upper two bits are flags to indicate stop/start.

The driver apparently attempted to optimize write access, by only writing a byte in those cases where the stop/start bits are zero. However, we have seen cases where the lower byte is duplicated onto the upper byte by the hardware, which causes inadvertent stop/starts.

Quoted 4 lines

This patch changes the write access to the transmit FIFO to always be 16 bits wide.

Signed off by: Steven A. Falco <sfalco-7/[email protected]>

Applied to for-next, and added stable, thanks!