@ -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