]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/Dhcp4Dxe/Dhcp4Driver.c
Fixed one bug in UefiPxeBc start()/stop(). That would cause stop() failure.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / Dhcp4Dxe / Dhcp4Driver.c
index b9f2704c002b03a01aecd3679d90d139c628f4cc..4d78b87ad1187ffa24591d0572fd9060d9f17f11 100644 (file)
@@ -61,14 +61,13 @@ Returns:
 \r
 --*/\r
 {\r
-  return NetLibInstallAllDriverProtocols (\r
+  return EfiLibInstallDriverBindingComponentName2 (\r
            ImageHandle,\r
            SystemTable,\r
            &gDhcp4DriverBinding,\r
            ImageHandle,\r
            &gDhcp4ComponentName,\r
-           NULL,\r
-           NULL\r
+           &gDhcp4ComponentName2\r
            );\r
 }\r
 \r
@@ -230,7 +229,7 @@ Dhcp4CreateService (
   //\r
   Status = gBS->CreateEvent (\r
                   EVT_NOTIFY_SIGNAL | EVT_TIMER,\r
-                  TPL_CALLBACK,\r
+                  NET_TPL_TIMER,\r
                   DhcpOnTimerTick,\r
                   DhcpSb,\r
                   &DhcpSb->Timer\r
@@ -373,7 +372,7 @@ Dhcp4DriverBindingStop (
   NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiUdp4ProtocolGuid);\r
 \r
   if (NicHandle == NULL) {\r
-    return EFI_SUCCESS;\r
+    return EFI_DEVICE_ERROR;\r
   }\r
 \r
    Status = gBS->OpenProtocol (\r
@@ -395,44 +394,39 @@ Dhcp4DriverBindingStop (
     return EFI_SUCCESS;\r
   }\r
 \r
-  OldTpl            = NET_RAISE_TPL (NET_TPL_LOCK);\r
-  DhcpSb->InDestory = TRUE;\r
-\r
-  //\r
-  // Don't use NET_LIST_FOR_EACH_SAFE here, Dhcp4ServiceBindingDestoryChild\r
-  // may cause other child to be deleted.\r
-  //\r
-  while (!NetListIsEmpty (&DhcpSb->Children)) {\r
-    Instance = NET_LIST_HEAD (&DhcpSb->Children, DHCP_PROTOCOL, Link);\r
-    Dhcp4ServiceBindingDestroyChild (ServiceBinding, Instance->Handle);\r
-  }\r
+  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
 \r
-  if (DhcpSb->NumChildren != 0) {\r
-    Status = EFI_DEVICE_ERROR;\r
-    goto ON_ERROR;\r
-  }\r
+  if (NumberOfChildren == 0) {\r
 \r
-  DhcpSb->ServiceState  = DHCP_DESTORY;\r
+    DhcpSb->InDestory    = TRUE;\r
+    DhcpSb->ServiceState = DHCP_DESTORY;\r
 \r
-  Status = gBS->UninstallProtocolInterface (\r
-                  NicHandle,\r
-                  &gEfiDhcp4ServiceBindingProtocolGuid,\r
-                  ServiceBinding\r
-                  );\r
+    gBS->UninstallProtocolInterface (\r
+           NicHandle,\r
+           &gEfiDhcp4ServiceBindingProtocolGuid,\r
+           ServiceBinding\r
+           );\r
 \r
-  if (EFI_ERROR (Status)) {\r
-    goto ON_ERROR;\r
+    Dhcp4CloseService (DhcpSb);\r
+\r
+    NetFreePool (DhcpSb);\r
+  } else {\r
+    //\r
+    // Don't use NET_LIST_FOR_EACH_SAFE here, Dhcp4ServiceBindingDestoryChild\r
+    // may cause other child to be deleted.\r
+    //\r
+    while (!NetListIsEmpty (&DhcpSb->Children)) {\r
+      Instance = NET_LIST_HEAD (&DhcpSb->Children, DHCP_PROTOCOL, Link);\r
+      ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);\r
+    }\r
+\r
+    if (DhcpSb->NumChildren != 0) {\r
+      Status = EFI_DEVICE_ERROR;\r
+    }\r
   }\r
 \r
-  Dhcp4CloseService (DhcpSb);\r
   NET_RESTORE_TPL (OldTpl);\r
 \r
-  NetFreePool (DhcpSb);\r
-  return EFI_SUCCESS;\r
-\r
-ON_ERROR:\r
-  DhcpSb->InDestory = FALSE;\r
-  NET_RESTORE_TPL (OldTpl);\r
   return Status;\r
 }\r
 \r
@@ -461,6 +455,8 @@ DhcpInitProtocol (
   Instance->CompletionEvent   = NULL;\r
   Instance->RenewRebindEvent  = NULL;\r
   Instance->Token             = NULL;\r
+  Instance->UdpIo             = NULL;\r
+  NetbufQueInit (&Instance->ResponseQueue);\r
 }\r
 \r
 \r