diff --git a/stand/common/dev_net.c b/stand/common/dev_net.c index aecb5bcde81c..3c13ad99ec5a 100644 --- a/stand/common/dev_net.c +++ b/stand/common/dev_net.c @@ -176,21 +176,42 @@ net_open(struct open_file *f, ...) int net_configure(struct devdesc *dev) { - int error, sock; + int error; - sock = netif_open(dev); - if (sock < 0) + if (netdev_sock >= 0) + return (0); + + netdev_sock = netif_open(dev); + if (netdev_sock < 0) return (ENXIO); error = 0; if (rootip.s_addr == 0) - error = net_getparams(sock); + error = net_getparams(netdev_sock); if (error == 0) - net_setparams(sock); - netif_close(sock); + net_setparams(netdev_sock); + if (error != 0) { + netif_close(netdev_sock); + netdev_sock = -1; + return (error); + } + + netdev_name = strdup(dev->d_dev->dv_name); + if (netdev_name == NULL) { + netif_close(netdev_sock); + netdev_sock = -1; + return (ENOMEM); + } return (error); } +void +net_deconfigure(void) +{ + + net_cleanup(); +} + static int net_close(struct open_file *f) { diff --git a/stand/common/dev_net.h b/stand/common/dev_net.h index 5cf6652c96af..a216f745e219 100644 --- a/stand/common/dev_net.h +++ b/stand/common/dev_net.h @@ -30,6 +30,7 @@ extern struct devsw netdev; int net_configure(struct devdesc *); +void net_deconfigure(void); uint32_t net_parse_rootpath(void); #endif diff --git a/stand/efi/loader/memdisk.c b/stand/efi/loader/memdisk.c index 8990f9393e85..6a4fb5b31f45 100644 --- a/stand/efi/loader/memdisk.c +++ b/stand/efi/loader/memdisk.c @@ -245,6 +245,8 @@ maybe_download_initmd(void) if (url == NULL || *url == '\0') return; + /* Release SNP so the firmware network stack can fetch the image. */ + net_deconfigure(); printf("Downloading initmd from %s\n", url); error = download_md_image(url); if (error != 0 && error != ECANCELED)