]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/MnpDxe/MnpDriver.c
NetworkPkg: Move Network library and drivers from MdeModulePkg to NetworkPkg
[mirror_edk2.git] / MdeModulePkg / Universal / Network / MnpDxe / MnpDriver.c
diff --git a/MdeModulePkg/Universal/Network/MnpDxe/MnpDriver.c b/MdeModulePkg/Universal/Network/MnpDxe/MnpDriver.c
deleted file mode 100644 (file)
index e99e7c5..0000000
+++ /dev/null
@@ -1,683 +0,0 @@
-/** @file\r
-  Implementation of driver entry point and driver binding protocol.\r
-\r
-Copyright (c) 2005 - 2018, Intel Corporation. All rights reserved.<BR>\r
-SPDX-License-Identifier: BSD-2-Clause-Patent\r
-\r
-**/\r
-\r
-#include "MnpDriver.h"\r
-#include "MnpImpl.h"\r
-#include "MnpVlan.h"\r
-\r
-EFI_DRIVER_BINDING_PROTOCOL gMnpDriverBinding = {\r
-  MnpDriverBindingSupported,\r
-  MnpDriverBindingStart,\r
-  MnpDriverBindingStop,\r
-  0xa,\r
-  NULL,\r
-  NULL\r
-};\r
-\r
-/**\r
-  Callback function which provided by user to remove one node in NetDestroyLinkList process.\r
-\r
-  @param[in]    Entry           The entry to be removed.\r
-  @param[in]    Context         Pointer to the callback context corresponds to the Context in NetDestroyLinkList.\r
-\r
-  @retval EFI_SUCCESS           The entry has been removed successfully.\r
-  @retval Others                Fail to remove the entry.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-MnpDestroyServiceDataEntry (\r
-  IN LIST_ENTRY         *Entry,\r
-  IN VOID               *Context\r
-  )\r
-{\r
-  MNP_SERVICE_DATA              *MnpServiceData;\r
-\r
-  MnpServiceData = MNP_SERVICE_DATA_FROM_LINK (Entry);\r
-  return MnpDestroyServiceData (MnpServiceData);\r
-}\r
-\r
-/**\r
-  Callback function which provided by user to remove one node in NetDestroyLinkList process.\r
-\r
-  @param[in]    Entry           The entry to be removed.\r
-  @param[in]    Context         Pointer to the callback context corresponds to the Context in NetDestroyLinkList.\r
-\r
-  @retval EFI_SUCCESS           The entry has been removed successfully.\r
-  @retval Others                Fail to remove the entry.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-MnpDestroyServiceChildEntry (\r
-  IN LIST_ENTRY         *Entry,\r
-  IN VOID               *Context\r
-  )\r
-{\r
-  MNP_SERVICE_DATA              *MnpServiceData;\r
-\r
-  MnpServiceData = MNP_SERVICE_DATA_FROM_LINK (Entry);\r
-  return MnpDestroyServiceChild (MnpServiceData);\r
-}\r
-\r
-/**\r
-  Test to see if this driver supports ControllerHandle. This service\r
-  is called by the EFI boot service ConnectController(). In\r
-  order to make drivers as small as possible, there are a few calling\r
-  restrictions for this service. ConnectController() must\r
-  follow these calling restrictions. If any other agent wishes to call\r
-  Supported() it must also follow these calling restrictions.\r
-\r
-  @param[in]  This                 Protocol instance pointer.\r
-  @param[in]  ControllerHandle     Handle of device to test.\r
-  @param[in]  RemainingDevicePath  Optional parameter use to pick a specific\r
-                                   child device to start.\r
-\r
-  @retval EFI_SUCCESS              This driver supports this device.\r
-  @retval EFI_ALREADY_STARTED      This driver is already running on this device.\r
-  @retval Others                   This driver does not support this device.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-MnpDriverBindingSupported (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL     *This,\r
-  IN EFI_HANDLE                      ControllerHandle,\r
-  IN EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath OPTIONAL\r
-  )\r
-{\r
-  EFI_STATUS                   Status;\r
-  EFI_SIMPLE_NETWORK_PROTOCOL  *Snp;\r
-\r
-  //\r
-  // Test to open the Simple Network protocol BY_DRIVER.\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  ControllerHandle,\r
-                  &gEfiSimpleNetworkProtocolGuid,\r
-                  (VOID **) &Snp,\r
-                  This->DriverBindingHandle,\r
-                  ControllerHandle,\r
-                  EFI_OPEN_PROTOCOL_BY_DRIVER\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Close the openned SNP protocol.\r
-  //\r
-  gBS->CloseProtocol (\r
-         ControllerHandle,\r
-         &gEfiSimpleNetworkProtocolGuid,\r
-         This->DriverBindingHandle,\r
-         ControllerHandle\r
-         );\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Start this driver on ControllerHandle. This service is called by the\r
-  EFI boot service ConnectController(). In order to make drivers as small\r
-  as possible, there are a few calling restrictions for this service.\r
-  ConnectController() must follow these calling restrictions. If any other\r
-  agent wishes to call Start() it must also follow these calling restrictions.\r
-\r
-  @param[in]       This                 Protocol instance pointer.\r
-  @param[in]       ControllerHandle     Handle of device to bind driver to.\r
-  @param[in]       RemainingDevicePath  Optional parameter use to pick a specific\r
-                                        child device to start.\r
-\r
-  @retval EFI_SUCCESS           This driver is added to ControllerHandle.\r
-  @retval EFI_ALREADY_STARTED   This driver is already running on ControllerHandle.\r
-  @retval EFI_OUT_OF_RESOURCES  Failed to allocate memory for Mnp Service Data.\r
-  @retval Others                This driver does not support this device.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-MnpDriverBindingStart (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL     *This,\r
-  IN EFI_HANDLE                      ControllerHandle,\r
-  IN EFI_DEVICE_PATH_PROTOCOL        *RemainingDevicePath OPTIONAL\r
-  )\r
-{\r
-  EFI_STATUS        Status;\r
-  MNP_SERVICE_DATA  *MnpServiceData;\r
-  MNP_DEVICE_DATA   *MnpDeviceData;\r
-  LIST_ENTRY        *Entry;\r
-  VLAN_TCI          *VlanVariable;\r
-  UINTN             NumberOfVlan;\r
-  UINTN             Index;\r
-\r
-  VlanVariable = NULL;\r
-\r
-  //\r
-  // Initialize the Mnp Device Data\r
-  //\r
-  MnpDeviceData = AllocateZeroPool (sizeof (MNP_DEVICE_DATA));\r
-  if (MnpDeviceData == NULL) {\r
-    DEBUG ((EFI_D_ERROR, "MnpDriverBindingStart(): Failed to allocate the Mnp Device Data.\n"));\r
-\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  Status = MnpInitializeDeviceData (MnpDeviceData, This->DriverBindingHandle, ControllerHandle);\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG ((EFI_D_ERROR, "MnpDriverBindingStart: MnpInitializeDeviceData failed, %r.\n", Status));\r
-\r
-    FreePool (MnpDeviceData);\r
-    return Status;\r
-  }\r
-\r
-  //\r
-  // Check whether NIC driver has already produced VlanConfig protocol\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  ControllerHandle,\r
-                  &gEfiVlanConfigProtocolGuid,\r
-                  NULL,\r
-                  This->DriverBindingHandle,\r
-                  ControllerHandle,\r
-                  EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
-                  );\r
-  if (!EFI_ERROR (Status)) {\r
-    //\r
-    // NIC hardware already implement VLAN,\r
-    // no need to provide software VLAN implementation in MNP driver\r
-    //\r
-    MnpDeviceData->NumberOfVlan = 0;\r
-    ZeroMem (&MnpDeviceData->VlanConfig, sizeof (EFI_VLAN_CONFIG_PROTOCOL));\r
-    MnpServiceData = MnpCreateServiceData (MnpDeviceData, 0, 0);\r
-    Status = (MnpServiceData != NULL) ? EFI_SUCCESS : EFI_OUT_OF_RESOURCES;\r
-    goto Exit;\r
-  }\r
-\r
-  //\r
-  // Install VLAN Config Protocol\r
-  //\r
-  Status = gBS->InstallMultipleProtocolInterfaces (\r
-                  &ControllerHandle,\r
-                  &gEfiVlanConfigProtocolGuid,\r
-                  &MnpDeviceData->VlanConfig,\r
-                  NULL\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    goto Exit;\r
-  }\r
-\r
-  //\r
-  // Get current VLAN configuration from EFI Variable\r
-  //\r
-  NumberOfVlan = 0;\r
-  Status = MnpGetVlanVariable (MnpDeviceData, &NumberOfVlan, &VlanVariable);\r
-  if (EFI_ERROR (Status)) {\r
-    //\r
-    // No VLAN is set, create a default MNP service data for untagged frame\r
-    //\r
-    MnpDeviceData->NumberOfVlan = 0;\r
-    MnpServiceData = MnpCreateServiceData (MnpDeviceData, 0, 0);\r
-    Status = (MnpServiceData != NULL) ? EFI_SUCCESS : EFI_OUT_OF_RESOURCES;\r
-    goto Exit;\r
-  }\r
-\r
-  //\r
-  // Create MNP service data for each VLAN\r
-  //\r
-  MnpDeviceData->NumberOfVlan = NumberOfVlan;\r
-  for (Index = 0; Index < NumberOfVlan; Index++) {\r
-    MnpServiceData = MnpCreateServiceData (\r
-                       MnpDeviceData,\r
-                       VlanVariable[Index].Bits.Vid,\r
-                       (UINT8) VlanVariable[Index].Bits.Priority\r
-                       );\r
-\r
-    if (MnpServiceData == NULL) {\r
-      Status = EFI_OUT_OF_RESOURCES;\r
-\r
-      goto Exit;\r
-    }\r
-  }\r
-\r
-Exit:\r
-  if (VlanVariable != NULL) {\r
-    FreePool (VlanVariable);\r
-  }\r
-\r
-  if (EFI_ERROR (Status)) {\r
-    //\r
-    // Destroy all MNP service data\r
-    //\r
-    while (!IsListEmpty (&MnpDeviceData->ServiceList)) {\r
-      Entry = GetFirstNode (&MnpDeviceData->ServiceList);\r
-      MnpServiceData = MNP_SERVICE_DATA_FROM_LINK (Entry);\r
-      MnpDestroyServiceData (MnpServiceData);\r
-    }\r
-\r
-    //\r
-    // Uninstall the VLAN Config Protocol if any\r
-    //\r
-    if (MnpDeviceData->VlanConfig.Set != NULL) {\r
-      gBS->UninstallMultipleProtocolInterfaces (\r
-             MnpDeviceData->ControllerHandle,\r
-             &gEfiVlanConfigProtocolGuid,\r
-             &MnpDeviceData->VlanConfig,\r
-             NULL\r
-             );\r
-    }\r
-\r
-    //\r
-    // Destroy Mnp Device Data\r
-    //\r
-    MnpDestroyDeviceData (MnpDeviceData, This->DriverBindingHandle);\r
-    FreePool (MnpDeviceData);\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  Stop this driver on ControllerHandle. This service is called by the\r
-  EFI boot service DisconnectController(). In order to make drivers as\r
-  small as possible, there are a few calling restrictions for this service.\r
-  DisconnectController() must follow these calling restrictions. If any other\r
-  agent wishes to call Stop() it must also follow these calling restrictions.\r
-\r
-  @param[in]  This               Protocol instance pointer.\r
-  @param[in]  ControllerHandle   Handle of device to stop driver on.\r
-  @param[in]  NumberOfChildren   Number of Handles in ChildHandleBuffer. If\r
-                                 number of children is zero stop the entire\r
-                                 bus driver.\r
-  @param[in]  ChildHandleBuffer  List of Child Handles to Stop.\r
-\r
-  @retval EFI_SUCCESS            This driver is removed ControllerHandle.\r
-  @retval EFI_DEVICE_ERROR       The device could not be stopped due to a device error.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-MnpDriverBindingStop (\r
-  IN EFI_DRIVER_BINDING_PROTOCOL     *This,\r
-  IN EFI_HANDLE                      ControllerHandle,\r
-  IN UINTN                           NumberOfChildren,\r
-  IN EFI_HANDLE                      *ChildHandleBuffer OPTIONAL\r
-  )\r
-{\r
-  EFI_STATUS                    Status;\r
-  EFI_SERVICE_BINDING_PROTOCOL  *ServiceBinding;\r
-  EFI_VLAN_CONFIG_PROTOCOL      *VlanConfig;\r
-  MNP_DEVICE_DATA               *MnpDeviceData;\r
-  MNP_SERVICE_DATA              *MnpServiceData;\r
-  LIST_ENTRY                    *List;\r
-  UINTN                         ListLength;\r
-\r
-  //\r
-  // Try to retrieve MNP service binding protocol from the ControllerHandle\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  ControllerHandle,\r
-                  &gEfiManagedNetworkServiceBindingProtocolGuid,\r
-                  (VOID **) &ServiceBinding,\r
-                  This->DriverBindingHandle,\r
-                  ControllerHandle,\r
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    //\r
-    // Retrieve VLAN Config Protocol from the ControllerHandle\r
-    //\r
-    Status = gBS->OpenProtocol (\r
-                    ControllerHandle,\r
-                    &gEfiVlanConfigProtocolGuid,\r
-                    (VOID **) &VlanConfig,\r
-                    This->DriverBindingHandle,\r
-                    ControllerHandle,\r
-                    EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                    );\r
-    if (EFI_ERROR (Status)) {\r
-      DEBUG ((EFI_D_ERROR, "MnpDriverBindingStop: try to stop unknown Controller.\n"));\r
-      return EFI_DEVICE_ERROR;\r
-    }\r
-\r
-    MnpDeviceData = MNP_DEVICE_DATA_FROM_THIS (VlanConfig);\r
-  } else {\r
-    MnpServiceData = MNP_SERVICE_DATA_FROM_THIS (ServiceBinding);\r
-    MnpDeviceData = MnpServiceData->MnpDeviceData;\r
-  }\r
-\r
-  if (NumberOfChildren == 0) {\r
-    //\r
-    // Destroy all MNP service data\r
-    //\r
-    List = &MnpDeviceData->ServiceList;\r
-    Status = NetDestroyLinkList (\r
-               List,\r
-               MnpDestroyServiceDataEntry,\r
-               NULL,\r
-               &ListLength\r
-               );\r
-    if (EFI_ERROR (Status) || ListLength !=0) {\r
-      return EFI_DEVICE_ERROR;\r
-    }\r
-\r
-    //\r
-    // Uninstall the VLAN Config Protocol if any\r
-    //\r
-    if (MnpDeviceData->VlanConfig.Set != NULL) {\r
-      gBS->UninstallMultipleProtocolInterfaces (\r
-             MnpDeviceData->ControllerHandle,\r
-             &gEfiVlanConfigProtocolGuid,\r
-             &MnpDeviceData->VlanConfig,\r
-             NULL\r
-             );\r
-    }\r
-\r
-    //\r
-    // Destroy Mnp Device Data\r
-    //\r
-    MnpDestroyDeviceData (MnpDeviceData, This->DriverBindingHandle);\r
-    FreePool (MnpDeviceData);\r
-\r
-    if (gMnpControllerNameTable != NULL) {\r
-      FreeUnicodeStringTable (gMnpControllerNameTable);\r
-      gMnpControllerNameTable = NULL;\r
-    }\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  //\r
-  // Stop all MNP child\r
-  //\r
-  List = &MnpDeviceData->ServiceList;\r
-  Status = NetDestroyLinkList (\r
-             List,\r
-             MnpDestroyServiceChildEntry,\r
-             NULL,\r
-             &ListLength\r
-             );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_DEVICE_ERROR;\r
-  }\r
-\r
-  return EFI_SUCCESS;\r
-}\r
-\r
-\r
-/**\r
-  Creates a child handle with a set of I/O services.\r
-\r
-  @param[in]       This              Protocol instance pointer.\r
-  @param[in, out]  ChildHandle       Pointer to the handle of the child to create. If\r
-                                     it is NULL, then a new handle is created. If\r
-                                     it is not NULL, then the I/O services are added\r
-                                     to the existing child handle.\r
-\r
-  @retval EFI_SUCCES                 The protocol was added to ChildHandle.\r
-  @retval EFI_INVALID_PARAMETER      ChildHandle is NULL.\r
-  @retval EFI_OUT_OF_RESOURCES       There are not enough resources available to\r
-                                     create the child.\r
-  @retval Others                     The child handle was not created.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-MnpServiceBindingCreateChild (\r
-  IN     EFI_SERVICE_BINDING_PROTOCOL    *This,\r
-  IN OUT EFI_HANDLE                      *ChildHandle\r
-  )\r
-{\r
-  EFI_STATUS         Status;\r
-  MNP_SERVICE_DATA   *MnpServiceData;\r
-  MNP_INSTANCE_DATA  *Instance;\r
-  VOID               *MnpSb;\r
-  EFI_TPL            OldTpl;\r
-\r
-  if ((This == NULL) || (ChildHandle == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  MnpServiceData = MNP_SERVICE_DATA_FROM_THIS (This);\r
-\r
-  //\r
-  // Allocate buffer for the new instance.\r
-  //\r
-  Instance = AllocateZeroPool (sizeof (MNP_INSTANCE_DATA));\r
-  if (Instance == NULL) {\r
-    DEBUG ((EFI_D_ERROR, "MnpServiceBindingCreateChild: Faild to allocate memory for the new instance.\n"));\r
-\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  //\r
-  // Init the instance data.\r
-  //\r
-  MnpInitializeInstanceData (MnpServiceData, Instance);\r
-\r
-  Status = gBS->InstallMultipleProtocolInterfaces (\r
-                  ChildHandle,\r
-                  &gEfiManagedNetworkProtocolGuid,\r
-                  &Instance->ManagedNetwork,\r
-                  NULL\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG (\r
-      (EFI_D_ERROR,\r
-      "MnpServiceBindingCreateChild: Failed to install the MNP protocol, %r.\n",\r
-      Status)\r
-      );\r
-\r
-    goto ErrorExit;\r
-  }\r
-\r
-  //\r
-  // Save the instance's childhandle.\r
-  //\r
-  Instance->Handle = *ChildHandle;\r
-\r
-  Status = gBS->OpenProtocol (\r
-                  MnpServiceData->ServiceHandle,\r
-                  &gEfiManagedNetworkServiceBindingProtocolGuid,\r
-                  (VOID **) &MnpSb,\r
-                  gMnpDriverBinding.DriverBindingHandle,\r
-                  Instance->Handle,\r
-                  EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    goto ErrorExit;\r
-  }\r
-\r
-  //\r
-  // Add the child instance into ChildrenList.\r
-  //\r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
-\r
-  InsertTailList (&MnpServiceData->ChildrenList, &Instance->InstEntry);\r
-  MnpServiceData->ChildrenNumber++;\r
-\r
-  gBS->RestoreTPL (OldTpl);\r
-\r
-ErrorExit:\r
-\r
-  if (EFI_ERROR (Status)) {\r
-\r
-    if (Instance->Handle != NULL) {\r
-\r
-      gBS->UninstallMultipleProtocolInterfaces (\r
-            Instance->Handle,\r
-            &gEfiManagedNetworkProtocolGuid,\r
-            &Instance->ManagedNetwork,\r
-            NULL\r
-            );\r
-    }\r
-\r
-    FreePool (Instance);\r
-  }\r
-\r
-  return Status;\r
-}\r
-\r
-\r
-/**\r
-  Destroys a child handle with a set of I/O services.\r
-\r
-  The DestroyChild() function does the opposite of CreateChild(). It removes a\r
-  protocol that was installed by CreateChild() from ChildHandle. If the removed\r
-  protocol is the last protocol on ChildHandle, then ChildHandle is destroyed.\r
-\r
-  @param[in]  This               Pointer to the EFI_SERVICE_BINDING_PROTOCOL\r
-                                 instance.\r
-  @param[in]  ChildHandle        Handle of the child to destroy.\r
-\r
-  @retval EFI_SUCCES             The protocol was removed from ChildHandle.\r
-  @retval EFI_UNSUPPORTED        ChildHandle does not support the protocol that\r
-                                 is being removed.\r
-  @retval EFI_INVALID_PARAMETER  ChildHandle is NULL.\r
-  @retval EFI_ACCESS_DENIED      The protocol could not be removed from the\r
-                                 ChildHandle because its services are being\r
-                                 used.\r
-  @retval Others                 The child handle was not destroyed.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-MnpServiceBindingDestroyChild (\r
-  IN EFI_SERVICE_BINDING_PROTOCOL    *This,\r
-  IN EFI_HANDLE                      ChildHandle\r
-  )\r
-{\r
-  EFI_STATUS                    Status;\r
-  MNP_SERVICE_DATA              *MnpServiceData;\r
-  EFI_MANAGED_NETWORK_PROTOCOL  *ManagedNetwork;\r
-  MNP_INSTANCE_DATA             *Instance;\r
-  EFI_TPL                       OldTpl;\r
-\r
-  if ((This == NULL) || (ChildHandle == NULL)) {\r
-    return EFI_INVALID_PARAMETER;\r
-  }\r
-\r
-  MnpServiceData = MNP_SERVICE_DATA_FROM_THIS (This);\r
-\r
-  //\r
-  // Try to retrieve ManagedNetwork Protocol from ChildHandle.\r
-  //\r
-  Status = gBS->OpenProtocol (\r
-                  ChildHandle,\r
-                  &gEfiManagedNetworkProtocolGuid,\r
-                  (VOID **) &ManagedNetwork,\r
-                  gMnpDriverBinding.DriverBindingHandle,\r
-                  ChildHandle,\r
-                  EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    return EFI_UNSUPPORTED;\r
-  }\r
-\r
-  Instance = MNP_INSTANCE_DATA_FROM_THIS (ManagedNetwork);\r
-\r
-  //\r
-  // MnpServiceBindingDestroyChild may be called twice: first called by\r
-  // MnpServiceBindingStop, second called by uninstalling the MNP protocol\r
-  // in this ChildHandle. Use destroyed to make sure the resource clean code\r
-  // will only excecute once.\r
-  //\r
-  if (Instance->Destroyed) {\r
-    return EFI_SUCCESS;\r
-  }\r
-\r
-  Instance->Destroyed = TRUE;\r
-\r
-  //\r
-  // Close the Simple Network protocol.\r
-  //\r
-  gBS->CloseProtocol (\r
-         MnpServiceData->ServiceHandle,\r
-         &gEfiManagedNetworkServiceBindingProtocolGuid,\r
-         MnpServiceData->MnpDeviceData->ImageHandle,\r
-         ChildHandle\r
-         );\r
-\r
-  //\r
-  // Uninstall the ManagedNetwork protocol.\r
-  //\r
-  Status = gBS->UninstallMultipleProtocolInterfaces (\r
-                  ChildHandle,\r
-                  &gEfiManagedNetworkProtocolGuid,\r
-                  &Instance->ManagedNetwork,\r
-                  NULL\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    DEBUG (\r
-      (EFI_D_ERROR,\r
-      "MnpServiceBindingDestroyChild: Failed to uninstall the ManagedNetwork protocol, %r.\n",\r
-      Status)\r
-      );\r
-\r
-    Instance->Destroyed = FALSE;\r
-    return Status;\r
-  }\r
-\r
-  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
-\r
-  //\r
-  // Reset the configuration.\r
-  //\r
-  ManagedNetwork->Configure (ManagedNetwork, NULL);\r
-\r
-  //\r
-  // Try to flush the RcvdPacketQueue.\r
-  //\r
-  MnpFlushRcvdDataQueue (Instance);\r
-\r
-  //\r
-  // Clean the RxTokenMap.\r
-  //\r
-  NetMapClean (&Instance->RxTokenMap);\r
-\r
-  //\r
-  // Remove this instance from the ChildrenList.\r
-  //\r
-  RemoveEntryList (&Instance->InstEntry);\r
-  MnpServiceData->ChildrenNumber--;\r
-\r
-  gBS->RestoreTPL (OldTpl);\r
-\r
-  FreePool (Instance);\r
-\r
-  return Status;\r
-}\r
-\r
-/**\r
-  The entry point for Mnp driver which installs the driver binding and component\r
-  name protocol on its ImageHandle.\r
-\r
-  @param[in]  ImageHandle  The image handle of the driver.\r
-  @param[in]  SystemTable  The system table.\r
-\r
-  @retval EFI_SUCCES       The driver binding and component name protocols are\r
-                           successfully installed.\r
-  @retval Others           Other errors as indicated.\r
-\r
-**/\r
-EFI_STATUS\r
-EFIAPI\r
-MnpDriverEntryPoint (\r
-  IN EFI_HANDLE          ImageHandle,\r
-  IN EFI_SYSTEM_TABLE    *SystemTable\r
-  )\r
-{\r
-  return EfiLibInstallDriverBindingComponentName2 (\r
-           ImageHandle,\r
-           SystemTable,\r
-           &gMnpDriverBinding,\r
-           ImageHandle,\r
-           &gMnpComponentName,\r
-           &gMnpComponentName2\r
-           );\r
-}\r