[U-Boot] [PATCH v2 2/5] sunxi: net: Allow the sunxi to set the MAC from an EEPROM
Joe Hershberger
joe.hershberger at gmail.com
Tue Jan 26 01:32:20 CET 2016
On Mon, Dec 14, 2015 at 6:41 AM, Olliver Schinagl
<o.schinagl at ultimaker.com> wrote:
> This patch uses the newly introduced Kconfig options to set the MAC
> address from an EEPROM, this will be especially useful for the Olimex
> OLinuXino series of sunxi boards as they all have an 2k i2c eeprom chip.
>
> The MAC address is in the eeprom is ignored if there is already a MAC
"The MAC address in the eeprom is ignored..."
> address in the environment or (if enabled) the CRC8 check fails.
>
> Signed-off-by: Olliver Schinagl <o.schinagl at ultimaker.com>
> ---
> board/sunxi/Kconfig | 4 ++++
> board/sunxi/board.c | 36 ++++++++++++++++++++++++++++++++++++
> net/Kconfig | 1 +
> 3 files changed, 41 insertions(+)
>
> diff --git a/board/sunxi/Kconfig b/board/sunxi/Kconfig
> index 2dd9d3b..a2da3a6 100644
> --- a/board/sunxi/Kconfig
> +++ b/board/sunxi/Kconfig
> @@ -339,18 +339,21 @@ config I2C0_ENABLE
>
> config I2C1_ENABLE
> bool "Enable I2C/TWI controller 1"
> + default y if (NET_ETHADDR_EEPROM_I2C_BUS = 1)
> default n
> ---help---
> See I2C0_ENABLE help text.
>
> config I2C2_ENABLE
> bool "Enable I2C/TWI controller 2"
> + default y if NET_ETHADDR_EEPROM_I2C_BUS = 2
> default n
> ---help---
> See I2C0_ENABLE help text.
>
> if MACH_SUN6I || MACH_SUN7I
> config I2C3_ENABLE
> + default y if NET_ETHADDR_EEPROM_I2C_BUS = 3
> bool "Enable I2C/TWI controller 3"
> default n
> ---help---
> @@ -359,6 +362,7 @@ endif
>
> if MACH_SUN7I
> config I2C4_ENABLE
> + default y if NET_ETHADDR_EEPROM_I2C_BUS = 4
> bool "Enable I2C/TWI controller 4"
> default n
> ---help---
> diff --git a/board/sunxi/board.c b/board/sunxi/board.c
> index 6ac398c..28310a2 100644
> --- a/board/sunxi/board.c
> +++ b/board/sunxi/board.c
> @@ -12,6 +12,7 @@
> */
>
> #include <common.h>
> +#include <i2c.h>
> #include <mmc.h>
> #include <axp_pmic.h>
> #include <asm/arch/clock.h>
> @@ -23,6 +24,7 @@
> #include <asm/arch/usb_phy.h>
> #include <asm/gpio.h>
> #include <asm/io.h>
> +#include <linux/crc8.h>
> #include <nand.h>
> #include <net.h>
>
> @@ -510,6 +512,37 @@ void get_board_serial(struct tag_serialnr *serialnr)
> }
> #endif
>
> +#if defined(CONFIG_NET_ETHADDR_EEPROM) && defined(CONFIG_NET_ETHADDR_EEPROM_I2C)
> +static int read_mac_from_eeprom(uint8_t *mac_addr)
> +{
> + uint8_t eeprom[7];
> + int old_i2c_bus;
> +
> + old_i2c_bus = i2c_get_bus_num();
> + i2c_set_bus_num(CONFIG_NET_ETHADDR_EEPROM_I2C_BUS);
> + if (i2c_read(CONFIG_NET_ETHADDR_EEPROM_I2C_ADDR,
> + CONFIG_NET_ETHADDR_EEPROM_OFFSET,
> + CONFIG_NET_ETHADDR_EEPROM_I2C_ADDRLEN,
> + eeprom, 7)) {
> + i2c_set_bus_num(old_i2c_bus);
> + puts("Could not read the EEPROM; EEPROM missing?\n");
> + return -1;
> + }
> + i2c_set_bus_num(old_i2c_bus);
> +#ifdef CONFIG_NET_ETHADDR_EEPROM_CRC8
> + if (crc8(eeprom, 6) != eeprom[6]) {
> + puts("CRC error on MAC address from EEPROM.\n");
> + return -1;
> + }
> +#endif
> + memcpy(mac_addr, eeprom, 6);
> +
> + return 0;
> +}
> +#else
> +static int read_mac_from_eeprom(uint8_t *mac_addr) { return -1; }
> +#endif
> +
> #if !defined(CONFIG_SPL_BUILD)
> #include <asm/arch/spl.h>
>
> @@ -553,6 +586,9 @@ int misc_init_r(void)
> }
> #endif
>
> + if ((!getenv("ethaddr")) && (!read_mac_from_eeprom(mac_addr)))
> + eth_setenv_enetaddr("ethaddr", mac_addr);
It seems a bit odd to actually write this to the environment instead
of it being a read_rom_hwaddr operation for the Ethernet driver that
this board uses.
Do we need a different board-level ROM callback? Maybe the drivers
used in such situations can be the only ones to support it.
> +
> ret = sunxi_get_sid(sid);
> if (ret == 0 && sid[0] != 0 && sid[3] != 0) {
> if (!getenv("ethaddr")) {
> diff --git a/net/Kconfig b/net/Kconfig
> index aced51e..0f4cc5a 100644
> --- a/net/Kconfig
> +++ b/net/Kconfig
> @@ -8,6 +8,7 @@ menuconfig NET
> if NET
>
> config NET_ETHADDR_EEPROM
> + depends on ARCH_SUNXI
> bool "Get ethaddr from eeprom"
> help
> Selecting this will try to get the Ethernet address from an onboard
> --
> 2.6.2
>
> _______________________________________________
> U-Boot mailing list
> U-Boot at lists.denx.de
> http://lists.denx.de/mailman/listinfo/u-boot
More information about the U-Boot
mailing list