]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Ip4Dxe/Ip4Driver.c
Scrubbed some files for IP4
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Ip4Dxe / Ip4Driver.c
index f8d4b392767597cf8568bd122a4a663561838b66..f36394a0093075bb54ba7d036e93f967dc4b4c22 100644 (file)
@@ -31,54 +31,54 @@ EFI_DRIVER_BINDING_PROTOCOL gIp4DriverBinding = {
   NULL\r
 };\r
 \r
+/**\r
+  This is the declaration of an EFI image entry point. This entry point is\r
+  the same for UEFI Applications, UEFI OS Loaders, and UEFI Drivers including\r
+  both device drivers and bus drivers.\r
+  \r
+  The entry point for IP4 driver which install the driver\r
+  binding and component name protocol on its image.\r
+\r
+  @param  ImageHandle           The firmware allocated handle for the UEFI image.\r
+  @param  SystemTable           A pointer to the EFI System Table.\r
+\r
+  @retval EFI_SUCCESS           The operation completed successfully.\r
+  @retval EFI_OUT_OF_RESOURCES  The request could not be completed due to a lack of resources.\r
+\r
+**/\r
 EFI_STATUS\r
 EFIAPI\r
 Ip4DriverEntryPoint (\r
   IN EFI_HANDLE             ImageHandle,\r
   IN EFI_SYSTEM_TABLE       *SystemTable\r
   )\r
