summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorQian Ouyang <qian.ouyang@intel.com>2013-08-20 02:22:00 +0000
committerqianouyang <qianouyang@6f19259b-4bc3-4df7-8a09-765794883524>2013-08-20 02:22:00 +0000
commit61f2ab909d473aaf6faa278424287685a2c502fe (patch)
tree858beb0eefd0df1499877b4e63210caeec64c292
parent2e969d2e9e98820a136002699ff1d02ba2a2f551 (diff)
downloadedk2-61f2ab909d473aaf6faa278424287685a2c502fe.zip
edk2-61f2ab909d473aaf6faa278424287685a2c502fe.tar.gz
edk2-61f2ab909d473aaf6faa278424287685a2c502fe.tar.bz2
Update the structure of EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL, PXE_HW_UNDI, PXE_SW_UNDI to support greater than 256NICs in UNDI (Request by UEFI2.4 Mantis991).
Signed-off-by: Qian Ouyang <qian.ouyang@intel.com> Reviewed-by: Ting Ye <ting.ye@intel.com> Siyuan Fu <siyuan.fu@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/trunk/edk2@14569 6f19259b-4bc3-4df7-8a09-765794883524
-rw-r--r--MdeModulePkg/Universal/Network/SnpDxe/Snp.c7
-rw-r--r--MdePkg/Include/Protocol/NetworkInterfaceIdentifier.h14
-rw-r--r--MdePkg/Include/Uefi/UefiPxe.h12
-rw-r--r--OptionRomPkg/UndiRuntimeDxe/Decode.c25
-rw-r--r--OptionRomPkg/UndiRuntimeDxe/Init.c12
5 files changed, 43 insertions, 27 deletions
diff --git a/MdeModulePkg/Universal/Network/SnpDxe/Snp.c b/MdeModulePkg/Universal/Network/SnpDxe/Snp.c
index 177d0a9..ed583b4 100644
--- a/MdeModulePkg/Universal/Network/SnpDxe/Snp.c
+++ b/MdeModulePkg/Universal/Network/SnpDxe/Snp.c
@@ -410,8 +410,13 @@ SimpleNetworkDriverStart (
Snp->TxRxBufferSize = 0;
Snp->TxRxBuffer = NULL;
+
+ if (Nii->Revision >= EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION) {
+ Snp->IfNum = Nii->IfNum;
- Snp->IfNum = Nii->IfNum;
+ } else {
+ Snp->IfNum = (UINT8) (Nii->IfNum & 0xFF);
+ }
if ((Pxe->hw.Implementation & PXE_ROMID_IMP_HW_UNDI) != 0) {
Snp->IsSwUndi = FALSE;
diff --git a/MdePkg/Include/Protocol/NetworkInterfaceIdentifier.h b/MdePkg/Include/Protocol/NetworkInterfaceIdentifier.h
index 417a6cd..88a1c42 100644
--- a/MdePkg/Include/Protocol/NetworkInterfaceIdentifier.h
+++ b/MdePkg/Include/Protocol/NetworkInterfaceIdentifier.h
@@ -1,7 +1,7 @@
/** @file
EFI Network Interface Identifier Protocol.
-Copyright (c) 2006 - 2011, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that accompanies this distribution.
The full text of the license may be found at
@@ -34,7 +34,11 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
0x1ACED566, 0x76ED, 0x4218, {0xBC, 0x81, 0x76, 0x7F, 0x1F, 0x97, 0x7A, 0x89 } \
}
-#define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION 0x00010000
+//
+// Revision defined in UEFI Specification 2.4
+//
+#define EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION 0x00020000
+
///
/// Revision defined in EFI1.1.
@@ -70,9 +74,9 @@ struct _EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL {
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.
+ UINT16 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 | IFcntExt <<8 ) fields in the !PXE structure.
};
diff --git a/MdePkg/Include/Uefi/UefiPxe.h b/MdePkg/Include/Uefi/UefiPxe.h
index 165359b..2972ff7 100644
--- a/MdePkg/Include/Uefi/UefiPxe.h
+++ b/MdePkg/Include/Uefi/UefiPxe.h
@@ -3,7 +3,7 @@
structure prototypes, global variables and constants that
are needed for porting PXE to EFI.
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials are licensed and made available under
the terms and conditions of the BSD License that accompanies this distribution.
The full text of the license may be found at
@@ -719,10 +719,11 @@ typedef struct s_pxe_hw_undi {
PXE_UINT8 Len; ///< sizeof(PXE_HW_UNDI).
PXE_UINT8 Fudge; ///< makes 8-bit cksum equal zero.
PXE_UINT8 Rev; ///< PXE_ROMID_REV.
- PXE_UINT8 IFcnt; ///< physical connector count.
+ PXE_UINT8 IFcnt; ///< physical connector count lower byte.
PXE_UINT8 MajorVer; ///< PXE_ROMID_MAJORVER.
PXE_UINT8 MinorVer; ///< PXE_ROMID_MINORVER.
- PXE_UINT16 reserved; ///< zero, not used.
+ PXE_UINT8 IFcntExt; ///< physical connector count upper byte.
+ PXE_UINT8 reserved; ///< zero, not used.
PXE_UINT32 Implementation; ///< implementation flags.
///< reserved ///< vendor use.
///< UINT32 Status; ///< status port.
@@ -815,10 +816,11 @@ typedef struct s_pxe_sw_undi {
PXE_UINT8 Len; ///< sizeof(PXE_SW_UNDI).
PXE_UINT8 Fudge; ///< makes 8-bit cksum zero.
PXE_UINT8 Rev; ///< PXE_ROMID_REV.
- PXE_UINT8 IFcnt; ///< physical connector count.
+ PXE_UINT8 IFcnt; ///< physical connector count lower byte.
PXE_UINT8 MajorVer; ///< PXE_ROMID_MAJORVER.
PXE_UINT8 MinorVer; ///< PXE_ROMID_MINORVER.
- PXE_UINT16 reserved1; ///< zero, not used.
+ PXE_UINT8 IFcntExt; ///< physical connector count upper byte.
+ PXE_UINT8 reserved1; ///< zero, not used.
PXE_UINT32 Implementation; ///< Implementation flags.
PXE_UINT64 EntryPoint; ///< API entry point.
PXE_UINT8 reserved2[3]; ///< zero, not used.
diff --git a/OptionRomPkg/UndiRuntimeDxe/Decode.c b/OptionRomPkg/UndiRuntimeDxe/Decode.c
index 0eabc2a..eb0ee1d 100644
--- a/OptionRomPkg/UndiRuntimeDxe/Decode.c
+++ b/OptionRomPkg/UndiRuntimeDxe/Decode.c
@@ -1,7 +1,7 @@
/** @file
Provides the basic UNID functions.
-Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
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
@@ -1290,7 +1290,7 @@ UNDI_APIEntry_new (
CdbPtr = (PXE_CDB *) (UINTN) cdb;
- if (CdbPtr->IFnum >= pxe_31->IFcnt) {
+ if (CdbPtr->IFnum >= (pxe_31->IFcnt | pxe_31->IFcntExt << 8) ) {
CdbPtr->StatFlags = PXE_STATFLAGS_COMMAND_FAILED;
CdbPtr->StatCode = PXE_STATCODE_INVALID_CDB;
return ;
@@ -1336,7 +1336,7 @@ UNDI_APIEntry_Common (
if ((CdbPtr->OpCode > PXE_OPCODE_LAST_VALID) ||
(CdbPtr->StatCode != PXE_STATCODE_INITIALIZE) ||
(CdbPtr->StatFlags != PXE_STATFLAGS_INITIALIZE) ||
- (CdbPtr->IFnum >= pxe_31->IFcnt) ) {
+ (CdbPtr->IFnum >= (pxe_31->IFcnt | pxe_31->IFcntExt << 8) ) {
goto badcdb;
}
@@ -1436,24 +1436,28 @@ PxeUpdate (
IN PXE_SW_UNDI *PxePtr
)
{
+ UINT16 NicNum;
+ NicNum = (PxePtr->IFcnt | PxePtr->IFcntEx << 8);
+
if (NicPtr == NULL) {
- if (PxePtr->IFcnt > 0) {
+ if (NicNum > 0) {
//
// number of NICs this undi supports
//
- PxePtr->IFcnt--;
+ NicNum --;
}
-
- PxePtr->Fudge = (UINT8) (PxePtr->Fudge - CalculateSum8 ((VOID *) PxePtr, PxePtr->Len));
- return ;
+ goto done;
}
//
// number of NICs this undi supports
//
- PxePtr->IFcnt++;
+ NicNum++;
+
+done:
+ PxePtr->IFcnt = (UINT8)(NicNum & 0xFF);
+ PxePtr->IFcntEx = (UINT8) ((NicNum & 0xFF00) >> 8);
PxePtr->Fudge = (UINT8) (PxePtr->Fudge - CalculateSum8 ((VOID *) PxePtr, PxePtr->Len));
-
return ;
}
@@ -1485,6 +1489,7 @@ PxeStructInit (
// number of NICs this undi supports
//
PxePtr->IFcnt = 0;
+ PxePtr->IFcntEx = 0;
PxePtr->Rev = PXE_ROMID_REV;
PxePtr->MajorVer = PXE_ROMID_MAJORVER;
PxePtr->MinorVer = PXE_ROMID_MINORVER;
diff --git a/OptionRomPkg/UndiRuntimeDxe/Init.c b/OptionRomPkg/UndiRuntimeDxe/Init.c
index 3d0a3de..9410fe1 100644
--- a/OptionRomPkg/UndiRuntimeDxe/Init.c
+++ b/OptionRomPkg/UndiRuntimeDxe/Init.c
@@ -1,7 +1,7 @@
/** @file
Initialization functions for EFI UNDI32 driver.
-Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
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
@@ -64,7 +64,7 @@ UndiNotifyVirtual (
//
// UNDI32DeviceList is an array of pointers
//
- for (Index = 0; Index < pxe_31->IFcnt; Index++) {
+ for (Index = 0; Index < (pxe_31->IFcnt | pxe_31->IFcntExt << 8); Index++) {
UNDI32DeviceList[Index]->NIIProtocol_31.Id = (UINT64) (UINTN) Pxe31Pointer;
EfiConvertPointer (
EFI_OPTIONAL_PTR,
@@ -409,7 +409,7 @@ UndiDriverStart (
// the IfNum index for the current interface will be the total number
// of interfaces initialized so far
//
- UNDI32Device->NIIProtocol_31.IfNum = pxe_31->IFcnt;
+ UNDI32Device->NIIProtocol_31.IfNum = pxe_31->IFcnt | pxe_31->IFcntExt << 8;
PxeUpdate (&UNDI32Device->NicInfo, pxe_31);
@@ -470,7 +470,7 @@ UndiDriverStart (
goto UndiErrorDeleteDevicePath;
}
- Len = (pxe_31->IFcnt * sizeof (UndiDataPointer->NII_entry)) + sizeof (UndiDataPointer);
+ Len = ((pxe_31->IFcnt|pxe_31->IFcntExt << 8)* sizeof (UndiDataPointer->NII_entry)) + sizeof (UndiDataPointer);
Status = gBS->AllocatePool (EfiRuntimeServicesData, Len, (VOID **) &UndiDataPointer);
if (EFI_ERROR (Status)) {
@@ -949,10 +949,10 @@ InstallConfigTable (
UndiData = (UNDI_CONFIG_TABLE *)UndiDataPointer;
- UndiData->NumberOfInterfaces = pxe_31->IFcnt;
+ UndiData->NumberOfInterfaces = (pxe_31->IFcnt | pxe_31->IFcntExt << 8);
UndiData->nextlink = NULL;
- for (Index = 0; Index < pxe_31->IFcnt; Index++) {
+ for (Index = 0; Index < (pxe_31->IFcnt | pxe_31->IFcntExt << 8); Index++) {
UndiData->NII_entry[Index].NII_InterfacePointer = &UNDI32DeviceList[Index]->NIIProtocol_31;
UndiData->NII_entry[Index].DevicePathPointer = UNDI32DeviceList[Index]->Undi32DevPath;
}