[PATCH v3 4/4] ARM: stm32: DH: Use common MAC address functions

Patrick DELAUNAY patrick.delaunay at foss.st.com
Mon Jul 25 17:33:55 CEST 2022


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 at denx.de>
> Tested-by: Marek Vasut <marex at denx.de>
> Reviewed-by: Marek Vasut <marex at 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 at foss.st.com>

Thanks
Patrick




More information about the U-Boot mailing list