Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 3 Jul 2014 10:59:43 +0000 (UTC)
From:      Daichi GOTO <daichi@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-10@freebsd.org
Subject:   svn commit: r268210 - stable/10/sys/dev/glxiic
Message-ID:  <201407031059.s63AxhfH085954@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: daichi (ports committer)
Date: Thu Jul  3 10:59:42 2014
New Revision: 268210
URL: http://svnweb.freebsd.org/changeset/base/268210

Log:
  MFC: r267852
  
  Fixed an IIC timing issue between the glxiic master and a slave of
  peripheral devices.  When transmitting (rx) from slave to master,
  sometimes nAKC delays. As a result, some slaves fails their
  transmission.
  
  Submitted by:	Masanori OZAWA <ozawa@ongs.co.jp>
  Reviewed by:	brix

Modified:
  stable/10/sys/dev/glxiic/glxiic.c
Directory Properties:
  stable/10/   (props changed)

Modified: stable/10/sys/dev/glxiic/glxiic.c
==============================================================================
--- stable/10/sys/dev/glxiic/glxiic.c	Thu Jul  3 10:49:46 2014	(r268209)
+++ stable/10/sys/dev/glxiic/glxiic.c	Thu Jul  3 10:59:42 2014	(r268210)
@@ -711,6 +711,7 @@ static int
 glxiic_state_master_addr_callback(struct glxiic_softc *sc, uint8_t status)
 {
 	uint8_t slave;
+	uint8_t ctrl1;
 
 	GLXIIC_ASSERT_LOCKED(sc);
 
@@ -746,6 +747,13 @@ glxiic_state_master_addr_callback(struct
 
 	bus_write_1(sc->smb_res, GLXIIC_SMB_SDA, slave);
 
+	if ((sc->msg->flags & IIC_M_RD) != 0 && sc->ndata == 1) {
+		/* Last byte from slave, set NACK. */
+		ctrl1 = bus_read_1(sc->smb_res, GLXIIC_SMB_CTRL1);
+		bus_write_1(sc->smb_res, GLXIIC_SMB_CTRL1,
+		    ctrl1 | GLXIIC_SMB_CTRL1_ACK_BIT);
+	}
+
 	return (IIC_NOERR);
 }
 
@@ -811,13 +819,6 @@ glxiic_state_master_rx_callback(struct g
 		return (IIC_ENOACK);
 	}
 
-	if (sc->ndata == 1) {
-		/* Last byte from slave, set NACK. */
-		ctrl1 = bus_read_1(sc->smb_res, GLXIIC_SMB_CTRL1);
-		bus_write_1(sc->smb_res, GLXIIC_SMB_CTRL1,
-		    ctrl1 | GLXIIC_SMB_CTRL1_ACK_BIT);
-	}
-
 	if ((status & GLXIIC_SMB_STS_STASTR_BIT) != 0) {
 		/* Bus is stalled, clear and wait for data. */
 		bus_write_1(sc->smb_res, GLXIIC_SMB_STS,
@@ -837,6 +838,13 @@ glxiic_state_master_rx_callback(struct g
 		return (glxiic_state_table[sc->state].callback(sc, status));
 	}
 
+	if (sc->ndata == 1) {
+		/* Last byte from slave, set NACK. */
+		ctrl1 = bus_read_1(sc->smb_res, GLXIIC_SMB_CTRL1);
+		bus_write_1(sc->smb_res, GLXIIC_SMB_CTRL1,
+		    ctrl1 | GLXIIC_SMB_CTRL1_ACK_BIT);
+	}
+
 	glxiic_start_timeout_locked(sc);
 
 	return (IIC_NOERR);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201407031059.s63AxhfH085954>