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