summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobby Cai <r63905@freescale.com>2009-05-14 16:10:11 +0800
committerRobby Cai <r63905@freescale.com>2009-05-15 18:15:11 +0800
commit70a08c19b0e173b581d03a168b78813341708bfb (patch)
treea443adb1f4fcd3db842ed02166146b487969e287
parent4928a68a1feeb6b7501d8696fb821d245b69151c (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.c16
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))