[U-Boot] [PATCH v2] Fix DM9000 MAC address handling

Proper behavior is to pull MAC address from NVRAM in the initialization() an stuff it in dev->address, then program the device from dev->address in the init() function.
Signed-off-by: Ben Warren biggerbadderben@gmail.com ---
v2: Made dm9000_get_enetaddr static and removed unnecessary brace in for loop
drivers/net/dm9000x.c | 26 ++++++++++++++------------ 1 files changed, 14 insertions(+), 12 deletions(-)
diff --git a/drivers/net/dm9000x.c b/drivers/net/dm9000x.c index efe9135..73dd335 100644 --- a/drivers/net/dm9000x.c +++ b/drivers/net/dm9000x.c @@ -284,7 +284,6 @@ static int dm9000_init(struct eth_device *dev, bd_t *bd) int i, oft, lnk; u8 io_mode; struct board_info *db = &dm9000_info; - uchar enetaddr[6];
DM9000_DBG("%s\n", __func__);
@@ -342,20 +341,11 @@ static int dm9000_init(struct eth_device *dev, bd_t *bd) /* Clear interrupt status */ DM9000_iow(DM9000_ISR, ISR_ROOS | ISR_ROS | ISR_PTS | ISR_PRS);
- /* Set Node address */ - if (!eth_getenv_enetaddr("ethaddr", enetaddr)) { -#if !defined(CONFIG_DM9000_NO_SROM) - for (i = 0; i < 3; i++) - dm9000_read_srom_word(i, enetaddr + 2 * i); - eth_setenv_enetaddr("ethaddr", enetaddr); -#endif - } - - printf("MAC: %pM\n", enetaddr); + printf("MAC: %pM\n", dev->enetaddr);
/* fill device MAC address registers */ for (i = 0, oft = DM9000_PAR; i < 6; i++, oft++) - DM9000_iow(oft, enetaddr[i]); + DM9000_iow(oft, dev->enetaddr[i]); for (i = 0, oft = 0x16; i < 8; i++, oft++) DM9000_iow(oft, 0xff);
@@ -558,6 +548,15 @@ void dm9000_write_srom_word(int offset, u16 val) } #endif
+static void dm9000_get_enetaddr(struct eth_device *dev) +{ +#if !defined(CONFIG_DM9000_NO_SROM) + int i; + for (i = 0; i < 3; i++) + dm9000_read_srom_word(i, dev->enetaddr + (2 * i)); +#endif +} + /* Read a byte from I/O port */ @@ -621,6 +620,9 @@ int dm9000_initialize(bd_t *bis) { struct eth_device *dev = &(dm9000_info.netdev);
+ /* Load MAC address from EEPROM */ + dm9000_get_enetaddr(dev); + dev->init = dm9000_init; dev->halt = dm9000_halt; dev->send = dm9000_send;

Proper behavior is to pull MAC address from NVRAM in the initialization() an stuff it in dev->address, then program the device from dev->address in the init() function.
Signed-off-by: Ben Warren biggerbadderben@gmail.com
Ben I tested and here is the result.
1) dhcp still does not work 2) I have to set a static ipaddr for the bootcmd to work
Your patch solved the issue where issuing the bootcmd "tftp; bootm" would complain about ethaddr not being set.
But i do notice that ethaddr does not get saved in the environment.

Hi Sandeep,
Paulraj, Sandeep wrote:
Proper behavior is to pull MAC address from NVRAM in the initialization() an stuff it in dev->address, then program the device from dev->address in the init() function.
Signed-off-by: Ben Warren biggerbadderben@gmail.com
Ben I tested and here is the result.
- dhcp still does not work
- I have to set a static ipaddr for the bootcmd to work
Your patch solved the issue where issuing the bootcmd "tftp; bootm" would complain about ethaddr not being set.
But i do notice that ethaddr does not get saved in the environment.
Saving the address to the environment is the user's job. Nothing should write it automatically. A few drivers do, but they should be changed.
Please look in net/eth.c::eth_initialize() to see how this works. The order of precedence is this:
1. If environment variable is not set, it's up to the driver to find its own MAC address. 2. If the environment variable is set, and is non-zero, it is used. If if conflicts with the value in NVRAM, a warning is issued, but the environment value is still used.
I don't know why DHCP doesn't work, but if I were you I'd check that the address printed from line 344 in dm9000x.c shows a valid unicast MAC address.
regards, Ben
participants (2)
-
Ben Warren
-
Paulraj, Sandeep