//\r
NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiManagedNetworkProtocolGuid);\r
if (NicHandle == NULL) {\r
- return EFI_SUCCESS;\r
+ return EFI_DEVICE_ERROR;\r
}\r
\r
//\r
);\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