[U-Boot] [PATCH] net: eth-uclass: ignore unavailable devices

Alexandru Marginean alexm.osslist at gmail.com
Sun Dec 1 00:55:31 UTC 2019


Hi Michael,

On 10/22/2019 1:03 AM, Michael Walle wrote:
> device_probe() may fail in which case the seq_id will be -1. Don't
> display these devices during startup. While this is only a cosmetic
> change, the return value of eth_initialize() will also change to the
> actual number of available devices. The return value is only used in
> spl_net to decide whether there are any devices to boot from. So
> returning only available devices is also more correct in that case.
> 
> Signed-off-by: Michael Walle <michael at walle.cc>
> ---
>   net/eth-uclass.c | 17 +++++++++++------
>   1 file changed, 11 insertions(+), 6 deletions(-)
> 
> diff --git a/net/eth-uclass.c b/net/eth-uclass.c
> index 3bd98b01ad..acd59216e3 100644
> --- a/net/eth-uclass.c
> +++ b/net/eth-uclass.c
> @@ -420,20 +420,25 @@ int eth_initialize(void)
>   
>   		bootstage_mark(BOOTSTAGE_ID_NET_ETH_INIT);
>   		do {
> -			if (num_devices)
> -				printf(", ");
> +			if (dev->seq != -1) {
> +				if (num_devices)
> +					printf(", ");
>   
> -			printf("eth%d: %s", dev->seq, dev->name);
> +				printf("eth%d: %s", dev->seq, dev->name);
>   
> -			if (ethprime && dev == prime_dev)
> -				printf(" [PRIME]");
> +				if (ethprime && dev == prime_dev)
> +					printf(" [PRIME]");
> +			}
>   
>   			eth_write_hwaddr(dev);
>   
> +			if (dev->seq != -1)
> +				num_devices++;
>   			uclass_next_device_check(&dev);
> -			num_devices++;
>   		} while (dev);
>   
> +		if (!num_devices)
> +			printf("No ethernet found.\n");
>   		putc('\n');
>   	}
>   
> 

What would you say about something like this instead?  It's a bit more 
compact and should be functionally equivalent:

  net/eth-uclass.c | 54 ++++++++++++++++++++++--------------------------
  1 file changed, 25 insertions(+), 29 deletions(-)

diff --git a/net/eth-uclass.c b/net/eth-uclass.c
index 1bc8947749..4d4eaeb371 100644
--- a/net/eth-uclass.c
+++ b/net/eth-uclass.c
@@ -390,10 +390,16 @@ int eth_rx(void)

  int eth_initialize(void)
  {
+	struct udevice *dev, *prime_dev = NULL;
+	char *ethprime = env_get("ethprime");
  	int num_devices = 0;
-	struct udevice *dev;
+	struct uclass *uc;

  	eth_common_init();
+	eth_set_dev(NULL);
+
+	if (ethprime)
+		prime_dev = eth_get_dev_by_name(ethprime);

  	/*
  	 * Devices need to write the hwaddr even if not started so that Linux
@@ -401,40 +407,30 @@ int eth_initialize(void)
  	 * This is accomplished by attempting to probe each device and calling
  	 * their write_hwaddr() operation.
  	 */
-	uclass_first_device_check(UCLASS_ETH, &dev);
-	if (!dev) {
-		printf("No ethernet found.\n");
-		bootstage_error(BOOTSTAGE_ID_NET_ETH_START);
-	} else {
-		char *ethprime = env_get("ethprime");
-		struct udevice *prime_dev = NULL;
+	uclass_get(UCLASS_ETH, &uc);
+	uclass_foreach_dev(dev, uc) {
+		if (device_probe(dev))
+			continue;
+
+		eth_write_hwaddr(dev);
+
+		if (num_devices)
+			printf(", ");
+		printf("eth%d: %s", dev->seq, dev->name);

-		if (ethprime)
-			prime_dev = eth_get_dev_by_name(ethprime);
-		if (prime_dev) {
+		if (dev == prime_dev) {
  			eth_set_dev(prime_dev);
  			eth_current_changed();
-		} else {
-			eth_set_dev(NULL);
+			printf(" [PRIME]");
  		}
+		num_devices++;
+	}

+	if (!num_devices) {
+		bootstage_error(BOOTSTAGE_ID_NET_ETH_START);
+		printf("No ethernet found.\n");
+	} else {
  		bootstage_mark(BOOTSTAGE_ID_NET_ETH_INIT);
-		do {
-			if (device_active(dev)) {
-				if (num_devices)
-					printf(", ");
-
-				printf("eth%d: %s", dev->seq, dev->name);
-
-				if (ethprime && dev == prime_dev)
-					printf(" [PRIME]");
-				eth_write_hwaddr(dev);
-			}
-
-			uclass_next_device_check(&dev);
-			num_devices++;
-		} while (dev);
-
  		putc('\n');
  	}

Alex


More information about the U-Boot mailing list