Initialize.c revision 4cda7726e5fd30aaf3e05c80207ae1b264bfa123
1c74593cd394ae2135d910915a6a455e0a5cea221vanjeff/** @file 24cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Implementation of initializing a network adapter. 34cda7726e5fd30aaf3e05c80207ae1b264bfa123niry 44cda7726e5fd30aaf3e05c80207ae1b264bfa123niryCopyright (c) 2004 - 2008, Intel Corporation. <BR> 54cda7726e5fd30aaf3e05c80207ae1b264bfa123niryAll rights reserved. This 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/** 19c74593cd394ae2135d910915a6a455e0a5cea221vanjeff this routine calls undi to initialize the interface. 20c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 214cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @param Snp pointer to snp driver structure 224cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @param CableDetectFlag Do/don't detect the cable (depending on what undi supports) 234cda7726e5fd30aaf3e05c80207ae1b264bfa123niry 244cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @retval EFI_SUCCESS UNDI is initialized successfully 254cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @retval EFI_DEVICE_ERROR UNDI could not be initialized 264cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @retval Other other errors 27c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 28c74593cd394ae2135d910915a6a455e0a5cea221vanjeff**/ 29c74593cd394ae2135d910915a6a455e0a5cea221vanjeffEFI_STATUS 304cda7726e5fd30aaf3e05c80207ae1b264bfa123niryPxeInit ( 314cda7726e5fd30aaf3e05c80207ae1b264bfa123niry SNP_DRIVER *Snp, 32c74593cd394ae2135d910915a6a455e0a5cea221vanjeff UINT16 CableDetectFlag 33c74593cd394ae2135d910915a6a455e0a5cea221vanjeff ) 34c74593cd394ae2135d910915a6a455e0a5cea221vanjeff{ 354cda7726e5fd30aaf3e05c80207ae1b264bfa123niry PXE_CPB_INITIALIZE *Cpb; 364cda7726e5fd30aaf3e05c80207ae1b264bfa123niry VOID *Addr; 37c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EFI_STATUS Status; 38c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 394cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb = Snp->Cpb; 404cda7726e5fd30aaf3e05c80207ae1b264bfa123niry if (Snp->TxRxBufferSize != 0) { 414cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Status = Snp->PciIo->AllocateBuffer ( 424cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->PciIo, 434cda7726e5fd30aaf3e05c80207ae1b264bfa123niry AllocateAnyPages, 444cda7726e5fd30aaf3e05c80207ae1b264bfa123niry EfiBootServicesData, 454cda7726e5fd30aaf3e05c80207ae1b264bfa123niry SNP_MEM_PAGES (Snp->TxRxBufferSize), 464cda7726e5fd30aaf3e05c80207ae1b264bfa123niry &Addr, 474cda7726e5fd30aaf3e05c80207ae1b264bfa123niry 0 484cda7726e5fd30aaf3e05c80207ae1b264bfa123niry ); 49c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 50c74593cd394ae2135d910915a6a455e0a5cea221vanjeff if (Status != EFI_SUCCESS) { 51c74593cd394ae2135d910915a6a455e0a5cea221vanjeff DEBUG ( 52c74593cd394ae2135d910915a6a455e0a5cea221vanjeff (EFI_D_ERROR, 534cda7726e5fd30aaf3e05c80207ae1b264bfa123niry "\nSnp->PxeInit() AllocateBuffer %xh (%r)\n", 54c74593cd394ae2135d910915a6a455e0a5cea221vanjeff Status, 55c74593cd394ae2135d910915a6a455e0a5cea221vanjeff Status) 56c74593cd394ae2135d910915a6a455e0a5cea221vanjeff ); 57c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 58c74593cd394ae2135d910915a6a455e0a5cea221vanjeff return Status; 59c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 60c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 614cda7726e5fd30aaf3e05c80207ae1b264bfa123niry ASSERT (Addr); 62c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 634cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->TxRxBuffer = Addr; 64c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 65c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 664cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->MemoryAddr = (UINT64)(UINTN) Snp->TxRxBuffer; 67c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 684cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->MemoryLength = Snp->TxRxBufferSize; 69c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 70c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // 71c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // let UNDI decide/detect these values 72c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // 734cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->LinkSpeed = 0; 744cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->TxBufCnt = 0; 754cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->TxBufSize = 0; 764cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->RxBufCnt = 0; 774cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->RxBufSize = 0; 78c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 794cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->DuplexMode = PXE_DUPLEX_DEFAULT; 80c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 814cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Cpb->LoopBackMode = LOOPBACK_NORMAL; 82c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 834cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.OpCode = PXE_OPCODE_INITIALIZE; 844cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.OpFlags = CableDetectFlag; 85c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 864cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.CPBsize = sizeof (PXE_CPB_INITIALIZE); 874cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.DBsize = sizeof (PXE_DB_INITIALIZE); 88c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 894cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.CPBaddr = (UINT64)(UINTN) Snp->Cpb; 904cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.DBaddr = (UINT64)(UINTN) Snp->Db; 91c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 924cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.StatCode = PXE_STATCODE_INITIALIZE; 934cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.StatFlags = PXE_STATFLAGS_INITIALIZE; 944cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.IFnum = Snp->IfNum; 954cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.Control = PXE_CONTROL_LAST_CDB_IN_LIST; 96c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 974cda7726e5fd30aaf3e05c80207ae1b264bfa123niry DEBUG ((EFI_D_NET, "\nSnp->undi.initialize() ")); 98c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 994cda7726e5fd30aaf3e05c80207ae1b264bfa123niry (*Snp->IssueUndi32Command) ((UINT64)(UINTN) &Snp->Cdb); 100c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1014cda7726e5fd30aaf3e05c80207ae1b264bfa123niry if (Snp->Cdb.StatCode == PXE_STATCODE_SUCCESS) { 1024cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Mode.State = EfiSimpleNetworkInitialized; 103c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 104c74593cd394ae2135d910915a6a455e0a5cea221vanjeff Status = EFI_SUCCESS; 105c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } else { 106c74593cd394ae2135d910915a6a455e0a5cea221vanjeff DEBUG ( 107c74593cd394ae2135d910915a6a455e0a5cea221vanjeff (EFI_D_WARN, 1084cda7726e5fd30aaf3e05c80207ae1b264bfa123niry "\nSnp->undi.initialize() %xh:%xh\n", 1094cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.StatFlags, 1104cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Cdb.StatCode) 111c74593cd394ae2135d910915a6a455e0a5cea221vanjeff ); 112c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1134cda7726e5fd30aaf3e05c80207ae1b264bfa123niry if (Snp->TxRxBuffer != NULL) { 1144cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->PciIo->FreeBuffer ( 1154cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->PciIo, 1164cda7726e5fd30aaf3e05c80207ae1b264bfa123niry SNP_MEM_PAGES (Snp->TxRxBufferSize), 1174cda7726e5fd30aaf3e05c80207ae1b264bfa123niry (VOID *) Snp->TxRxBuffer 118c74593cd394ae2135d910915a6a455e0a5cea221vanjeff ); 119c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 120c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1214cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->TxRxBuffer = NULL; 122c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1234cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Status = EFI_DEVICE_ERROR; 124c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 125c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 126c74593cd394ae2135d910915a6a455e0a5cea221vanjeff return Status; 127c74593cd394ae2135d910915a6a455e0a5cea221vanjeff} 128c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 129c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 130c74593cd394ae2135d910915a6a455e0a5cea221vanjeff/** 1314cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Resets a network adapter and allocates the transmit and receive buffers 1324cda7726e5fd30aaf3e05c80207ae1b264bfa123niry required by the network interface; optionally, also requests allocation of 1334cda7726e5fd30aaf3e05c80207ae1b264bfa123niry additional transmit and receive buffers. 1344cda7726e5fd30aaf3e05c80207ae1b264bfa123niry 1354cda7726e5fd30aaf3e05c80207ae1b264bfa123niry This function allocates the transmit and receive buffers required by the network 1364cda7726e5fd30aaf3e05c80207ae1b264bfa123niry interface. If this allocation fails, then EFI_OUT_OF_RESOURCES is returned. 1374cda7726e5fd30aaf3e05c80207ae1b264bfa123niry If the allocation succeeds and the network interface is successfully initialized, 1384cda7726e5fd30aaf3e05c80207ae1b264bfa123niry then EFI_SUCCESS will be returned. 1394cda7726e5fd30aaf3e05c80207ae1b264bfa123niry 1404cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @param This A pointer to the EFI_SIMPLE_NETWORK_PROTOCOL instance. 1414cda7726e5fd30aaf3e05c80207ae1b264bfa123niry 1424cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @param ExtraRxBufferSize The size, in bytes, of the extra receive buffer space 1434cda7726e5fd30aaf3e05c80207ae1b264bfa123niry that the driver should allocate for the network interface. 1444cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Some network interfaces will not be able to use the 1454cda7726e5fd30aaf3e05c80207ae1b264bfa123niry extra buffer, and the caller will not know if it is 1464cda7726e5fd30aaf3e05c80207ae1b264bfa123niry actually being used. 1474cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @param ExtraTxBufferSize The size, in bytes, of the extra transmit buffer space 1484cda7726e5fd30aaf3e05c80207ae1b264bfa123niry that the driver should allocate for the network interface. 1494cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Some network interfaces will not be able to use the 1504cda7726e5fd30aaf3e05c80207ae1b264bfa123niry extra buffer, and the caller will not know if it is 1514cda7726e5fd30aaf3e05c80207ae1b264bfa123niry actually being used. 1524cda7726e5fd30aaf3e05c80207ae1b264bfa123niry 1534cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @retval EFI_SUCCESS The network interface was initialized. 1544cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @retval EFI_NOT_STARTED The network interface has not been started. 1554cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @retval EFI_OUT_OF_RESOURCES There was not enough memory for the transmit and 1564cda7726e5fd30aaf3e05c80207ae1b264bfa123niry receive buffers. 1574cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @retval EFI_INVALID_PARAMETER This parameter was NULL or did not point to a valid 1584cda7726e5fd30aaf3e05c80207ae1b264bfa123niry EFI_SIMPLE_NETWORK_PROTOCOL structure. 1594cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @retval EFI_DEVICE_ERROR The command could not be sent to the network interface. 1604cda7726e5fd30aaf3e05c80207ae1b264bfa123niry @retval EFI_UNSUPPORTED The increased buffer size feature is not supported. 161c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 162c74593cd394ae2135d910915a6a455e0a5cea221vanjeff**/ 163c74593cd394ae2135d910915a6a455e0a5cea221vanjeffEFI_STATUS 164c74593cd394ae2135d910915a6a455e0a5cea221vanjeffEFIAPI 1654cda7726e5fd30aaf3e05c80207ae1b264bfa123nirySnpUndi32Initialize ( 1664cda7726e5fd30aaf3e05c80207ae1b264bfa123niry IN EFI_SIMPLE_NETWORK_PROTOCOL *This, 1674cda7726e5fd30aaf3e05c80207ae1b264bfa123niry IN UINTN ExtraRxBufferSize OPTIONAL, 1684cda7726e5fd30aaf3e05c80207ae1b264bfa123niry IN UINTN ExtraTxBufferSize OPTIONAL 169c74593cd394ae2135d910915a6a455e0a5cea221vanjeff ) 170c74593cd394ae2135d910915a6a455e0a5cea221vanjeff{ 171c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EFI_STATUS EfiStatus; 1724cda7726e5fd30aaf3e05c80207ae1b264bfa123niry SNP_DRIVER *Snp; 173c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EFI_TPL OldTpl; 174c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1754cda7726e5fd30aaf3e05c80207ae1b264bfa123niry if (This == NULL) { 176c74593cd394ae2135d910915a6a455e0a5cea221vanjeff return EFI_INVALID_PARAMETER; 177c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 178c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1794cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp = EFI_SIMPLE_NETWORK_DEV_FROM_THIS (This); 180c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 181c74593cd394ae2135d910915a6a455e0a5cea221vanjeff OldTpl = gBS->RaiseTPL (TPL_CALLBACK); 182c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1834cda7726e5fd30aaf3e05c80207ae1b264bfa123niry if (Snp == NULL) { 184c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EfiStatus = EFI_INVALID_PARAMETER; 185c74593cd394ae2135d910915a6a455e0a5cea221vanjeff goto ON_EXIT; 186c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 187c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 1884cda7726e5fd30aaf3e05c80207ae1b264bfa123niry switch (Snp->Mode.State) { 189c74593cd394ae2135d910915a6a455e0a5cea221vanjeff case EfiSimpleNetworkStarted: 190c74593cd394ae2135d910915a6a455e0a5cea221vanjeff break; 191c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 192c74593cd394ae2135d910915a6a455e0a5cea221vanjeff case EfiSimpleNetworkStopped: 193c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EfiStatus = EFI_NOT_STARTED; 194c74593cd394ae2135d910915a6a455e0a5cea221vanjeff goto ON_EXIT; 195c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 196c74593cd394ae2135d910915a6a455e0a5cea221vanjeff default: 197c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EfiStatus = EFI_DEVICE_ERROR; 198c74593cd394ae2135d910915a6a455e0a5cea221vanjeff goto ON_EXIT; 199c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 200c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 201c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EfiStatus = gBS->CreateEvent ( 202c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EVT_NOTIFY_WAIT, 203c74593cd394ae2135d910915a6a455e0a5cea221vanjeff TPL_NOTIFY, 204c74593cd394ae2135d910915a6a455e0a5cea221vanjeff &SnpWaitForPacketNotify, 2054cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp, 2064cda7726e5fd30aaf3e05c80207ae1b264bfa123niry &Snp->Snp.WaitForPacket 207c74593cd394ae2135d910915a6a455e0a5cea221vanjeff ); 208c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 209c74593cd394ae2135d910915a6a455e0a5cea221vanjeff if (EFI_ERROR (EfiStatus)) { 2104cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Snp.WaitForPacket = NULL; 211c74593cd394ae2135d910915a6a455e0a5cea221vanjeff EfiStatus = EFI_DEVICE_ERROR; 212c74593cd394ae2135d910915a6a455e0a5cea221vanjeff goto ON_EXIT; 213c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 214c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // 215c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // 216c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // 2174cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Mode.MCastFilterCount = 0; 2184cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Mode.ReceiveFilterSetting = 0; 2194cda7726e5fd30aaf3e05c80207ae1b264bfa123niry ZeroMem (Snp->Mode.MCastFilter, sizeof Snp->Mode.MCastFilter); 220c74593cd394ae2135d910915a6a455e0a5cea221vanjeff CopyMem ( 2214cda7726e5fd30aaf3e05c80207ae1b264bfa123niry &Snp->Mode.CurrentAddress, 2224cda7726e5fd30aaf3e05c80207ae1b264bfa123niry &Snp->Mode.PermanentAddress, 223c74593cd394ae2135d910915a6a455e0a5cea221vanjeff sizeof (EFI_MAC_ADDRESS) 224c74593cd394ae2135d910915a6a455e0a5cea221vanjeff ); 225c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 226c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // 227c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // Compute tx/rx buffer sizes based on UNDI init info and parameters. 228c74593cd394ae2135d910915a6a455e0a5cea221vanjeff // 2294cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->TxRxBufferSize = (UINT32) (Snp->InitInfo.MemoryRequired + ExtraRxBufferSize + ExtraTxBufferSize); 230c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 2314cda7726e5fd30aaf3e05c80207ae1b264bfa123niry if (Snp->Mode.MediaPresentSupported) { 2324cda7726e5fd30aaf3e05c80207ae1b264bfa123niry if (PxeInit (Snp, PXE_OPFLAGS_INITIALIZE_DETECT_CABLE) == EFI_SUCCESS) { 2334cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Mode.MediaPresent = TRUE; 234c74593cd394ae2135d910915a6a455e0a5cea221vanjeff goto ON_EXIT; 235c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 236c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 237c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 2384cda7726e5fd30aaf3e05c80207ae1b264bfa123niry Snp->Mode.MediaPresent = FALSE; 239c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 2404cda7726e5fd30aaf3e05c80207ae1b264bfa123niry EfiStatus = PxeInit (Snp, PXE_OPFLAGS_INITIALIZE_DO_NOT_DETECT_CABLE); 241c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 242c74593cd394ae2135d910915a6a455e0a5cea221vanjeff if (EFI_ERROR (EfiStatus)) { 2434cda7726e5fd30aaf3e05c80207ae1b264bfa123niry gBS->CloseEvent (Snp->Snp.WaitForPacket); 244c74593cd394ae2135d910915a6a455e0a5cea221vanjeff } 245c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 246c74593cd394ae2135d910915a6a455e0a5cea221vanjeffON_EXIT: 247c74593cd394ae2135d910915a6a455e0a5cea221vanjeff gBS->RestoreTPL (OldTpl); 248c74593cd394ae2135d910915a6a455e0a5cea221vanjeff 249c74593cd394ae2135d910915a6a455e0a5cea221vanjeff return EfiStatus; 250c74593cd394ae2135d910915a6a455e0a5cea221vanjeff} 251