[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