]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/ArpDxe/ArpDriver.c
Sync the latest version from R8.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / ArpDxe / ArpDriver.c
index 6a52ed1958673cf715489e3cbc604b50f028417c..aa99ff5b51f001ddf78503a149c01498b7eddaf3 100644 (file)
@@ -1,6 +1,6 @@
 /** @file\r
 \r
-Copyright (c) 2006, Intel Corporation\r
+Copyright (c) 2006 - 2007, Intel Corporation                                                         \r
 All rights reserved. This program and the accompanying materials\r
 are licensed and made available under the terms and conditions of the BSD License\r
 which accompanies this distribution.  The full text of the license may be found at\r
@@ -177,11 +177,6 @@ ArpCreateService (
     goto ERROR_EXIT;\r
   }\r
 \r
-  //\r
-  // Init the lock.\r
-  //\r
-  NET_LOCK_INIT (&ArpService->Lock);\r
-\r
   //\r
   // Init the lists.\r
   //\r
@@ -418,7 +413,7 @@ ArpDriverBindingStop (
   //\r
   NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiManagedNetworkProtocolGuid);\r
   if (NicHandle == NULL) {\r
-    return EFI_SUCCESS;\r
+    return EFI_DEVICE_ERROR;\r
   }\r
 \r
   //\r
@@ -434,50 +429,43 @@ ArpDriverBindingStop (
                   );\r
   if (EFI_ERROR (Status)) {\r
     ARP_DEBUG_ERROR (("ArpDriverBindingStop: Open ArpSb failed, %r.\n", Status));\r
-    return Status;\r
+    return EFI_DEVICE_ERROR;\r
   }\r
 \r
   ArpService = ARP_SERVICE_DATA_FROM_THIS (ServiceBinding);\r
 \r
-  while (!NetListIsEmpty (&ArpService->ChildrenList)) {\r
+  if (NumberOfChildren == 0) {\r
     //\r
-    // Iterate all the instances.\r
+    // Uninstall the ARP ServiceBinding protocol.\r
     //\r
-    Instance = NET_LIST_HEAD (&ArpService->ChildrenList, ARP_INSTANCE_DATA, List);\r
+    gBS->UninstallMultipleProtocolInterfaces (\r
+           NicHandle,\r
+           &gEfiArpServiceBindingProtocolGuid,\r
+           &ArpService->ServiceBinding,\r
+           NULL\r
+           );\r
 \r
     //\r
-    // Destroy this arp child.\r
+    // Clean the arp servicebinding context data and free the memory allocated.\r
     //\r
-    ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);\r
-  }\r
+    ArpCleanService (ArpService);\r
 \r
-  ASSERT (NetListIsEmpty (&ArpService->PendingRequestTable));\r
-  ASSERT (NetListIsEmpty (&ArpService->DeniedCacheTable));\r
-  ASSERT (NetListIsEmpty (&ArpService->ResolvedCacheTable));\r
+    NetFreePool (ArpService);\r
+  } else {\r
 \r
-  //\r
-  // Uninstall the ARP ServiceBinding protocol.\r
-  //\r
-  Status = gBS->UninstallMultipleProtocolInterfaces (\r
-                  NicHandle,\r
-                  &gEfiArpServiceBindingProtocolGuid,\r
-                  &ArpService->ServiceBinding,\r
-                  NULL\r
-                  );\r
-  if (EFI_ERROR (Status)) {\r
-    ARP_DEBUG_ERROR (("ArpDriverBindingStop: Failed to uninstall ArpSb, %r.\n", Status));\r
-    return Status;\r
-  }\r
+    while (!NetListIsEmpty (&ArpService->ChildrenList)) {\r
+      Instance = NET_LIST_HEAD (&ArpService->ChildrenList, ARP_INSTANCE_DATA, List);\r
 \r
-  //\r
-  // Clean the arp servicebinding context data and free the memory allocated.\r
-  //\r
-  ArpCleanService (ArpService);\r
-  NetFreePool (ArpService);\r
+      ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);\r
+    }\r
 \r
-  return Status;\r
-}\r
+    ASSERT (NetListIsEmpty (&ArpService->PendingRequestTable));\r
+    ASSERT (NetListIsEmpty (&ArpService->DeniedCacheTable));\r
+    ASSERT (NetListIsEmpty (&ArpService->ResolvedCacheTable));\r
+  }\r
 \r
+  return EFI_SUCCESS;\r
+}\r
 \r
 /**\r
   Creates a child handle with a set of I/O services.\r
@@ -506,6 +494,7 @@ ArpServiceBindingCreateChild (
   ARP_SERVICE_DATA   *ArpService;\r
   ARP_INSTANCE_DATA  *Instance;\r
   VOID               *Mnp;\r
+  EFI_TPL            OldTpl;\r
 \r
   if ((This == NULL) || (ChildHandle == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -564,11 +553,7 @@ ArpServiceBindingCreateChild (
     goto ERROR;\r
   }\r
 \r
-  if (EFI_ERROR (NET_TRYLOCK (&ArpService->Lock))) {\r
-\r
-    Status = EFI_ACCESS_DENIED;\r
-    goto ERROR;\r
-  }\r
+  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
 \r
   //\r
   // Insert the instance into children list managed by the arp service context data.\r
@@ -576,7 +561,7 @@ ArpServiceBindingCreateChild (
   NetListInsertTail (&ArpService->ChildrenList, &Instance->List);\r
   ArpService->ChildrenNumber++;\r
 \r
-  NET_UNLOCK (&ArpService->Lock);\r
+  NET_RESTORE_TPL (OldTpl);\r
 \r
 ERROR:\r
 \r
@@ -633,6 +618,7 @@ ArpServiceBindingDestroyChild (
   ARP_SERVICE_DATA   *ArpService;\r
   ARP_INSTANCE_DATA  *Instance;\r
   EFI_ARP_PROTOCOL   *Arp;\r
+  EFI_TPL            OldTpl;\r
 \r
   if ((This == NULL) || (ChildHandle == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -693,10 +679,7 @@ ArpServiceBindingDestroyChild (
     return Status;\r
   }\r
 \r
-  if (EFI_ERROR (NET_TRYLOCK (&ArpService->Lock))) {\r
-    Instance->Destroyed = FALSE;\r
-    return EFI_ACCESS_DENIED;\r
-  }\r
+  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
 \r
   if (Instance->Configured) {\r
     //\r
@@ -716,7 +699,7 @@ ArpServiceBindingDestroyChild (
   NetListRemoveEntry (&Instance->List);\r
   ArpService->ChildrenNumber--;\r
 \r
-  NET_UNLOCK (&ArpService->Lock);\r
+  NET_RESTORE_TPL (OldTpl);\r
 \r
   NetFreePool (Instance);\r
 \r
@@ -749,14 +732,13 @@ Returns:
 \r
 --*/\r
 {\r
-  return NetLibInstallAllDriverProtocols (\r
+  return EfiLibInstallDriverBindingComponentName2 (\r
            ImageHandle,\r
            SystemTable,\r
            &gArpDriverBinding,\r
            ImageHandle,\r
            &gArpComponentName,\r
-           NULL,\r
-           NULL\r
+           &gArpComponentName2\r
            );\r
 }\r
 \r