[U-Boot] [PATCHv6 00/28] Retrieve MAC address from EEPROM
Olliver Schinagl
oliver at schinagl.nl
Mon May 15 08:02:16 UTC 2017
This patch-series introduces methods to retrieve the MAC address from an
onboard EEPROM. The series does a few small cleanups at the start, as either
I ran into them while doing this series and fixed them along the way or
actually depended on them.
A manufacturer wants to produce boards and may even have MAC addresses for
boards. Maintaining unique environments on a per-board basis however is
horrible. Also this data should be very persistent, and not easily deletable
by simply wiping the environment or device tree. Finally there are
chips available on the market with a pre-programmed MAC address chips
(proms)
that a board manufacturer wants to use. Because of this, the MAC needs to be
stored be able to read from such an 'external' source.
The current idea of the eeprom layout, is to skip the first 8 bytes, so that
other information can be stored there if needed, for example a header
with some magic to identify the EEPROM. Or equivalent purposes.
After those 8 bytes the MAC address follows the first macaddress. The
macaddress is appended by a CRC8 byte and then padded to make for nice 8 bytes.
Following the first macaddress one can store a second, or a third etc etc
macaddress.
The CRC8 is optional (via a define) but is strongly recommended to have. It
helps preventing user error and more importantly, checks if the bytes
read are actually a user inserted address. E.g. only writing 1 macaddress into
the eeprom but trying to consume 2.
These patches where tested on Olimex OLinuXino Lime1 (A10/A20), Lime2 (NAND
and eMMC) and A20-OLinuXino-MICRO-4G variants and have been in use
internally on our production systems since v2 of this patch set.
TODO in a follow up series:
* Replace the I2C specific read function to a generic function using
Maxime Ripard's EEPROM uclass once merged.
* Upgrade to use the EERPOM layout functionality as suggested by Igor Grinberg
* Add EEPROM/Mac commands suggested by York Sun
The series was initially based ontop of Joe's u-boot_net/next branches, but I
rebased it ontop of u-boot/master to get the latest sunxi changes, including:
sun7i: Add support for Olimex A20-OLinuXino-LIME2-eMMC
ARM: dts: sunxi: Change node name for pwrseq pin on Olinuxino-lime2-emmc
Which are on their way to being merged in master. So once those land into master
this all should apply cleanly. Sorry Joe!
=======
Changes since v5:
* Removed changes to eth_legacy as per Simon's request
* Adapted, improved and fixed the emac/gmac Kconfig conversion
* Renamed sunxi_[eg]mac to sun[47]_mac to be more clear and allowing preparing
to merge common parts into sunxi_common
* Added a few more MAC helpers
* Added PHY_GIGE as Kconfig symbol
Changes since v4:
* Some patches have been merged, so those are no longer included in the set.
* Reworked review comments
* Added the source of a MAC address
* Made sunxi-gmac a subclassed driver
* Switch sunxi-[eg]mac to Kconfig
* Drop the FDT injection code for now, this needs more thought/discussion
Changes since v3:
* Split off board specific stuff and only modify the generic functions
* Make reading of an eeprom available to every board. By default this is
unconfigure and thus should just fall through
* Clean some minor bits up (ARP_HLEN) and use it more generically
* Update the gen_ethaddr_crc as suggested by simon
* Let the fixup_ethernet from fdt_common insert mac addresses to the
environment
for unconfigured devices. There is a small caveat here however as
described
in the TODO above.
* Print the mac address that u-boot assigned to each device.
Changes since v2:
* Drop the id byte altogether and just mark it as reserved. The 'index'
can be
used to indicate the interface instead
* Addopt the read_rom_hwaddr hooks
* Renamed crc8 tool to gen_ethaddr_crc
* Improved the layout EEPROM example
* Made a function out of the hwaddress writing function in sunxi_emac so it
can be re-used as the write_hwaddr net_ops hook.
* No longer handle fdt parameters in board.c
Changes since v1:
* Do not CRC the id byte, move it just after the crc byte.
One of the reasons I decided to move it after the crc8 was mostly due to
mass
generation of MAC + CRC combo's where the ID is still unknown. Also not
crc-ing
the ID means that it is much easier for a user to change it (via the
u-boot i2c
cmd line or from within linux) without having to worry about the crc.
* Add a generator to convert a MAC address from the input to a MAC + CRC8 on
the output.
Emmanuel Vadot (1):
ARM: dts: sunxi: Change node name for pwrseq pin on
Olinuxino-lime2-emmc
Olliver Schinagl (27):
sun7i: Add support for Olimex A20-OLinuXino-LIME2-eMMC
net: core: Add PHY_GIGE as a Kconfig symbol
net: sunxi simplify defconfig
net: sunxi: Re-add RTL8211X_PHY_FORCE_MASTER
net: sunxi: Restore sunxi_[eg]mac behavior
net: sunxi: Move GMAC_TX_DELAY to the driver
net: cosmetic: Do not use magic values for ARP_HLEN
net: core: Sanitize get/set operations for enetaddr
net: core: Inform the user of the device MAC address
net: core: Add MAC address helper functions
net: Add ability to set MAC address via EEPROM
net: core: print the source of the MAC address
net: cosmetic: A MAC address is not limited to SROM
net: core: Check return value of read_rom_hwaddr
fdt: fixup_eth: Remove code duplication with a function
fdt: fixup_eth: improve error catching/reduce identation
arm: sunxi: Expose function to generate sunxi-specific a MAC address
net: sunxi_emac: Write HW address via net_ops hook
net: sunxi: Rename sunxi_emac to a more specific sun4i_mac
net: sunxi: Have sunxi common functions together
net: sun4i_mac: Add read_rom_hwaddr hook
net: sun7i_mac: Make the sun7i a dw driver subclass
net: dw: Expose designware_eth_start
net: sun7i_mac: Add read_rom_hwaddr hook
net: sun8i_gmac: Add read_rom_hwaddr hook
net: sun8i: fix whitespace
net: sunxi: Enable eeprom on OLinuXino Lime boards (again)
arch/arm/dts/sun7i-a20-olinuxino-lime2-emmc.dts | 2 +-
arch/arm/include/asm/arch-sunxi/sys_proto.h | 4 +-
arch/arm/mach-sunxi/Kconfig | 14 +-
arch/arm/mach-sunxi/board.c | 1 -
board/sunxi/MAINTAINERS | 5 +
board/sunxi/Makefile | 1 -
board/sunxi/board.c | 146 ++++++++-----
common/fdt_support.c | 33 ++-
configs/A10-OLinuXino-Lime_defconfig | 4 +-
configs/A20-OLinuXino-Lime2-eMMC_defconfig | 36 ++++
configs/A20-OLinuXino-Lime2_defconfig | 8 +-
configs/A20-OLinuXino-Lime_defconfig | 8 +-
configs/A20-OLinuXino_MICRO_defconfig | 8 +-
configs/A20-Olimex-SOM-EVB_defconfig | 4 +-
configs/Bananapi_defconfig | 3 +-
configs/Bananapro_defconfig | 3 +-
configs/CSQ_CS908_defconfig | 4 +-
configs/Colombus_defconfig | 3 +-
configs/Cubieboard2_defconfig | 4 +-
configs/Cubietruck_defconfig | 3 +-
configs/Hummingbird_A31_defconfig | 3 +-
configs/Itead_Ibox_A20_defconfig | 4 +-
configs/Lamobo_R1_defconfig | 3 +-
configs/Linksprite_pcDuino3_Nano_defconfig | 3 +-
configs/Linksprite_pcDuino3_defconfig | 4 +-
configs/Mele_A1000G_quad_defconfig | 4 +-
configs/Mele_I7_defconfig | 4 +-
configs/Mele_M3_defconfig | 4 +-
configs/Mele_M5_defconfig | 4 +-
configs/Mele_M9_defconfig | 4 +-
configs/Orangepi_defconfig | 3 +-
configs/Orangepi_mini_defconfig | 3 +-
configs/Sinlinx_SinA31s_defconfig | 4 +-
configs/Sinovoip_BPI_M2_defconfig | 3 +-
configs/Wits_Pro_A20_DKT_defconfig | 3 +-
configs/i12-tvbox_defconfig | 4 +-
configs/icnova-a20-swac_defconfig | 4 +-
configs/mixtile_loftq_defconfig | 3 +-
doc/README.enetaddr | 95 +++++++++
drivers/net/Kconfig | 76 +++++--
drivers/net/Makefile | 5 +-
drivers/net/designware.c | 3 +-
drivers/net/designware.h | 1 +
drivers/net/{sunxi_emac.c => sun4i_mac.c} | 267 +++++++++++++-----------
board/sunxi/gmac.c => drivers/net/sun7i_mac.c | 54 ++++-
drivers/net/sun8i_emac.c | 15 +-
drivers/net/sunxi_common.c | 33 +++
drivers/net/sunxi_common.h | 13 ++
include/configs/sunxi-common.h | 13 +-
include/net.h | 76 ++++++-
net/Kconfig | 59 ++++++
net/eth-uclass.c | 65 +++---
net/eth_common.c | 53 ++++-
net/eth_legacy.c | 4 +-
scripts/config_whitelist.txt | 2 -
55 files changed, 842 insertions(+), 350 deletions(-)
create mode 100644 configs/A20-OLinuXino-Lime2-eMMC_defconfig
rename drivers/net/{sunxi_emac.c => sun4i_mac.c} (59%)
rename board/sunxi/gmac.c => drivers/net/sun7i_mac.c (67%)
create mode 100644 drivers/net/sunxi_common.c
create mode 100644 drivers/net/sunxi_common.h
--
2.11.0
More information about the U-Boot
mailing list