TianoCore EDK2 master
Loading...
Searching...
No Matches
ArpDriver.c
Go to the documentation of this file.
1
9#include "ArpDriver.h"
10#include "ArpImpl.h"
11
12EFI_DRIVER_BINDING_PROTOCOL gArpDriverBinding = {
16 0xa,
17 NULL,
18 NULL
19};
20
39 IN EFI_HANDLE ImageHandle,
40 IN EFI_HANDLE ControllerHandle,
41 IN OUT ARP_SERVICE_DATA *ArpService
42 )
43{
44 EFI_STATUS Status;
45
46 ASSERT (ArpService != NULL);
47
48 ArpService->Signature = ARP_SERVICE_DATA_SIGNATURE;
49
50 //
51 // Init the lists.
52 //
53 InitializeListHead (&ArpService->ChildrenList);
54 InitializeListHead (&ArpService->PendingRequestTable);
55 InitializeListHead (&ArpService->DeniedCacheTable);
56 InitializeListHead (&ArpService->ResolvedCacheTable);
57
58 //
59 // Init the servicebinding protocol members.
60 //
61 ArpService->ServiceBinding.CreateChild = ArpServiceBindingCreateChild;
62 ArpService->ServiceBinding.DestroyChild = ArpServiceBindingDestroyChild;
63
64 //
65 // Save the handles.
66 //
67 ArpService->ImageHandle = ImageHandle;
68 ArpService->ControllerHandle = ControllerHandle;
69
70 //
71 // Create a MNP child instance.
72 //
74 ControllerHandle,
75 ImageHandle,
76 &gEfiManagedNetworkServiceBindingProtocolGuid,
77 &ArpService->MnpChildHandle
78 );
79 if (EFI_ERROR (Status)) {
80 return Status;
81 }
82
83 //
84 // Open the MNP protocol.
85 //
86 Status = gBS->OpenProtocol (
87 ArpService->MnpChildHandle,
88 &gEfiManagedNetworkProtocolGuid,
89 (VOID **)&ArpService->Mnp,
90 ImageHandle,
91 ControllerHandle,
92 EFI_OPEN_PROTOCOL_BY_DRIVER
93 );
94 if (EFI_ERROR (Status)) {
95 goto ERROR_EXIT;
96 }
97
98 //
99 // Get the underlayer Snp mode data.
100 //
101 Status = ArpService->Mnp->GetModeData (ArpService->Mnp, NULL, &ArpService->SnpMode);
102 if ((Status != EFI_NOT_STARTED) && EFI_ERROR (Status)) {
103 goto ERROR_EXIT;
104 }
105
106 if (ArpService->SnpMode.IfType != NET_IFTYPE_ETHERNET) {
107 //
108 // Only support the ethernet.
109 //
110 Status = EFI_UNSUPPORTED;
111 goto ERROR_EXIT;
112 }
113
114 //
115 // Set the Mnp config parameters.
116 //
117 ArpService->MnpConfigData.ReceivedQueueTimeoutValue = 0;
118 ArpService->MnpConfigData.TransmitQueueTimeoutValue = 0;
119 ArpService->MnpConfigData.ProtocolTypeFilter = ARP_ETHER_PROTO_TYPE;
120 ArpService->MnpConfigData.EnableUnicastReceive = TRUE;
121 ArpService->MnpConfigData.EnableMulticastReceive = FALSE;
122 ArpService->MnpConfigData.EnableBroadcastReceive = TRUE;
123 ArpService->MnpConfigData.EnablePromiscuousReceive = FALSE;
124 ArpService->MnpConfigData.FlushQueuesOnReset = TRUE;
125 ArpService->MnpConfigData.EnableReceiveTimestamps = FALSE;
126 ArpService->MnpConfigData.DisableBackgroundPolling = FALSE;
127
128 //
129 // Configure the Mnp child.
130 //
131 Status = ArpService->Mnp->Configure (ArpService->Mnp, &ArpService->MnpConfigData);
132 if (EFI_ERROR (Status)) {
133 goto ERROR_EXIT;
134 }
135
136 //
137 // Create the event used in the RxToken.
138 //
139 Status = gBS->CreateEvent (
140 EVT_NOTIFY_SIGNAL,
141 TPL_NOTIFY,
143 ArpService,
144 &ArpService->RxToken.Event
145 );
146 if (EFI_ERROR (Status)) {
147 goto ERROR_EXIT;
148 }
149
150 //
151 // Create the Arp heartbeat timer.
152 //
153 Status = gBS->CreateEvent (
154 EVT_NOTIFY_SIGNAL | EVT_TIMER,
155 TPL_CALLBACK,
157 ArpService,
158 &ArpService->PeriodicTimer
159 );
160 if (EFI_ERROR (Status)) {
161 goto ERROR_EXIT;
162 }
163
164 //
165 // Start the heartbeat timer.
166 //
167 Status = gBS->SetTimer (
168 ArpService->PeriodicTimer,
170 ARP_PERIODIC_TIMER_INTERVAL
171 );
172
173ERROR_EXIT:
174
175 return Status;
176}
177
187VOID
189 IN OUT ARP_SERVICE_DATA *ArpService
190 )
191{
192 NET_CHECK_SIGNATURE (ArpService, ARP_SERVICE_DATA_SIGNATURE);
193
194 if (ArpService->PeriodicTimer != NULL) {
195 //
196 // Cancel and close the PeriodicTimer.
197 //
198 gBS->SetTimer (ArpService->PeriodicTimer, TimerCancel, 0);
199 gBS->CloseEvent (ArpService->PeriodicTimer);
200 }
201
202 if (ArpService->RxToken.Event != NULL) {
203 //
204 // Cancel the RxToken and close the event in the RxToken.
205 //
206 ArpService->Mnp->Cancel (ArpService->Mnp, NULL);
207 gBS->CloseEvent (ArpService->RxToken.Event);
208 }
209
210 if (ArpService->Mnp != NULL) {
211 //
212 // Reset the Mnp child and close the Mnp protocol.
213 //
214 ArpService->Mnp->Configure (ArpService->Mnp, NULL);
215 gBS->CloseProtocol (
216 ArpService->MnpChildHandle,
217 &gEfiManagedNetworkProtocolGuid,
218 ArpService->ImageHandle,
219 ArpService->ControllerHandle
220 );
221 }
222
223 if (ArpService->MnpChildHandle != NULL) {
224 //
225 // Destroy the mnp child.
226 //
228 ArpService->ControllerHandle,
229 ArpService->ImageHandle,
230 &gEfiManagedNetworkServiceBindingProtocolGuid,
231 ArpService->MnpChildHandle
232 );
233 }
234}
235
247EFIAPI
249 IN LIST_ENTRY *Entry,
250 IN VOID *Context
251 )
252{
253 ARP_INSTANCE_DATA *Instance;
254 EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
255
256 if ((Entry == NULL) || (Context == NULL)) {
257 return EFI_INVALID_PARAMETER;
258 }
259
260 Instance = NET_LIST_USER_STRUCT_S (Entry, ARP_INSTANCE_DATA, List, ARP_INSTANCE_DATA_SIGNATURE);
261 ServiceBinding = (EFI_SERVICE_BINDING_PROTOCOL *)Context;
262
263 return ServiceBinding->DestroyChild (ServiceBinding, Instance->Handle);
264}
265
296EFIAPI
299 IN EFI_HANDLE ControllerHandle,
300 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
301 )
302{
303 EFI_STATUS Status;
304
305 //
306 // Test to see if Arp SB is already installed.
307 //
308 Status = gBS->OpenProtocol (
309 ControllerHandle,
310 &gEfiArpServiceBindingProtocolGuid,
311 NULL,
312 This->DriverBindingHandle,
313 ControllerHandle,
314 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
315 );
316 if (Status == EFI_SUCCESS) {
317 return EFI_ALREADY_STARTED;
318 }
319
320 //
321 // Test to see if MNP SB is installed.
322 //
323 Status = gBS->OpenProtocol (
324 ControllerHandle,
325 &gEfiManagedNetworkServiceBindingProtocolGuid,
326 NULL,
327 This->DriverBindingHandle,
328 ControllerHandle,
329 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
330 );
331
332 return Status;
333}
334
367EFIAPI
370 IN EFI_HANDLE ControllerHandle,
371 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
372 )
373{
374 EFI_STATUS Status;
375 ARP_SERVICE_DATA *ArpService;
376
377 //
378 // Allocate a zero pool for ArpService.
379 //
380 ArpService = AllocateZeroPool (sizeof (ARP_SERVICE_DATA));
381 if (ArpService == NULL) {
382 return EFI_OUT_OF_RESOURCES;
383 }
384
385 //
386 // Initialize the arp service context data.
387 //
388 Status = ArpCreateService (This->DriverBindingHandle, ControllerHandle, ArpService);
389 if (EFI_ERROR (Status)) {
390 goto ERROR;
391 }
392
393 //
394 // Install the ARP service binding protocol.
395 //
396 Status = gBS->InstallMultipleProtocolInterfaces (
397 &ControllerHandle,
398 &gEfiArpServiceBindingProtocolGuid,
399 &ArpService->ServiceBinding,
400 NULL
401 );
402 if (EFI_ERROR (Status)) {
403 goto ERROR;
404 }
405
406 //
407 // OK, start to receive arp packets from Mnp.
408 //
409 Status = ArpService->Mnp->Receive (ArpService->Mnp, &ArpService->RxToken);
410 if (EFI_ERROR (Status)) {
411 goto ERROR;
412 }
413
414 return Status;
415
416ERROR:
417
418 //
419 // On error, clean the arp service context data, and free the memory allocated.
420 //
421 ArpCleanService (ArpService);
422 FreePool (ArpService);
423
424 return Status;
425}
426
457EFIAPI
460 IN EFI_HANDLE ControllerHandle,
461 IN UINTN NumberOfChildren,
462 IN EFI_HANDLE *ChildHandleBuffer
463 )
464{
465 EFI_STATUS Status;
466 EFI_HANDLE NicHandle;
467 EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
468 ARP_SERVICE_DATA *ArpService;
469 LIST_ENTRY *List;
470
471 //
472 // Get the NicHandle which the arp servicebinding is installed on.
473 //
474 NicHandle = NetLibGetNicHandle (ControllerHandle, &gEfiManagedNetworkProtocolGuid);
475 if (NicHandle == NULL) {
476 return EFI_SUCCESS;
477 }
478
479 //
480 // Try to get the arp servicebinding protocol on the NicHandle.
481 //
482 Status = gBS->OpenProtocol (
483 NicHandle,
484 &gEfiArpServiceBindingProtocolGuid,
485 (VOID **)&ServiceBinding,
486 This->DriverBindingHandle,
487 ControllerHandle,
488 EFI_OPEN_PROTOCOL_GET_PROTOCOL
489 );
490 if (EFI_ERROR (Status)) {
491 DEBUG ((DEBUG_ERROR, "ArpDriverBindingStop: Open ArpSb failed, %r.\n", Status));
492 return EFI_DEVICE_ERROR;
493 }
494
495 ArpService = ARP_SERVICE_DATA_FROM_THIS (ServiceBinding);
496
497 if (NumberOfChildren != 0) {
498 //
499 // NumberOfChildren is not zero, destroy all the ARP children instances.
500 //
501 List = &ArpService->ChildrenList;
502 Status = NetDestroyLinkList (
503 List,
505 ServiceBinding,
506 NULL
507 );
508 ASSERT (IsListEmpty (&ArpService->PendingRequestTable));
509 ASSERT (IsListEmpty (&ArpService->DeniedCacheTable));
510 ASSERT (IsListEmpty (&ArpService->ResolvedCacheTable));
511 } else if (IsListEmpty (&ArpService->ChildrenList)) {
512 //
513 // Uninstall the ARP ServiceBinding protocol.
514 //
515 gBS->UninstallMultipleProtocolInterfaces (
516 NicHandle,
517 &gEfiArpServiceBindingProtocolGuid,
518 &ArpService->ServiceBinding,
519 NULL
520 );
521
522 //
523 // Clean the arp servicebinding context data and free the memory allocated.
524 //
525 ArpCleanService (ArpService);
526
527 FreePool (ArpService);
528 }
529
530 return EFI_SUCCESS;
531}
532
554EFIAPI
557 IN EFI_HANDLE *ChildHandle
558 )
559{
560 EFI_STATUS Status;
561 ARP_SERVICE_DATA *ArpService;
562 ARP_INSTANCE_DATA *Instance;
563 VOID *Mnp;
564 EFI_TPL OldTpl;
565
566 if ((This == NULL) || (ChildHandle == NULL)) {
567 return EFI_INVALID_PARAMETER;
568 }
569
570 ArpService = ARP_SERVICE_DATA_FROM_THIS (This);
571
572 //
573 // Allocate memory for the instance context data.
574 //
575 Instance = AllocateZeroPool (sizeof (ARP_INSTANCE_DATA));
576 if (Instance == NULL) {
577 DEBUG ((DEBUG_ERROR, "ArpSBCreateChild: Failed to allocate memory for Instance.\n"));
578
579 return EFI_OUT_OF_RESOURCES;
580 }
581
582 //
583 // Init the instance context data.
584 //
585 ArpInitInstance (ArpService, Instance);
586
587 //
588 // Install the ARP protocol onto the ChildHandle.
589 //
590 Status = gBS->InstallMultipleProtocolInterfaces (
591 ChildHandle,
592 &gEfiArpProtocolGuid,
593 (VOID *)&Instance->ArpProto,
594 NULL
595 );
596 if (EFI_ERROR (Status)) {
597 DEBUG ((DEBUG_ERROR, "ArpSBCreateChild: failed to install ARP protocol, %r.\n", Status));
598
599 FreePool (Instance);
600 return Status;
601 }
602
603 //
604 // Save the ChildHandle.
605 //
606 Instance->Handle = *ChildHandle;
607
608 //
609 // Open the Managed Network protocol BY_CHILD.
610 //
611 Status = gBS->OpenProtocol (
612 ArpService->MnpChildHandle,
613 &gEfiManagedNetworkProtocolGuid,
614 (VOID **)&Mnp,
615 gArpDriverBinding.DriverBindingHandle,
616 Instance->Handle,
617 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
618 );
619 if (EFI_ERROR (Status)) {
620 goto ERROR;
621 }
622
623 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
624
625 //
626 // Insert the instance into children list managed by the arp service context data.
627 //
628 InsertTailList (&ArpService->ChildrenList, &Instance->List);
629 ArpService->ChildrenNumber++;
630
631 gBS->RestoreTPL (OldTpl);
632
633ERROR:
634
635 if (EFI_ERROR (Status)) {
636 gBS->CloseProtocol (
637 ArpService->MnpChildHandle,
638 &gEfiManagedNetworkProtocolGuid,
639 gArpDriverBinding.DriverBindingHandle,
640 Instance->Handle
641 );
642
643 gBS->UninstallMultipleProtocolInterfaces (
644 Instance->Handle,
645 &gEfiArpProtocolGuid,
646 &Instance->ArpProto,
647 NULL
648 );
649
650 //
651 // Free the allocated memory.
652 //
653 FreePool (Instance);
654 }
655
656 return Status;
657}
658
679EFIAPI
682 IN EFI_HANDLE ChildHandle
683 )
684{
685 EFI_STATUS Status;
686 ARP_SERVICE_DATA *ArpService;
687 ARP_INSTANCE_DATA *Instance;
688 EFI_ARP_PROTOCOL *Arp;
689 EFI_TPL OldTpl;
690
691 if ((This == NULL) || (ChildHandle == NULL)) {
692 return EFI_INVALID_PARAMETER;
693 }
694
695 ArpService = ARP_SERVICE_DATA_FROM_THIS (This);
696
697 //
698 // Get the arp protocol.
699 //
700 Status = gBS->OpenProtocol (
701 ChildHandle,
702 &gEfiArpProtocolGuid,
703 (VOID **)&Arp,
704 ArpService->ImageHandle,
705 ChildHandle,
706 EFI_OPEN_PROTOCOL_GET_PROTOCOL
707 );
708 if (EFI_ERROR (Status)) {
709 return EFI_UNSUPPORTED;
710 }
711
712 Instance = ARP_INSTANCE_DATA_FROM_THIS (Arp);
713
714 if (Instance->InDestroy) {
715 return EFI_SUCCESS;
716 }
717
718 //
719 // Use the InDestroy as a flag to avoid re-entrance.
720 //
721 Instance->InDestroy = TRUE;
722
723 //
724 // Close the Managed Network protocol.
725 //
726 gBS->CloseProtocol (
727 ArpService->MnpChildHandle,
728 &gEfiManagedNetworkProtocolGuid,
729 gArpDriverBinding.DriverBindingHandle,
730 ChildHandle
731 );
732
733 //
734 // Uninstall the ARP protocol.
735 //
736 Status = gBS->UninstallMultipleProtocolInterfaces (
737 ChildHandle,
738 &gEfiArpProtocolGuid,
739 &Instance->ArpProto,
740 NULL
741 );
742 if (EFI_ERROR (Status)) {
743 DEBUG ((
744 DEBUG_ERROR,
745 "ArpSBDestroyChild: Failed to uninstall the arp protocol, %r.\n",
746 Status
747 ));
748
749 Instance->InDestroy = FALSE;
750 return Status;
751 }
752
753 OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
754
755 if (Instance->Configured) {
756 //
757 // Delete the related cache entry.
758 //
759 ArpDeleteCacheEntry (Instance, FALSE, NULL, TRUE);
760
761 //
762 // Reset the instance configuration.
763 //
764 ArpConfigureInstance (Instance, NULL);
765 }
766
767 //
768 // Remove this instance from the ChildrenList.
769 //
770 RemoveEntryList (&Instance->List);
771 ArpService->ChildrenNumber--;
772
773 gBS->RestoreTPL (OldTpl);
774
775 FreePool (Instance);
776
777 return Status;
778}
779
793EFIAPI
795 IN EFI_HANDLE ImageHandle,
796 IN EFI_SYSTEM_TABLE *SystemTable
797 )
798{
800 ImageHandle,
801 SystemTable,
802 &gArpDriverBinding,
803 ImageHandle,
804 &gArpComponentName,
805 &gArpComponentName2
806 );
807}
UINT64 UINTN
EFI_STATUS ArpCreateService(IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ControllerHandle, IN OUT ARP_SERVICE_DATA *ArpService)
Definition: ArpDriver.c:38
EFI_STATUS EFIAPI ArpDriverBindingSupported(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL)
Definition: ArpDriver.c:297
VOID ArpCleanService(IN OUT ARP_SERVICE_DATA *ArpService)
Definition: ArpDriver.c:188
EFI_STATUS EFIAPI ArpServiceBindingCreateChild(IN EFI_SERVICE_BINDING_PROTOCOL *This, IN EFI_HANDLE *ChildHandle)
Definition: ArpDriver.c:555
EFI_STATUS EFIAPI ArpServiceBindingDestroyChild(IN EFI_SERVICE_BINDING_PROTOCOL *This, IN EFI_HANDLE ChildHandle)
Definition: ArpDriver.c:680
EFI_STATUS EFIAPI ArpDriverBindingStart(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL)
Definition: ArpDriver.c:368
EFI_STATUS EFIAPI ArpDriverBindingStop(IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE ControllerHandle, IN UINTN NumberOfChildren, IN EFI_HANDLE *ChildHandleBuffer)
Definition: ArpDriver.c:458
EFI_STATUS EFIAPI ArpDriverEntryPoint(IN EFI_HANDLE ImageHandle, IN EFI_SYSTEM_TABLE *SystemTable)
Definition: ArpDriver.c:794
EFI_STATUS EFIAPI ArpDestroyChildEntryInHandleBuffer(IN LIST_ENTRY *Entry, IN VOID *Context)
Definition: ArpDriver.c:248
EFI_STATUS ArpConfigureInstance(IN ARP_INSTANCE_DATA *Instance, IN EFI_ARP_CONFIG_DATA *ConfigData OPTIONAL)
Definition: ArpImpl.c:906
UINTN ArpDeleteCacheEntry(IN ARP_INSTANCE_DATA *Instance, IN BOOLEAN BySwAddress, IN UINT8 *AddressBuffer OPTIONAL, IN BOOLEAN Force)
Definition: ArpImpl.c:1326
VOID EFIAPI ArpOnFrameRcvd(IN EFI_EVENT Event, IN VOID *Context)
Definition: ArpImpl.c:333
VOID EFIAPI ArpTimerHandler(IN EFI_EVENT Event, IN VOID *Context)
Definition: ArpImpl.c:418
VOID ArpInitInstance(IN ARP_SERVICE_DATA *ArpService, OUT ARP_INSTANCE_DATA *Instance)
Definition: ArpImpl.c:35
#define ARP_INSTANCE_DATA_FROM_THIS(a)
Definition: ArpImpl.h:98
#define ARP_SERVICE_DATA_FROM_THIS(a)
Definition: ArpImpl.h:134
BOOLEAN EFIAPI IsListEmpty(IN CONST LIST_ENTRY *ListHead)
Definition: LinkedList.c:403
LIST_ENTRY *EFIAPI RemoveEntryList(IN CONST LIST_ENTRY *Entry)
Definition: LinkedList.c:590
LIST_ENTRY *EFIAPI InitializeListHead(IN OUT LIST_ENTRY *ListHead)
Definition: LinkedList.c:182
LIST_ENTRY *EFIAPI InsertTailList(IN OUT LIST_ENTRY *ListHead, IN OUT LIST_ENTRY *Entry)
Definition: LinkedList.c:259
VOID *EFIAPI AllocateZeroPool(IN UINTN AllocationSize)
VOID EFIAPI FreePool(IN VOID *Buffer)
#define NULL
Definition: Base.h:319
#define TRUE
Definition: Base.h:301
#define FALSE
Definition: Base.h:307
#define IN
Definition: Base.h:279
#define OUT
Definition: Base.h:284
#define DEBUG(Expression)
Definition: DebugLib.h:434
EFI_STATUS EFIAPI NetLibCreateServiceChild(IN EFI_HANDLE Controller, IN EFI_HANDLE Image, IN EFI_GUID *ServiceBindingGuid, IN OUT EFI_HANDLE *ChildHandle)
Definition: DxeNetLib.c:1967
EFI_STATUS EFIAPI NetLibDestroyServiceChild(IN EFI_HANDLE Controller, IN EFI_HANDLE Image, IN EFI_GUID *ServiceBindingGuid, IN EFI_HANDLE ChildHandle)
Definition: DxeNetLib.c:2020
EFI_HANDLE EFIAPI NetLibGetNicHandle(IN EFI_HANDLE Controller, IN EFI_GUID *ProtocolGuid)
Definition: DxeNetLib.c:3019
EFI_STATUS EFIAPI NetDestroyLinkList(IN LIST_ENTRY *List, IN NET_DESTROY_LINK_LIST_CALLBACK CallBack, IN VOID *Context OPTIONAL, OUT UINTN *ListLength OPTIONAL)
Definition: DxeNetLib.c:1236
RETURN_STATUS EFI_STATUS
Definition: UefiBaseType.h:29
UINTN EFI_TPL
Definition: UefiBaseType.h:41
VOID * EFI_HANDLE
Definition: UefiBaseType.h:33
#define EFI_SUCCESS
Definition: UefiBaseType.h:112
EFI_BOOT_SERVICES * gBS
EFI_STATUS EFIAPI EfiLibInstallDriverBindingComponentName2(IN CONST EFI_HANDLE ImageHandle, IN CONST EFI_SYSTEM_TABLE *SystemTable, IN EFI_DRIVER_BINDING_PROTOCOL *DriverBinding, IN EFI_HANDLE DriverBindingHandle, IN CONST EFI_COMPONENT_NAME_PROTOCOL *ComponentName OPTIONAL, IN CONST EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2 OPTIONAL)
@ TimerCancel
Definition: UefiSpec.h:531
@ TimerPeriodic
Definition: UefiSpec.h:535