
On Thursday 29 January 2009 15:41:31 Wolfgang Denk wrote:
In message 200901291525.03553.vapier@gentoo.org you wrote:
so how exactly are $ethaddr in the env and bi_enetaddr in the global data supposed to interact ? this is a mess in the current tree and i dont see any notes that indicate how things are supposed to be handled. and i'd like to make these changes once and get it right the first time ;).
Can't you just ask some simple and easy questions for a change? ;-)
i see it as:
- common net code calls board_eth_init()
- board_eth_init() sets up ethaddr in env if it isnt set already
- board_eth_init() calls the driver init (bfin_EMAC_initialize() in my
case) - driver init looks up ethaddr in env and sets bi_enetaddr in global data - all other code uses bi_enetaddr to get the MAC address
This doesn't work, as in the case that you don;t use any network commands in U-Boot, board_eth_init() will not run and consequently you don't know the MAC address so you cannot pass it to Linux either.
Rather:
- misc_init_r() [or similar] sets up ethaddr in env if it isnt set already and sets bi_enetaddr in global data
- board_eth_init() calls the driver init (bfin_EMAC_initialize() in your case)
- driver init looks up ethaddr in env or bi_enetaddr
well this gets us into the realm of what i was trying to avoid/fix in the first place: duplication of the env/ethaddr handling/parsing code. i get tired of auditing every board/driver just to find the same simple bugs were duplicated and/or not handled properly.
i guess i can mitigate this by making functions in include/asm-blackfin/net.h and having the boards/drivers call those. -mike