1c74593cd394ae2135d910915a6a455e0a5cea221vanjeff/** @file 24cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Implementation of initializing a network adapter. 34cda7726e5fd30aaf3e05c80207ae1b264bfa123niry 4e5eed7d3641d71d7ea539e5379ea9c6a5cd97004hhtianCopyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR> 5e5eed7d3641d71d7ea539e5379ea9c6a5cd97004hhtianThis program and the accompanying materials are licensed 64cda7726e5fd30aaf3e05c80207ae1b264bfa123niryand made available under the terms and conditions of the BSD License which 74cda7726e5fd30aaf3e05c80207ae1b264bfa123niryaccompanies this distribution. The full text of the license may be found at 84cda7726e5fd30aaf3e05c80207ae1b264bfa123niryhttp://opensource.org/licenses/bsd-license.php 9c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 10c74593cd394ae2135d910915a6a455e0a5cea221vanjeffTHE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 11c74593cd394ae2135d910915a6a455e0a5cea221vanjeffWITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 12c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 13c74593cd394ae2135d910915a6a455e0a5cea221vanjeff**/ 14c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 15c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 16c74593cd394ae2135d910915a6a455e0a5cea221vanjeff#include "Snp.h" 17c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 18c74593cd394ae2135d910915a6a455e0a5cea221vanjeff/** 19f381602727922e793de5826ee390344cb907e07aniry Call UNDI to initialize the interface. 20c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 21f381602727922e793de5826ee390344cb907e07aniry @param Snp Pointer to snp driver structure. 22f381602727922e793de5826ee390344cb907e07aniry @param CableDetectFlag Do/don't detect the cable (depending on what 23f381602727922e793de5826ee390344cb907e07aniry undi supports). 244cda7726e5fd30aaf3e05c80207ae1b264bfa123niry 25f381602727922e793de5826ee390344cb907e07aniry @retval EFI_SUCCESS UNDI is initialized successfully. 26f381602727922e793de5826ee390344cb907e07aniry @retval EFI_DEVICE_ERROR UNDI could not be initialized. 27f381602727922e793de5826ee390344cb907e07aniry @retval Other Other errors as indicated. 28c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 29c74593cd394ae2135d910915a6a455e0a5cea221vanjeff**/ 30c74593cd394ae2135d910915a6a455e0a5cea221vanjeffEFI_STATUS 314cda7726e5fd30aaf3e05c80207ae1b264bfa123niryPxeInit ( 324cda7726e5fd30aaf3e05c80207ae1b264bfa123niry SNP_DRIVER *Snp, 33c74593cd394ae2135d910915a6a455e0a5cea221vanjeff UINT16 CableDetectFlag 34c74593cd394ae2135d910915a6a455e0a5cea221vanjeff ) 35c74593cd394ae2135d910915a6a455e0a5cea221vanjeff{ 364cda7726e5fd30aaf3e05c80207ae1b264bfa123niry PXE_CPB_INITIALIZE *Cpb; 374cda7726e5fd30aaf3e05c80207ae1b264bfa123niry VOID *Addr; 38c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EFI_STATUS Status; 39c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 404cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb = Snp->Cpb; 414cda7726e5fd30aaf3e05c80207ae1b264bfa123niry if (Snp->TxRxBufferSize != 0) { 424cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Status = Snp->PciIo->AllocateBuffer ( 434cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->PciIo, 444cda7726e5fd30aaf3e05c80207ae1b264bfa123niry AllocateAnyPages, 454cda7726e5fd30aaf3e05c80207ae1b264bfa123niry EfiBootServicesData, 464cda7726e5fd30aaf3e05c80207ae1b264bfa123niry SNP_MEM_PAGES (Snp->TxRxBufferSize), 474cda7726e5fd30aaf3e05c80207ae1b264bfa123niry &Addr, 484cda7726e5fd30aaf3e05c80207ae1b264bfa123niry 0 494cda7726e5fd30aaf3e05c80207ae1b264bfa123niry ); 50c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 51c74593cd394ae2135d910915a6a455e0a5cea221vanjeff if (Status != EFI_SUCCESS) { 52c74593cd394ae2135d910915a6a455e0a5cea221vanjeff DEBUG ( 53c74593cd394ae2135d910915a6a455e0a5cea221vanjeff (EFI_D_ERROR, 544cda7726e5fd30aaf3e05c80207ae1b264bfa123niry "\nSnp->PxeInit() AllocateBuffer %xh (%r)\n", 55c74593cd394ae2135d910915a6a455e0a5cea221vanjeff Status, 56c74593cd394ae2135d910915a6a455e0a5cea221vanjeff Status) 57c74593cd394ae2135d910915a6a455e0a5cea221vanjeff ); 58c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 59c74593cd394ae2135d910915a6a455e0a5cea221vanjeff return Status; 60c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 61c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 624cda7726e5fd30aaf3e05c80207ae1b264bfa123niry ASSERT (Addr); 63c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 644cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->TxRxBuffer = Addr; 65c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 66c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 674cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->MemoryAddr = (UINT64)(UINTN) Snp->TxRxBuffer; 68c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 694cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->MemoryLength = Snp->TxRxBufferSize; 70c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 71c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // 72c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // let UNDI decide/detect these values 73c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // 744cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->LinkSpeed = 0; 754cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->TxBufCnt = 0; 764cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->TxBufSize = 0; 774cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->RxBufCnt = 0; 784cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->RxBufSize = 0; 79c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 804cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->DuplexMode = PXE_DUPLEX_DEFAULT; 81c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 824cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->LoopBackMode = LOOPBACK_NORMAL; 83c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 844cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.OpCode = PXE_OPCODE_INITIALIZE; 854cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.OpFlags = CableDetectFlag; 86c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 87c9325700d0ef25eaf45077928af3f93b15ac5fe0ydong Snp->Cdb.CPBsize = (UINT16) sizeof (PXE_CPB_INITIALIZE); 88c9325700d0ef25eaf45077928af3f93b15ac5fe0ydong Snp->Cdb.DBsize = (UINT16) sizeof (PXE_DB_INITIALIZE); 89c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 904cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.CPBaddr = (UINT64)(UINTN) Snp->Cpb; 914cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.DBaddr = (UINT64)(UINTN) Snp->Db; 92c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 934cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; 944cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; 954cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.IFnum = Snp->IfNum; 964cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; 97c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 989cff2f8d3687aeed765e1ee787c18ce70ae500bcniry DEBUG ((EFI_D_NET, "\nSnp->undi.initialize() ")); 99c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1004cda7726e5fd30aaf3e05c80207ae1b264bfa123niry (*Snp->IssueUndi32Command) ((UINT64)(UINTN) &Snp->Cdb); 101c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1024cda7726e5fd30aaf3e05c80207ae1b264bfa123niry if (Snp->Cdb.StatCode == PXE_STATCODE_SUCCESS) { 1034cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Mode.State = EfiSimpleNetworkInitialized; 104c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 105c74593cd394ae2135d910915a6a455e0a5cea221vanjeff Status = EFI_SUCCESS; 106c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } else { 107c74593cd394ae2135d910915a6a455e0a5cea221vanjeff DEBUG ( 1089cff2f8d3687aeed765e1ee787c18ce70ae500bcniry (EFI_D_WARN, 1094cda7726e5fd30aaf3e05c80207ae1b264bfa123niry "\nSnp->undi.initialize() %xh:%xh\n", 1104cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.StatFlags, 1114cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.StatCode) 112c74593cd394ae2135d910915a6a455e0a5cea221vanjeff ); 113c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1144cda7726e5fd30aaf3e05c80207ae1b264bfa123niry if (Snp->TxRxBuffer != NULL) { 1154cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->PciIo->FreeBuffer ( 1164cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->PciIo, 1174cda7726e5fd30aaf3e05c80207ae1b264bfa123niry SNP_MEM_PAGES (Snp->TxRxBufferSize), 1184cda7726e5fd30aaf3e05c80207ae1b264bfa123niry (VOID *) Snp->TxRxBuffer 119c74593cd394ae2135d910915a6a455e0a5cea221vanjeff ); 120c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 121c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1224cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->TxRxBuffer = NULL; 123c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1244cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Status = EFI_DEVICE_ERROR; 125c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 126c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 127c74593cd394ae2135d910915a6a455e0a5cea221vanjeff return Status; 128c74593cd394ae2135d910915a6a455e0a5cea221vanjeff} 129c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 130c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 131c74593cd394ae2135d910915a6a455e0a5cea221vanjeff/** 1324cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Resets a network adapter and allocates the transmit and receive buffers 1334cda7726e5fd30aaf3e05c80207ae1b264bfa123niry required by the network interface; optionally, also requests allocation of 1344cda7726e5fd30aaf3e05c80207ae1b264bfa123niry additional transmit and receive buffers. 1354cda7726e5fd30aaf3e05c80207ae1b264bfa123niry 1364cda7726e5fd30aaf3e05c80207ae1b264bfa123niry This function allocates the transmit and receive buffers required by the network 1374cda7726e5fd30aaf3e05c80207ae1b264bfa123niry interface. If this allocation fails, then EFI_OUT_OF_RESOURCES is returned. 1384cda7726e5fd30aaf3e05c80207ae1b264bfa123niry If the allocation succeeds and the network interface is successfully initialized, 1394cda7726e5fd30aaf3e05c80207ae1b264bfa123niry then EFI_SUCCESS will be returned. 1404cda7726e5fd30aaf3e05c80207ae1b264bfa123niry 1414cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @param This A pointer to the EFI_SIMPLE_NETWORK_PROTOCOL instance. 1424cda7726e5fd30aaf3e05c80207ae1b264bfa123niry 1434cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @param ExtraRxBufferSize The size, in bytes, of the extra receive buffer space 1444cda7726e5fd30aaf3e05c80207ae1b264bfa123niry that the driver should allocate for the network interface. 1454cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Some network interfaces will not be able to use the 1464cda7726e5fd30aaf3e05c80207ae1b264bfa123niry extra buffer, and the caller will not know if it is 1474cda7726e5fd30aaf3e05c80207ae1b264bfa123niry actually being used. 1484cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @param ExtraTxBufferSize The size, in bytes, of the extra transmit buffer space 1494cda7726e5fd30aaf3e05c80207ae1b264bfa123niry that the driver should allocate for the network interface. 1504cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Some network interfaces will not be able to use the 1514cda7726e5fd30aaf3e05c80207ae1b264bfa123niry extra buffer, and the caller will not know if it is 1524cda7726e5fd30aaf3e05c80207ae1b264bfa123niry actually being used. 1534cda7726e5fd30aaf3e05c80207ae1b264bfa123niry 1544cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @retval EFI_SUCCESS The network interface was initialized. 1554cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @retval EFI_NOT_STARTED The network interface has not been started. 1564cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @retval EFI_OUT_OF_RESOURCES There was not enough memory for the transmit and 1574cda7726e5fd30aaf3e05c80207ae1b264bfa123niry receive buffers. 1584cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @retval EFI_INVALID_PARAMETER This parameter was NULL or did not point to a valid 1594cda7726e5fd30aaf3e05c80207ae1b264bfa123niry EFI_SIMPLE_NETWORK_PROTOCOL structure. 1604cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @retval EFI_DEVICE_ERROR The command could not be sent to the network interface. 1614cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @retval EFI_UNSUPPORTED The increased buffer size feature is not supported. 162c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 163c74593cd394ae2135d910915a6a455e0a5cea221vanjeff**/ 164c74593cd394ae2135d910915a6a455e0a5cea221vanjeffEFI_STATUS 165c74593cd394ae2135d910915a6a455e0a5cea221vanjeffEFIAPI 1664cda7726e5fd30aaf3e05c80207ae1b264bfa123nirySnpUndi32Initialize ( 1674cda7726e5fd30aaf3e05c80207ae1b264bfa123niry IN EFI_SIMPLE_NETWORK_PROTOCOL *This, 1684cda7726e5fd30aaf3e05c80207ae1b264bfa123niry IN UINTN ExtraRxBufferSize OPTIONAL, 1694cda7726e5fd30aaf3e05c80207ae1b264bfa123niry IN UINTN ExtraTxBufferSize OPTIONAL 170c74593cd394ae2135d910915a6a455e0a5cea221vanjeff ) 171c74593cd394ae2135d910915a6a455e0a5cea221vanjeff{ 172c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EFI_STATUS EfiStatus; 1734cda7726e5fd30aaf3e05c80207ae1b264bfa123niry SNP_DRIVER *Snp; 174c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EFI_TPL OldTpl; 175c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1764cda7726e5fd30aaf3e05c80207ae1b264bfa123niry if (This == NULL) { 177c74593cd394ae2135d910915a6a455e0a5cea221vanjeff return EFI_INVALID_PARAMETER; 178c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 179c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1804cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (This); 181c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 182c74593cd394ae2135d910915a6a455e0a5cea221vanjeff OldTpl = gBS->RaiseTPL (TPL_CALLBACK); 183c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1844cda7726e5fd30aaf3e05c80207ae1b264bfa123niry if (Snp == NULL) { 185c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EfiStatus = EFI_INVALID_PARAMETER; 186c74593cd394ae2135d910915a6a455e0a5cea221vanjeff goto ON_EXIT; 187c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 188c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1894cda7726e5fd30aaf3e05c80207ae1b264bfa123niry switch (Snp->Mode.State) { 190c74593cd394ae2135d910915a6a455e0a5cea221vanjeff case EfiSimpleNetworkStarted: 191c74593cd394ae2135d910915a6a455e0a5cea221vanjeff break; 192c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 193c74593cd394ae2135d910915a6a455e0a5cea221vanjeff case EfiSimpleNetworkStopped: 194c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EfiStatus = EFI_NOT_STARTED; 195c74593cd394ae2135d910915a6a455e0a5cea221vanjeff goto ON_EXIT; 196c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 197c74593cd394ae2135d910915a6a455e0a5cea221vanjeff default: 198c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EfiStatus = EFI_DEVICE_ERROR; 199c74593cd394ae2135d910915a6a455e0a5cea221vanjeff goto ON_EXIT; 200c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 201c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 202c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EfiStatus = gBS->CreateEvent ( 203c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EVT_NOTIFY_WAIT, 204c74593cd394ae2135d910915a6a455e0a5cea221vanjeff TPL_NOTIFY, 205c74593cd394ae2135d910915a6a455e0a5cea221vanjeff &SnpWaitForPacketNotify, 2064cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp, 2074cda7726e5fd30aaf3e05c80207ae1b264bfa123niry &Snp->Snp.WaitForPacket 208c74593cd394ae2135d910915a6a455e0a5cea221vanjeff ); 209c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 210c74593cd394ae2135d910915a6a455e0a5cea221vanjeff if (EFI_ERROR (EfiStatus)) { 2114cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Snp.WaitForPacket = NULL; 212c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EfiStatus = EFI_DEVICE_ERROR; 213c74593cd394ae2135d910915a6a455e0a5cea221vanjeff goto ON_EXIT; 214c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 215c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // 216c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // 217c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // 2184cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Mode.MCastFilterCount = 0; 2194cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Mode.ReceiveFilterSetting = 0; 2204cda7726e5fd30aaf3e05c80207ae1b264bfa123niry ZeroMem (Snp->Mode.MCastFilter, sizeof Snp->Mode.MCastFilter); 221c74593cd394ae2135d910915a6a455e0a5cea221vanjeff CopyMem ( 2224cda7726e5fd30aaf3e05c80207ae1b264bfa123niry &Snp->Mode.CurrentAddress, 2234cda7726e5fd30aaf3e05c80207ae1b264bfa123niry &Snp->Mode.PermanentAddress, 224c74593cd394ae2135d910915a6a455e0a5cea221vanjeff sizeof (EFI_MAC_ADDRESS) 225c74593cd394ae2135d910915a6a455e0a5cea221vanjeff ); 226c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 227c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // 228c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // Compute tx/rx buffer sizes based on UNDI init info and parameters. 229c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // 2304cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->TxRxBufferSize = (UINT32) (Snp->InitInfo.MemoryRequired + ExtraRxBufferSize + ExtraTxBufferSize); 231c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 2324cda7726e5fd30aaf3e05c80207ae1b264bfa123niry if (Snp->Mode.MediaPresentSupported) { 2334cda7726e5fd30aaf3e05c80207ae1b264bfa123niry if (PxeInit (Snp, PXE_OPFLAGS_INITIALIZE_DETECT_CABLE) == EFI_SUCCESS) { 2344cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Mode.MediaPresent = TRUE; 235c74593cd394ae2135d910915a6a455e0a5cea221vanjeff goto ON_EXIT; 236c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 237c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 238c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 2394cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Mode.MediaPresent = FALSE; 240c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 2414cda7726e5fd30aaf3e05c80207ae1b264bfa123niry EfiStatus = PxeInit (Snp, PXE_OPFLAGS_INITIALIZE_DO_NOT_DETECT_CABLE); 242c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 243c74593cd394ae2135d910915a6a455e0a5cea221vanjeff if (EFI_ERROR (EfiStatus)) { 2444cda7726e5fd30aaf3e05c80207ae1b264bfa123niry gBS->CloseEvent (Snp->Snp.WaitForPacket); 245c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 246c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 247c74593cd394ae2135d910915a6a455e0a5cea221vanjeffON_EXIT: 248c74593cd394ae2135d910915a6a455e0a5cea221vanjeff gBS->RestoreTPL (OldTpl); 249c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 250c74593cd394ae2135d910915a6a455e0a5cea221vanjeff return EfiStatus; 251c74593cd394ae2135d910915a6a455e0a5cea221vanjeff} 252