linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH v2] i2c: xlp9xx: Fix case where SSIF read transaction completes early
@ 2018-08-09  6:36 George Cherian
  2018-08-09 15:39 ` Wolfram Sang
  0 siblings, 1 reply; 3+ messages in thread
From: George Cherian @ 2018-08-09  6:36 UTC (permalink / raw)
  To: linux-kernel, linux-i2c; +Cc: wsa, jglauber, george.cherian

During ipmi stress tests we see occasional failure of transactions
at the boot time. This happens in the case of a I2C_M_RECV_LEN
transactions, when the read transfer completes (with the initial
read length of 34) before the driver gets a chance to handle interrupts.

The current driver code expects at least 2 interrupts for I2C_M_RECV_LEN
transactions. The length is updated during the first interrupt, and  the
buffer contents are only copied during subsequent interrupts. In case of
just one interrupt, we will complete the transaction without copying
out the bytes from RX fifo.

Update the code to drain the RX fifo after the length update,
so that the transaction completes correctly in all cases.

Signed-off-by: George Cherian <george.cherian@cavium.com>
---
 drivers/i2c/busses/i2c-xlp9xx.c | 41 ++++++++++++++++++++++++++++-------------
 1 file changed, 28 insertions(+), 13 deletions(-)

diff --git a/drivers/i2c/busses/i2c-xlp9xx.c b/drivers/i2c/busses/i2c-xlp9xx.c
index 1f41a4f..7134f72 100644
--- a/drivers/i2c/busses/i2c-xlp9xx.c
+++ b/drivers/i2c/busses/i2c-xlp9xx.c
@@ -191,28 +191,43 @@ static void xlp9xx_i2c_drain_rx_fifo(struct xlp9xx_i2c_dev *priv)
 	if (priv->len_recv) {
 		/* read length byte */
 		rlen = xlp9xx_read_i2c_reg(priv, XLP9XX_I2C_MRXFIFO);
+
+		/*
+		 * We expect at least 2 interrupts for I2C_M_RECV_LEN
+		 * transactions. The length is updated during the first
+		 * interrupt, and the buffer contents are only copied
+		 * during subsequent interrupts. If in case the interrupts
+		 * get merged we would complete the transaction without
+		 * copying out the bytes from RX fifo. To avoid this now we
+		 * drain the fifo as and when data is available.
+		 * We drained the rlen byte already, decrement total length
+		 * by one.
+		 */
+
+		len--;
 		if (rlen > I2C_SMBUS_BLOCK_MAX || rlen == 0) {
 			rlen = 0;	/*abort transfer */
 			priv->msg_buf_remaining = 0;
 			priv->msg_len = 0;
-		} else {
-			*buf++ = rlen;
-			if (priv->client_pec)
-				++rlen; /* account for error check byte */
-			/* update remaining bytes and message length */
-			priv->msg_buf_remaining = rlen;
-			priv->msg_len = rlen + 1;
+			xlp9xx_i2c_update_rlen(priv);
+			return;
 		}
+
+		*buf++ = rlen;
+		if (priv->client_pec)
+			++rlen; /* account for error check byte */
+		/* update remaining bytes and message length */
+		priv->msg_buf_remaining = rlen;
+		priv->msg_len = rlen + 1;
 		xlp9xx_i2c_update_rlen(priv);
 		priv->len_recv = false;
-	} else {
-		len = min(priv->msg_buf_remaining, len);
-		for (i = 0; i < len; i++, buf++)
-			*buf = xlp9xx_read_i2c_reg(priv, XLP9XX_I2C_MRXFIFO);
-
-		priv->msg_buf_remaining -= len;
 	}
 
+	len = min(priv->msg_buf_remaining, len);
+	for (i = 0; i < len; i++, buf++)
+		*buf = xlp9xx_read_i2c_reg(priv, XLP9XX_I2C_MRXFIFO);
+
+	priv->msg_buf_remaining -= len;
 	priv->msg_buf = buf;
 
 	if (priv->msg_buf_remaining)
-- 
1.8.3.1


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

* Re: [PATCH v2] i2c: xlp9xx: Fix case where SSIF read transaction completes early
  2018-08-09  6:36 [PATCH v2] i2c: xlp9xx: Fix case where SSIF read transaction completes early George Cherian
@ 2018-08-09 15:39 ` Wolfram Sang
  2018-08-09 15:42   ` Wolfram Sang
  0 siblings, 1 reply; 3+ messages in thread
From: Wolfram Sang @ 2018-08-09 15:39 UTC (permalink / raw)
  To: George Cherian; +Cc: linux-kernel, linux-i2c, jglauber

[-- Attachment #1: Type: text/plain, Size: 912 bytes --]

On Wed, Aug 08, 2018 at 11:36:48PM -0700, George Cherian wrote:
> During ipmi stress tests we see occasional failure of transactions
> at the boot time. This happens in the case of a I2C_M_RECV_LEN
> transactions, when the read transfer completes (with the initial
> read length of 34) before the driver gets a chance to handle interrupts.
> 
> The current driver code expects at least 2 interrupts for I2C_M_RECV_LEN
> transactions. The length is updated during the first interrupt, and  the
> buffer contents are only copied during subsequent interrupts. In case of
> just one interrupt, we will complete the transaction without copying
> out the bytes from RX fifo.
> 
> Update the code to drain the RX fifo after the length update,
> so that the transaction completes correctly in all cases.
> 
> Signed-off-by: George Cherian <george.cherian@cavium.com>

Applied to for-current, thanks!


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

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

* Re: [PATCH v2] i2c: xlp9xx: Fix case where SSIF read transaction completes early
  2018-08-09 15:39 ` Wolfram Sang
@ 2018-08-09 15:42   ` Wolfram Sang
  0 siblings, 0 replies; 3+ messages in thread
From: Wolfram Sang @ 2018-08-09 15:42 UTC (permalink / raw)
  To: George Cherian; +Cc: linux-kernel, linux-i2c, jglauber

[-- Attachment #1: Type: text/plain, Size: 1035 bytes --]

On Thu, Aug 09, 2018 at 05:39:59PM +0200, Wolfram Sang wrote:
> On Wed, Aug 08, 2018 at 11:36:48PM -0700, George Cherian wrote:
> > During ipmi stress tests we see occasional failure of transactions
> > at the boot time. This happens in the case of a I2C_M_RECV_LEN
> > transactions, when the read transfer completes (with the initial
> > read length of 34) before the driver gets a chance to handle interrupts.
> > 
> > The current driver code expects at least 2 interrupts for I2C_M_RECV_LEN
> > transactions. The length is updated during the first interrupt, and  the
> > buffer contents are only copied during subsequent interrupts. In case of
> > just one interrupt, we will complete the transaction without copying
> > out the bytes from RX fifo.
> > 
> > Update the code to drain the RX fifo after the length update,
> > so that the transaction completes correctly in all cases.
> > 
> > Signed-off-by: George Cherian <george.cherian@cavium.com>
> 
> Applied to for-current, thanks!

...and added stable.


[-- Attachment #2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

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

end of thread, other threads:[~2018-08-09 15:42 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2018-08-09  6:36 [PATCH v2] i2c: xlp9xx: Fix case where SSIF read transaction completes early George Cherian
2018-08-09 15:39 ` Wolfram Sang
2018-08-09 15: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;
as well as URLs for NNTP newsgroup(s).