mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-11-28 07:31:15 +00:00
km/ivm: allow to set locally administred MAC addresses
It is possible to flag MAC addresses as locally administred. In this case they don't need to be unique. This is only allowed for interfaces which have no connection to the outside. For the TEGR1 board we use this feature. Cc: Heiko Schocher <hs@denx.de> Signed-off-by: Holger Brunck <holger.brunck@keymile.com>
This commit is contained in:
parent
b63d4f34d0
commit
b2f2c7be34
1 changed files with 21 additions and 3 deletions
|
@ -189,7 +189,7 @@ static int ivm_check_crc(unsigned char *buf, int block)
|
|||
|
||||
/* take care of the possible MAC address offset and the IVM content offset */
|
||||
static int process_mac(unsigned char *valbuf, unsigned char *buf,
|
||||
int offset)
|
||||
int offset, bool unique)
|
||||
{
|
||||
unsigned char mac[6];
|
||||
unsigned long val = (buf[4] << 16) + (buf[5] << 8) + buf[6];
|
||||
|
@ -199,6 +199,13 @@ static int process_mac(unsigned char *valbuf, unsigned char *buf,
|
|||
*/
|
||||
memcpy(mac, buf+1, 6);
|
||||
|
||||
/* MAC adress can be set to locally administred, this is only allowed
|
||||
* for interfaces which have now connection to the outside. For these
|
||||
* addresses we need to set the second bit in the first byte.
|
||||
*/
|
||||
if (!unique)
|
||||
mac[0] |= 0x2;
|
||||
|
||||
if (offset) {
|
||||
val += offset;
|
||||
mac[3] = (val >> 16) & 0xff;
|
||||
|
@ -300,12 +307,23 @@ static int ivm_populate_env(unsigned char *buf, int len)
|
|||
return 0;
|
||||
page2 = &buf[CONFIG_SYS_IVM_EEPROM_PAGE_LEN*2];
|
||||
|
||||
#ifndef CONFIG_KMTEGR1
|
||||
/* if an offset is defined, add it */
|
||||
process_mac(valbuf, page2, CONFIG_PIGGY_MAC_ADRESS_OFFSET);
|
||||
process_mac(valbuf, page2, CONFIG_PIGGY_MAC_ADRESS_OFFSET, true);
|
||||
setenv((char *)"ethaddr", (char *)valbuf);
|
||||
#ifdef CONFIG_KMVECT1
|
||||
/* KMVECT1 has two ethernet interfaces */
|
||||
process_mac(valbuf, page2, 1);
|
||||
process_mac(valbuf, page2, 1, true);
|
||||
setenv((char *)"eth1addr", (char *)valbuf);
|
||||
#endif
|
||||
#else
|
||||
/* KMTEGR1 has a special setup. eth0 has no connection to the outside and
|
||||
* gets an locally administred MAC address, eth1 is the debug interface and
|
||||
* gets the official MAC address from the IVM
|
||||
*/
|
||||
process_mac(valbuf, page2, CONFIG_PIGGY_MAC_ADRESS_OFFSET, false);
|
||||
setenv((char *)"ethaddr", (char *)valbuf);
|
||||
process_mac(valbuf, page2, CONFIG_PIGGY_MAC_ADRESS_OFFSET, true);
|
||||
setenv((char *)"eth1addr", (char *)valbuf);
|
||||
#endif
|
||||
|
||||
|
|
Loading…
Reference in a new issue