[efi] Add an EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL interface
authorMichael Brown <mcb30@etherboot.org>
Mon, 12 Jan 2009 05:22:40 +0000 (05:22 +0000)
committerMichael Brown <mcb30@etherboot.org>
Mon, 12 Jan 2009 19:11:30 +0000 (19:11 +0000)
This allegedly optional interface seems to be compulsory if you want
EFI's PXE code to bother trying to use your network interface.

src/include/gpxe/efi/Protocol/NetworkInterfaceIdentifier.h [new file with mode: 0644]
src/interface/efi/efi_snp.c

diff --git a/src/include/gpxe/efi/Protocol/NetworkInterfaceIdentifier.h b/src/include/gpxe/efi/Protocol/NetworkInterfaceIdentifier.h
new file mode 100644 (file)
index 0000000..e99ec38
--- /dev/null
@@ -0,0 +1,74 @@
+/** @file
+  EFI Network Interface Identifier Protocol
+
+  Copyright (c) 2006 - 2008, Intel Corporation
+  All rights reserved. This program and the accompanying materials
+  are licensed and made available under the terms and conditions of the BSD License
+  which accompanies this distribution.  The full text of the license may be found at
+  http://opensource.org/licenses/bsd-license.php
+
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+
+**/
+
+#ifndef __EFI_NETWORK_INTERFACE_IDENTIFER_H__
+#define __EFI_NETWORK_INTERFACE_IDENTIFER_H__
+
+
+#define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_GUID \
+  { \
+    0xE18541CD, 0xF755, 0x4f73, {0x92, 0x8D, 0x64, 0x3C, 0x8A, 0x79, 0xB2, 0x29 } \
+  }
+
+#define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION    0x00010000
+
+///
+/// Revision defined in EFI1.1.
+///
+#define EFI_NETWORK_INTERFACE_IDENTIFIER_INTERFACE_REVISION   EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION
+
+///
+/// Forward reference for pure ANSI compatability
+///
+typedef struct _EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL  EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL;
+
+///
+/// Protocol defined in EFI1.1.
+///
+typedef EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL   EFI_NETWORK_INTERFACE_IDENTIFIER_INTERFACE;
+
+typedef enum {
+  EfiNetworkInterfaceUndi = 1
+} EFI_NETWORK_PROTOCOL_TYPE;
+
+///
+/// An optional protocol that is used to describe details about the software
+/// layer that is used to produce the Simple Network Protocol.
+///
+struct _EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL {
+  UINT64    Revision;   ///< The revision of the EFI_NETWORK_INTERFACE_IDENTIFIER protocol.
+  UINT64    ID;         ///< Address of the first byte of the identifying structure for this network
+                        ///< interface. This is only valid when the network interface is started
+                        ///< (see Start()). When the network interface is not started, this field is set to zero.
+  UINT64    ImageAddr;  ///< Address of the first byte of the identifying structure for this
+                        ///< network interface.  This is set to zero if there is no structure.
+  UINT32    ImageSize;  ///< Size of unrelocated network interface image.
+  CHAR8     StringId[4];///< A four-character ASCII string that is sent in the class identifier field of
+                        ///< option 60 in DHCP. For a Type of EfiNetworkInterfaceUndi, this field is UNDI.
+  UINT8     Type;       ///< Network interface type. This will be set to one of the values
+                        ///< in EFI_NETWORK_INTERFACE_TYPE.
+  UINT8     MajorVer;   ///< Major version number.
+  UINT8     MinorVer;   ///< Minor version number.
+  BOOLEAN   Ipv6Supported; ///< TRUE if the network interface supports IPv6; otherwise FALSE.
+  UINT8     IfNum;      ///< The network interface number that is being identified by this Network
+                        ///< Interface Identifier Protocol. This field must be less than or equal
+                        ///< to the IFcnt field in the !PXE structure.
+
+};
+
+extern EFI_GUID gEfiNetworkInterfaceIdentifierProtocolGuid;
+extern EFI_GUID gEfiNetworkInterfaceIdentifierProtocolGuid_31;
+
+#endif // _EFI_NII_H
index 9f92666..a3eace3 100644 (file)
@@ -30,6 +30,7 @@
 #include <gpxe/efi/Protocol/PciIo.h>
 #include <gpxe/efi/Protocol/SimpleNetwork.h>
 #include <gpxe/efi/Protocol/ComponentName2.h>
