Browse Source

[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.
tags/v0.9.7
Michael Brown 15 years ago
parent
commit
aa86afe890

+ 74
- 0
src/include/gpxe/efi/Protocol/NetworkInterfaceIdentifier.h View File

1
+/** @file
2
+  EFI Network Interface Identifier Protocol
3
+
4
+  Copyright (c) 2006 - 2008, Intel Corporation
5
+  All rights reserved. This program and the accompanying materials
6
+  are licensed and made available under the terms and conditions of the BSD License
7
+  which accompanies this distribution.  The full text of the license may be found at
8
+  http://opensource.org/licenses/bsd-license.php
9
+
10
+  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11
+  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
+
13
+
14
+**/
15
+
16
+#ifndef __EFI_NETWORK_INTERFACE_IDENTIFER_H__
17
+#define __EFI_NETWORK_INTERFACE_IDENTIFER_H__
18
+
19
+
20
+#define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_GUID \
21
+  { \
22
+    0xE18541CD, 0xF755, 0x4f73, {0x92, 0x8D, 0x64, 0x3C, 0x8A, 0x79, 0xB2, 0x29 } \
23
+  }
24
+
25
+#define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION    0x00010000
26
+
27
+///
28
+/// Revision defined in EFI1.1.
29
+///
30
+#define EFI_NETWORK_INTERFACE_IDENTIFIER_INTERFACE_REVISION   EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION
31
+
32
+///
33
+/// Forward reference for pure ANSI compatability
34
+///
35
+typedef struct _EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL  EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL;
36
+
37
+///
38
+/// Protocol defined in EFI1.1.
39
+///
40
+typedef EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL   EFI_NETWORK_INTERFACE_IDENTIFIER_INTERFACE;
41
+
42
+typedef enum {
43
+  EfiNetworkInterfaceUndi = 1
44
+} EFI_NETWORK_PROTOCOL_TYPE;
45
+
46
+///
47
+/// An optional protocol that is used to describe details about the software
48
+/// layer that is used to produce the Simple Network Protocol.
49
+///
50
+struct _EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL {
51
+  UINT64    Revision;   ///< The revision of the EFI_NETWORK_INTERFACE_IDENTIFIER protocol.
52
+  UINT64    ID;         ///< Address of the first byte of the identifying structure for this network
53
+                        ///< interface. This is only valid when the network interface is started
54
+                        ///< (see Start()). When the network interface is not started, this field is set to zero.
55
+  UINT64    ImageAddr;  ///< Address of the first byte of the identifying structure for this
56
+                        ///< network interface.  This is set to zero if there is no structure.
57
+  UINT32    ImageSize;  ///< Size of unrelocated network interface image.
58
+  CHAR8     StringId[4];///< A four-character ASCII string that is sent in the class identifier field of
59
+                        ///< option 60 in DHCP. For a Type of EfiNetworkInterfaceUndi, this field is UNDI.
60
+  UINT8     Type;       ///< Network interface type. This will be set to one of the values
61
+                        ///< in EFI_NETWORK_INTERFACE_TYPE.
62
+  UINT8     MajorVer;   ///< Major version number.
63
+  UINT8     MinorVer;   ///< Minor version number.
64
+  BOOLEAN   Ipv6Supported; ///< TRUE if the network interface supports IPv6; otherwise FALSE.
65
+  UINT8     IfNum;      ///< The network interface number that is being identified by this Network
66
+                        ///< Interface Identifier Protocol. This field must be less than or equal
67
+                        ///< to the IFcnt field in the !PXE structure.
68
+
69
+};
70
+
71
+extern EFI_GUID gEfiNetworkInterfaceIdentifierProtocolGuid;
72
+extern EFI_GUID gEfiNetworkInterfaceIdentifierProtocolGuid_31;
73
+
74
+#endif // _EFI_NII_H

+ 24
- 0
src/interface/efi/efi_snp.c View File

30
 #include <gpxe/efi/Protocol/PciIo.h>
30
 #include <gpxe/efi/Protocol/PciIo.h>
31
 #include <gpxe/efi/Protocol/SimpleNetwork.h>
31
 #include <gpxe/efi/Protocol/SimpleNetwork.h>
32
 #include <gpxe/efi/Protocol/ComponentName2.h>
32
 #include <gpxe/efi/Protocol/ComponentName2.h>
33
+#include <gpxe/efi/Protocol/NetworkInterfaceIdentifier.h>
33
 #include <config/general.h>
34
 #include <config/general.h>
34
 
35
 
35
 /** @file
36
 /** @file
62
 	unsigned int rx_count_interrupts;
63
 	unsigned int rx_count_interrupts;
63
 	/** Outstanding RX packet count (via WaitForPacket event) */
64
 	/** Outstanding RX packet count (via WaitForPacket event) */
64
 	unsigned int rx_count_events;
65
 	unsigned int rx_count_events;
66
+	/** The network interface identifier */
67
+	EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL nii;
65
 	/** Device name */
68
 	/** Device name */
66
 	wchar_t name[ sizeof ( ( ( struct net_device * ) NULL )->name ) ];
69
 	wchar_t name[ sizeof ( ( ( struct net_device * ) NULL )->name ) ];
67
 	/** The device path
70
 	/** The device path
88
 static EFI_GUID efi_device_path_protocol_guid
91
 static EFI_GUID efi_device_path_protocol_guid
89
 	= EFI_DEVICE_PATH_PROTOCOL_GUID;
92
 	= EFI_DEVICE_PATH_PROTOCOL_GUID;
90
 
93
 
94
+/** Efi network interface identifier GUID */
95
+static EFI_GUID efi_nii_protocol_guid = {
96
+	/* No, this isn't the GUID defined as
97
+	 * EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_GUID in
98
+	 * Protocol/NetworkInterfaceIdentifier.h.  That GUID gets
99
+	 * ignored by the EFI network stack.  You have to use this one
100
+	 * instead.
101
+	 */
102
+	0x1ACED566, 0x76ED, 0x4218,
103
+	{ 0xBC, 0x81, 0x76, 0x7F, 0x1F, 0x97, 0x7A, 0x89 }
104
+};
105
+
91
 /** EFI PCI I/O protocol GUID */
106
 /** EFI PCI I/O protocol GUID */
92
 static EFI_GUID efi_pci_io_protocol_guid
107
 static EFI_GUID efi_pci_io_protocol_guid
93
 	= EFI_PCI_IO_PROTOCOL_GUID;
108
 	= EFI_PCI_IO_PROTOCOL_GUID;
936
 	snpdev->mode.State = EfiSimpleNetworkStopped;
951
 	snpdev->mode.State = EfiSimpleNetworkStopped;
937
 	efi_snp_set_mode ( snpdev );
952
 	efi_snp_set_mode ( snpdev );
938
 
953
 
954
+	/* Populate the NII structure */
955
+	snpdev->nii.Revision =
956
+		EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION;
957
+	strncpy ( snpdev->nii.StringId, "gPXE",
958
+		  sizeof ( snpdev->nii.StringId ) );
959
+
939
 	/* Populate the device name */
960
 	/* Populate the device name */
940
 	for ( i = 0 ; i < sizeof ( netdev->name ) ; i++ ) {
961
 	for ( i = 0 ; i < sizeof ( netdev->name ) ; i++ ) {
941
 		/* Damn Unicode names */
962
 		/* Damn Unicode names */
965
 			&snpdev->handle,
986
 			&snpdev->handle,
966
 			&efi_simple_network_protocol_guid, &snpdev->snp,
987
 			&efi_simple_network_protocol_guid, &snpdev->snp,
967
 			&efi_device_path_protocol_guid, &snpdev->path,
988
 			&efi_device_path_protocol_guid, &snpdev->path,
989
+			&efi_nii_protocol_guid, &snpdev->nii,
968
 			NULL ) ) != 0 ) {
990
 			NULL ) ) != 0 ) {
969
 		DBGC ( snpdev, "SNPDEV %p could not install protocols: "
991
 		DBGC ( snpdev, "SNPDEV %p could not install protocols: "
970
 		       "%s\n", snpdev, efi_strerror ( efirc ) );
992
 		       "%s\n", snpdev, efi_strerror ( efirc ) );
979
 			snpdev->handle,
1001
 			snpdev->handle,
980
 			&efi_simple_network_protocol_guid, &snpdev->snp,
1002
 			&efi_simple_network_protocol_guid, &snpdev->snp,
981
 			&efi_device_path_protocol_guid, &snpdev->path,
1003
 			&efi_device_path_protocol_guid, &snpdev->path,
1004
+			&efi_nii_protocol_guid, &snpdev->nii,
982
 			NULL );
1005
 			NULL );
983
  err_install_protocol_interface:
1006
  err_install_protocol_interface:
984
 	bs->CloseEvent ( snpdev->snp.WaitForPacket );
1007
 	bs->CloseEvent ( snpdev->snp.WaitForPacket );
1027
 			snpdev->handle,
1050
 			snpdev->handle,
1028
 			&efi_simple_network_protocol_guid, &snpdev->snp,
1051
 			&efi_simple_network_protocol_guid, &snpdev->snp,
1029
 			&efi_device_path_protocol_guid, &snpdev->path,
1052
 			&efi_device_path_protocol_guid, &snpdev->path,
1053
+			&efi_nii_protocol_guid, &snpdev->nii,
1030
 			NULL );
1054
 			NULL );
1031
 	bs->CloseEvent ( snpdev->snp.WaitForPacket );
1055
 	bs->CloseEvent ( snpdev->snp.WaitForPacket );
1032
 	netdev_put ( snpdev->netdev );
1056
 	netdev_put ( snpdev->netdev );

Loading…
Cancel
Save