sunxi: ensure NanoPi R1 has unique MAC address

Ensure the MAC address for all NanoPi R1 boards is assigned uniquely for
each board.

The vendor ships the device in two variants; one with and one without
eMMC; but both without static mac-addresses.
In order to assign both board types unique MAC addresses, fall back on
the same method used for the NanoPi R2S and R4S in case the EEPROM
chip is not present by generating the board MAC from the SD card CID.

[0] https://wiki.friendlyelec.com/wiki/index.php/NanoPi_R1#Hardware_Spec

Similar too and based on:

commit b5675f500d ("rockchip: ensure NanoPi R4S has unique MAC address")

Co-authored-by: David Bauer <mail@david-bauer.net>
Signed-off-by: Jan-Niklas Burfeind <git@aiyionpri.me>
This commit is contained in:
Jan-Niklas Burfeind 2022-12-23 22:03:14 +01:00 committed by David Bauer
parent 5925401007
commit c7d3bbb909
3 changed files with 35 additions and 11 deletions

View File

@ -204,6 +204,14 @@ macaddr_add() {
echo $oui:$nic echo $oui:$nic
} }
macaddr_generate_from_mmc_cid() {
local mmc_dev=$1
local sd_hash=$(sha256sum /sys/class/block/$mmc_dev/device/cid)
local mac_base=$(macaddr_canonicalize "$(echo "${sd_hash}" | dd bs=1 count=12 2>/dev/null)")
echo "$(macaddr_unsetbit_mc "$(macaddr_setbit_la "${mac_base}")")"
}
macaddr_geteui() { macaddr_geteui() {
local mac=$1 local mac=$1
local sep=$2 local sep=$2

View File

@ -17,15 +17,6 @@ rockchip_setup_interfaces()
esac esac
} }
generate_mac_from_mmc_cid()
{
local mmc_dev=$1
local sd_hash=$(sha256sum /sys/class/block/$mmc_dev/device/cid)
local mac_base=$(macaddr_canonicalize "$(echo "${sd_hash}" | dd bs=1 count=12 2>/dev/null)")
echo "$(macaddr_unsetbit_mc "$(macaddr_setbit_la "${mac_base}")")"
}
nanopi_r4s_get_mac() nanopi_r4s_get_mac()
{ {
local interface=$1 local interface=$1
@ -38,7 +29,7 @@ nanopi_r4s_get_mac()
address=$(macaddr_setbit_la "$address") address=$(macaddr_setbit_la "$address")
fi fi
else else
address=$(generate_mac_from_mmc_cid mmcblk1) address=$(macaddr_generate_from_mmc_cid mmcblk1)
if [ "$interface" = "lan" ]; then if [ "$interface" = "lan" ]; then
address=$(macaddr_add "$address" 1) address=$(macaddr_add "$address" 1)
fi fi
@ -56,7 +47,7 @@ rockchip_setup_macs()
case "$board" in case "$board" in
friendlyarm,nanopi-r2s) friendlyarm,nanopi-r2s)
wan_mac=$(generate_mac_from_mmc_cid mmcblk0) wan_mac=$(macaddr_generate_from_mmc_cid mmcblk0)
lan_mac=$(macaddr_add "$wan_mac" 1) lan_mac=$(macaddr_add "$wan_mac" 1)
;; ;;
friendlyarm,nanopi-r4s) friendlyarm,nanopi-r4s)

View File

@ -29,6 +29,27 @@ sunxi_setup_interfaces()
esac esac
} }
nanopi_r1_get_mac()
{
local interface=$1
local eeprom_path="/sys/bus/i2c/devices/2-0051/eeprom"
local address
if [ -f "$eeprom_path" ]; then
address=$(get_mac_binary "$eeprom_path" 0xfa)
if [ "$interface" = "lan" ]; then
address=$(macaddr_setbit_la "$address")
fi
else
address=$(macaddr_generate_from_mmc_cid mmcblk1)
if [ "$interface" = "lan" ]; then
address=$(macaddr_add "$address" 1)
fi
fi
echo "$address"
}
sunxi_setup_macs() sunxi_setup_macs()
{ {
local board="$1" local board="$1"
@ -37,6 +58,10 @@ sunxi_setup_macs()
local label_mac="" local label_mac=""
case "$board" in case "$board" in
friendlyarm,nanopi-r1)
wan_mac=$(nanopi_r1_get_mac wan)
lan_mac=$(nanopi_r1_get_mac lan)
;;
friendlyarm,nanopi-r1s-h5) friendlyarm,nanopi-r1s-h5)
lan_mac=$(get_mac_binary "/sys/bus/i2c/devices/0-0051/eeprom" 0xfa) lan_mac=$(get_mac_binary "/sys/bus/i2c/devices/0-0051/eeprom" 0xfa)
;; ;;