16ae81428485020dd371eaefa5b97b24f21efe117klu/** @file
25f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
38f2a5f8012e3a6de30f5b12ce3a218efae9eaeddhhtian Copyright (c) 2010, Apple, Inc. All rights reserved.<BR>
48f2a5f8012e3a6de30f5b12ce3a218efae9eaeddhhtian Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
55f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
65f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    This program and the accompanying materials
75f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    are licensed and made available under the terms and conditions of the BSD License
85f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    which accompanies this distribution. The full text of the license may be found at
95f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    http://opensource.org/licenses/bsd-license.php
105f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
115f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
125f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
135f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
145f44f5b9bb21baefa954c0c36b5e86957ee68b86kluModule Name:
155f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
165f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnp.c
175f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
185f44f5b9bb21baefa954c0c36b5e86957ee68b86kluAbstract:
195f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
205f44f5b9bb21baefa954c0c36b5e86957ee68b86klu-**/
215f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
225f44f5b9bb21baefa954c0c36b5e86957ee68b86klu#include "EmuSnpDxe.h"
235f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
245f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
255f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
265f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFI_SIMPLE_NETWORK_PROTOCOL gEmuSnpTemplate = {
275f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI_SIMPLE_NETWORK_PROTOCOL_REVISION,
285f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnpStart,
295f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnpStop,
305f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnpInitialize,
315f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnpReset,
325f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnpShutdown,
335f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnpReceiveFilters,
345f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnpStationAddress,
355f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnpStatistics,
365f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnpMcastIptoMac,
375f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnpNvdata,
385f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnpGetStatus,
395f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnpTransmit,
405f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnpReceive,
415f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  NULL,                     // WaitForPacket
425f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  NULL                      // Mode
435f44f5b9bb21baefa954c0c36b5e86957ee68b86klu };
445f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
455f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFI_SIMPLE_NETWORK_MODE gEmuSnpModeTemplate = {
466ae81428485020dd371eaefa5b97b24f21efe117klu  EfiSimpleNetworkStopped,      //  State
475f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  NET_ETHER_ADDR_LEN,           //  HwAddressSize
485f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  NET_ETHER_HEADER_SIZE,        //  MediaHeaderSize
495f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  1500,                         //  MaxPacketSize
505f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  0,                            //  NvRamSize
515f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  0,                            //  NvRamAccessSize
525f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  0,                            //  ReceiveFilterMask
535f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  0,                            //  ReceiveFilterSetting
545f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  MAX_MCAST_FILTER_CNT,         //  MaxMCastFilterCount
555f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  0,                            //  MCastFilterCount
565f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  {
575f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    { { 0 } }
585f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  },                            //  MCastFilter
5982408a47c9a982ceea9290dfe2d38ece14d8c867xli  {
6082408a47c9a982ceea9290dfe2d38ece14d8c867xli    { 0 }
6182408a47c9a982ceea9290dfe2d38ece14d8c867xli  },                            //  CurrentAddress
6282408a47c9a982ceea9290dfe2d38ece14d8c867xli  {
6382408a47c9a982ceea9290dfe2d38ece14d8c867xli    { 0 }
645f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  },                            //  BroadcastAddress
65ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  {
66ff72001b5b0e581e53614015d93abd1107bee25bniruiyu    { 0 }
67ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  },                            //  PermanentAddress
68ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  NET_IFTYPE_ETHERNET,          //  IfType
69ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  FALSE,                        //  MacAddressChangeable
70ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  FALSE,                        //  MultipleTxSupported
71ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  FALSE,                        //  MediaPresentSupported
72ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  TRUE                          //  MediaPresent
73ff72001b5b0e581e53614015d93abd1107bee25bniruiyu};
74ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
75ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
76ff72001b5b0e581e53614015d93abd1107bee25bniruiyu/**
77ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  Changes the state of a network interface from "stopped" to "started".
78ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
79ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  @param  This Protocol instance pointer.
80ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
81ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  @retval EFI_SUCCESS           Always succeeds.
82ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
83ff72001b5b0e581e53614015d93abd1107bee25bniruiyu**/
84ff72001b5b0e581e53614015d93abd1107bee25bniruiyuEFI_STATUS
85ff72001b5b0e581e53614015d93abd1107bee25bniruiyuEFIAPI
86ff72001b5b0e581e53614015d93abd1107bee25bniruiyuEmuSnpStart(
87ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  IN EFI_SIMPLE_NETWORK_PROTOCOL    *This
88ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  )
89ff72001b5b0e581e53614015d93abd1107bee25bniruiyu{
90ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  EFI_STATUS              Status;
91ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  EMU_SNP_PRIVATE_DATA    *Private;
92ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
93ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
94ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
95ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  Status = Private->Io->Start (Private->Io);
96ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  return Status;
97ff72001b5b0e581e53614015d93abd1107bee25bniruiyu}
98ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
99ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
100ff72001b5b0e581e53614015d93abd1107bee25bniruiyu/**
101ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  Changes the state of a network interface from "started" to "stopped".
102ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
103ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  @param  This Protocol instance pointer.
104ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
105ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  @retval EFI_SUCCESS           Always succeeds.
106ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
107ff72001b5b0e581e53614015d93abd1107bee25bniruiyu**/
108ff72001b5b0e581e53614015d93abd1107bee25bniruiyuEFI_STATUS
109ff72001b5b0e581e53614015d93abd1107bee25bniruiyuEFIAPI
1105f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEmuSnpStop (
1115f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_SIMPLE_NETWORK_PROTOCOL    *This
1125f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  )
1135f44f5b9bb21baefa954c0c36b5e86957ee68b86klu{
1145f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI_STATUS              Status;
1155f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EMU_SNP_PRIVATE_DATA    *Private;
1165f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
1175f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
1185f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
1195f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = Private->Io->Stop (Private->Io);
1205f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  return Status;
1215f44f5b9bb21baefa954c0c36b5e86957ee68b86klu}
1225f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
1235f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
1245f44f5b9bb21baefa954c0c36b5e86957ee68b86klu/**
1255f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Resets a network adapter and allocates the transmit and receive buffers
1265f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  required by the network interface; optionally, also requests allocation
1275f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  of additional transmit and receive buffers.
1285f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
1295f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  This              Protocol instance pointer.
1305f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  ExtraRxBufferSize The size, in bytes, of the extra receive buffer space
13104369cd8fc2523bd45dccb1f615f97c950ed3c63qhuang                            that the driver should allocate for the network interface.
1325f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                            Some network interfaces will not be able to use the extra
1335f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                            buffer, and the caller will not know if it is actually
1345f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                            being used.
1355f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  ExtraTxBufferSize The size, in bytes, of the extra transmit buffer space
1365f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                            that the driver should allocate for the network interface.
13704369cd8fc2523bd45dccb1f615f97c950ed3c63qhuang                            Some network interfaces will not be able to use the extra
1385f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                            buffer, and the caller will not know if it is actually
1395f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                            being used.
1405f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
1415f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_SUCCESS           Always succeeds.
1425f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
1435f44f5b9bb21baefa954c0c36b5e86957ee68b86klu**/
1445f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFI_STATUS
1455f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFIAPI
1465f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEmuSnpInitialize (
1475f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_SIMPLE_NETWORK_PROTOCOL    *This,
1485f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN UINTN                          ExtraRxBufferSize OPTIONAL,
1495f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN UINTN                          ExtraTxBufferSize OPTIONAL
1505f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  )
1515f44f5b9bb21baefa954c0c36b5e86957ee68b86klu{
1525f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI_STATUS              Status;
1535f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EMU_SNP_PRIVATE_DATA    *Private;
1545f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
1555f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
1565f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
1575f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = Private->Io->Initialize (Private->Io, ExtraRxBufferSize, ExtraTxBufferSize);
1585f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  return Status;
1595f44f5b9bb21baefa954c0c36b5e86957ee68b86klu}
1605f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
1615f44f5b9bb21baefa954c0c36b5e86957ee68b86klu/**
1625f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Resets a network adapter and re-initializes it with the parameters that were
1635f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  provided in the previous call to Initialize().
1645f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
1655f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  This                 Protocol instance pointer.
1665f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  ExtendedVerification Indicates that the driver may perform a more
1675f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                               exhaustive verification operation of the device
1685f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                               during reset.
169ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
170ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  @retval EFI_SUCCESS           Always succeeds.
171ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
172ff72001b5b0e581e53614015d93abd1107bee25bniruiyu**/
173ff72001b5b0e581e53614015d93abd1107bee25bniruiyuEFI_STATUS
174ff72001b5b0e581e53614015d93abd1107bee25bniruiyuEFIAPI
175ff72001b5b0e581e53614015d93abd1107bee25bniruiyuEmuSnpReset (
176ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  IN EFI_SIMPLE_NETWORK_PROTOCOL    *This,
177ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  IN BOOLEAN                        ExtendedVerification
178e74c3676e651f79d27afa986c5837eb1e103fe84mdkinney  )
1795f44f5b9bb21baefa954c0c36b5e86957ee68b86klu{
1805f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI_STATUS              Status;
181f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  EMU_SNP_PRIVATE_DATA    *Private;
182f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
183f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
184f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
185f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  Status = Private->Io->Reset (Private->Io, ExtendedVerification);
186f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  return Status;
187f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff}
188f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
189f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff/**
190f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  Resets a network adapter and leaves it in a state that is safe for
191f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  another driver to initialize.
192f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
193f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @param  This Protocol instance pointer.
194f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
195f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @retval EFI_SUCCESS           Always succeeds.
196f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
197f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff**/
198f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeffEFI_STATUS
199f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeffEFIAPI
200f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeffEmuSnpShutdown (
201f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  IN EFI_SIMPLE_NETWORK_PROTOCOL    *This
202f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  )
203f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff{
204f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  EFI_STATUS              Status;
205f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  EMU_SNP_PRIVATE_DATA    *Private;
206f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
207f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
208f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
209f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  Status = Private->Io->Shutdown (Private->Io);
210f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  return Status;
211f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff}
212f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
213f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff/**
214f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  Manages the multicast receive filters of a network interface.
215f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
216f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @param  This               Protocol instance pointer.
217f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @param  EnableBits         A bit mask of receive filters to enable on the network interface.
218f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @param  DisableBits        A bit mask of receive filters to disable on the network interface.
219ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  @param  ResetMcastFilter   Set to TRUE to reset the contents of the multicast receive
220ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                             filters on the network interface to their default values.
221ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  @param  McastFilterCount   Number of multicast HW MAC addresses in the new
222ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                             MCastFilter list. This value must be less than or equal to
223ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                             the MCastFilterCnt field of EFI_SIMPLE_NETWORK_MODE. This
224ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                             field is optional if ResetMCastFilter is TRUE.
225ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  @param  McastFilter        A pointer to a list of new multicast receive filter HW MAC
226ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                             addresses. This list will replace any existing multicast
227ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                             HW MAC address list. This field is optional if
228ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                             ResetMCastFilter is TRUE.
229ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
230f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @retval EFI_SUCCESS           The multicast receive filter list was updated.
231f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @retval EFI_DEVICE_ERROR      The command could not be sent to the network interface.
232f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
233f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff**/
2345f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFI_STATUS
2355f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFIAPI
2365f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEmuSnpReceiveFilters (
2375f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_SIMPLE_NETWORK_PROTOCOL    *This,
238f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  IN UINT32                         EnableBits,
239f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  IN UINT32                         DisableBits,
2405f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN BOOLEAN                        ResetMcastFilter,
2415f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN UINTN                          McastFilterCount OPTIONAL,
2425f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_MAC_ADDRESS                *McastFilter OPTIONAL
2435f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  )
2445f44f5b9bb21baefa954c0c36b5e86957ee68b86klu{
245ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  EFI_STATUS              Status;
246ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  EMU_SNP_PRIVATE_DATA    *Private;
247ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
248ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
249ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
250ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  Status = Private->Io->ReceiveFilters (
251ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                          Private->Io,
252ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                          EnableBits,
253ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                          DisableBits,
254ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                          ResetMcastFilter,
255ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                          McastFilterCount,
256ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                          McastFilter
257ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                          );
258ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  return Status;
259ff72001b5b0e581e53614015d93abd1107bee25bniruiyu}
260ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
261ff72001b5b0e581e53614015d93abd1107bee25bniruiyu/**
262ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  Modifies or resets the current station address, if supported.
263ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
264ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  @param  This         Protocol instance pointer.
265e74c3676e651f79d27afa986c5837eb1e103fe84mdkinney  @param  Reset        Flag used to reset the station address to the network interfaces
266e74c3676e651f79d27afa986c5837eb1e103fe84mdkinney                       permanent address.
267e74c3676e651f79d27afa986c5837eb1e103fe84mdkinney  @param  NewMacAddr   New station address to be used for the network interface.
268e74c3676e651f79d27afa986c5837eb1e103fe84mdkinney
269e74c3676e651f79d27afa986c5837eb1e103fe84mdkinney  @retval EFI_UNSUPPORTED       Not supported yet.
270ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
271ff72001b5b0e581e53614015d93abd1107bee25bniruiyu**/
272ff72001b5b0e581e53614015d93abd1107bee25bniruiyuEFI_STATUS
273ff72001b5b0e581e53614015d93abd1107bee25bniruiyuEFIAPI
274ff72001b5b0e581e53614015d93abd1107bee25bniruiyuEmuSnpStationAddress (
275ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  IN EFI_SIMPLE_NETWORK_PROTOCOL    *This,
276ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  IN BOOLEAN                        Reset,
277ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  IN EFI_MAC_ADDRESS                *NewMacAddr OPTIONAL
278ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  )
279ff72001b5b0e581e53614015d93abd1107bee25bniruiyu{
280e74c3676e651f79d27afa986c5837eb1e103fe84mdkinney  EFI_STATUS              Status;
281e74c3676e651f79d27afa986c5837eb1e103fe84mdkinney  EMU_SNP_PRIVATE_DATA    *Private;
282e74c3676e651f79d27afa986c5837eb1e103fe84mdkinney
283e74c3676e651f79d27afa986c5837eb1e103fe84mdkinney  Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
284ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
285ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  Status = Private->Io->StationAddress (Private->Io, Reset, NewMacAddr);
286ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  return Status;
287ff72001b5b0e581e53614015d93abd1107bee25bniruiyu}
288ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
289ff72001b5b0e581e53614015d93abd1107bee25bniruiyu/**
2905f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Resets or collects the statistics on a network interface.
2915f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
2925f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  This            Protocol instance pointer.
2935f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  Reset           Set to TRUE to reset the statistics for the network interface.
2945f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  StatisticsSize  On input the size, in bytes, of StatisticsTable. On
2955f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          output the size, in bytes, of the resulting table of
296f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff                          statistics.
297af4a63857cd189964cc2c6b53b54483efaba78a3vanjeff  @param  StatisticsTable A pointer to the EFI_NETWORK_STATISTICS structure that
298f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff                          contains the statistics.
2995f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
3005f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_SUCCESS           The statistics were collected from the network interface.
301f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @retval EFI_NOT_STARTED       The network interface has not been started.
3025f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_BUFFER_TOO_SMALL  The Statistics buffer was too small. The current buffer
3035f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                                size needed to hold the statistics is returned in
3045f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                                StatisticsSize.
3055f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_UNSUPPORTED       Not supported yet.
306f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
307f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff**/
308f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeffEFI_STATUS
3095f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFIAPI
3105f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEmuSnpStatistics (
311f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  IN EFI_SIMPLE_NETWORK_PROTOCOL    *This,
312f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  IN BOOLEAN                        Reset,
3135f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN OUT UINTN                      *StatisticsSize OPTIONAL,
3145f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  OUT EFI_NETWORK_STATISTICS        *StatisticsTable OPTIONAL
3155f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  )
3165f44f5b9bb21baefa954c0c36b5e86957ee68b86klu{
3175f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI_STATUS              Status;
3185f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EMU_SNP_PRIVATE_DATA    *Private;
3195f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
3205f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
3215f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
3225f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = Private->Io->Statistics (Private->Io, Reset, StatisticsSize, StatisticsTable);
3235f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  return Status;
3245f44f5b9bb21baefa954c0c36b5e86957ee68b86klu}
3255f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
326f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff/**
327f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  Converts a multicast IP address to a multicast HW MAC address.
328f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
329f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @param  This Protocol instance pointer.
330f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @param  Ipv6 Set to TRUE if the multicast IP address is IPv6 [RFC 2460]. Set
331f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff               to FALSE if the multicast IP address is IPv4 [RFC 791].
332f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @param  Ip   The multicast IP address that is to be converted to a multicast
333f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff               HW MAC address.
334f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @param  Mac  The multicast HW MAC address that is to be generated from IP.
335f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
3365f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_SUCCESS           The multicast IP address was mapped to the multicast
3375f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                                HW MAC address.
3385f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_NOT_STARTED       The network interface has not been started.
3395f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_BUFFER_TOO_SMALL  The Statistics buffer was too small. The current buffer
3405f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                                size needed to hold the statistics is returned in
3415f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                                StatisticsSize.
3425f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_UNSUPPORTED       Not supported yet.
3435f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
3445f44f5b9bb21baefa954c0c36b5e86957ee68b86klu**/
3455f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFI_STATUS
3465f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFIAPI
3475f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEmuSnpMcastIptoMac (
3485f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_SIMPLE_NETWORK_PROTOCOL    *This,
3495f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN BOOLEAN                        Ipv6,
3505f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_IP_ADDRESS                 *Ip,
351f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  OUT EFI_MAC_ADDRESS               *Mac
3525f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  )
3535f44f5b9bb21baefa954c0c36b5e86957ee68b86klu{
3545f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI_STATUS              Status;
3555f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EMU_SNP_PRIVATE_DATA    *Private;
3565f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
3575f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
3585f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
3595f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = Private->Io->MCastIpToMac (Private->Io, Ipv6, Ip, Mac);
3605f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  return Status;
3615f44f5b9bb21baefa954c0c36b5e86957ee68b86klu}
3625f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
3635f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
3645f44f5b9bb21baefa954c0c36b5e86957ee68b86klu/**
3655f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Performs read and write operations on the NVRAM device attached to a
3665f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  network interface.
3675f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
3685f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  This         Protocol instance pointer.
3695f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  ReadOrWrite  TRUE for read operations, FALSE for write operations.
3705f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  Offset       Byte offset in the NVRAM device at which to start the read or
3715f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                       write operation. This must be a multiple of NvRamAccessSize and
3725f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                       less than NvRamSize.
3735f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  BufferSize   The number of bytes to read or write from the NVRAM device.
3745f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                       This must also be a multiple of NvramAccessSize.
3755f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  Buffer       A pointer to the data buffer.
3765f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
3775f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_UNSUPPORTED       Not supported yet.
3785f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
3795f44f5b9bb21baefa954c0c36b5e86957ee68b86klu**/
3805f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFI_STATUS
3815f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFIAPI
3825f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEmuSnpNvdata (
3835f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_SIMPLE_NETWORK_PROTOCOL    *This,
3845f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN BOOLEAN                        ReadOrWrite,
385ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  IN UINTN                          Offset,
3865f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN UINTN                          BufferSize,
3875f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN OUT VOID                       *Buffer
3885f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  )
3895f44f5b9bb21baefa954c0c36b5e86957ee68b86klu{
3905f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI_STATUS              Status;
391ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  EMU_SNP_PRIVATE_DATA    *Private;
392ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
393ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
394ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
395ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  Status = Private->Io->NvData (Private->Io, ReadOrWrite, Offset, BufferSize, Buffer);
3965f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  return Status;
3975f44f5b9bb21baefa954c0c36b5e86957ee68b86klu}
3985f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
3995f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
4005f44f5b9bb21baefa954c0c36b5e86957ee68b86klu/**
401ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  Reads the current interrupt status and recycled transmit buffer status from
4025f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  a network interface.
4035f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
4045f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  This            Protocol instance pointer.
4055f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  InterruptStatus A pointer to the bit mask of the currently active interrupts
4066394182967f63d4a97a1c882861d9958657112bbqwang                          If this is NULL, the interrupt status will not be read from
4075f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          the device. If this is not NULL, the interrupt status will
4085f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          be read from the device. When the  interrupt status is read,
4095f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          it will also be cleared. Clearing the transmit  interrupt
4105f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          does not empty the recycled transmit buffer array.
4115f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  TxBuffer        Recycled transmit buffer address. The network interface will
4125f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          not transmit if its internal recycled transmit buffer array
4135f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          is full. Reading the transmit buffer does not clear the
4145f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          transmit interrupt. If this is NULL, then the transmit buffer
4155f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          status will not be read. If there are no transmit buffers to
4165f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          recycle and TxBuf is not NULL, * TxBuf will be set to NULL.
4175f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
4185f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_SUCCESS           Always succeeds.
4195f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
4205f44f5b9bb21baefa954c0c36b5e86957ee68b86klu**/
4216394182967f63d4a97a1c882861d9958657112bbqwangEFI_STATUS
4225f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFIAPI
4235f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEmuSnpGetStatus (
4245f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_SIMPLE_NETWORK_PROTOCOL    *This,
4255f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  OUT UINT32                        *InterruptStatus,
4265f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  OUT VOID                          **TxBuffer
4275f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  )
4285f44f5b9bb21baefa954c0c36b5e86957ee68b86klu{
4295f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI_STATUS              Status;
4305f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EMU_SNP_PRIVATE_DATA    *Private;
4315f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
4325f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
4335f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
4345f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = Private->Io->GetStatus (Private->Io, InterruptStatus, TxBuffer);
4355f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  return Status;
4365f44f5b9bb21baefa954c0c36b5e86957ee68b86klu}
4375f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
438f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
439f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff/**
440f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  Places a packet in the transmit queue of a network interface.
441f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
4425f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  This       Protocol instance pointer.
4435f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  HeaderSize The size, in bytes, of the media header to be filled in by
4445f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                     the Transmit() function. If HeaderSize is non-zero, then it
4455f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                     must be equal to This->Mode->MediaHeaderSize and the DestAddr
4465f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                     and Protocol parameters must not be NULL.
4475f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  BufferSize The size, in bytes, of the entire packet (media header and
4485f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                     data) to be transmitted through the network interface.
4495f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  Buffer     A pointer to the packet (media header followed by data) to be
4505f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                     transmitted. This parameter cannot be NULL. If HeaderSize is zero,
4515f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                     then the media header in Buffer must already be filled in by the
4525f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                     caller. If HeaderSize is non-zero, then the media header will be
4535f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                     filled in by the Transmit() function.
4545f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  SrcAddr    The source HW MAC address. If HeaderSize is zero, then this parameter
4555f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                     is ignored. If HeaderSize is non-zero and SrcAddr is NULL, then
4565f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                     This->Mode->CurrentAddress is used for the source HW MAC address.
4575f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  DestAddr   The destination HW MAC address. If HeaderSize is zero, then this
4585f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                     parameter is ignored.
4595f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  Protocol   The type of header to build. If HeaderSize is zero, then this
4605f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                     parameter is ignored. See RFC 1700, section "Ether Types", for
461ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                     examples.
4625f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
4635f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_SUCCESS           The packet was placed on the transmit queue.
4645f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_DEVICE_ERROR      The command could not be sent to the network interface.
4656394182967f63d4a97a1c882861d9958657112bbqwang  @retval EFI_INVALID_PARAMETER One or more of the parameters has an unsupported value.
4665f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_NOT_STARTED       The network interface has not been started.
4675f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
4685f44f5b9bb21baefa954c0c36b5e86957ee68b86klu**/
4695f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFI_STATUS
4705f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFIAPI
471ff72001b5b0e581e53614015d93abd1107bee25bniruiyuEmuSnpTransmit (
4725f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_SIMPLE_NETWORK_PROTOCOL    *This,
473ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  IN UINTN                          HeaderSize,
474ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  IN UINTN                          BufferSize,
475ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  IN VOID*                          Buffer,
476ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  IN EFI_MAC_ADDRESS                *SrcAddr OPTIONAL,
477ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  IN EFI_MAC_ADDRESS                *DestAddr OPTIONAL,
478ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  IN UINT16                         *Protocol OPTIONAL
479ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  )
480ff72001b5b0e581e53614015d93abd1107bee25bniruiyu{
481ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  EFI_STATUS              Status;
482ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  EMU_SNP_PRIVATE_DATA    *Private;
483ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
484ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
485ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
486ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  Status = Private->Io->Transmit (
487ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                          Private->Io,
488ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                          HeaderSize,
489ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                          BufferSize,
490ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                          Buffer,
491ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                          SrcAddr,
492ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                          DestAddr,
493ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                          Protocol
494ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                          );
495ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  return Status;
496ff72001b5b0e581e53614015d93abd1107bee25bniruiyu}
497ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
498ff72001b5b0e581e53614015d93abd1107bee25bniruiyu/**
4995f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Receives a packet from a network interface.
5005f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
5015f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  This             Protocol instance pointer.
5025f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  HeaderSize       The size, in bytes, of the media header received on the network
5039be29006683dd5fa6c02059691735715d28070c7vanjeff                           interface. If this parameter is NULL, then the media header size
5045f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                           will not be returned.
5059be29006683dd5fa6c02059691735715d28070c7vanjeff  @param  BuffSize         On entry, the size, in bytes, of Buffer. On exit, the size, in
506f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff                           bytes, of the packet that was received on the network interface.
507f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @param  Buffer           A pointer to the data buffer to receive both the media header and
508ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                           the data.
509ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  @param  SourceAddr       The source HW MAC address. If this parameter is NULL, the
510f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff                           HW MAC source address will not be extracted from the media
511f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff                           header.
512f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @param  DestinationAddr  The destination HW MAC address. If this parameter is NULL,
513f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff                           the HW MAC destination address will not be extracted from the
514f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff                           media header.
515f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @param  Protocol         The media header type. If this parameter is NULL, then the
516ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                           protocol will not be extracted from the media header. See
517ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                           RFC 1700 section "Ether Types" for examples.
518ff72001b5b0e581e53614015d93abd1107bee25bniruiyu
519ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  @retval EFI_SUCCESS           The received data was stored in Buffer, and BufferSize has
520f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff                                been updated to the number of bytes received.
521f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @retval EFI_NOT_READY         The network interface is too busy to accept this transmit
522f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff                                request.
523f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @retval EFI_NOT_STARTED       The network interface has not been started.
524f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @retval EFI_BUFFER_TOO_SMALL  The BufferSize parameter is too small.
525f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  @retval EFI_DEVICE_ERROR      The command could not be sent to the network interface.
526f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
527f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff**/
528f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeffEFI_STATUS
529f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeffEFIAPI
530f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeffEmuSnpReceive (
531ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  IN EFI_SIMPLE_NETWORK_PROTOCOL    *This,
532ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  OUT UINTN                         *HeaderSize OPTIONAL,
533ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  IN OUT UINTN                      *BuffSize,
534ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  OUT VOID                          *Buffer,
535ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  OUT EFI_MAC_ADDRESS               *SourceAddr OPTIONAL,
536ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  OUT EFI_MAC_ADDRESS               *DestinationAddr OPTIONAL,
537ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  OUT UINT16                        *Protocol OPTIONAL
538f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  )
539f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff{
540f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  EFI_STATUS              Status;
541f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  EMU_SNP_PRIVATE_DATA    *Private;
542f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
543f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff  Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (This);
544f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff
5455f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = Private->Io->Receive (
5465f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          Private->Io,
5475f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          HeaderSize,
5485f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          BuffSize,
5495f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          Buffer,
5505f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          SourceAddr,
5515f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          DestinationAddr,
5525f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          Protocol
5535f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                          );
5545f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  return Status;
5555f44f5b9bb21baefa954c0c36b5e86957ee68b86klu}
5565f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
5575f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
5585f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
5595f44f5b9bb21baefa954c0c36b5e86957ee68b86klu/**
5605f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Test to see if this driver supports ControllerHandle. This service
5615f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  is called by the EFI boot service ConnectController(). In
5625f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  order to make drivers as small as possible, there are a few calling
5635f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  restrictions for this service. ConnectController() must
5645f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  follow these calling restrictions. If any other agent wishes to call
5655f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Supported() it must also follow these calling restrictions.
5665f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
5675f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  This                Protocol instance pointer.
5685f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  ControllerHandle    Handle of device to test
5695f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  RemainingDevicePath Optional parameter use to pick a specific child
5705f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                              device to start.
5715f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
5725f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_SUCCESS         This driver supports this device
5735f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_UNSUPPORTED     This driver does not support this device
5745f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
5755f44f5b9bb21baefa954c0c36b5e86957ee68b86klu**/
5765f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFI_STATUS
5775f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFIAPI
5785f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEmuSnpDriverBindingSupported (
5795f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
5805f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_HANDLE                   ControllerHandle,
5815f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
5825f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  )
5835f44f5b9bb21baefa954c0c36b5e86957ee68b86klu{
5845f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI_STATUS                Status;
5855f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EMU_IO_THUNK_PROTOCOL     *EmuIoThunk;
586ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  MAC_ADDR_DEVICE_PATH      *Node;
5875f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI_DEVICE_PATH_PROTOCOL  *ParentDevicePath;
5885f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
5895f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  if (RemainingDevicePath != NULL) {
5905f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    if (!IsDevicePathEnd (RemainingDevicePath)) {
591ff72001b5b0e581e53614015d93abd1107bee25bniruiyu      Node = (MAC_ADDR_DEVICE_PATH *)RemainingDevicePath;
592f22911b49e8be58d364f9e21f5af6bd3f0513cf7vanjeff      if (Node->Header.Type != MESSAGING_DEVICE_PATH ||
59304369cd8fc2523bd45dccb1f615f97c950ed3c63qhuang          Node->Header.SubType != MSG_MAC_ADDR_DP) {
5945f44f5b9bb21baefa954c0c36b5e86957ee68b86klu        // If the remaining device path does not match we don't support the request
5955f44f5b9bb21baefa954c0c36b5e86957ee68b86klu        return EFI_UNSUPPORTED;
5965f44f5b9bb21baefa954c0c36b5e86957ee68b86klu      }
59704369cd8fc2523bd45dccb1f615f97c950ed3c63qhuang    }
59804369cd8fc2523bd45dccb1f615f97c950ed3c63qhuang  }
5995f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
60004369cd8fc2523bd45dccb1f615f97c950ed3c63qhuang
60104369cd8fc2523bd45dccb1f615f97c950ed3c63qhuang  //
60204369cd8fc2523bd45dccb1f615f97c950ed3c63qhuang  // Open the IO Abstraction(s) needed to perform the supported test
60304369cd8fc2523bd45dccb1f615f97c950ed3c63qhuang  //
60404369cd8fc2523bd45dccb1f615f97c950ed3c63qhuang  Status = gBS->OpenProtocol (
60504369cd8fc2523bd45dccb1f615f97c950ed3c63qhuang                  ControllerHandle,
60604369cd8fc2523bd45dccb1f615f97c950ed3c63qhuang                  &gEmuIoThunkProtocolGuid,
60704369cd8fc2523bd45dccb1f615f97c950ed3c63qhuang                  (VOID **)&EmuIoThunk,
6085f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  This->DriverBindingHandle,
6095f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  ControllerHandle,
6105f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  EFI_OPEN_PROTOCOL_BY_DRIVER
6115f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  );
6125f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  if (EFI_ERROR (Status)) {
6135f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    return Status;
6145f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  }
6155f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
6165f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
6175f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  // Close the I/O Abstraction(s) used to perform the supported test
6185f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
6195f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  gBS->CloseProtocol (
6205f44f5b9bb21baefa954c0c36b5e86957ee68b86klu        ControllerHandle,
6215f44f5b9bb21baefa954c0c36b5e86957ee68b86klu        &gEmuIoThunkProtocolGuid,
6225f44f5b9bb21baefa954c0c36b5e86957ee68b86klu        This->DriverBindingHandle,
6235f44f5b9bb21baefa954c0c36b5e86957ee68b86klu        ControllerHandle
6245f44f5b9bb21baefa954c0c36b5e86957ee68b86klu        );
6255f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
6265f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
627ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  //
628ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  // Open the EFI Device Path protocol needed to perform the supported test
629ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  //
630ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  Status = gBS->OpenProtocol (
631ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                  ControllerHandle,
632ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                  &gEfiDevicePathProtocolGuid,
633ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                  (VOID **) &ParentDevicePath,
634ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                  This->DriverBindingHandle,
635ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                  ControllerHandle,
636ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                  EFI_OPEN_PROTOCOL_BY_DRIVER
637ff72001b5b0e581e53614015d93abd1107bee25bniruiyu                  );
638ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  if (Status == EFI_ALREADY_STARTED) {
639ff72001b5b0e581e53614015d93abd1107bee25bniruiyu    return EFI_SUCCESS;
6405f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  }
6415f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
6425f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  if (EFI_ERROR (Status)) {
6435f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    return Status;
6445f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  }
6455f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
6465f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
6475f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  // Make sure GUID is for a SNP handle.
6485f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
6495f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = EFI_UNSUPPORTED;
6505f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  if (CompareGuid (EmuIoThunk->Protocol, &gEmuSnpProtocolGuid)) {
6515f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    Status = EFI_SUCCESS;
6525f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  }
6535f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
6545f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
6555f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  // Close protocol, don't use device path protocol in the Support() function
6565f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
6575f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  gBS->CloseProtocol (
6585f44f5b9bb21baefa954c0c36b5e86957ee68b86klu        ControllerHandle,
6595f44f5b9bb21baefa954c0c36b5e86957ee68b86klu        &gEfiDevicePathProtocolGuid,
6605f44f5b9bb21baefa954c0c36b5e86957ee68b86klu        This->DriverBindingHandle,
6615f44f5b9bb21baefa954c0c36b5e86957ee68b86klu        ControllerHandle
6625f44f5b9bb21baefa954c0c36b5e86957ee68b86klu        );
6635f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
6645f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  return Status;
6655f44f5b9bb21baefa954c0c36b5e86957ee68b86klu}
6665f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
6675f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
6685f44f5b9bb21baefa954c0c36b5e86957ee68b86klu/**
6695f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Start this driver on ControllerHandle. This service is called by the
6705f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI boot service ConnectController(). In order to make
6715f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  drivers as small as possible, there are a few calling restrictions for
6725f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  this service. ConnectController() must follow these
6735f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  calling restrictions. If any other agent wishes to call Start() it
6745f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  must also follow these calling restrictions.
6755f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
6765f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  This                 Protocol instance pointer.
6775f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  ControllerHandle     Handle of device to bind driver to
6785f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  RemainingDevicePath  Optional parameter use to pick a specific child
6795f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                               device to start.
6805f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
6815f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_SUCCESS          Always succeeds.
6825f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
6835f44f5b9bb21baefa954c0c36b5e86957ee68b86klu**/
6845f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFI_STATUS
6856394182967f63d4a97a1c882861d9958657112bbqwangEFIAPI
6865f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEmuSnpDriverBindingStart (
6875f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_DRIVER_BINDING_PROTOCOL  *This,
6885f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_HANDLE                   ControllerHandle,
6895f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_DEVICE_PATH_PROTOCOL     *RemainingDevicePath OPTIONAL
6905f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  )
6915f44f5b9bb21baefa954c0c36b5e86957ee68b86klu{
6925f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI_STATUS                  Status;
6935f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EMU_IO_THUNK_PROTOCOL       *EmuIoThunk;
6945f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EMU_SNP_PRIVATE_DATA        *Private;
6955f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  MAC_ADDR_DEVICE_PATH        Node;
6965f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI_DEVICE_PATH_PROTOCOL    *ParentDevicePath;
6975f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
6985f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private = NULL;
6995f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7005f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
7015f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  // Grab the protocols we need
7025f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
7035f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = gBS->OpenProtocol(
7045f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  ControllerHandle,
7055f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  &gEfiDevicePathProtocolGuid,
7065f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  ( VOID ** ) &ParentDevicePath,
7075f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  This->DriverBindingHandle,
7085f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  ControllerHandle,
7095f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  EFI_OPEN_PROTOCOL_BY_DRIVER
7105f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  );
7115f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  if (EFI_ERROR (Status) && Status) {
7125f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    return Status;
7135f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  }
7145f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7155f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = gBS->OpenProtocol (
7165f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  ControllerHandle,
7175f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  &gEmuIoThunkProtocolGuid,
7185f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  (VOID **)&EmuIoThunk,
7195f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  This->DriverBindingHandle,
7205f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  ControllerHandle,
7215f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  EFI_OPEN_PROTOCOL_BY_DRIVER
7225f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  );
7235f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  if (EFI_ERROR (Status)) {
7245f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    return Status;
7255f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  }
7265f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7275f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  if (!CompareGuid (EmuIoThunk->Protocol, &gEmuSnpProtocolGuid)) {
7285f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    return EFI_UNSUPPORTED;
7295f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  }
7305f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7315f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = EmuIoThunk->Open (EmuIoThunk);
7325f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  if (EFI_ERROR (Status)) {
7335f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    goto Done;
7345f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  }
7355f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7365f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
7375f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //  Allocate the private data.
7385f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
7395f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private = AllocateZeroPool (sizeof (EMU_SNP_PRIVATE_DATA));
7405f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  if (Private == NULL) {
7415f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    Status = EFI_OUT_OF_RESOURCES;
7425f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    goto Done;
7435f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  }
7445f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7455f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  CopyMem (&Private->Snp, &gEmuSnpTemplate, sizeof (EFI_SIMPLE_NETWORK_PROTOCOL));
7465f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  CopyMem (&Private->Mode, &gEmuSnpModeTemplate, sizeof (EFI_SIMPLE_NETWORK_MODE));
7475f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7485f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private->Signature    = EMU_SNP_PRIVATE_DATA_SIGNATURE;
7495f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private->IoThunk      = EmuIoThunk;
7505f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private->Io           = EmuIoThunk->Interface;
7515f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private->EfiHandle    = ControllerHandle;
7525f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private->DeviceHandle = NULL;
7535f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private->Snp.Mode     = &Private->Mode;
7545f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private->ControllerNameTable = NULL;
7555f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7565f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7575f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = Private->Io->CreateMapping (Private->Io, &Private->Mode);
7585f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  if (EFI_ERROR (Status)) {
7595f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    goto Done;
7605f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  }
7615f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7625f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
7635f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  // Build the device path by appending the MAC node to the ParentDevicePath
7645f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  // from the EmuIo handle.
7655f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
7665f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  ZeroMem (&Node, sizeof (MAC_ADDR_DEVICE_PATH));
7675f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7685f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Node.Header.Type     = MESSAGING_DEVICE_PATH;
7695f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Node.Header.SubType  = MSG_MAC_ADDR_DP;
7705f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Node.IfType          = Private->Mode.IfType;
7715f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7725f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  SetDevicePathNodeLength ((EFI_DEVICE_PATH_PROTOCOL * )&Node, sizeof (MAC_ADDR_DEVICE_PATH));
7735f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7745f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  CopyMem (&Node.MacAddress, &Private->Mode.CurrentAddress, sizeof (EFI_MAC_ADDRESS));
7755f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7765f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
7775f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  // Build the device path by appending the MAC node to the ParentDevicePath from the EmuIo handle.
7785f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
7795f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private->DevicePath = AppendDevicePathNode (ParentDevicePath, (EFI_DEVICE_PATH_PROTOCOL *)&Node);
7805f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  if ( Private->DevicePath == NULL ) {
7815f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    Status = EFI_OUT_OF_RESOURCES;
7825f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    goto Done;
7835f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  }
7845f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7855f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  AddUnicodeString2 (
7865f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    "eng",
7875f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    gEmuSnpDriverComponentName.SupportedLanguages,
7886394182967f63d4a97a1c882861d9958657112bbqwang    &Private->ControllerNameTable,
7895f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    EmuIoThunk->ConfigString,
7905f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    TRUE
7915f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    );
7925f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
7935f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  AddUnicodeString2 (
7945f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    "en",
7955f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    gEmuSnpDriverComponentName2.SupportedLanguages,
7965f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    &Private->ControllerNameTable,
7975f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    EmuIoThunk->ConfigString,
7985f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    FALSE
7995f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    );
8005f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
8015f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
8025f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  // Create Child Handle
8035f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
8045f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = gBS->InstallMultipleProtocolInterfaces(
8055f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  &Private->DeviceHandle,
8065f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  &gEfiSimpleNetworkProtocolGuid, &Private->Snp,
8075f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  &gEfiDevicePathProtocolGuid,    Private->DevicePath,
8085f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  NULL
8095f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  );
8105f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  if (EFI_ERROR (Status)) {
8115f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    goto Done;
8125f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  }
8135f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
8145f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
8155f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  // Open For Child Device
8165f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
8175f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = gBS->OpenProtocol (
8185f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  ControllerHandle,
8195f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  &gEmuIoThunkProtocolGuid,
8205f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  (VOID **)&EmuIoThunk,
8215f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  This->DriverBindingHandle,
8225f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  Private->DeviceHandle,
8235f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
8245f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  );
8255f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
8265f44f5b9bb21baefa954c0c36b5e86957ee68b86kluDone:
8275f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  if (EFI_ERROR (Status)) {
8285f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    if (Private != NULL) {
8295f44f5b9bb21baefa954c0c36b5e86957ee68b86klu      FreePool (Private);
8305f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    }
8315f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    if (ParentDevicePath != NULL) {
8325f44f5b9bb21baefa954c0c36b5e86957ee68b86klu      gBS->CloseProtocol(
8335f44f5b9bb21baefa954c0c36b5e86957ee68b86klu            ControllerHandle,
8345f44f5b9bb21baefa954c0c36b5e86957ee68b86klu            &gEfiDevicePathProtocolGuid,
8355f44f5b9bb21baefa954c0c36b5e86957ee68b86klu            This->DriverBindingHandle,
8365f44f5b9bb21baefa954c0c36b5e86957ee68b86klu            ControllerHandle
8375f44f5b9bb21baefa954c0c36b5e86957ee68b86klu            );
8385f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    }
8395f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  }
8405f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
8415f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  return Status;
8425f44f5b9bb21baefa954c0c36b5e86957ee68b86klu}
8435f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
8445f44f5b9bb21baefa954c0c36b5e86957ee68b86klu/**
8455f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Stop this driver on ControllerHandle. This service is called by the
8465f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI boot service DisconnectController(). In order to
8475f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  make drivers as small as possible, there are a few calling
8485f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  restrictions for this service. DisconnectController()
8495f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  must follow these calling restrictions. If any other agent wishes
8505f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  to call Stop() it must also follow these calling restrictions.
8515f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
8525f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  This              Protocol instance pointer.
8535f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  ControllerHandle  Handle of device to stop driver on
8545f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of
8555f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                            children is zero stop the entire bus driver.
8565f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  ChildHandleBuffer List of Child Handles to Stop.
8575f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
8585f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_SUCCESS       Always succeeds.
8595f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
8605f44f5b9bb21baefa954c0c36b5e86957ee68b86klu**/
8615f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFI_STATUS
8625f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFIAPI
8635f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEmuSnpDriverBindingStop (
8645f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_DRIVER_BINDING_PROTOCOL    *This,
8655f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_HANDLE                     ControllerHandle,
8665f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN UINTN                          NumberOfChildren,
8675f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_HANDLE                     *ChildHandleBuffer
8685f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  )
8695f44f5b9bb21baefa954c0c36b5e86957ee68b86klu{
8705f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI_STATUS                  Status;
8715f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EMU_SNP_PRIVATE_DATA        *Private = NULL;
8725f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI_SIMPLE_NETWORK_PROTOCOL *Snp;
8735f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
8745f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
8755f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  // Complete all outstanding transactions to Controller.
8765f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  // Don't allow any new transaction to Controller to be started.
8775f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
8785f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  if (NumberOfChildren == 0) {
8795f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    //
8805f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    // Close the bus driver
8815f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    //
8825f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    Status = gBS->CloseProtocol (
8835f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                    ControllerHandle,
8845f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                    &gEmuIoThunkProtocolGuid,
8855f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                    This->DriverBindingHandle,
8865f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                    ControllerHandle
8875f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                    );
8885f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
8895f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    Status = gBS->CloseProtocol (
890a00ec39b52224a40bf9a0a813b69cb43e14407a8mdkinney                    ControllerHandle,
8915f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                    &gEfiDevicePathProtocolGuid,
892a00ec39b52224a40bf9a0a813b69cb43e14407a8mdkinney                    This->DriverBindingHandle,
8935f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                    ControllerHandle
8945f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                    );
8955f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    return Status;
8965f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  }
8975f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
8985f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  ASSERT (NumberOfChildren == 1);
8995f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
9005f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
9015f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
9025f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  // Get our context back.
9035f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  //
9045f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = gBS->OpenProtocol(
9055f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  ChildHandleBuffer[0],
9065f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  &gEfiSimpleNetworkProtocolGuid,
9075f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  ( VOID ** ) &Snp,
9085f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  This->DriverBindingHandle,
9095f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  ControllerHandle,
9105f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  EFI_OPEN_PROTOCOL_GET_PROTOCOL
9115f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  );
9125f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  if (EFI_ERROR (Status)) {
9135f44f5b9bb21baefa954c0c36b5e86957ee68b86klu    return EFI_DEVICE_ERROR;
9145f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  }
9155f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
9165f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Private = EMU_SNP_PRIVATE_DATA_FROM_SNP_THIS (Snp);
9175f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = Private->IoThunk->Close (Private->IoThunk);
9185f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
9195f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = gBS->CloseProtocol(
9205f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  ChildHandleBuffer[0],
9215f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  &gEmuIoThunkProtocolGuid,
9225f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  This->DriverBindingHandle,
9235f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  Private->DeviceHandle
9245f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  );
9255f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
9265f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  Status = gBS->UninstallMultipleProtocolInterfaces(
9275f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  ChildHandleBuffer[0],
9285f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  &gEfiSimpleNetworkProtocolGuid,   &Private->Snp,
9295f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  &gEfiDevicePathProtocolGuid,      Private->DevicePath,
9305f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  NULL
9315f44f5b9bb21baefa954c0c36b5e86957ee68b86klu                  );
9325f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
9335f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  FreePool (Private->DevicePath);
9345f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  FreeUnicodeStringTable (Private->ControllerNameTable);
9355f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  FreePool (Private);
9365f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
9375f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  return EFI_SUCCESS;
93882408a47c9a982ceea9290dfe2d38ece14d8c867xli}
9395f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
9405f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
9415f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFI_DRIVER_BINDING_PROTOCOL gEmuSnpDriverBinding = {
9425f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnpDriverBindingSupported,
943ff72001b5b0e581e53614015d93abd1107bee25bniruiyu  EmuSnpDriverBindingStart,
9445f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EmuSnpDriverBindingStop,
9455f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  0xA,
9465f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  NULL,
9475f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  NULL
9485f44f5b9bb21baefa954c0c36b5e86957ee68b86klu};
9495f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
9505f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
9515f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
9525f44f5b9bb21baefa954c0c36b5e86957ee68b86klu/**
953f7c58a94cf72eb00f0931c89d935a164abaadf50mdkinney  This is the declaration of an EFI image entry point. This entry point is
9545f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including
9555f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  both device drivers and bus drivers.
9565f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
9575f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  ImageHandle           The firmware allocated handle for the UEFI image.
9585f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @param  SystemTable           A pointer to the EFI System Table.
9595f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
9605f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_SUCCESS           The operation completed successfully.
9615f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.
9625f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
9635f44f5b9bb21baefa954c0c36b5e86957ee68b86klu**/
9645f44f5b9bb21baefa954c0c36b5e86957ee68b86kluEFI_STATUS
965f7c58a94cf72eb00f0931c89d935a164abaadf50mdkinneyEFIAPI
9665f44f5b9bb21baefa954c0c36b5e86957ee68b86kluInitializeEmuSnpDriver (
9675f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_HANDLE        ImageHandle,
9685f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  IN EFI_SYSTEM_TABLE   *SystemTable
969f7c58a94cf72eb00f0931c89d935a164abaadf50mdkinney  )
9705f44f5b9bb21baefa954c0c36b5e86957ee68b86klu{
9715f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  EFI_STATUS            Status;
9725f44f5b9bb21baefa954c0c36b5e86957ee68b86klu
973f7c58a94cf72eb00f0931c89d935a164abaadf50mdkinney  //
9745f44f5b9bb21baefa954c0c36b5e86957ee68b86klu  // Install the Driver Protocols
97582408a47c9a982ceea9290dfe2d38ece14d8c867xli  //
97682408a47c9a982ceea9290dfe2d38ece14d8c867xli  Status = EfiLibInstallDriverBindingComponentName2(
97782408a47c9a982ceea9290dfe2d38ece14d8c867xli              ImageHandle,
97882408a47c9a982ceea9290dfe2d38ece14d8c867xli              SystemTable,
97982408a47c9a982ceea9290dfe2d38ece14d8c867xli              &gEmuSnpDriverBinding,
98082408a47c9a982ceea9290dfe2d38ece14d8c867xli              ImageHandle,
98182408a47c9a982ceea9290dfe2d38ece14d8c867xli              &gEmuSnpDriverComponentName,
98282408a47c9a982ceea9290dfe2d38ece14d8c867xli              &gEmuSnpDriverComponentName2
98382408a47c9a982ceea9290dfe2d38ece14d8c867xli              );
98482408a47c9a982ceea9290dfe2d38ece14d8c867xli
98582408a47c9a982ceea9290dfe2d38ece14d8c867xli  return Status;
98682408a47c9a982ceea9290dfe2d38ece14d8c867xli}
98782408a47c9a982ceea9290dfe2d38ece14d8c867xli