
To reduce code duplication, let the stm32 based DH boards use the common code for setting up their mac addresses.
Signed-off-by: Philip Oberfichtner pro@denx.de
---
board/dhelectronics/dh_stm32mp1/board.c | 104 +++++++++++------------- 1 file changed, 47 insertions(+), 57 deletions(-)
diff --git a/board/dhelectronics/dh_stm32mp1/board.c b/board/dhelectronics/dh_stm32mp1/board.c index d407f0bf59..5d83d9cd3f 100644 --- a/board/dhelectronics/dh_stm32mp1/board.c +++ b/board/dhelectronics/dh_stm32mp1/board.c @@ -43,6 +43,7 @@ #include <usb/dwc2_udc.h> #include <watchdog.h> #include <dm/ofnode.h> +#include "../common/dh_common.h" #include "../../st/common/stpmic1.h"
/* SYSCFG registers */ @@ -90,35 +91,18 @@ DECLARE_GLOBAL_DATA_PTR; #define KS_CIDER 0xC0 #define CIDER_ID 0x8870
-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; +static bool dh_stm32_mac_is_in_ks8851(void) +{ + int off; + u32 reg, cider, ccr;
off = fdt_path_offset(gd->fdt_blob, "ethernet1"); - if (off < 0) { - /* ethernet1 is not present in the system */ - skip_eth1 = true; - goto out_set_ethaddr; - } + if (off < 0) + return false;
- ret = eth_env_get_enetaddr("eth1addr", enetaddr); - if (ret) { - /* eth1addr is already set */ - skip_eth1 = true; - goto out_set_ethaddr; - } - - ret = fdt_node_check_compatible(gd->fdt_blob, off, "micrel,ks8851-mll"); - if (ret) - goto out_set_ethaddr; + if (fdt_node_check_compatible(gd->fdt_blob, off, "micrel,ks8851-mll")) + return false;
/* * KS8851 with EEPROM may use custom MAC from EEPROM, read @@ -126,56 +110,62 @@ int setup_mac_address(void) * is present. If EEPROM is present, it must contain valid * MAC address. */ - u32 reg, cider, ccr; reg = fdt_get_base_address(gd->fdt_blob, off); if (!reg) - goto out_set_ethaddr; + return false;
writew(KS_BE0 | KS_BE1 | KS_CIDER, reg + 2); cider = readw(reg); - if ((cider & 0xfff0) != CIDER_ID) { - skip_eth1 = true; - goto out_set_ethaddr; - } + if ((cider & 0xfff0) != CIDER_ID) + return true;
writew(KS_BE0 | KS_BE1 | KS_CCR, reg + 2); ccr = readw(reg); - if (ccr & KS_CCR_EEPROM) { - skip_eth1 = true; - goto out_set_ethaddr; - } + if (ccr & KS_CCR_EEPROM) + return true; + + return false; +} + +static int dh_stm32_setup_ethaddr(void) +{ + unsigned char enetaddr[6];
-out_set_ethaddr: - if (skip_eth0 && skip_eth1) + if (dh_mac_is_in_env("ethaddr")) return 0;
- off = fdt_path_offset(gd->fdt_blob, "eeprom0"); - if (off < 0) { - printf("%s: No eeprom0 path offset\n", __func__); - return off; - } + if (!dh_get_mac_from_eeprom(enetaddr, "eeprom0")) + return eth_env_set_enetaddr("ethaddr", enetaddr);
- ret = uclass_get_device_by_of_offset(UCLASS_I2C_EEPROM, off, &dev); - if (ret) { - printf("Cannot find EEPROM!\n"); - return ret; - } + return -ENXIO; +}
- ret = i2c_eeprom_read(dev, 0xfa, enetaddr, 0x6); - if (ret) { - printf("Error reading configuration EEPROM!\n"); - return ret; - } +static int dh_stm32_setup_eth1addr(void) +{ + unsigned char enetaddr[6];
- if (is_valid_ethaddr(enetaddr)) { - if (!skip_eth0) - eth_env_set_enetaddr("ethaddr", enetaddr); + if (dh_mac_is_in_env("eth1addr")) + return 0; + + if (dh_stm32_mac_is_in_ks8851()) + return 0;
+ if (!dh_get_mac_from_eeprom(enetaddr, "eeprom0")) { enetaddr[5]++; - if (!skip_eth1) - eth_env_set_enetaddr("eth1addr", enetaddr); + return eth_env_set_enetaddr("eth1addr", enetaddr); }
+ return -ENXIO; +} + +int setup_mac_address(void) +{ + if (dh_stm32_setup_ethaddr()) + printf("%s: Unable to setup ethaddr!\n", __func__); + + if (dh_stm32_setup_eth1addr()) + printf("%s: Unable to setup eth1addr!\n", __func__); + return 0; }