/** @file\r
Implementation of driver entry point and driver binding protocol.\r
\r
-Copyright (c) 2004 - 2014, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials are licensed\r
-and made available under the terms and conditions of the BSD License which\r
-accompanies this distribution. The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 2004 - 2018, Intel Corporation. All rights reserved.<BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
\r
**/\r
\r
PXE_STATFLAGS InitStatFlags;\r
EFI_PCI_IO_PROTOCOL *PciIo;\r
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *BarDesc;\r
- \r
+ BOOLEAN FoundIoBar;\r
+ BOOLEAN FoundMemoryBar;\r
+\r
DEBUG ((EFI_D_NET, "\nSnpNotifyNetworkInterfaceIdentifier() "));\r
\r
Status = gBS->OpenProtocol (\r
\r
Snp->TxRxBufferSize = 0;\r
Snp->TxRxBuffer = NULL;\r
- \r
+\r
+ Snp->RecycledTxBuf = AllocatePool (sizeof (UINT64) * SNP_TX_BUFFER_INCREASEMENT);\r
+ if (Snp->RecycledTxBuf == NULL) {\r
+ Status = EFI_OUT_OF_RESOURCES;\r
+ goto Error_DeleteSNP;\r
+ }\r
+ Snp->MaxRecycledTxBuf = SNP_TX_BUFFER_INCREASEMENT;\r
+ Snp->RecycledTxBufCount = 0;\r
+\r
if (Nii->Revision >= EFI_NETWORK_INTERFACE_IDENTIFIER_PROTOCOL_REVISION) {\r
- Snp->IfNum = Nii->IfNum;\r
+ Snp->IfNum = Nii->IfNum;\r
\r
} else {\r
Snp->IfNum = (UINT8) (Nii->IfNum & 0xFF);\r
Snp->Db = (VOID *) ((UINTN) Address + 2048);\r
\r
//\r
- // Find the correct memory and io bar.\r
+ // Find the correct BAR to do IO.\r
+ //\r
+ // Enumerate through the PCI BARs for the device to determine which one is\r
+ // the IO BAR. Save the index of the BAR into the adapter info structure.\r
+ // for regular 32bit BARs, 0 is memory mapped, 1 is io mapped\r
//\r
- Snp->MemoryBarIndex = PCI_MAX_BAR;\r
- Snp->IoBarIndex = PCI_MAX_BAR;\r
+ Snp->MemoryBarIndex = 0;\r
+ Snp->IoBarIndex = 1;\r
+ FoundMemoryBar = FALSE;\r
+ FoundIoBar = FALSE;\r
for (BarIndex = 0; BarIndex < PCI_MAX_BAR; BarIndex++) {\r
Status = PciIo->GetBarAttributes (\r
PciIo,\r
goto Error_DeleteSNP;\r
}\r
\r
- if (BarDesc->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM) {\r
+ if ((!FoundMemoryBar) && (BarDesc->ResType == ACPI_ADDRESS_SPACE_TYPE_MEM)) {\r
Snp->MemoryBarIndex = BarIndex;\r
- } else if (BarDesc->ResType == ACPI_ADDRESS_SPACE_TYPE_IO) {\r
+ FoundMemoryBar = TRUE;\r
+ } else if ((!FoundIoBar) && (BarDesc->ResType == ACPI_ADDRESS_SPACE_TYPE_IO)) {\r
Snp->IoBarIndex = BarIndex;\r
+ FoundIoBar = TRUE;\r
}\r
\r
FreePool (BarDesc);\r
- }\r
- if ((Snp->MemoryBarIndex == PCI_MAX_BAR) || (Snp->IoBarIndex == PCI_MAX_BAR)) {\r
- goto Error_DeleteSNP;\r
+\r
+ if (FoundMemoryBar && FoundIoBar) {\r
+ break;\r
+ }\r
}\r
\r
Status = PxeStart (Snp);\r
\r
switch (InitStatFlags & PXE_STATFLAGS_CABLE_DETECT_MASK) {\r
case PXE_STATFLAGS_CABLE_DETECT_SUPPORTED:\r
- Snp->Mode.MediaPresentSupported = TRUE;\r
+ Snp->CableDetectSupported = TRUE;\r
break;\r
\r
case PXE_STATFLAGS_CABLE_DETECT_NOT_SUPPORTED:\r
default:\r
- Snp->Mode.MediaPresentSupported = FALSE;\r
+ Snp->CableDetectSupported = FALSE;\r
}\r
\r
switch (InitStatFlags & PXE_STATFLAGS_GET_STATUS_NO_MEDIA_MASK) {\r
Snp->MediaStatusSupported = FALSE;\r
}\r
\r
+ if (Snp->CableDetectSupported || Snp->MediaStatusSupported) {\r
+ Snp->Mode.MediaPresentSupported = TRUE;\r
+ }\r
+\r
if ((Pxe->hw.Implementation & PXE_ROMID_IMP_STATION_ADDR_SETTABLE) != 0) {\r
Snp->Mode.MacAddressChangeable = TRUE;\r
} else {\r
\r
Error_DeleteSNP:\r
\r
+ if (Snp->RecycledTxBuf != NULL) {\r
+ FreePool (Snp->RecycledTxBuf);\r
+ }\r
+\r
PciIo->FreeBuffer (\r
PciIo,\r
SNP_MEM_PAGES (sizeof (SNP_DRIVER)),\r
PxeShutdown (Snp);\r
PxeStop (Snp);\r
\r
+ FreePool (Snp->RecycledTxBuf);\r
+\r
PciIo = Snp->PciIo;\r
PciIo->FreeBuffer (\r
PciIo,\r