Add memory barriers to kwgbe_send/recv

kwgbe_send/recv both have loops waiting for the hardware to set  a bit.
GCC 4.3.3 cleverly optimizes this to ... a while(1); loop. This patch
introduces memory barriers to force re-loading of the transmit descriptor.

mb() wasn't defined for arm, but perhaps it should?

Signed-off-by: Simon Kagstrom <simon.kagst...@netinsight.net>
---
 drivers/net/kirkwood_egiga.c |    4 ++++
 1 files changed, 4 insertions(+), 0 deletions(-)

diff --git a/drivers/net/kirkwood_egiga.c b/drivers/net/kirkwood_egiga.c
index 3c5db19..abedf77 100644
--- a/drivers/net/kirkwood_egiga.c
+++ b/drivers/net/kirkwood_egiga.c
@@ -513,6 +513,8 @@ static int kwgbe_send(struct eth_device *dev, volatile void 
*dataptr,
                        printf("Err..(%s) in xmit packet\n", __FUNCTION__);
                        return -1;
                }
+               /* Memory barrier to see to it that cmd_sts is re-read */
+               asm volatile("" : : : "memory");
        };
        return 0;
 }
@@ -531,6 +533,8 @@ static int kwgbe_recv(struct eth_device *dev)
                        debug("%s time out...\n", __FUNCTION__);
                        return -1;
                }
+               /* Memory barrier to see to it that cmd_sts is re-read */
+               asm volatile("" : : : "memory");
        } while (p_rxdesc_curr->cmd_sts & KWGBE_BUFFER_OWNED_BY_DMA);
 
        if (p_rxdesc_curr->byte_cnt != 0) {
-- 
1.6.0.4
_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to