]> git.proxmox.com Git - mirror_edk2.git/blobdiff - MdeModulePkg/Universal/Network/ArpDxe/ArpMain.c
1. Add DPC protocol and DpcLib library in MdeModulePkg.
[mirror_edk2.git] / MdeModulePkg / Universal / Network / ArpDxe / ArpMain.c
index eb1b082a21c0b2b9f39eb5976f0e1c83a348bd40..d760f7c0181bb460003df0c82e07169f770d1ffa 100644 (file)
@@ -51,6 +51,7 @@ ArpConfigure (
 {\r
   EFI_STATUS         Status;\r
   ARP_INSTANCE_DATA  *Instance;\r
+  EFI_TPL            OldTpl;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -65,16 +66,14 @@ ArpConfigure (
 \r
   Instance = ARP_INSTANCE_DATA_FROM_THIS (This);\r
 \r
-  if (EFI_ERROR (NET_TRYLOCK (&Instance->ArpService->Lock))) {\r
-    return EFI_ACCESS_DENIED;\r
-  }\r
+  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
 \r
   //\r
   // Configure this instance, the ConfigData has already passed the basic checks.\r
   //\r
   Status = ArpConfigureInstance (Instance, ConfigData);\r
 \r
-  NET_UNLOCK (&Instance->ArpService->Lock);\r
+  NET_RESTORE_TPL (OldTpl);\r
 \r
   return Status;\r
 }\r
@@ -131,6 +130,7 @@ ArpAdd (
   ARP_CACHE_ENTRY          *CacheEntry;\r
   EFI_SIMPLE_NETWORK_MODE  *SnpMode;\r
   NET_ARP_ADDRESS          MatchAddress[2];\r
+  EFI_TPL                  OldTpl;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -166,9 +166,7 @@ ArpAdd (
   MatchAddress[Protocol].Length     = Instance->ConfigData.SwAddressLength;\r
   MatchAddress[Protocol].AddressPtr = TargetSwAddress;\r
 \r
-  if (EFI_ERROR (NET_TRYLOCK (&ArpService->Lock))) {\r
-    return EFI_ACCESS_DENIED;\r
-  }\r
+  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
 \r
   //\r
   // See whether the entry to add exists. Check the DeinedCacheTable first.\r
@@ -262,7 +260,7 @@ ArpAdd (
 \r
 UNLOCK_EXIT:\r
 \r
-  NET_UNLOCK (&ArpService->Lock);\r
+  NET_RESTORE_TPL (OldTpl);\r
 \r
   return Status;\r
 }\r
@@ -309,7 +307,7 @@ ArpFind (
 {\r
   EFI_STATUS         Status;\r
   ARP_INSTANCE_DATA  *Instance;\r
-  ARP_SERVICE_DATA   *ArpService;\r
+  EFI_TPL            OldTpl;\r
 \r
   if ((This == NULL) ||\r
     (!Refresh && (EntryCount == NULL) && (EntryLength == NULL)) ||\r
@@ -318,15 +316,12 @@ ArpFind (
   }\r
 \r
   Instance   = ARP_INSTANCE_DATA_FROM_THIS (This);\r
-  ArpService = Instance->ArpService;\r
 \r
   if (!Instance->Configured) {\r
     return EFI_NOT_STARTED;\r
   }\r
 \r
-  if (EFI_ERROR (NET_TRYLOCK (&ArpService->Lock))) {\r
-    return EFI_ACCESS_DENIED;\r
-  }\r
+  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
 \r
   //\r
   // All the check passed, find the cache entries now.\r
@@ -341,7 +336,7 @@ ArpFind (
              Refresh\r
              );\r
 \r
-  NET_UNLOCK (&ArpService->Lock);\r
+  NET_RESTORE_TPL (OldTpl);\r
 \r
   return Status;\r
 }\r
@@ -373,8 +368,8 @@ ArpDelete (
   )\r
 {\r
   ARP_INSTANCE_DATA  *Instance;\r
-  ARP_SERVICE_DATA   *ArpService;\r
   UINTN              Count;\r
+  EFI_TPL            OldTpl;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -386,18 +381,14 @@ ArpDelete (
     return EFI_NOT_STARTED;\r
   }\r
 \r
-  ArpService = Instance->ArpService;\r
-\r
-  if (EFI_ERROR (NET_TRYLOCK (&ArpService->Lock))) {\r
-    return EFI_ACCESS_DENIED;\r
-  }\r
+  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
 \r
   //\r
   // Delete the specified cache entries.\r
   //\r
   Count = ArpDeleteCacheEntry (Instance, BySwAddress, AddressBuffer, TRUE);\r
 \r
-  NET_UNLOCK (&ArpService->Lock);\r
+  NET_RESTORE_TPL (OldTpl);\r
 \r
   return (Count == 0) ? EFI_NOT_FOUND : EFI_SUCCESS;\r
 }\r
@@ -422,8 +413,8 @@ ArpFlush (
   )\r
 {\r
   ARP_INSTANCE_DATA  *Instance;\r
-  ARP_SERVICE_DATA   *ArpService;\r
   UINTN              Count;\r
+  EFI_TPL            OldTpl;\r
 \r
   if (This == NULL) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -435,18 +426,14 @@ ArpFlush (
     return EFI_NOT_STARTED;\r
   }\r
 \r
-  ArpService = Instance->ArpService;\r
-\r
-  if (EFI_ERROR (NET_TRYLOCK (&ArpService->Lock))) {\r
-    return EFI_ACCESS_DENIED;\r
-  }\r
+  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
 \r
   //\r
   // Delete the dynamic entries from the cache table.\r
   //\r
   Count = ArpDeleteCacheEntry (Instance, FALSE, NULL, FALSE);\r
 \r
-  NET_UNLOCK (&ArpService->Lock);\r
+  NET_RESTORE_TPL (OldTpl);\r
 \r
   return (Count == 0) ? EFI_NOT_FOUND : EFI_SUCCESS;\r
 }\r
@@ -491,6 +478,7 @@ ArpRequest (
   NET_ARP_ADDRESS          HardwareAddress;\r
   NET_ARP_ADDRESS          ProtocolAddress;\r
   USER_REQUEST_CONTEXT     *RequestContext;\r
+  EFI_TPL                  OldTpl;\r
 \r
   if ((This == NULL) || (TargetHwAddress == NULL)) {\r
     return EFI_INVALID_PARAMETER;\r
@@ -545,9 +533,7 @@ ArpRequest (
   //\r
   NetZeroMem (TargetHwAddress, SnpMode->HwAddressSize);\r
 \r
-  if (EFI_ERROR (NET_TRYLOCK (&ArpService->Lock))) {\r
-    return EFI_ACCESS_DENIED;\r
-  }\r
+  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
 \r
   //\r
   // Check whether the software address is in the denied table.\r
@@ -653,12 +639,17 @@ ArpRequest (
 \r
 UNLOCK_EXIT:\r
 \r
-  NET_UNLOCK (&ArpService->Lock);\r
+  NET_RESTORE_TPL (OldTpl);\r
 \r
 SIGNAL_USER:\r
 \r
   if ((ResolvedEvent != NULL) && (Status == EFI_SUCCESS)) {\r
     gBS->SignalEvent (ResolvedEvent);\r
+\r
+    //\r
+    // Dispatch the DPC queued by the NotifyFunction of ResolvedEvent.\r
+    //\r
+    NetLibDispatchDpc ();\r
   }\r
 \r
   return Status;\r
@@ -695,8 +686,8 @@ ArpCancel (
   )\r
 {\r
   ARP_INSTANCE_DATA  *Instance;\r
-  ARP_SERVICE_DATA   *ArpService;\r
   UINTN              Count;\r
+  EFI_TPL            OldTpl;\r
 \r
   if ((This == NULL) ||\r
     ((TargetSwAddress != NULL) && (ResolvedEvent == NULL)) ||\r
@@ -710,18 +701,20 @@ ArpCancel (
     return EFI_NOT_STARTED;\r
   }\r
 \r
-  ArpService = Instance->ArpService;\r
-\r
-  if (EFI_ERROR (NET_TRYLOCK (&ArpService->Lock))) {\r
-    return EFI_ACCESS_DENIED;\r
-  }\r
+  OldTpl = NET_RAISE_TPL (NET_TPL_LOCK);\r
 \r
   //\r
   // Cancel the specified request.\r
   //\r
   Count = ArpCancelRequest (Instance, TargetSwAddress, ResolvedEvent);\r
 \r
-  NET_UNLOCK (&ArpService->Lock);\r
+  //\r
+  // Dispatch the DPCs queued by the NotifyFunction of the events signaled\r
+  // by ArpCancleRequest.\r
+  //\r
+  NetLibDispatchDpc ();\r
+\r
+  NET_RESTORE_TPL (OldTpl);\r
 \r
   return (Count == 0) ? EFI_NOT_FOUND : EFI_SUCCESS;\r
 }\r