Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[efi] Add an EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL interface
This allegedly optional interface seems to be compulsory if you want
EFI's PXE code to bother trying to use your network interface.
  • Loading branch information
Michael Brown committed Jan 12, 2009
1 parent cced04e commit aa86afe
Show file tree
Hide file tree
Showing 2 changed files with 98 additions and 0 deletions.
74 changes: 74 additions & 0 deletions src/include/gpxe/efi/Protocol/NetworkInterfaceIdentifier.h
@@ -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
24 changes: 24 additions & 0 deletions src/interface/efi/efi_snp.c
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand All @@ -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;
Expand Down Expand Up @@ -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 */
Expand Down Expand Up @@ -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 ) );
Expand All @@ -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 );
Expand Down Expand Up @@ -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 );
Expand Down

0 comments on commit aa86afe

Please sign in to comment.