summaryrefslogtreecommitdiff
path: root/MdeModulePkg
diff options
context:
space:
mode:
authorFu Siyuan <siyuan.fu@intel.com>2015-09-15 05:45:03 +0000
committerhwu1225 <hwu1225@Edk2>2015-09-15 05:45:03 +0000
commit9a36457f943e1a758fdb4b39205022a55bf74cdc (patch)
tree8ceff70bd0a75ae3797ee5dc8503c65b670c9ee0 /MdeModulePkg
parent9f00fa9165ebc8da0cc604e7f475f3f2ad7735ca (diff)
downloadedk2-platforms-9a36457f943e1a758fdb4b39205022a55bf74cdc.tar.xz
MdeModulePkg: Change the algorithm in SNP to use the first found BAR index.
The driver binding start function in SNP.c goes through all the BARs and get the last BAR index for use. Theoretically it should work with all valid BARs, but we got reports some device did always use the first valid BAR, so we change the logic in SNP to use the first found BAR index instead of the last one. (Sync patch r18455 from main trunk.) Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Fu Siyuan <siyuan.fu@intel.com> Reviewed-by: Ye Ting <ting.ye@intel.com> git-svn-id: https://svn.code.sf.net/p/edk2/code/branches/UDK2015@18465 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdeModulePkg')
-rw-r--r--MdeModulePkg/Universal/Network/SnpDxe/Snp.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/MdeModulePkg/Universal/Network/SnpDxe/Snp.c b/MdeModulePkg/Universal/Network/SnpDxe/Snp.c
index a63dd10b29..db5b6267a6 100644
--- a/MdeModulePkg/Universal/Network/SnpDxe/Snp.c
+++ b/MdeModulePkg/Universal/Network/SnpDxe/Snp.c
@@ -1,7 +1,7 @@
/** @file
Implementation of driver entry point and driver binding protocol.
-Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2004 - 2015, 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
@@ -273,6 +273,8 @@ SimpleNetworkDriverStart (
PXE_STATFLAGS InitStatFlags;
EFI_PCI_IO_PROTOCOL *PciIo;
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *BarDesc;
+ BOOLEAN FoundIoBar;
+ BOOLEAN FoundMemoryBar;
DEBUG ((EFI_D_NET, "\nSnpNotifyNetworkInterfaceIdentifier() "));
@@ -403,7 +405,7 @@ SimpleNetworkDriverStart (
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);
@@ -463,6 +465,8 @@ SimpleNetworkDriverStart (
//
Snp->MemoryBarIndex = 0;
Snp->IoBarIndex = 1;
+ FoundMemoryBar = FALSE;
+ FoundIoBar = FALSE;
for (BarIndex = 0; BarIndex < PCI_MAX_BAR; BarIndex++) {
Status = PciIo->GetBarAttributes (
PciIo,
@@ -476,13 +480,19 @@ SimpleNetworkDriverStart (
goto Error_DeleteSNP;
}
- if (BarDesc->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) {
+ if ((!FoundMemoryBar) && (BarDesc->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM)) {
Snp->MemoryBarIndex = BarIndex;
- } else if (BarDesc->ResType == ACPI_ADDRESS_SPACE_TYPE_IO) {
+ FoundMemoryBar = TRUE;
+ } else if ((!FoundIoBar) && (BarDesc->ResType == ACPI_ADDRESS_SPACE_TYPE_IO)) {
Snp->IoBarIndex = BarIndex;
+ FoundIoBar = TRUE;
}
FreePool (BarDesc);
+
+ if (FoundMemoryBar && FoundIoBar) {
+ break;
+ }
}
Status = PxeStart (Snp);