diff options
author | Sekhar Nori <nsekhar@ti.com> | 2009-04-05 18:20:49 +0530 |
---|---|---|
committer | Justin Waters <justin.waters@timesys.com> | 2009-09-09 14:03:23 -0400 |
commit | 93ba1364bcf9aa7c21fca29b1ef02fd7bbffae29 (patch) | |
tree | 30c9262476b51839cea9611dc834214b4b72d48e | |
parent | 781fac01dba5c71ba4dfc137c2d0c4f333ea1c57 (diff) |
U-Boot: implement reading MAC address from SPI flash
Signed-off-by: Sekhar Nori <nsekhar@ti.com>
-rw-r--r-- | board/da8xx/da8xx-evm/da850.c | 65 |
1 files changed, 46 insertions, 19 deletions
diff --git a/board/da8xx/da8xx-evm/da850.c b/board/da8xx/da8xx-evm/da850.c index 23aa6a2df0..7eceddf577 100644 --- a/board/da8xx/da8xx-evm/da850.c +++ b/board/da8xx/da8xx-evm/da850.c @@ -30,6 +30,10 @@ #include <common.h> #include <i2c.h> +#include <spi.h> +#include <spi_flash.h> +#include <net.h> +#include <asm/errno.h> #include <asm/arch/hardware.h> #include <asm/arch/emac_defs.h> @@ -189,32 +193,55 @@ int board_init(void) return(0); } +#define CFG_MAC_ADDR_SPI_BUS 0 +#define CFG_MAC_ADDR_SPI_CS 0 +#define CFG_MAC_ADDR_SPI_MAX_HZ 1000000 +#define CFG_MAC_ADDR_SPI_MODE SPI_MODE_3 + +#define CFG_MAC_ADDR_OFFSET (flash->size - SZ_4K) + +static int get_mac_addr(u8 *addr) +{ + int ret; + struct spi_flash *flash; + + flash = spi_flash_probe(CFG_MAC_ADDR_SPI_BUS, CFG_MAC_ADDR_SPI_CS, + CFG_MAC_ADDR_SPI_MAX_HZ, CFG_MAC_ADDR_SPI_MODE); + if (!flash) { + printf(" Error - unable to probe SPI flash.\n"); + goto err_probe; + } + + ret = spi_flash_read(flash, CFG_MAC_ADDR_OFFSET, 6, addr); + if (ret) { + printf("Error - unable to read MAC address from SPI flash.\n"); + goto err_read; + } + +err_read: + spi_flash_free(flash); +err_probe: + return ret; +} + int misc_init_r (void) { - u_int8_t tmp[20], buf[10]; - int i; + u_int8_t tmp[20], addr[10]; printf ("ARM Clock : %d Hz\n", clk_get(DAVINCI_ARM_CLKID)); - /* Set Ethernet MAC address from EEPROM */ - if (i2c_read(CONFIG_SYS_I2C_EEPROM_ADDR, 0x7f00, CONFIG_SYS_I2C_EEPROM_ADDR_LEN, buf, 6)) { - printf("\nEEPROM @ 0x%02x read FAILED!!!\n", CONFIG_SYS_I2C_EEPROM_ADDR); - } else { - tmp[0] = 0xff; - for (i = 0; i < 6; i++) - tmp[0] &= buf[i]; - - if ((tmp[0] != 0xff) && (getenv("ethaddr") == NULL)) { - sprintf((char *)&tmp[0], "%02x:%02x:%02x:%02x:%02x:%02x", - buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); - setenv("ethaddr", (char *)&tmp[0]); + if (getenv("ethaddr") == NULL) { + /* Set Ethernet MAC address from EEPROM */ + get_mac_addr(addr); + + if(is_multicast_ether_addr(addr) || is_zero_ether_addr(addr)) { + printf("Invalid MAC address read.\n"); + return -EINVAL; } - } + sprintf((char *)tmp, "%02x:%02x:%02x:%02x:%02x:%02x", addr[0], + addr[1], addr[2], addr[3], addr[4], addr[5]); - tmp[0] = 0x01; - tmp[1] = 0x23; - if(i2c_write(0x5f, 0, 0, tmp, 2)) { - printf("Ethernet switch start failed!\n"); + setenv("ethaddr", (char *)tmp); } if (!eth_hw_init()) { |