ARM: dts: stm32: Update eth1addr from EEPROM if eth1 present
authorMarek Vasut <marex@denx.de>
Thu, 30 Jul 2020 23:34:50 +0000 (01:34 +0200)
committerPatrice Chotard <patrice.chotard@st.com>
Thu, 13 Aug 2020 07:56:44 +0000 (09:56 +0200)
The STM32MP1 DHCOM has two ethernet interfaces, the on-SoM DWMAC and KS8851.
Set eth1addr for the KS8851 to a MAC address of the DWMAC incremented by 1.
The MAC of the DWMAC is set from on-SoM EEPROM already, but the MAC address
of KS8851 was left uninitialized, so fix this.

Signed-off-by: Marek Vasut <marex@denx.de>
Cc: Patrice Chotard <patrice.chotard@st.com>
Cc: Patrick Delaunay <patrick.delaunay@st.com>
Reviewed-by: Patrice Chotard <patrice.chotard@st.com>
arch/arm/dts/stm32mp15xx-dhcom-u-boot.dtsi
board/dhelectronics/dh_stm32mp1/board.c

index f96de9e..92345b7 100644 (file)
@@ -18,6 +18,7 @@
                mmc1 = &sdmmc2;
                spi0 = &qspi;
                usb0 = &usbotg_hs;
+               ethernet1 = &ksz8851;
        };
 
        config {
index eec51d2..c9abe3c 100644 (file)
@@ -84,11 +84,26 @@ DECLARE_GLOBAL_DATA_PTR;
 int setup_mac_address(void)
 {
        unsigned char enetaddr[6];
+       bool skip_eth0 = false;
+       bool skip_eth1 = false;
        struct udevice *dev;
        int off, ret;
 
        ret = eth_env_get_enetaddr("ethaddr", enetaddr);
        if (ret)        /* ethaddr is already set */
+               skip_eth0 = true;
+
+       off = fdt_path_offset(gd->fdt_blob, "ethernet1");
+       if (off < 0) {
+               /* ethernet1 is not present in the system */
+               skip_eth1 = true;
+       } else {
+               ret = eth_env_get_enetaddr("eth1addr", enetaddr);
+               if (ret)        /* eth1addr is already set */
+                       skip_eth1 = true;
+       }
+
+       if (skip_eth0 && skip_eth1)
                return 0;
 
        off = fdt_path_offset(gd->fdt_blob, "eeprom0");
@@ -109,8 +124,14 @@ int setup_mac_address(void)
                return ret;
        }
 
-       if (is_valid_ethaddr(enetaddr))
-               eth_env_set_enetaddr("ethaddr", enetaddr);
+       if (is_valid_ethaddr(enetaddr)) {
+               if (!skip_eth0)
+                       eth_env_set_enetaddr("ethaddr", enetaddr);
+
+               enetaddr[5]++;
+               if (!skip_eth1)
+                       eth_env_set_enetaddr("eth1addr", enetaddr);
+       }
 
        return 0;
 }