public inbox for linux-i2c@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH] i2c-xiic.c must always write 16-bit words to TX_FIFO
@ 2013-04-22 19:34 Steven A. Falco
       [not found] ` <517590CF.10609-7/gz0mrWfc7QT0dZR+AlfA@public.gmane.org>
  0 siblings, 1 reply; 2+ messages in thread
From: Steven A. Falco @ 2013-04-22 19:34 UTC (permalink / raw)
  To: linux-i2c-u79uwXL29TY76Z2rM5mHXA

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/gz0mrWfc7QT0dZR+AlfA@public.gmane.org>

---

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.

diff --git a/drivers/i2c/busses/i2c-xiic.c b/drivers/i2c/busses/i2c-xiic.c
index 332c720..3d0f052 100644
--- a/drivers/i2c/busses/i2c-xiic.c
+++ b/drivers/i2c/busses/i2c-xiic.c
@@ -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);
 	}
 }
 

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* Re: [PATCH] i2c-xiic.c must always write 16-bit words to TX_FIFO
       [not found] ` <517590CF.10609-7/gz0mrWfc7QT0dZR+AlfA@public.gmane.org>
@ 2013-04-23 16:42   ` Wolfram Sang
  0 siblings, 0 replies; 2+ messages in thread
From: Wolfram Sang @ 2013-04-23 16:42 UTC (permalink / raw)
  To: Steven A. Falco; +Cc: linux-i2c-u79uwXL29TY76Z2rM5mHXA

On Mon, Apr 22, 2013 at 03:34:39PM -0400, Steven A. Falco wrote:
> 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/gz0mrWfc7QT0dZR+AlfA@public.gmane.org>

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

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2013-04-23 16:42 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-04-22 19:34 [PATCH] i2c-xiic.c must always write 16-bit words to TX_FIFO Steven A. Falco
     [not found] ` <517590CF.10609-7/gz0mrWfc7QT0dZR+AlfA@public.gmane.org>
2013-04-23 16:42   ` Wolfram Sang

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox