REF: https://bugzilla.tianocore.org/show_bug.cgi?id=2335 This patch is to check the PCI Memory Base Address Register is valid or not. *** a\NetworkPkg\SnpDxe\Snp.c 2019-11-11 16:53:40.773300500 +0530 --- b\NetworkPkg\SnpDxe\Snp.c 2019-11-03 18:46:02.000000000 +0530 *************** SimpleNetworkDriverStart ( *** 266,272 **** UINT8 BarIndex; PXE_STATFLAGS InitStatFlags; EFI_PCI_IO_PROTOCOL *PciIo; ! EFI_ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR *BarDesc = NULL; BOOLEAN FoundIoBar; BOOLEAN FoundMemoryBar; --- 266,272 ---- UINT8 BarIndex; PXE_STATFLAGS InitStatFlags; EFI_PCI_IO_PROTOCOL *PciIo; ! EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *BarDesc; BOOLEAN FoundIoBar; BOOLEAN FoundMemoryBar; *************** SimpleNetworkDriverStart ( *** 481,494 **** } else if (EFI_ERROR (Status)) { goto Error_DeleteSNP; } ! //PXE boot fails with cards having non-continuous BAR. ! // From UEFI Spec, GetBarAttributes can have only descriptors of type ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR ! // and ACPI_END_TAG_DESCRIPTOR. ! if( BarDesc->Header.Header.Byte != ACPI_QWORD_ADDRESS_SPACE_DESCRIPTOR ) { ! FreePool (BarDesc); ! continue; ! } ! if ((!FoundMemoryBar) && (BarDesc->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM)) { Snp->MemoryBarIndex = BarIndex; FoundMemoryBar = TRUE; --- 481,487 ---- } else if (EFI_ERROR (Status)) { goto Error_DeleteSNP; } ! if ((!FoundMemoryBar) && (BarDesc->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM)) { Snp->MemoryBarIndex = BarIndex; FoundMemoryBar = TRUE;