svn commit: r295144 - head/sys/boot/efi/libefi
Emmanuel Vadot
manu at bidouilliste.com
Tue Feb 2 12:42:42 UTC 2016
I cannot netboot loader.efi anymore now.
Consoles: EFI console
Unable to open network interface 1
Unable to open network interface 2
...
panic: netboot: no interfaces left untried
Netboot loader.efi works before even if loading the kernel was really really slow.
On Tue, 2 Feb 2016 10:39:19 +0000 (UTC)
Andrew Turner <andrew at FreeBSD.org> wrote:
> Author: andrew
> Date: Tue Feb 2 10:39:18 2016
> New Revision: 295144
> URL: https://svnweb.freebsd.org/changeset/base/295144
>
> Log:
> Add suppor to loader.efi to load files off hte network. For this we need
> to open the device in exclusive mode as, without this, the firmware may
> also be reading packets off the interface leading to a race.
>
> Reviewed by: emaste
> Sponsored by: ABT Systems Ltd
> Differential Revision: https://reviews.freebsd.org/D4132
>
> Modified:
> head/sys/boot/efi/libefi/efinet.c
>
> Modified: head/sys/boot/efi/libefi/efinet.c
> ==============================================================================
> --- head/sys/boot/efi/libefi/efinet.c Tue Feb 2 10:32:45 2016 (r295143)
> +++ head/sys/boot/efi/libefi/efinet.c Tue Feb 2 10:39:18 2016 (r295144)
> @@ -184,11 +184,16 @@ efinet_init(struct iodesc *desc, void *m
> EFI_HANDLE h;
> EFI_STATUS status;
>
> + if (nif->nif_driver->netif_ifs[nif->nif_unit].dif_unit < 0) {
> + printf("Invalid network interface %d\n", nif->nif_unit);
> + return;
> + }
> +
> h = nif->nif_driver->netif_ifs[nif->nif_unit].dif_private;
> status = BS->HandleProtocol(h, &sn_guid, (VOID **)&nif->nif_devdata);
> if (status != EFI_SUCCESS) {
> - printf("net%d: cannot start interface (status=%ld)\n",
> - nif->nif_unit, (long)status);
> + printf("net%d: cannot start interface (status=%lu)\n",
> + nif->nif_unit, EFI_ERROR_CODE(status));
> return;
> }
>
> @@ -288,11 +293,30 @@ efinet_dev_init()
> stats = calloc(nifs, sizeof(struct netif_stats));
>
> for (i = 0; i < nifs; i++) {
> + EFI_SIMPLE_NETWORK *net;
> + EFI_HANDLE h;
> +
> dif = &efinetif.netif_ifs[i];
> + dif->dif_unit = -1;
> +
> + h = efi_find_handle(&efinet_dev, i);
> +
> + /*
> + * Open the network device in exclusive mode. Without this
> + * we will be racing with the UEFI network stack. It will
> + * pull packets off the network leading to lost packets.
> + */
> + status = BS->OpenProtocol(h, &sn_guid, (void **)&net,
> + IH, 0, EFI_OPEN_PROTOCOL_EXCLUSIVE);
> + if (status != EFI_SUCCESS) {
> + printf("Unable to open network interface %d\n", i);
> + continue;
> + }
> +
> dif->dif_unit = i;
> dif->dif_nsel = 1;
> dif->dif_stats = &stats[i];
> - dif->dif_private = efi_find_handle(&efinet_dev, i);
> + dif->dif_private = h;
> }
>
> return (0);
> _______________________________________________
> svn-src-head at freebsd.org mailing list
> https://lists.freebsd.org/mailman/listinfo/svn-src-head
> To unsubscribe, send any mail to "svn-src-head-unsubscribe at freebsd.org"
--
Emmanuel Vadot <manu at bidouilliste.com>
More information about the svn-src-all
mailing list