@ -186,12 +186,25 @@ static int read_eeprom(void)
}
}
/**
/**
* update_crc - update the CRC
*
* This function should be called after each update to the EEPROM structure ,
* to make sure the CRC is always correct .
*/
static void update_crc ( void )
{
u32 crc ;
crc = crc32 ( 0 , ( void * ) & e , sizeof ( e ) - 4 ) ;
e . crc = cpu_to_be32 ( crc ) ;
}
/**
* prog_eeprom - write the EEPROM from memory
* prog_eeprom - write the EEPROM from memory
*/
*/
static int prog_eeprom ( void )
static int prog_eeprom ( void )
{
{
int ret , i , length ;
int ret , i ;
unsigned int crc ;
void * p ;
void * p ;
# ifdef CONFIG_SYS_EEPROM_BUS_NUM
# ifdef CONFIG_SYS_EEPROM_BUS_NUM
unsigned int bus ;
unsigned int bus ;
@ -204,19 +217,16 @@ static int prog_eeprom(void)
# else
# else
memset ( e . res_0 , 0xFF , sizeof ( e . res_0 ) ) ;
memset ( e . res_0 , 0xFF , sizeof ( e . res_0 ) ) ;
# endif
# endif
update_crc ( ) ;
length = sizeof ( e ) ;
crc = crc32 ( 0 , ( void * ) & e , length - 4 ) ;
e . crc = cpu_to_be32 ( crc ) ;
# ifdef CONFIG_SYS_EEPROM_BUS_NUM
# ifdef CONFIG_SYS_EEPROM_BUS_NUM
bus = i2c_get_bus_num ( ) ;
bus = i2c_get_bus_num ( ) ;
i2c_set_bus_num ( CONFIG_SYS_EEPROM_BUS_NUM ) ;
i2c_set_bus_num ( CONFIG_SYS_EEPROM_BUS_NUM ) ;
# endif
# endif
for ( i = 0 , p = & e ; i < length ; i + = 8 , p + = 8 ) {
for ( i = 0 , p = & e ; i < sizeof ( e ) ; i + = 8 , p + = 8 ) {
ret = i2c_write ( CONFIG_SYS_I2C_EEPROM_ADDR , i , CONFIG_SYS_I2C_EEPROM_ADDR_LEN ,
ret = i2c_write ( CONFIG_SYS_I2C_EEPROM_ADDR , i , CONFIG_SYS_I2C_EEPROM_ADDR_LEN ,
p , min ( ( length - i ) , 8 ) ) ;
p , min ( ( sizeof ( e ) - i ) , 8 ) ) ;
if ( ret )
if ( ret )
break ;
break ;
udelay ( 5000 ) ; /* 5ms write cycle timing */
udelay ( 5000 ) ; /* 5ms write cycle timing */
@ -273,6 +283,8 @@ static void set_date(const char *string)
for ( i = 0 ; i < 6 ; i + + )
for ( i = 0 ; i < 6 ; i + + )
e . date [ i ] = h2i ( string [ 2 * i ] ) < < 4 | h2i ( string [ 2 * i + 1 ] ) ;
e . date [ i ] = h2i ( string [ 2 * i ] ) < < 4 | h2i ( string [ 2 * i + 1 ] ) ;
update_crc ( ) ;
}
}
/**
/**
@ -297,11 +309,12 @@ static void set_mac_address(unsigned int index, const char *string)
if ( * p = = ' : ' )
if ( * p = = ' : ' )
p + + ;
p + + ;
}
}
update_crc ( ) ;
}
}
int do_mac ( cmd_tbl_t * cmdtp , int flag , int argc , char * argv [ ] )
int do_mac ( cmd_tbl_t * cmdtp , int flag , int argc , char * argv [ ] )
{
{
int i ;
char cmd ;
char cmd ;
if ( argc = = 1 ) {
if ( argc = = 1 ) {
@ -316,9 +329,13 @@ int do_mac(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
return 0 ;
return 0 ;
}
}
if ( ( cmd = = ' i ' ) & & ( argc > 2 ) ) {
if ( cmd = = ' i ' ) {
for ( i = 0 ; i < 4 ; i + + )
# ifdef CONFIG_SYS_I2C_EEPROM_NXID
e . id [ i ] = argv [ 2 ] [ i ] ;
memcpy ( e . id , " NXID " , sizeof ( e . id ) ) ;
e . version = 0 ;
# else
memcpy ( e . id , " CCID " , sizeof ( e . id ) ) ;
# endif
return 0 ;
return 0 ;
}
}
@ -346,6 +363,7 @@ int do_mac(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
case ' n ' : /* serial number */
case ' n ' : /* serial number */
memset ( e . sn , 0 , sizeof ( e . sn ) ) ;
memset ( e . sn , 0 , sizeof ( e . sn ) ) ;
strncpy ( ( char * ) e . sn , argv [ 2 ] , sizeof ( e . sn ) - 1 ) ;
strncpy ( ( char * ) e . sn , argv [ 2 ] , sizeof ( e . sn ) - 1 ) ;
update_crc ( ) ;
break ;
break ;
case ' e ' : /* errata */
case ' e ' : /* errata */
# ifdef CONFIG_SYS_I2C_EEPROM_NXID
# ifdef CONFIG_SYS_I2C_EEPROM_NXID
@ -355,12 +373,14 @@ int do_mac(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
e . errata [ 0 ] = argv [ 2 ] [ 0 ] ;
e . errata [ 0 ] = argv [ 2 ] [ 0 ] ;
e . errata [ 1 ] = argv [ 2 ] [ 1 ] ;
e . errata [ 1 ] = argv [ 2 ] [ 1 ] ;
# endif
# endif
update_crc ( ) ;
break ;
break ;
case ' d ' : /* date BCD format YYMMDDhhmmss */
case ' d ' : /* date BCD format YYMMDDhhmmss */
set_date ( argv [ 2 ] ) ;
set_date ( argv [ 2 ] ) ;
break ;
break ;
case ' p ' : /* MAC table size */
case ' p ' : /* MAC table size */
e . mac_count = simple_strtoul ( argv [ 2 ] , NULL , 16 ) ;
e . mac_count = simple_strtoul ( argv [ 2 ] , NULL , 16 ) ;
update_crc ( ) ;
break ;
break ;
case ' 0 ' . . . ' 7 ' : /* "mac 0" through "mac 7" */
case ' 0 ' . . . ' 7 ' : /* "mac 0" through "mac 7" */
set_mac_address ( cmd - ' 0 ' , argv [ 2 ] ) ;
set_mac_address ( cmd - ' 0 ' , argv [ 2 ] ) ;
@ -388,6 +408,9 @@ int do_mac(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
int mac_read_from_eeprom ( void )
int mac_read_from_eeprom ( void )
{
{
unsigned int i ;
unsigned int i ;
u32 crc ;
puts ( " EEPROM: " ) ;
if ( read_eeprom ( ) ) {
if ( read_eeprom ( ) ) {
printf ( " Read failed. \n " ) ;
printf ( " Read failed. \n " ) ;
@ -395,31 +418,18 @@ int mac_read_from_eeprom(void)
}
}
if ( ! is_valid ) {
if ( ! is_valid ) {
printf ( " Invalid ID (%02x %02x %02x %02x) \n " , e . id [ 0 ] , e . id [ 1 ] , e . id [ 2 ] , e . id [ 3 ] ) ;
printf ( " Invalid ID (%02x %02x %02x %02x) \n " ,
e . id [ 0 ] , e . id [ 1 ] , e . id [ 2 ] , e . id [ 3 ] ) ;
return - 1 ;
return - 1 ;
}
}
if ( be32_to_cpu ( e . crc ) ! = 0xFFFFFFFF ) {
crc = crc32 ( 0 , ( void * ) & e , sizeof ( e ) - 4 ) ;
u32 crc = crc32 ( 0 , ( void * ) & e , sizeof ( e ) - 4 ) ;
if ( crc ! = be32_to_cpu ( e . crc ) ) {
printf ( " CRC mismatch (%08x != %08x) \n " , crc , be32_to_cpu ( e . crc ) ) ;
if ( crc ! = be32_to_cpu ( e . crc ) ) {
return - 1 ;
printf ( " CRC mismatch (%08x != %08x). \n " , crc ,
be32_to_cpu ( e . crc ) ) ;
return - 1 ;
}
}
/* Check the number of MAC addresses which is limited to
* MAX_NUM_PORTS .
*/
if ( e . mac_count > MAX_NUM_PORTS ) {
printf ( " Warning: The number of MAC addresses is greater "
" than %u, force it to %u. \n " , MAX_NUM_PORTS ,
MAX_NUM_PORTS ) ;
e . mac_count = MAX_NUM_PORTS ;
}
}
for ( i = 0 ; i < e . mac_count ; i + + ) {
for ( i = 0 ; i < min ( e . mac_count , MAX_NUM_PORTS ) ; i + + ) {
if ( memcmp ( & e . mac [ i ] , " \0 \0 \0 \0 \0 \0 " , 6 ) & &
if ( memcmp ( & e . mac [ i ] , " \0 \0 \0 \0 \0 \0 " , 6 ) & &
memcmp ( & e . mac [ i ] , " \xFF \xFF \xFF \xFF \xFF \xFF " , 6 ) ) {
memcmp ( & e . mac [ i ] , " \xFF \xFF \xFF \xFF \xFF \xFF " , 6 ) ) {
char ethaddr [ 18 ] ;
char ethaddr [ 18 ] ;
@ -441,6 +451,13 @@ int mac_read_from_eeprom(void)
}
}
}
}
# ifdef CONFIG_SYS_I2C_EEPROM_NXID
printf ( " %c%c%c%c v%u \n " , e . id [ 0 ] , e . id [ 1 ] , e . id [ 2 ] , e . id [ 3 ] ,
be32_to_cpu ( e . version ) ) ;
# else
printf ( " %c%c%c%c \n " , e . id [ 0 ] , e . id [ 1 ] , e . id [ 2 ] , e . id [ 3 ] ) ;
# endif
return 0 ;
return 0 ;
}
}