svn commit: r349201 - head/stand/efi/libefi

Rebecca Cran bcran at FreeBSD.org
Wed Jun 19 18:47:45 UTC 2019


Author: bcran
Date: Wed Jun 19 18:47:44 2019
New Revision: 349201
URL: https://svnweb.freebsd.org/changeset/base/349201

Log:
  efinet: Defer exclusively opening the network handles
  
  Don't commit to exclusive access to the network device handle by
  efinet until the loader has decided to load something through the
  network. This allows for the possibility of other users of the
  network device.
  
  Submitted by:	scottph
  Reviewed by:	tsoome, emaste
  Tested by: 	tsoome, bcran
  Differential Revision:	https://reviews.freebsd.org/D20642

Modified:
  head/stand/efi/libefi/efinet.c

Modified: head/stand/efi/libefi/efinet.c
==============================================================================
--- head/stand/efi/libefi/efinet.c	Wed Jun 19 16:44:07 2019	(r349200)
+++ head/stand/efi/libefi/efinet.c	Wed Jun 19 18:47:44 2019	(r349201)
@@ -108,7 +108,25 @@ efinet_match(struct netif *nif, void *machdep_hint)
 static int
 efinet_probe(struct netif *nif, void *machdep_hint)
 {
+	EFI_SIMPLE_NETWORK *net;
+	EFI_HANDLE h;
+	EFI_STATUS status;
 
+	h = nif->nif_driver->netif_ifs[nif->nif_unit].dif_private;
+	/*
+	 * 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, NULL, EFI_OPEN_PROTOCOL_EXCLUSIVE);
+	if (status != EFI_SUCCESS) {
+		printf("Unable to open network interface %d for "
+		    "exclusive access: %lu\n", nif->nif_unit,
+		    EFI_ERROR_CODE(status));
+		return (efi_status_to_errno(status));
+	}
+
 	return (0);
 }
 
@@ -269,7 +287,6 @@ efinet_dev_init()
 	struct netif_dif *dif;
 	struct netif_stats *stats;
 	EFI_DEVICE_PATH *devpath, *node;
-	EFI_SIMPLE_NETWORK *net;
 	EFI_HANDLE *handles, *handles2;
 	EFI_STATUS status;
 	UINTN sz;
@@ -304,19 +321,6 @@ efinet_dev_init()
 		if (DevicePathType(node) != MESSAGING_DEVICE_PATH ||
 		    DevicePathSubType(node) != MSG_MAC_ADDR_DP)
 			continue;
-
-		/*
-		 * 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(handles[i], &sn_guid, (void **)&net,
-		    IH, NULL, EFI_OPEN_PROTOCOL_EXCLUSIVE);
-		if (status != EFI_SUCCESS) {
-			printf("Unable to open network interface %d for "
-			    "exclusive access: %lu\n", i,
-			    EFI_ERROR_CODE(status));
-		}
 
 		handles2[nifs] = handles[i];
 		nifs++;


More information about the svn-src-all mailing list