
Hi Ben,
On Fri, Nov 28, 2008 at 09:27:37PM -0800, Ben Warren wrote:
the board I'm currently working on has an ASIX AX88796 NE2000 clone but no EEPROM attached to it. Hence, the get_prom() routine returns zeros only so the system won't work.
This patch takes the MAC address given by CONFIG_ETHADDR and translates it to numeric values. This could probably go to some other, more generic place, but I didn't find any.
CONFIG_ETHADDR is bad and shouldn't be used unless you only ever plan on building one board. No new board ports will be accepted that define it.
I agree it's a hack, but in order to boot the board from ethernet, there is need for something, even if it's not perfect.
What would be better here, although it's still not very good, would be to have something like CONFIG_NE2000_NOPROM, and if defined, make a 'getenv("ethaddr")' call and program the hardware with the return value (with proper error checking, of course).
I agree. See the patch below.
Thanks, Daniel
This patch adds CONFIG_NE2000_NOPROM as configuration variable and reads the 'ethaddr' setting from environment to set up the adapter.
Signed-off-by: Daniel Mack daniel@caiaq.de
diff --git a/drivers/net/ne2000_base.c b/drivers/net/ne2000_base.c index f93f932..86c1380 100644 --- a/drivers/net/ne2000_base.c +++ b/drivers/net/ne2000_base.c @@ -669,7 +669,6 @@ void uboot_push_tx_done(int key, int val) { int eth_init(bd_t *bd) { int r; u8 dev_addr[6]; - char ethaddr[20];
PRINTK("### eth_init\n");
@@ -693,16 +692,35 @@ int eth_init(bd_t *bd) {
nic.base = (u8 *) CONFIG_DRIVER_NE2000_BASE;
- r = get_prom(dev_addr, nic.base); - if (!r) - return -1; +#ifndef CONFIG_NE2000_NOPROM + { + char ethaddr[20]; + r = get_prom(dev_addr, nic.base); + if (!r) + return -1; + + sprintf (ethaddr, "%02X:%02X:%02X:%02X:%02X:%02X", + dev_addr[0], dev_addr[1], + dev_addr[2], dev_addr[3], + dev_addr[4], dev_addr[5]) ; + PRINTK("Set environment from HW MAC addr = "%s"\n", ethaddr); + setenv ("ethaddr", ethaddr); + } +#else /* CONFIG_NE2000_NOPROM */ + { + char *s = getenv("ethaddr");
- sprintf (ethaddr, "%02X:%02X:%02X:%02X:%02X:%02X", - dev_addr[0], dev_addr[1], - dev_addr[2], dev_addr[3], - dev_addr[4], dev_addr[5]) ; - PRINTK("Set environment from HW MAC addr = "%s"\n", ethaddr); - setenv ("ethaddr", ethaddr); + if (!s) { + printf ("CONFIG_NE2000_NOPROM set but no " + "ethaddr given in environment.\n"); + return -1; + } + + /* convert the string notation */ + for (r = 0; r < 6; r++) + dev_addr[r] = simple_strtol(s + (r * 3), NULL, 16); + } +#endif
nic.data = nic.base + DP_DATA; nic.tx_buf1 = START_PG;