+#include <gpxe/efi/Protocol/NetworkInterfaceIdentifier.h>
 #include <config/general.h>
 
 /** @file
@@ -62,6 +63,8 @@ struct efi_snp_device {
        unsigned int rx_count_interrupts;
        /** Outstanding RX packet count (via WaitForPacket event) */
        unsigned int rx_count_events;
+       /** The network interface identifier */
+       EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL nii;
        /** Device name */
        wchar_t name[ sizeof ( ( ( struct net_device * ) NULL )->name ) ];
        /** The device path
@@ -88,6 +91,18 @@ static EFI_GUID efi_component_name2_protocol_guid
 static EFI_GUID efi_device_path_protocol_guid
        = EFI_DEVICE_PATH_PROTOCOL_GUID;
 
+/** Efi network interface identifier GUID */
+static EFI_GUID efi_nii_protocol_guid = {
+       /* No, this isn't the GUID defined as
+        * EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_GUID in
+        * Protocol/NetworkInterfaceIdentifier.h.  That GUID gets
+        * ignored by the EFI network stack.  You have to use this one
+        * instead.
+        */
+       0x1ACED566, 0x76ED, 0x4218,
+       { 0xBC, 0x81, 0x76, 0x7F, 0x1F, 0x97, 0x7A, 0x89 }
+};
+
 /** EFI PCI I/O protocol GUID */
 static EFI_GUID efi_pci_io_protocol_guid
        = EFI_PCI_IO_PROTOCOL_GUID;
@@ -936,6 +951,12 @@ efi_snp_driver_start ( EFI_DRIVER_BINDING_PROTOCOL *driver,
        snpdev->mode.State = EfiSimpleNetworkStopped;
        efi_snp_set_mode ( snpdev );
 
+       /* Populate the NII structure */
+       snpdev->nii.Revision =
+               EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION;
+       strncpy ( snpdev->nii.StringId, "gPXE",
+                 sizeof ( snpdev->nii.StringId ) );
+
        /* Populate the device name */
        for ( i = 0 ; i < sizeof ( netdev->name ) ; i++ ) {
                /* Damn Unicode names */
@@ -965,6 +986,7 @@ efi_snp_driver_start ( EFI_DRIVER_BINDING_PROTOCOL *driver,
                        &snpdev->handle,
                        &efi_simple_network_protocol_guid, &snpdev->snp,
                        &efi_device_path_protocol_guid, &snpdev->path,
+                       &efi_nii_protocol_guid, &snpdev->nii,
                        NULL ) ) != 0 ) {
                DBGC ( snpdev, "SNPDEV %p could not install protocols: "
                       "%s\n", snpdev, efi_strerror ( efirc ) );
@@ -979,6 +1001,7 @@ efi_snp_driver_start ( EFI_DRIVER_BINDING_PROTOCOL *driver,
                        snpdev->handle,
                        &efi_simple_network_protocol_guid, &snpdev->snp,
                        &efi_device_path_protocol_guid, &snpdev->path,
+                       &efi_nii_protocol_guid, &snpdev->nii,
                        NULL );
  err_install_protocol_interface:
        bs->CloseEvent ( snpdev->snp.WaitForPacket );
@@ -1027,6 +1050,7 @@ efi_snp_driver_stop ( EFI_DRIVER_BINDING_PROTOCOL *driver,
                        snpdev->handle,
                        &efi_simple_network_protocol_guid, &snpdev->snp,
                        &efi_device_path_protocol_guid, &snpdev->path,
+                       &efi_nii_protocol_guid, &snpdev->nii,
                        NULL );
        bs->CloseEvent ( snpdev->snp.WaitForPacket );
        netdev_put ( snpdev->netdev );