-/*++\r
-\r
-Routine Description:\r
-\r
-  The entry point for IP4 driver which install the driver\r
-  binding and component name protocol on its image.\r
-\r
-Arguments:\r
-\r
-  ImageHandle - The image handle of the driver\r
-  SystemTable - The system table\r
-\r
-Returns:\r
-\r
-  EFI_SUCCESS if the driver binding and component name protocols\r
-  are successfully installed, otherwise if failed.\r
-\r
---*/\r
 {\r
-  return EfiLibInstallAllDriverProtocols (\r
+  return EfiLibInstallDriverBindingComponentName2 (\r
            ImageHandle,\r
            SystemTable,\r
            &gIp4DriverBinding,\r
            ImageHandle,\r
            &gIp4ComponentName,\r
-           NULL,\r
-           NULL\r
+           &gIp4ComponentName2\r
            );\r
 }\r
 \r
-\r
 /**\r
-  Test to see if this driver supports ControllerHandle.\r
-\r
-  @param  This                   Protocol instance pointer.\r
-  @param  ControllerHandle       Handle of device to test\r
-  @param  RemainingDevicePath    Optional parameter use to pick a specific child\r
-                                 device to start.\r
-\r
-  @retval EFI_SUCCES             This driver supports this device\r
-  @retval EFI_ALREADY_STARTED    This driver is already running on this device\r
-  @retval other                  This driver does not support this device\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  This                Protocol instance pointer.\r
+  @param  ControllerHandle    Handle of device to test\r
+  @param  RemainingDevicePath Optional parameter use to pick a specific child\r
+                              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 other               This driver does not support this device\r
 \r
 **/\r
 EFI_STATUS\r
@@ -122,7 +122,6 @@ Ip4DriverBindingSupported (
   return Status;\r
 }\r
 \r
-STATIC\r
 EFI_STATUS\r
 Ip4CleanService (\r
   IN IP4_SERVICE            *IpSb\r
@@ -130,7 +129,7 @@ Ip4CleanService (
 \r
 \r
 /**\r
-  Create a new IP4 driver service binding protocol\r
+  Create a new IP4 driver service binding private instance.\r
 \r
   @param  Controller             The controller that has MNP service binding\r
                                  installed\r
@@ -140,9 +139,9 @@ Ip4CleanService (
 \r
   @retval EFI_OUT_OF_RESOURCES   Failed to allocate some resource\r
   @retval EFI_SUCCESS            A new IP4 service binding private is created.\r
+  @retval other                  Other error occurs.\r
 \r
 **/\r
-STATIC\r
 EFI_STATUS\r
 Ip4CreateService (\r
   IN  EFI_HANDLE            Controller,\r
@@ -162,7 +161,7 @@ Ip4CreateService (
   // empty resources, so if any thing goes wrong when allocating\r
   // resources, Ip4CleanService can be called to clean it up.\r
   //\r
-  IpSb = NetAllocatePool (sizeof (IP4_SERVICE));\r
+  IpSb = AllocatePool (sizeof (IP4_SERVICE));\r
 \r
   if (IpSb == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
@@ -175,16 +174,16 @@ Ip4CreateService (
   IpSb->InDestory                   = FALSE;\r
 \r
   IpSb->NumChildren                 = 0;\r
-  NetListInit (&IpSb->Children);\r
+  InitializeListHead (&IpSb->Children);\r
 \r
-  NetListInit (&IpSb->Interfaces);\r
+  InitializeListHead (&IpSb->Interfaces);\r
   IpSb->DefaultInterface            = NULL;\r
   IpSb->DefaultRouteTable           = NULL;\r
 \r
   Ip4InitAssembleTable (&IpSb->Assemble);\r
 \r
   IpSb->IgmpCtrl.Igmpv1QuerySeen    = 0;\r
-  NetListInit (&IpSb->IgmpCtrl.Groups);\r
+  InitializeListHead (&IpSb->IgmpCtrl.Groups);\r
 \r
   IpSb->Image                       = ImageHandle;\r
   IpSb->Controller                  = Controller;\r
@@ -203,12 +202,13 @@ Ip4CreateService (
   IpSb->MnpConfigData.EnableReceiveTimestamps   = FALSE;\r
   IpSb->MnpConfigData.DisableBackgroundPolling  = FALSE;\r
 \r
-  NetZeroMem (&IpSb->SnpMode, sizeof (EFI_SIMPLE_NETWORK_MODE));\r
+  ZeroMem (&IpSb->SnpMode, sizeof (EFI_SIMPLE_NETWORK_MODE));\r
 \r
   IpSb->Timer                       = NULL;\r
   IpSb->Ip4Config                   = NULL;\r
   IpSb->DoneEvent                   = NULL;\r
   IpSb->ReconfigEvent               = NULL;\r
+  IpSb->ActiveEvent                 = NULL;\r
 \r
   //\r
   // Create various resources. First create the route table, timer\r
@@ -283,7 +283,7 @@ Ip4CreateService (
     goto ON_ERROR;\r
   }\r
 \r
-  NetListInsertHead (&IpSb->Interfaces, &IpSb->DefaultInterface->Link);\r
+  InsertHeadList (&IpSb->Interfaces, &IpSb->DefaultInterface->Link);\r
 \r
   IpSb->MacString = NULL;\r
 \r
@@ -292,7 +292,7 @@ Ip4CreateService (
 \r
 ON_ERROR:\r
   Ip4CleanService (IpSb);\r
-  NetFreePool (IpSb);\r
+  gBS->FreePool (IpSb);\r
 \r
   return Status;\r
 }\r
@@ -301,14 +301,14 @@ ON_ERROR:
 /**\r
   Clean up a IP4 service binding instance. It will release all\r
   the resource allocated by the instance. The instance may be\r
-  partly initialized, or partly destoried. If a resource is\r
-  destoried, it is marked as that in case the destory failed and\r
+  partly initialized, or partly destroyed. If a resource is\r
+  destroyed, it is marked as that in case the destory failed and\r
   being called again later.\r
 \r
   @param  IpSb                   The IP4 serviceing binding instance to clean up\r
 \r
   @retval EFI_SUCCESS            The resource used by the instance are cleaned up\r
-  @retval Others                 Failed to clean up some of the resources.\r
+  @retval other                  Failed to clean up some of the resources.\r
 \r
 **/\r
 EFI_STATUS\r
@@ -336,13 +336,13 @@ Ip4CleanService (
   Ip4CleanAssembleTable (&IpSb->Assemble);\r
 \r
   if (IpSb->MnpChildHandle != NULL) {\r
-    if (IpSb->Mnp) {\r
+    if (IpSb->Mnp != NULL) {\r
       gBS->CloseProtocol (\r
-            IpSb->MnpChildHandle,\r
-            &gEfiManagedNetworkProtocolGuid,\r
-            IpSb->Image,\r
-            IpSb->Controller\r
-            );\r
+             IpSb->MnpChildHandle,\r
+             &gEfiManagedNetworkProtocolGuid,\r
+             IpSb->Image,\r
+             IpSb->Controller\r
+             );\r
 \r
       IpSb->Mnp = NULL;\r
     }\r
@@ -376,6 +376,7 @@ Ip4CleanService (
 \r
     gBS->CloseEvent (IpSb->DoneEvent);\r
     gBS->CloseEvent (IpSb->ReconfigEvent);\r
+    IpSb->ActiveEvent = NULL;\r
     IpSb->Ip4Config = NULL;\r
   }\r
 \r
@@ -384,16 +385,21 @@ Ip4CleanService (
 \r
 \r
 /**\r
-  Start this driver on ControllerHandle.\r
-\r
-  @param  This                   Protocol instance pointer.\r
-  @param  ControllerHandle       Handle of device to bind driver to\r
-  @param  RemainingDevicePath    Optional parameter use to pick a specific child\r
-                                 device to start.\r
-\r
-  @retval EFI_SUCCES             This driver is added to ControllerHandle\r
-  @retval EFI_ALREADY_STARTED    This driver is already running on ControllerHandle\r
-  @retval other                  This driver does not support this device\r
+  Start this driver on ControllerHandle. This service is called by the\r
+  EFI boot service ConnectController(). In order to make\r
+  drivers as small as possible, there are a few calling restrictions for\r
+  this service. ConnectController() must follow these\r
+  calling restrictions. If any other agent wishes to call Start() it\r
+  must also follow these calling restrictions.\r
+\r
+  @param  This                 Protocol instance pointer.\r
+  @param  ControllerHandle     Handle of device to bind driver to\r
+  @param  RemainingDevicePath  Optional parameter use to pick a specific child\r
+                               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 other                This driver does not support this device\r
 \r
 **/\r
 EFI_STATUS\r
@@ -476,23 +482,28 @@ UNINSTALL_PROTOCOL:
 \r
 FREE_SERVICE:\r
   Ip4CleanService (IpSb);\r
-  NetFreePool (IpSb);\r
+  gBS->FreePool (IpSb);\r
 \r
   return Status;\r
 }\r
 \r
 \r
 /**\r
-  Stop this driver on ControllerHandle.\r
-\r
-  @param  This                   Protocol instance pointer.\r
-  @param  ControllerHandle       Handle of device to stop driver on\r
-  @param  NumberOfChildren       Number of Handles in ChildHandleBuffer. If  number\r
-                                 of children is zero stop the entire  bus driver.\r
-  @param  ChildHandleBuffer      List of Child Handles to Stop.\r
-\r
-  @retval EFI_SUCCES             This driver is removed ControllerHandle\r
-  @retval other                  This driver was not removed from this device\r
+  Stop this driver on ControllerHandle. This service is called by the\r
+  EFI boot service DisconnectController(). In order to\r
+  make drivers as small as possible, there are a few calling\r
+  restrictions for this service. DisconnectController()\r
+  must follow these calling restrictions. If any other agent wishes\r
+  to call Stop() it must also follow these calling restrictions.\r
+  \r
+  @param  This              Protocol instance pointer.\r
+  @param  ControllerHandle  Handle of device to stop driver on\r
+  @param  NumberOfChildren  Number of Handles in ChildHandleBuffer. If number of\r
+                            children is zero stop the entire bus driver.\r
+  @param  ChildHandleBuffer List of Child Handles to Stop.\r
+\r
+  @retval EFI_SUCCESS       This driver is removed ControllerHandle\r
+  @retval other             This driver was not removed from this device\r
 \r
 **/\r
 EFI_STATUS\r
@@ -511,6 +522,7 @@ Ip4DriverBindingStop (
   EFI_STATUS                    Status;\r
   EFI_TPL                       OldTpl;\r
   INTN                          State;\r
+  BOOLEAN                       IsArp;\r
 \r
   //\r
   // IP4 driver opens the MNP child, ARP children or the IP4_CONFIG protocol\r
@@ -548,14 +560,14 @@ Ip4DriverBindingStop (
                     );\r
 \r
     if (EFI_ERROR (Status)) {\r
-      return EFI_SUCCESS;\r
+      return EFI_DEVICE_ERROR;\r
     }\r
 \r
     IpSb = IP4_SERVICE_FROM_PROTOCOL (ServiceBinding);\r
 \r
-    OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+    OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
-    if (IpSb->Ip4Config && (IpSb->State != IP4_SERVICE_DESTORY)) {\r
+    if (IpSb->Ip4Config != NULL && (IpSb->State != IP4_SERVICE_DESTORY)) {\r
 \r
       IpSb->Ip4Config->Stop (IpSb->Ip4Config);\r
 \r
@@ -567,7 +579,7 @@ Ip4DriverBindingStop (
                       );\r
 \r
       if (EFI_ERROR (Status)) {\r
-        NET_RESTORE_TPL (OldTpl);\r
+        gBS->RestoreTPL (OldTpl);\r
         return Status;\r
       }\r
 \r
@@ -583,7 +595,7 @@ Ip4DriverBindingStop (
       gBS->CloseEvent (IpSb->ReconfigEvent);\r
     }\r
 \r
-    NET_RESTORE_TPL (OldTpl);\r
+    gBS->RestoreTPL (OldTpl);\r
     return EFI_SUCCESS;\r
   }\r
 \r
@@ -593,14 +605,16 @@ Ip4DriverBindingStop (
   // service binding is installed on the NIC handle. So, need to open\r
   // the protocol info to find the NIC handle.\r
   //\r
+  IsArp     = FALSE;\r
   NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiManagedNetworkProtocolGuid);\r
 \r
   if (NicHandle == NULL) {\r
     NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiArpProtocolGuid);\r
+    IsArp     = TRUE;\r
   }\r
 \r
   if (NicHandle == NULL) {\r
-    return EFI_SUCCESS;\r
+    return EFI_DEVICE_ERROR;\r
   }\r
 \r
   //\r
@@ -621,70 +635,96 @@ Ip4DriverBindingStop (
 \r
   IpSb   = IP4_SERVICE_FROM_PROTOCOL (ServiceBinding);\r
 \r
-  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
   if (IpSb->InDestory) {\r
-    NET_RESTORE_TPL (OldTpl);\r
+    gBS->RestoreTPL (OldTpl);\r
     return EFI_SUCCESS;\r
   }\r
 \r
-  IpSb->InDestory = TRUE;\r
+  if (IsArp) {\r
+    while (!IsListEmpty (&IpSb->Children)) {\r
+      IpInstance = NET_LIST_HEAD (&IpSb->Children, IP4_PROTOCOL, Link);\r
 \r
-  State           = IpSb->State;\r
-  IpSb->State     = IP4_SERVICE_DESTORY;\r
+      ServiceBinding->DestroyChild (ServiceBinding, IpInstance->Handle);\r
+    }\r
 \r
-  //\r
-  // Destory all the children first. If not all children are destoried,\r
-  // the IP driver can operate correctly, so restore it state. Don't\r
-  // use NET_LIST_FOR_EACH_SAFE here, because it will cache the next\r
-  // pointer, which may point to the child that has already been destoried.\r
-  // For example, if there are two child in the list, the first is UDP\r
-  // listen child, the send is the MTFTP's child. When Udp child is\r
-  // destoried, it will destory the MTFTP's child. Then Next point to\r
-  // a invalid child.\r
-  //\r
-  while (!NetListIsEmpty (&IpSb->Children)) {\r
-    IpInstance = NET_LIST_HEAD (&IpSb->Children, IP4_PROTOCOL, Link);\r
-    Ip4ServiceBindingDestroyChild (ServiceBinding, IpInstance->Handle);\r
-  }\r
+    if (IpSb->NumChildren != 0) {\r
+      Status = EFI_DEVICE_ERROR;\r
+      goto ON_ERROR;\r
+    }\r
 \r
-  if (IpSb->NumChildren != 0) {\r
-    IpSb->State = State;\r
-    Status      = EFI_DEVICE_ERROR;\r
-    goto ON_ERROR;\r
-  }\r
+    IpSb->InDestory = TRUE;\r
 \r
-  //\r
-  // Clear the variable data.\r
-  //\r
-  Ip4ClearVariableData (IpSb);\r
+    State           = IpSb->State;\r
+    IpSb->State     = IP4_SERVICE_DESTORY;\r
 \r
-  //\r
-  // OK, clean other resources then uninstall the service binding protocol.\r
-  //\r
-  Status = Ip4CleanService (IpSb);\r
+    //\r
+    // Clear the variable data.\r
+    //\r
+    Ip4ClearVariableData (IpSb);\r
 \r
-  if (EFI_ERROR (Status)) {\r
-    goto ON_ERROR;\r
-  }\r
+    //\r
+    // OK, clean other resources then uninstall the service binding protocol.\r
+    //\r
+    Status = Ip4CleanService (IpSb);\r
 \r
-  Status = gBS->UninstallProtocolInterface (\r
-                  NicHandle,\r
-                  &gEfiIp4ServiceBindingProtocolGuid,\r
-                  ServiceBinding\r
-                  );\r
+    if (EFI_ERROR (Status)) {\r
+      IpSb->State = State;\r
+      goto ON_ERROR;\r
+    }\r
 \r
-  if (EFI_ERROR (Status)) {\r
-    goto ON_ERROR;\r
-  }\r
+    gBS->UninstallProtocolInterface (\r
+           NicHandle,\r
+           &gEfiIp4ServiceBindingProtocolGuid,\r
+           ServiceBinding\r
+           );\r
 \r
-  NET_RESTORE_TPL (OldTpl);\r
-  NetFreePool (IpSb);\r
-  return EFI_SUCCESS;\r
+    gBS->FreePool (IpSb);\r
+  } else if (NumberOfChildren == 0) {\r
+    IpSb->InDestory = TRUE;\r
+\r
+    State           = IpSb->State;\r
+    IpSb->State     = IP4_SERVICE_DESTORY;\r
+\r
+    //\r
+    // Clear the variable data.\r
+    //\r
+    Ip4ClearVariableData (IpSb);\r
+\r
+    //\r
+    // OK, clean other resources then uninstall the service binding protocol.\r
+    //\r
+    Status = Ip4CleanService (IpSb);\r
+\r
+    if (EFI_ERROR (Status)) {\r
+      IpSb->State = State;\r
+      goto ON_ERROR;\r
+    }\r
+\r
+    gBS->UninstallProtocolInterface (\r
+           NicHandle,\r
+           &gEfiIp4ServiceBindingProtocolGuid,\r
+           ServiceBinding\r
+           );\r
+\r
+    gBS->FreePool (IpSb);\r
+  } else {\r
+\r
+    while (!IsListEmpty (&IpSb->Children)) {\r
+      IpInstance = NET_LIST_HEAD (&IpSb->Children, IP4_PROTOCOL, Link);\r
+\r
+      ServiceBinding->DestroyChild (ServiceBinding, IpInstance->Handle);\r
+    }\r
+\r
+    if (IpSb->NumChildren != 0) {\r
+      Status = EFI_DEVICE_ERROR;\r
+    }\r
+  }\r
 \r
 ON_ERROR:\r
-  IpSb->InDestory = FALSE;\r
-  NET_RESTORE_TPL (OldTpl);\r
+\r
+  gBS->RestoreTPL (OldTpl);\r
   return Status;\r
 }\r
 \r
@@ -692,23 +732,23 @@ ON_ERROR:
 /**\r
   Creates a child handle with a set of I/O services.\r
 \r
-  @param  This                   Protocol instance pointer.\r
-  @param  ChildHandle            Pointer to the handle of the child to create.   If\r
-                                 it is NULL, then a new handle is created.   If it\r
-                                 is not NULL, then the I/O services are  added to\r
-                                 the existing child handle.\r
+  @param  This        Protocol instance pointer.\r
+  @param  ChildHandle Pointer to the handle of the child to create.  If it is NULL,\r
+                      then a new handle is created.  If it is not NULL, then the\r
+                      I/O services are added to the existing child handle.\r
 \r
-  @retval EFI_SUCCES             The child handle was created with the I/O services\r
-  @retval EFI_OUT_OF_RESOURCES   There are not enough resources availabe to create\r
-                                 the child\r
-  @retval other                  The child handle was not created\r
+  @retval EFI_SUCCES            The child handle was created with the I/O services\r
+  @retval EFI_INVALID_PARAMETER ChildHandle is NULL.\r
+  @retval EFI_OUT_OF_RESOURCES  There are not enough resources availabe to create\r
+                                the child\r
+  @retval other                 The child handle was not created\r
 \r
 **/\r
 EFI_STATUS\r
 EFIAPI\r
 Ip4ServiceBindingCreateChild (\r
   IN EFI_SERVICE_BINDING_PROTOCOL  *This,\r
-  IN EFI_HANDLE                    *ChildHandle\r
+  IN OUT EFI_HANDLE                *ChildHandle\r
   )\r
 {\r
   IP4_SERVICE               *IpSb;\r
@@ -722,7 +762,7 @@ Ip4ServiceBindingCreateChild (
   }\r
 \r
   IpSb       = IP4_SERVICE_FROM_PROTOCOL (This);\r
-  IpInstance = NetAllocatePool (sizeof (IP4_PROTOCOL));\r
+  IpInstance = AllocatePool (sizeof (IP4_PROTOCOL));\r
 \r
   if (IpInstance == NULL) {\r
     return EFI_OUT_OF_RESOURCES;\r
@@ -771,12 +811,12 @@ Ip4ServiceBindingCreateChild (
   //\r
   // Insert it into the service binding instance.\r
   //\r
-  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
-  NetListInsertTail (&IpSb->Children, &IpInstance->Link);\r
+  InsertTailList (&IpSb->Children, &IpInstance->Link);\r
   IpSb->NumChildren++;\r
 \r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 \r
 ON_ERROR:\r
 \r
@@ -784,7 +824,7 @@ ON_ERROR:
 \r
     Ip4CleanProtocol (IpInstance);\r
 \r
-    NetFreePool (IpInstance);\r
+    gBS->FreePool (IpInstance);\r
   }\r
 \r
   return Status;\r
@@ -794,17 +834,16 @@ ON_ERROR:
 /**\r
   Destroys a child handle with a set of I/O services.\r
 \r
-  @param  This                   Protocol instance pointer.\r
-  @param  ChildHandle            Handle of the child to destroy\r
+  @param  This        Protocol instance pointer.\r
+  @param  ChildHandle Handle of the child to destroy\r
 \r
-  @retval EFI_SUCCES             The I/O services were removed from the child\r
-                                 handle\r
-  @retval EFI_UNSUPPORTED        The child handle does not support the I/O services\r
-                                  that are being removed\r
-  @retval EFI_INVALID_PARAMETER  Child handle is not a valid EFI Handle.\r
-  @retval EFI_ACCESS_DENIED      The child handle could not be destroyed because\r
-                                 its  I/O services are being used.\r
-  @retval other                  The child handle was not destroyed\r
+  @retval EFI_SUCCES            The I/O services were removed from the child handle\r
+  @retval EFI_UNSUPPORTED       The child handle does not support the I/O services\r
+                                that are being removed.\r
+  @retval EFI_INVALID_PARAMETER Child handle is not a valid EFI Handle.\r
+  @retval EFI_ACCESS_DENIED     The child handle could not be destroyed because its\r
+                                I/O services are being used.\r
+  @retval other                 The child handle was not destroyed\r
 \r
 **/\r
 EFI_STATUS\r
@@ -849,7 +888,7 @@ Ip4ServiceBindingDestroyChild (
     return EFI_INVALID_PARAMETER;\r
   }\r
 \r
-  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
+  OldTpl = gBS->RaiseTPL (TPL_CALLBACK);\r
 \r
   //\r
   // A child can be destoried more than once. For example,\r
@@ -858,7 +897,7 @@ Ip4ServiceBindingDestroyChild (
   // the IP child it opens.\r
   //\r
   if (IpInstance->State == IP4_STATE_DESTORY) {\r
-    NET_RESTORE_TPL (OldTpl);\r
+    gBS->RestoreTPL (OldTpl);\r
     return EFI_SUCCESS;\r
   }\r
 \r
@@ -914,17 +953,17 @@ Ip4ServiceBindingDestroyChild (
     goto ON_ERROR;\r
   }\r
 \r
-  NetListRemoveEntry (&IpInstance->Link);\r
+  RemoveEntryList (&IpInstance->Link);\r
   IpSb->NumChildren--;\r
 \r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 \r
-  NetFreePool (IpInstance);\r
+  gBS->FreePool (IpInstance);\r
   return EFI_SUCCESS;\r
 \r
 ON_ERROR:\r
   IpInstance->State = State;\r
-  NET_RESTORE_TPL (OldTpl);\r
+  gBS->RestoreTPL (OldTpl);\r
 \r
   return Status;\r
 }\r