[PATCH 86/133] [Jaunty SRU] ARM.imx51 Freescale:ENGR00112449 BUGFIX[STMP378x] Ethernet driver can not read the chip ID

Brad Figg brad.figg at canonical.com
Thu Jul 9 16:49:16 UTC 2009


From: Robby Cai <r63905 at freescale.com>

The stmp37xx has a single DMA channel for SSP; therefore it must be
programmed for either transmission and reception. So it acts in half-duplex
mode. However the spi_write_then_read()'s behavior is broken for
hald-duplex mode via f9b90e39cbc5c4d6ef60022fd1f25d541df0aad1 in v2.6.28.
Now it's reverted via bdff549ebeff92b1a6952e5501caf16a6f8898c8

So this bug was fixed by
1) cherrypick bdff549ebeff92b1a6952e5501caf16a6f8898c8
2) modify drivers/net/enc28j60.c to handle half-duplex mode

Signed-off-by: Robby Cai <r63905 at freescale.com>
Signed-off-by: Brad Figg <brad.figg at canonical.com>
---
 drivers/net/enc28j60.c |   16 ++++++++++------
 1 files changed, 10 insertions(+), 6 deletions(-)

diff --git a/drivers/net/enc28j60.c b/drivers/net/enc28j60.c
index 36cb6e9..6007bff 100644
--- a/drivers/net/enc28j60.c
+++ b/drivers/net/enc28j60.c
@@ -90,10 +90,13 @@ spi_read_buf(struct enc28j60_net *priv, int len, u8 *data)
 {
 	u8 *rx_buf = priv->spi_transfer_buf + 4;
 	u8 *tx_buf = priv->spi_transfer_buf;
-	struct spi_transfer t = {
-		.tx_buf = tx_buf,
-		.rx_buf = rx_buf,
-		.len = SPI_OPLEN + len,
+	struct spi_transfer tt = {
+		.tx_buf	= tx_buf,
+		.len	= SPI_OPLEN,
+	};
+	struct spi_transfer tr = {
+		.rx_buf	= rx_buf,
+		.len	= len,
 	};
 	struct spi_message msg;
 	int ret;
@@ -102,10 +105,11 @@ spi_read_buf(struct enc28j60_net *priv, int len, u8 *data)
 	tx_buf[1] = tx_buf[2] = tx_buf[3] = 0;	/* don't care */
 
 	spi_message_init(&msg);
-	spi_message_add_tail(&t, &msg);
+	spi_message_add_tail(&tt, &msg);
+	spi_message_add_tail(&tr, &msg);
 	ret = spi_sync(priv->spi, &msg);
 	if (ret == 0) {
-		memcpy(data, &rx_buf[SPI_OPLEN], len);
+		memcpy(data, rx_buf, len);
 		ret = msg.status;
 	}
 	if (ret && netif_msg_drv(priv))
-- 
1.6.0.4





More information about the kernel-team mailing list