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