diff options
author | Robby Cai <r63905@freescale.com> | 2009-05-14 16:10:11 +0800 |
---|---|---|
committer | Robby Cai <r63905@freescale.com> | 2009-05-15 18:15:11 +0800 |
commit | 70a08c19b0e173b581d03a168b78813341708bfb (patch) | |
tree | a443adb1f4fcd3db842ed02166146b487969e287 | |
parent | 4928a68a1feeb6b7501d8696fb821d245b69151c (diff) |
ENGR00112449 BUGFIX[STMP378x] Ethernet driver can not read the chip ID
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@freescale.com>
-rw-r--r-- | 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 97699ea9d65e..660c03423b25 100644 --- a/drivers/net/enc28j60.c +++ b/drivers/net/enc28j60.c @@ -127,10 +127,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; @@ -139,10 +142,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)) |