
Call [dis]connect_controller for the efi_net_objs corresponding to U-Boot udevices
Signed-off-by: Adriano Cordova adriano.cordova@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;