Skip to content
Snippets Groups Projects
Commit 03f3d8d3 authored by Mike Frysinger's avatar Mike Frysinger Committed by Wolfgang Denk
Browse files

lan91c96/smc91111/smc911x: get mac address from environment


The environment is the canonical storage location of the mac address, so
we're killing off the global data location and moving everything to
querying the env directly.

Also, do not bother checking the EEPROM if the env is setup.  This
simplifies the code greatly.

Signed-off-by: default avatarMike Frysinger <vapier@gentoo.org>
Signed-off-by: default avatarWolfgang Dnek <wd@denx.de>
CC: Ben Warren <biggerbadderben@gmail.com>
CC: Rolf Offermanns <rof@sysgo.de>
CC: Erik Stahlman <erik@vt.edu>
CC: Daris A Nevil <dnevil@snmc.com>
CC: Sascha Hauer <s.hauer@pengutronix.de>
parent c527ce92
Branches
Tags
No related merge requests found
...@@ -606,10 +606,8 @@ static int smc_open (bd_t *bd) ...@@ -606,10 +606,8 @@ static int smc_open (bd_t *bd)
SMC_SELECT_BANK (1); SMC_SELECT_BANK (1);
err = smc_get_ethaddr (bd); /* set smc_mac_addr, and sync it with u-boot globals */ err = smc_get_ethaddr (bd); /* set smc_mac_addr, and sync it with u-boot globals */
if (err < 0) { if (err < 0)
memset (bd->bi_enetaddr, 0, 6); /* hack to make error stick! upper code will abort if not set */ return -1;
return (-1); /* upper code ignores this, but NOT bi_enetaddr */
}
#ifdef USE_32_BIT #ifdef USE_32_BIT
for (i = 0; i < 6; i += 2) { for (i = 0; i < 6; i += 2) {
word address; word address;
...@@ -869,69 +867,20 @@ static int smc_hw_init () ...@@ -869,69 +867,20 @@ static int smc_hw_init ()
int smc_get_ethaddr (bd_t * bd) int smc_get_ethaddr (bd_t * bd)
{ {
int env_size = 0; uchar v_mac[6];
int rom_valid = 0;
int env_present = 0;
int reg = 0;
char *s = NULL;
char *e = NULL;
char *v_mac, es[] = "11:22:33:44:55:66";
char s_env_mac[64];
uchar v_env_mac[6];
uchar v_rom_mac[6];
env_size = getenv_r ("ethaddr", s_env_mac, sizeof (s_env_mac));
if (env_size != sizeof(es)) { /* Ignore if env is bad or not set */
printf ("\n*** Warning: ethaddr is not set properly, ignoring!!\n");
} else {
env_present = 1;
s = s_env_mac;
for (reg = 0; reg < 6; ++reg) { /* turn string into mac value */
v_env_mac[reg] = s ? simple_strtoul (s, &e, 16) : 0;
if (s)
s = (*e) ? e + 1 : e;
}
}
rom_valid = get_rom_mac (v_rom_mac); /* get ROM mac value if any */ if (!eth_getenv_enetaddr("ethaddr", v_mac)) {
/* get ROM mac value if any */
if (!env_present) { /* if NO env */ if (!get_rom_mac(v_mac)) {
if (rom_valid) { /* but ROM is valid */ printf("\n*** ERROR: ethaddr is NOT set !!\n");
v_mac = (char *)v_rom_mac; return -1;
sprintf (s_env_mac, "%02X:%02X:%02X:%02X:%02X:%02X",
v_mac[0], v_mac[1], v_mac[2], v_mac[3],
v_mac[4], v_mac[5]);
setenv ("ethaddr", s_env_mac);
} else { /* no env, bad ROM */
printf ("\n*** ERROR: ethaddr is NOT set !!\n");
return (-1);
} }
} else { /* good env, don't care ROM */ eth_setenv_enetaddr("ethaddr", v_mac);
v_mac = (char *)v_env_mac; /* always use a good env over a ROM */
} }
if (env_present && rom_valid) { /* if both env and ROM are good */ smc_set_mac_addr(v_mac); /* use old function to update smc default */
if (memcmp (v_env_mac, v_rom_mac, 6) != 0) { PRINTK("Using MAC Address %pM\n", v_mac);
printf ("\nWarning: MAC addresses don't match:\n"); return 0;
printf ("\tHW MAC address: "
"%02X:%02X:%02X:%02X:%02X:%02X\n",
v_rom_mac[0], v_rom_mac[1],
v_rom_mac[2], v_rom_mac[3],
v_rom_mac[4], v_rom_mac[5] );
printf ("\t\"ethaddr\" value: "
"%02X:%02X:%02X:%02X:%02X:%02X\n",
v_env_mac[0], v_env_mac[1],
v_env_mac[2], v_env_mac[3],
v_env_mac[4], v_env_mac[5]) ;
debug ("### Set MAC addr from environment\n");
}
}
memcpy (bd->bi_enetaddr, v_mac, 6); /* update global address to match env (allows env changing) */
smc_set_mac_addr ((unsigned char *)v_mac); /* use old function to update smc default */
PRINTK("Using MAC Address %02X:%02X:%02X:%02X:%02X:%02X\n", v_mac[0], v_mac[1],
v_mac[2], v_mac[3], v_mac[4], v_mac[5]);
return (0);
} }
/* /*
......
...@@ -834,10 +834,8 @@ static int smc_open (bd_t * bd) ...@@ -834,10 +834,8 @@ static int smc_open (bd_t * bd)
SMC_SELECT_BANK (1); SMC_SELECT_BANK (1);
err = smc_get_ethaddr (bd); /* set smc_mac_addr, and sync it with u-boot globals */ err = smc_get_ethaddr (bd); /* set smc_mac_addr, and sync it with u-boot globals */
if (err < 0) { if (err < 0)
memset (bd->bi_enetaddr, 0, 6); /* hack to make error stick! upper code will abort if not set */ return -1;
return (-1); /* upper code ignores this, but NOT bi_enetaddr */
}
#ifdef USE_32_BIT #ifdef USE_32_BIT
for (i = 0; i < 6; i += 2) { for (i = 0; i < 6; i += 2) {
word address; word address;
...@@ -1535,66 +1533,20 @@ int eth_send(volatile void *packet, int length) { ...@@ -1535,66 +1533,20 @@ int eth_send(volatile void *packet, int length) {
int smc_get_ethaddr (bd_t * bd) int smc_get_ethaddr (bd_t * bd)
{ {
int env_size, rom_valid, env_present = 0, reg; uchar v_mac[6];
char *s = NULL, *e, es[] = "11:22:33:44:55:66";
char s_env_mac[64];
uchar v_env_mac[6], v_rom_mac[6], *v_mac;
env_size = getenv_r ("ethaddr", s_env_mac, sizeof (s_env_mac));
if ((env_size > 0) && (env_size < sizeof (es))) { /* exit if env is bad */
printf ("\n*** ERROR: ethaddr is not set properly!!\n");
return (-1);
}
if (env_size > 0) { if (!eth_getenv_enetaddr("ethaddr", v_mac)) {
env_present = 1; /* get ROM mac value if any */
s = s_env_mac; if (!get_rom_mac(v_mac)) {
} printf("\n*** ERROR: ethaddr is NOT set !!\n");
return -1;
for (reg = 0; reg < 6; ++reg) { /* turn string into mac value */
v_env_mac[reg] = s ? simple_strtoul (s, &e, 16) : 0;
if (s)
s = (*e) ? e + 1 : e;
}
rom_valid = get_rom_mac (v_rom_mac); /* get ROM mac value if any */
if (!env_present) { /* if NO env */
if (rom_valid) { /* but ROM is valid */
v_mac = v_rom_mac;
sprintf (s_env_mac, "%02X:%02X:%02X:%02X:%02X:%02X",
v_mac[0], v_mac[1], v_mac[2], v_mac[3],
v_mac[4], v_mac[5]);
setenv ("ethaddr", s_env_mac);
} else { /* no env, bad ROM */
printf ("\n*** ERROR: ethaddr is NOT set !!\n");
return (-1);
} }
} else { /* good env, don't care ROM */ eth_setenv_enetaddr("ethaddr", v_mac);
v_mac = v_env_mac; /* always use a good env over a ROM */
} }
if (env_present && rom_valid) { /* if both env and ROM are good */ smc_set_mac_addr(v_mac); /* use old function to update smc default */
if (memcmp (v_env_mac, v_rom_mac, 6) != 0) { PRINTK("Using MAC Address %pM\n", v_mac);
printf ("\nWarning: MAC addresses don't match:\n"); return 0;
printf ("\tHW MAC address: "
"%02X:%02X:%02X:%02X:%02X:%02X\n",
v_rom_mac[0], v_rom_mac[1],
v_rom_mac[2], v_rom_mac[3],
v_rom_mac[4], v_rom_mac[5] );
printf ("\t\"ethaddr\" value: "
"%02X:%02X:%02X:%02X:%02X:%02X\n",
v_env_mac[0], v_env_mac[1],
v_env_mac[2], v_env_mac[3],
v_env_mac[4], v_env_mac[5]) ;
debug ("### Set MAC addr from environment\n");
}
}
memcpy (bd->bi_enetaddr, v_mac, 6); /* update global address to match env (allows env changing) */
smc_set_mac_addr ((uchar *)v_mac); /* use old function to update smc default */
PRINTK("Using MAC Address %02X:%02X:%02X:%02X:%02X:%02X\n", v_mac[0], v_mac[1],
v_mac[2], v_mac[3], v_mac[4], v_mac[5]);
return (0);
} }
int get_rom_mac (uchar *v_rom_mac) int get_rom_mac (uchar *v_rom_mac)
......
...@@ -39,15 +39,10 @@ void pkt_data_push(u32 addr, u32 val) \ ...@@ -39,15 +39,10 @@ void pkt_data_push(u32 addr, u32 val) \
static int smx911x_handle_mac_address(bd_t *bd) static int smx911x_handle_mac_address(bd_t *bd)
{ {
unsigned long addrh, addrl; unsigned long addrh, addrl;
unsigned char *m = bd->bi_enetaddr; uchar m[6];
/* if the environment has a valid mac address then use it */ /* if the environment has a valid mac address then use it */
if ((m[0] | m[1] | m[2] | m[3] | m[4] | m[5])) { if (!eth_getenv_enetaddr("ethaddr", m)) {
addrl = m[0] | m[1] << 8 | m[2] << 16 | m[3] << 24;
addrh = m[4] | m[5] << 8;
smc911x_set_mac_csr(ADDRH, addrh);
smc911x_set_mac_csr(ADDRL, addrl);
} else {
/* if not, try to get one from the eeprom */ /* if not, try to get one from the eeprom */
addrh = smc911x_get_mac_csr(ADDRH); addrh = smc911x_get_mac_csr(ADDRH);
addrl = smc911x_get_mac_csr(ADDRL); addrl = smc911x_get_mac_csr(ADDRL);
...@@ -65,10 +60,11 @@ static int smx911x_handle_mac_address(bd_t *bd) ...@@ -65,10 +60,11 @@ static int smx911x_handle_mac_address(bd_t *bd)
"and no eeprom found\n"); "and no eeprom found\n");
return -1; return -1;
} }
eth_setenv_enetaddr("ethaddr", m);
} }
printf(DRIVERNAME ": MAC %02x:%02x:%02x:%02x:%02x:%02x\n", printf(DRIVERNAME ": MAC %pM\n", m);
m[0], m[1], m[2], m[3], m[4], m[5]);
return 0; return 0;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment