
Hi,
On 7/25/22 10:19, Philip Oberfichtner wrote:
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 Tested-by: Marek Vasut marex@denx.de Reviewed-by: Marek Vasut marex@denx.de
Changes in v3: - Reviewed by Marek
Changes in v2: - convert to livetree (rebase on commit 5a605b7c86152) - Tested-by Marek
board/dhelectronics/dh_stm32mp1/board.c | 102 +++++++++++------------- 1 file changed, 45 insertions(+), 57 deletions(-)
diff --git a/board/dhelectronics/dh_stm32mp1/board.c b/board/dhelectronics/dh_stm32mp1/board.c index 7a4c08cb7f..ab354e3e33 100644 --- a/board/dhelectronics/dh_stm32mp1/board.c +++ b/board/dhelectronics/dh_stm32mp1/board.c @@ -42,6 +42,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 */ @@ -84,36 +85,17 @@ #define KS_CIDER 0xC0 #define CIDER_ID 0x8870
-int setup_mac_address(void) +static bool dh_stm32_mac_is_in_ks8851(void) {
- unsigned char enetaddr[6];
- bool skip_eth0 = false;
- bool skip_eth1 = false;
- struct udevice *dev;
- int ret; ofnode node;
- ret = eth_env_get_enetaddr("ethaddr", enetaddr);
- if (ret) /* ethaddr is already set */
skip_eth0 = true;
u32 reg, cider, ccr;
node = ofnode_path("ethernet1");
- if (!ofnode_valid(node)) {
/* ethernet1 is not present in the system */
skip_eth1 = true;
goto out_set_ethaddr;
- }
- if (!ofnode_valid(node))
return false;
- ret = eth_env_get_enetaddr("eth1addr", enetaddr);
- if (ret) {
/* eth1addr is already set */
skip_eth1 = true;
goto out_set_ethaddr;
- }
- ret = ofnode_device_is_compatible(node, "micrel,ks8851-mll");
- if (ret)
goto out_set_ethaddr;
if (ofnode_device_is_compatible(node, "micrel,ks8851-mll"))
return false;
/*
- KS8851 with EEPROM may use custom MAC from EEPROM, read
@@ -121,56 +103,62 @@ int setup_mac_address(void) * is present. If EEPROM is present, it must contain valid * MAC address. */
- u32 reg, cider, ccr; reg = ofnode_get_addr(node); 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;
+}
-out_set_ethaddr:
- if (skip_eth0 && skip_eth1)
+static int dh_stm32_setup_ethaddr(void) +{
- unsigned char enetaddr[6];
- if (dh_mac_is_in_env("ethaddr")) return 0;
- node = ofnode_path("eeprom0");
- if (!ofnode_valid(node)) {
printf("%s: No eeprom0 path offset\n", __func__);
return -ENOENT;
- }
- if (!dh_get_mac_from_eeprom(enetaddr, "eeprom0"))
return eth_env_set_enetaddr("ethaddr", enetaddr);
- ret = uclass_get_device_by_ofnode(UCLASS_I2C_EEPROM, node, &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; }
Minor remarks on the last function:
the 2 'printf' calls can be replaced by log_error() call (or log_debug ?)
to correctly handle this trace with CONFIG_LOG_LEVEL
=> printf should avoid except in command result to handle log features during initialization
Anyway
Reviewed-by: Patrick Delaunay patrick.delaunay@foss.st.com
Thanks Patrick