@ -52,6 +52,7 @@
. o skeleton . c by Donald Becker ( becker @ cesdis . gsfc . nasa . gov )
.
. History :
. 06 / 19 / 03 Richard Woodruff Made u - boot environment aware and added mac addr checks .
. 10 / 17 / 01 Marco Hasewinkel Modify for DNP / 1110
. 07 / 25 / 01 Woojung Huh Modify for ADS Bitsy
. 04 / 25 / 01 Daris A Nevil Initial public release through SMSC
@ -176,7 +177,7 @@ void smc_destructor(void);
. The kernel calls this function when someone wants to use the device ,
. typically ' ifconfig ethX up ' .
*/
static int smc_open ( voi d) ;
static int smc_open ( bd_t * b d) ;
/*
@ -199,7 +200,12 @@ static void smc_phy_configure(void);
*/
static int smc_rcv ( void ) ;
/* See if a MAC address is defined in the current environment. If so use it. If not
. print a warning and set the environment and other globals with the default .
. If an EEPROM is present it really should be consulted .
*/
int smc_get_ethaddr ( bd_t * bd ) ;
int get_rom_mac ( char * v_rom_mac ) ;
/*
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
@ -226,7 +232,7 @@ void smc_set_mac_addr(const char *addr) {
/*
* smc_get_macaddr is no longer used . If you want to override the default
* mac address , call smc_get_mac_addr as a part of the board initialis ation .
* mac address , call smc_get_mac_addr as a part of the board initializ ation .
*/
#if 0
@ -665,14 +671,13 @@ void smc_destructor()
* Set up everything , reset the card , etc . .
*
*/
static int smc_open ( )
static int smc_open ( bd_t * bd )
{
int i ; /* used to set hw ethernet address */
int i , err ;
PRINTK2 ( " %s:smc_open \n " , SMC_DEV_NAME ) ;
/* reset the hardware */
smc_reset ( ) ;
smc_enable ( ) ;
@ -681,12 +686,16 @@ static int smc_open()
smc_phy_configure ( ) ;
# endif
/* conservative setting (10Mbps, HalfDuplex, no AutoNeg.) */
/* SMC_SELECT_BANK(0); */
/* SMC_outw(0, RPC_REG); */
SMC_SELECT_BANK ( 1 ) ;
err = smc_get_ethaddr ( bd ) ; /* set smc_mac_addr, and sync it with u-boot globals */
if ( err < 0 ) {
memset ( bd - > bi_enetaddr , 0 , 6 ) ; /* hack to make error stick! upper code will abort if not set*/
return ( - 1 ) ; /* upper code ignores this, but NOT bi_enetaddr */
}
# ifdef USE_32_BIT
for ( i = 0 ; i < 6 ; i + = 2 ) {
@ -1385,8 +1394,7 @@ static void print_packet( byte * buf, int length )
# endif
int eth_init ( bd_t * bd ) {
smc_open ( ) ;
return 0 ;
return ( smc_open ( bd ) ) ;
}
void eth_halt ( ) {
@ -1401,4 +1409,74 @@ int eth_send(volatile void *packet, int length) {
return smc_send_packet ( packet , length ) ;
}
int smc_get_ethaddr ( bd_t * bd )
{
int env_size , rom_valid , env_present = 0 , reg ;
char * s = NULL , * e , * v_mac , es [ ] = " 11:22:33:44:55:66 " ;
uchar s_env_mac [ 64 ] , v_env_mac [ 6 ] , v_rom_mac [ 6 ] ;
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 ) {
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 ( ! 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 */
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 */
if ( memcmp ( v_env_mac , v_rom_mac , 6 ) ! = 0 ) {
printf ( " \n *** Warning: Environment and ROM MAC addresses don't match \n " ) ;
printf ( " *** Using Environment MAC \n " ) ;
}
memcpy ( bd - > bi_enetaddr , v_mac , 6 ) ; /* update global address to match env (allows env changing) */
smc_set_mac_addr ( v_mac ) ; /* use old function to update smc default */
return ( 0 ) ;
}
int get_rom_mac ( char * v_rom_mac )
{
int is_rom_present = 0 ;
# ifdef HARDCODE_MAC /* used for testing or to supress run time warnings */
char hw_mac_addr [ ] = { 0x02 , 0x80 , 0xad , 0x20 , 0x31 , 0xb8 } ;
memcpy ( v_rom_mac , hw_mac_addr , 6 ) ;
return ( 1 ) ;
# else
if ( is_rom_present )
{
/* if eeprom contents are valid
* extract mac address into hw_mac_addr , 8 or 16 bit accesses
* memcpy ( v_rom_mac , hc_mac_addr , 6 ) ;
* return ( 1 ) ;
*/
}
memset ( v_rom_mac , 0 , 6 ) ;
return ( 0 ) ;
# endif
}
# endif /* CONFIG_DRIVER_SMC91111 */