From 35b00080dd397dfa4d8dae2d84423c36a34fe061 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Alain=20P=C3=A9teut?= <peteut@space.unibe.ch>
Date: Fri, 15 Apr 2011 12:44:37 +0200
Subject: [PATCH] xilinx_emaclite.c ping-pong fix
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Signed-off-by: Alain Péteut <peteut@space.unibe.ch>
---
drivers/net/xilinx_emaclite.c | 21 ++++++++++++---------
1 files changed, 12 insertions(+), 9 deletions(-)
@@ -138,7 +138,9 @@ static int emaclite_init(struct eth_device *dev, bd_t *bis)
debug ("EmacLite Initialization Started\n");
memset (&emaclite, 0, sizeof (xemaclite));
emaclite.baseaddress = dev->iobase;
-
+
+ emaclite.nexttxbuffertouse = 0;
+ emaclite.nextrxbuffertouse = 0;
/*
* TX - TX_PING & TX_PONG initialization
*/
@@ -155,12 +157,13 @@ static int emaclite_init(struct eth_device *dev, bd_t *bis)
while ((in_be32 (emaclite.baseaddress + XEL_TSR_OFFSET) &
XEL_TSR_PROG_MAC_ADDR) != 0) ;
-#ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG
+#ifdef XILINX_EMACLITE_TX_PING_PONG
/* The same operation with PONG TX */
out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET + XEL_BUFFER_OFFSET, 0);
xemaclite_alignedwrite (dev->enetaddr, emaclite.baseaddress +
XEL_BUFFER_OFFSET, ENET_ADDR_LENGTH);
- out_be32 (emaclite.baseaddress + XEL_TPLR_OFFSET, ENET_ADDR_LENGTH);
+ out_be32 (emaclite.baseaddress + XEL_TPLR_OFFSET + XEL_BUFFER_OFFSET,
+ ENET_ADDR_LENGTH);
out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET + XEL_BUFFER_OFFSET,
XEL_TSR_PROG_MAC_ADDR);
while ((in_be32 (emaclite.baseaddress + XEL_TSR_OFFSET +
@@ -172,7 +175,7 @@ static int emaclite_init(struct eth_device *dev, bd_t *bis)
*/
/* Write out the value to flush the RX buffer */
out_be32 (emaclite.baseaddress + XEL_RSR_OFFSET, XEL_RSR_RECV_IE_MASK);
-#ifdef CONFIG_XILINX_EMACLITE_RX_PING_PONG
+#ifdef XILINX_EMACLITE_RX_PING_PONG
out_be32 (emaclite.baseaddress + XEL_RSR_OFFSET + XEL_BUFFER_OFFSET,
XEL_RSR_RECV_IE_MASK);
#endif
@@ -222,7 +225,7 @@ static int emaclite_send (struct eth_device *dev, volatile void *ptr, int len)
printf ("Error: Timeout waiting for ethernet TX buffer\n");
/* Restart PING TX */
out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET, 0);
-#ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG
+#ifdef XILINX_EMACLITE_TX_PING_PONG
out_be32 (emaclite.baseaddress + XEL_TSR_OFFSET +
XEL_BUFFER_OFFSET, 0);
#endif
@@ -238,7 +241,7 @@ static int emaclite_send (struct eth_device *dev, volatile void *ptr, int len)
&& ((in_be32 ((baseaddress) + XEL_TSR_OFFSET)
& XEL_TSR_XMIT_ACTIVE_MASK) == 0)) {
-#ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG
+#ifdef XILINX_EMACLITE_TX_PING_PONG
emaclite.nexttxbuffertouse ^= XEL_BUFFER_OFFSET;
#endif
debug ("Send packet from 0x%x\n", baseaddress);
@@ -254,7 +257,7 @@ static int emaclite_send (struct eth_device *dev, volatile void *ptr, int len)
out_be32 (baseaddress + XEL_TSR_OFFSET, reg);
return 1;
}
-#ifdef CONFIG_XILINX_EMACLITE_TX_PING_PONG
+#ifdef XILINX_EMACLITE_TX_PING_PONG
/* Switch to second buffer */
baseaddress ^= XEL_BUFFER_OFFSET;
/* Determine if the expected buffer address is empty */
@@ -290,11 +293,11 @@ static int emaclite_recv(struct eth_device *dev)
reg = in_be32 (baseaddress + XEL_RSR_OFFSET);
debug ("Testing data at address 0x%x\n", baseaddress);
if ((reg & XEL_RSR_RECV_DONE_MASK) == XEL_RSR_RECV_DONE_MASK) {
-#ifdef CONFIG_XILINX_EMACLITE_RX_PING_PONG
+#ifdef XILINX_EMACLITE_RX_PING_PONG
emaclite.nextrxbuffertouse ^= XEL_BUFFER_OFFSET;
#endif
} else {
-#ifndef CONFIG_XILINX_EMACLITE_RX_PING_PONG
+#ifndef XILINX_EMACLITE_RX_PING_PONG
debug ("No data was available - address 0x%x\n", baseaddress);
return 0;
#else
--
1.7.2.5