
Hi Detlev,
On Wednesday 01 July 2009 18:56:18 Detlev Zundel wrote:
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?
You should rather use read/write accessor macros which "do the right thing". Try using readl() for the loop. Memory barriers do not belong into "upper level" code.
I know that we advertised the usage of the io accessor functions for quite some time now. But I'm not so sure here anymore. One disadvantage of this usage could be speed penalty by the usage of too many unnecessary barriers (included via the accessor functions on some platforms).
I remember a discussion either on the linuxppc-dev, linux-arm-kernel or the nextdev list about removing the accessor functions from the Linux version of this Marvell ethernet drivers (mv643xx_eth.c) at some time because of this speed penalty. Sorry but I don't have a link for this mlist discussion.
Just my 0.02$.
Best regards, Stefan
===================================================================== DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: +49-8142-66989-0 Fax: +49-8142-66989-80 Email: office@denx.de =====================================================================