[PATCH 11/21] efi_loader: efi_net: Manage EFI net objects with efi_[dis]connect_controller

Adriano Cordova adrianox at gmail.com
Wed Jan 22 18:08:48 CET 2025


Call [dis]connect_controller for the efi_net_objs corresponding to U-Boot udevices

Signed-off-by: Adriano Cordova <adriano.cordova at canonical.com>
---
 include/efi_loader.h            |  2 +-
 lib/efi_driver/efi_net_device.c |  2 +-
 lib/efi_loader/efi_net.c        | 38 ++++++++++++++++++++-------------
 3 files changed, 25 insertions(+), 17 deletions(-)

diff --git a/include/efi_loader.h b/include/efi_loader.h
index 09a9f75e19..93f223389a 100644
--- a/include/efi_loader.h
+++ b/include/efi_loader.h
@@ -638,7 +638,7 @@ efi_status_t efi_gop_register(void);
 int efi_net_register(void *ctx, struct event *event);
 /* Called to unregister an EFI network device */
 int efi_net_unregister(void *ctx, struct event *event);
-/* Called to initialized registered network devices */
+/* Called to initialized registered EFI network devices */
 efi_status_t efi_net_init(void);
 efi_status_t efi_net_do_start(void);
 /* Called by efi_net_register to make the ip4 config2 protocol available */
diff --git a/lib/efi_driver/efi_net_device.c b/lib/efi_driver/efi_net_device.c
index 64a443d074..298eded265 100644
--- a/lib/efi_driver/efi_net_device.c
+++ b/lib/efi_driver/efi_net_device.c
@@ -26,7 +26,7 @@ static efi_status_t efi_net_bind_drv(
 {
 	EFI_PRINT("%s: handle %p, interface %p\n", __func__, handle, interface);
 
-	return EFI_UNSUPPORTED;
+	return EFI_SUCCESS;
 }
 
 /**
diff --git a/lib/efi_loader/efi_net.c b/lib/efi_loader/efi_net.c
index 98b9c8b82e..b5284ffe34 100644
--- a/lib/efi_loader/efi_net.c
+++ b/lib/efi_loader/efi_net.c
@@ -1117,7 +1117,7 @@ efi_status_t efi_net_do_start(void)
 	int i, r;
 
 	for (i = 0; i < MAX_EFI_NET_OBJS; i++) {
-		if (net_objs[i]) {
+		if (net_objs[i] && net_objs[i]->dev) {
 			r = efi_netobj_start(net_objs[i]);
 			if (r)
 				return EFI_DEVICE_ERROR;
@@ -1142,19 +1142,10 @@ static int efi_netobj_init(struct efi_net_obj *netobj)
 	size_t *receive_lengths;
 	int i, j;
 
-	if (!netobj || efi_netobj_is_active(netobj))
+	if (!netobj || !netobj->net || efi_netobj_is_active(netobj))
 		return 0;
 
 	dev = netobj->dev;
-	if (!dev) {
-		/* No network device active, don't expose any */
-		return 0;
-	}
-
-	if (!netobj->net)
-		netobj->net = calloc(1, sizeof(*netobj->net));
-	if (!netobj->net)
-		goto out_of_resources;
 
 	if (!netobj->net_mode)
 		netobj->net_mode = calloc(1, sizeof(*netobj->net_mode));
@@ -1199,7 +1190,7 @@ static int efi_netobj_init(struct efi_net_obj *netobj)
 
 	/* Fill in object data */
 	r = efi_add_protocol(netobj->handle, &efi_net_guid,
-			     netobj->net);
+			netobj->net);
 	if (r != EFI_SUCCESS)
 		goto failure_to_add_protocol;
 
@@ -1247,12 +1238,16 @@ static int efi_netobj_init(struct efi_net_obj *netobj)
 	netobj->pxe.set_packets = efi_pxe_base_code_set_packets;
 	netobj->pxe.mode = &netobj->pxe_mode;
 
+	ret = EFI_CALL(efi_connect_controller(net_objs[i]->handle, NULL, NULL, 0));
+	if (ret != EFI_SUCCESS)
+		return -1;
+
 	/*
 	 * Scan dhcp entries for one corresponding
 	 * to this udevice, from newest to oldest
 	 */
 	i = (next_dhcp_entry + MAX_NUM_DHCP_ENTRIES - 1) % MAX_NUM_DHCP_ENTRIES;
-	for (j = 0; dhcp_cache[i].is_valid && j < MAX_NUM_DHCP_ENTRIES;
+	for (j = 0; dev && dhcp_cache[i].is_valid && j < MAX_NUM_DHCP_ENTRIES;
 	     i = (i + MAX_NUM_DHCP_ENTRIES - 1) % MAX_NUM_DHCP_ENTRIES, j++) {
 		if (dev == dhcp_cache[i].dev) {
 			netobj->pxe_mode.dhcp_ack = *dhcp_cache[i].dhcp_ack;
@@ -1304,7 +1299,6 @@ static int efi_netobj_init(struct efi_net_obj *netobj)
 	if (r != EFI_SUCCESS)
 		goto failure_to_add_protocol;
 #endif
-	printf("efi_net init device number %d\n", netobj->efi_seq_num);
 	return 0;
 failure_to_add_protocol:
 	printf("ERROR: Failure to add protocol\n");
@@ -1322,6 +1316,7 @@ out_of_resources:
 efi_status_t efi_net_init(void)
 {
 	int i, r;
+	efi_status_t ret;
 
 	for (i = 0; i < MAX_EFI_NET_OBJS; i++) {
 		if (net_objs[i]) {
@@ -1429,7 +1424,8 @@ int efi_net_register(void *ctx, struct event *event)
 	struct udevice *dev;
 	enum uclass_id id;
 	struct efi_net_obj *netobj;
-	int i;
+	efi_status_t ret;
+	int i, r;
 
 	dev = event->data.dm.dev;
 	if (!dev) {
@@ -1453,6 +1449,14 @@ int efi_net_register(void *ctx, struct event *event)
 	if (!netobj)
 		return -1;
 
+	if (efi_obj_list_initialized == EFI_SUCCESS) {
+		if (!efi_netobj_is_active(netobj)) {
+			r = efi_netobj_init(netobj);
+			if (r)
+				return -1;
+		}
+	}
+
 	return 0;
 }
 
@@ -1496,6 +1500,10 @@ int efi_net_unregister(void *ctx, struct event *event)
 		return 0;
 
 	if (efi_netobj_is_active(netobj)) {
+		ret = EFI_CALL(efi_disconnect_controller(netobj->handle, NULL, NULL));
+		if (ret != EFI_SUCCESS)
+			return -1;
+
 		ret = EFI_CALL(efi_close_event(netobj->wait_for_packet));
 		if (ret != EFI_SUCCESS)
 			return -1;
-- 
2.43.0



More information about the U-Boot mailing list