
spear600evb and spear300evb place ethaddr on a I2C memory. This patch cleans up reading of ethaddr
Signed-off-by: Vipin Kumar vipin.kumar@st.com --- board/st/spear/spear300evb.c | 5 ++++ board/st/spear/spear600evb.c | 7 ++++++ board/st/spear/spear_common.c | 55 +++++++++++++++++++++++++++---------------- 3 files changed, 47 insertions(+), 20 deletions(-)
diff --git a/board/st/spear/spear300evb.c b/board/st/spear/spear300evb.c index 2c7ccd6..46a5922 100644 --- a/board/st/spear/spear300evb.c +++ b/board/st/spear/spear300evb.c @@ -68,6 +68,11 @@ int board_eth_init(bd_t *bis)
#if defined(CONFIG_DESIGNWARE_ETH) u32 interface = PHY_INTERFACE_MODE_MII; +#if defined(CONFIG_SPEAR_MACID_IN_I2CMEM) + uchar mac_id[6]; + if (!eth_getenv_enetaddr("ethaddr", mac_id) && !i2c_read_mac(mac_id)) + eth_setenv_enetaddr("ethaddr", mac_id); +#endif if (designware_initialize(0, CONFIG_SPEAR_ETHBASE, CONFIG_DW0_PHY, interface) >= 0) ret++; diff --git a/board/st/spear/spear600evb.c b/board/st/spear/spear600evb.c index 61cea50..b5901e6 100644 --- a/board/st/spear/spear600evb.c +++ b/board/st/spear/spear600evb.c @@ -60,11 +60,18 @@ void board_nand_init() int board_eth_init(bd_t *bis) { int ret = 0; +#if defined(CONFIG_SPEAR_MACID_IN_I2CMEM) + uchar mac_id[6]; +#endif #if defined(CONFIG_DESIGNWARE_ETH) u32 interface = PHY_INTERFACE_MODE_MII; #if defined(CONFIG_DW_AUTONEG) interface = PHY_INTERFACE_MODE_GMII; #endif +#if defined(CONFIG_SPEAR_MACID_IN_I2CMEM) + if (!eth_getenv_enetaddr("ethaddr", mac_id) && !i2c_read_mac(mac_id)) + eth_setenv_enetaddr("ethaddr", mac_id); +#endif if (designware_initialize(0, CONFIG_SPEAR_ETHBASE, CONFIG_DW0_PHY, interface) >= 0) ret++; diff --git a/board/st/spear/spear_common.c b/board/st/spear/spear_common.c index c760229..71e9348 100644 --- a/board/st/spear/spear_common.c +++ b/board/st/spear/spear_common.c @@ -36,9 +36,6 @@
DECLARE_GLOBAL_DATA_PTR;
-#if defined(CONFIG_CMD_NET) -static int i2c_read_mac(uchar *buffer); -#endif void lowlevel_init(void) { } @@ -125,26 +122,33 @@ int spear_board_init(ulong mach_type) return 0; }
-#if defined(CONFIG_CMD_NET) -static int i2c_read_mac(uchar *buffer) +#if defined(CONFIG_SPEAR_MACID_IN_I2CMEM) && defined(CONFIG_CMD_NET) && \ + defined(CONFIG_CMD_I2C) +int i2c_read_mac(uchar *buffer) { u8 buf[2];
- i2c_read(CONFIG_I2C_CHIPADDRESS, MAGIC_OFF, 1, buf, MAGIC_LEN); + /* + * A magic ID which is present at offset 0 and reads 0x55AA represents + * whether MACID is present starting at offset 2 + */ + i2c_read(CONFIG_I2C_CHIPADDRESS, 0, 1, buf, 2);
/* Check if mac in i2c memory is valid */ - if ((buf[0] == MAGIC_BYTE0) && (buf[1] == MAGIC_BYTE1)) { + if ((buf[0] == 0x55) && (buf[1] == 0xAA)) { /* Valid mac address is saved in i2c eeprom */ - i2c_read(CONFIG_I2C_CHIPADDRESS, MAC_OFF, 1, buffer, MAC_LEN); + i2c_read(CONFIG_I2C_CHIPADDRESS, 0x2, 1, buffer, 6); return 0; }
return -1; }
-static int write_mac(uchar *mac) +static int i2c_write_mac(uchar *mac) { u8 buf[2]; + u8 temp[MAC_LEN]; + int i;
buf[0] = (u8)MAGIC_BYTE0; buf[1] = (u8)MAGIC_BYTE1; @@ -158,8 +162,15 @@ static int write_mac(uchar *mac) /* check if valid MAC address is saved in I2C EEPROM or not? */ if ((buf[0] == MAGIC_BYTE0) && (buf[1] == MAGIC_BYTE1)) { i2c_write(CONFIG_I2C_CHIPADDRESS, MAC_OFF, 1, mac, MAC_LEN); - puts("I2C EEPROM written with mac address \n"); - return 0; + + for (i = 0; i < MAC_LEN; i++) + temp[i] = ~mac[i]; + i2c_read(CONFIG_I2C_CHIPADDRESS, MAC_OFF, 1, temp, MAC_LEN); + + if (!memcmp(mac, temp, MAC_LEN)) { + puts("I2C EEPROM written with mac address\n"); + return 0; + } }
puts("I2C EEPROM writing failed\n"); @@ -171,7 +182,8 @@ int do_chip_config(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) { void (*sram_setfreq) (unsigned int, unsigned int); unsigned int frequency; -#if defined(CONFIG_CMD_NET) +#if defined(CONFIG_SPEAR_MACID_IN_I2CMEM) && defined(CONFIG_CMD_NET) && \ + defined(CONFIG_CMD_I2C) unsigned char mac[6]; #endif
@@ -199,7 +211,8 @@ int do_chip_config(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
return 0;
-#if defined(CONFIG_CMD_NET) +#if defined(CONFIG_SPEAR_MACID_IN_I2CMEM) && defined(CONFIG_CMD_NET) && \ + defined(CONFIG_CMD_I2C) } else if (!strcmp(argv[1], "ethaddr")) {
u32 reg; @@ -209,19 +222,18 @@ int do_chip_config(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) if (s) s = (*e) ? e + 1 : e; } - write_mac(mac); + i2c_write_mac(mac);
return 0; -#endif } else if (!strcmp(argv[1], "print")) { -#if defined(CONFIG_CMD_NET) if (!i2c_read_mac(mac)) { printf("Ethaddr (from i2c mem) = %pM\n", mac); } else { printf("Ethaddr (from i2c mem) = Not set\n"); } -#endif + return 0; +#endif }
return cmd_usage(cmdtp); @@ -229,8 +241,11 @@ int do_chip_config(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
U_BOOT_CMD(chip_config, 3, 1, do_chip_config, "configure chip", - "chip_config cpufreq/ddrfreq frequency\n" -#if defined(CONFIG_CMD_NET) + "chip_config cpufreq/ddrfreq frequency" +#if defined(CONFIG_SPEAR_MACID_IN_I2CMEM) && defined(CONFIG_CMD_NET) && \ + defined(CONFIG_CMD_I2C) + "\n" "chip_config ethaddr XX:XX:XX:XX:XX:XX\n" + "chip_config print" #endif - "chip_config print"); + "");