]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2Keyboard.c
Coding style modification.
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Isa / Ps2KeyboardDxe / Ps2Keyboard.c
CommitLineData
f8cd287b 1/**@file\r
2\r
3 PS/2 Keyboard driver. Routines that interacts with callers,\r
4 conforming to EFI driver model\r
05fbd06d 5\r
df0dcb5e 6Copyright (c) 2006 - 2007, Intel Corporation\r
7All rights reserved. This program and the accompanying materials\r
8are licensed and made available under the terms and conditions of the BSD License\r
9which accompanies this distribution. The full text of the license may be found at\r
10http://opensource.org/licenses/bsd-license.php\r
11\r
12THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
13WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
05fbd06d 14\r
f8cd287b 15**/\r
05fbd06d 16\r
05fbd06d 17#include "Ps2Keyboard.h"\r
18\r
19//\r
20// Function prototypes\r
21//\r
22EFI_STATUS\r
23EFIAPI\r
24KbdControllerDriverSupported (\r
25 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
26 IN EFI_HANDLE Controller,\r
27 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
28 );\r
29\r
30EFI_STATUS\r
31EFIAPI\r
32KbdControllerDriverStart (\r
33 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
34 IN EFI_HANDLE Controller,\r
35 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
36 );\r
37\r
38EFI_STATUS\r
39EFIAPI\r
40KbdControllerDriverStop (\r
41 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
42 IN EFI_HANDLE Controller,\r
43 IN UINTN NumberOfChildren,\r
44 IN EFI_HANDLE *ChildHandleBuffer\r
45 );\r
46\r
f3d1e940 47STATIC\r
48EFI_STATUS\r
49KbdFreeNotifyList (\r
50 IN OUT LIST_ENTRY *ListHead\r
51 ); \r
52\r
05fbd06d 53//\r
54// DriverBinding Protocol Instance\r
55//\r
56EFI_DRIVER_BINDING_PROTOCOL gKeyboardControllerDriver = {\r
57 KbdControllerDriverSupported,\r
58 KbdControllerDriverStart,\r
59 KbdControllerDriverStop,\r
60 0xa,\r
61 NULL,\r
62 NULL\r
63};\r
64\r
bcd70414 65/**\r
66 Test controller is a keyboard Controller\r
67 \r
68 @param This Pointer of EFI_DRIVER_BINDING_PROTOCOL\r
69 @param Controller driver's controller\r
70 @param RemainingDevicePath children device path\r
71 \r
72 @retval EFI_UNSUPPORTED controller is not floppy disk\r
73 @retval EFI_SUCCESS controller is floppy disk\r
74**/\r
05fbd06d 75EFI_STATUS\r
76EFIAPI\r
77KbdControllerDriverSupported (\r
78 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
79 IN EFI_HANDLE Controller,\r
80 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
81 )\r
05fbd06d 82{\r
83 EFI_STATUS Status;\r
84 EFI_ISA_IO_PROTOCOL *IsaIo;\r
85\r
86 //\r
87 // Open the IO Abstraction(s) needed to perform the supported test\r
88 //\r
89 Status = gBS->OpenProtocol (\r
90 Controller,\r
91 &gEfiIsaIoProtocolGuid,\r
92 (VOID **) &IsaIo,\r
93 This->DriverBindingHandle,\r
94 Controller,\r
95 EFI_OPEN_PROTOCOL_BY_DRIVER\r
96 );\r
97 if (EFI_ERROR (Status)) {\r
98 return Status;\r
99 }\r
100 //\r
101 // Use the ISA I/O Protocol to see if Controller is the Keyboard controller\r
102 //\r
103 if (IsaIo->ResourceList->Device.HID != EISA_PNP_ID (0x303) || IsaIo->ResourceList->Device.UID != 0) {\r
104 Status = EFI_UNSUPPORTED;\r
105 }\r
106 //\r
107 // Close the I/O Abstraction(s) used to perform the supported test\r
108 //\r
109 gBS->CloseProtocol (\r
110 Controller,\r
111 &gEfiIsaIoProtocolGuid,\r
112 This->DriverBindingHandle,\r
113 Controller\r
114 );\r
115\r
116 return Status;\r
117}\r
118\r
bcd70414 119/**\r
120 Create KEYBOARD_CONSOLE_IN_DEV instance on controller.\r
121 \r
122 @param This Pointer of EFI_DRIVER_BINDING_PROTOCOL\r
123 @param Controller driver controller handle\r
124 @param RemainingDevicePath Children's device path\r
125 \r
126 @retval whether success to create floppy control instance.\r
127**/\r
05fbd06d 128EFI_STATUS\r
129EFIAPI\r
130KbdControllerDriverStart (\r
131 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
132 IN EFI_HANDLE Controller,\r
133 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
134 )\r
05fbd06d 135{\r
136 EFI_STATUS Status;\r
137 EFI_STATUS Status1;\r
138 EFI_ISA_IO_PROTOCOL *IsaIo;\r
139 KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;\r
140 UINT8 Data;\r
141 EFI_STATUS_CODE_VALUE StatusCode;\r
142 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
143\r
144 StatusCode = 0;\r
145\r
146 Status = gBS->OpenProtocol (\r
147 Controller,\r
148 &gEfiDevicePathProtocolGuid,\r
149 (VOID **) &ParentDevicePath,\r
150 This->DriverBindingHandle,\r
151 Controller,\r
152 EFI_OPEN_PROTOCOL_BY_DRIVER\r
153 );\r
154 if (EFI_ERROR (Status)) {\r
155 return Status;\r
156 }\r
157 //\r
158 // Report that the keyboard is being enabled\r
159 //\r
160 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
161 EFI_PROGRESS_CODE,\r
162 EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_ENABLE,\r
163 ParentDevicePath\r
164 );\r
165\r
166 //\r
167 // Get the ISA I/O Protocol on Controller's handle\r
168 //\r
169 Status = gBS->OpenProtocol (\r
170 Controller,\r
171 &gEfiIsaIoProtocolGuid,\r
172 (VOID **) &IsaIo,\r
173 This->DriverBindingHandle,\r
174 Controller,\r
175 EFI_OPEN_PROTOCOL_BY_DRIVER\r
176 );\r
177 if (EFI_ERROR (Status)) {\r
178 gBS->CloseProtocol (\r
179 Controller,\r
180 &gEfiDevicePathProtocolGuid,\r
181 This->DriverBindingHandle,\r
182 Controller\r
183 );\r
184 return EFI_INVALID_PARAMETER;\r
185 }\r
186 //\r
187 // Allocate private data\r
188 //\r
189 ConsoleIn = AllocateZeroPool (sizeof (KEYBOARD_CONSOLE_IN_DEV));\r
190 if (ConsoleIn == NULL) {\r
191 Status = EFI_OUT_OF_RESOURCES;\r
192 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
193 goto ErrorExit;\r
194 }\r
195 //\r
196 // Setup the device instance\r
197 //\r
198 ConsoleIn->Signature = KEYBOARD_CONSOLE_IN_DEV_SIGNATURE;\r
199 ConsoleIn->Handle = Controller;\r
200 (ConsoleIn->ConIn).Reset = KeyboardEfiReset;\r
201 (ConsoleIn->ConIn).ReadKeyStroke = KeyboardReadKeyStroke;\r
202 ConsoleIn->DataRegisterAddress = KEYBOARD_8042_DATA_REGISTER;\r
203 ConsoleIn->StatusRegisterAddress = KEYBOARD_8042_STATUS_REGISTER;\r
204 ConsoleIn->CommandRegisterAddress = KEYBOARD_8042_COMMAND_REGISTER;\r
205 ConsoleIn->IsaIo = IsaIo;\r
206 ConsoleIn->ScancodeBufStartPos = 0;\r
207 ConsoleIn->ScancodeBufEndPos = KEYBOARD_BUFFER_MAX_COUNT - 1;\r
208 ConsoleIn->ScancodeBufCount = 0;\r
209 ConsoleIn->Ctrled = FALSE;\r
210 ConsoleIn->Alted = FALSE;\r
211 ConsoleIn->DevicePath = ParentDevicePath;\r
212\r
f3d1e940 213 ConsoleIn->ConInEx.Reset = KeyboardEfiResetEx;\r
214 ConsoleIn->ConInEx.ReadKeyStrokeEx = KeyboardReadKeyStrokeEx;\r
215 ConsoleIn->ConInEx.SetState = KeyboardSetState;\r
216 ConsoleIn->ConInEx.RegisterKeyNotify = KeyboardRegisterKeyNotify;\r
217 ConsoleIn->ConInEx.UnregisterKeyNotify = KeyboardUnregisterKeyNotify; \r
218 \r
219 InitializeListHead (&ConsoleIn->NotifyList);\r
05fbd06d 220 //\r
221 // Setup the WaitForKey event\r
222 //\r
223 Status = gBS->CreateEvent (\r
224 EVT_NOTIFY_WAIT,\r
225 TPL_NOTIFY,\r
226 KeyboardWaitForKey,\r
227 &(ConsoleIn->ConIn),\r
228 &((ConsoleIn->ConIn).WaitForKey)\r
229 );\r
230 if (EFI_ERROR (Status)) {\r
231 Status = EFI_OUT_OF_RESOURCES;\r
232 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
233 goto ErrorExit;\r
234 }\r
235 //\r
f3d1e940 236 // Setup the WaitForKeyEx event\r
237 // \r
238 Status = gBS->CreateEvent (\r
239 EVT_NOTIFY_WAIT,\r
240 TPL_NOTIFY,\r
241 KeyboardWaitForKeyEx,\r
242 &(ConsoleIn->ConInEx),\r
243 &(ConsoleIn->ConInEx.WaitForKeyEx)\r
244 );\r
245 if (EFI_ERROR (Status)) {\r
246 Status = EFI_OUT_OF_RESOURCES;\r
247 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
248 goto ErrorExit;\r
249 }\r
05fbd06d 250 // Setup a periodic timer, used for reading keystrokes at a fixed interval\r
251 //\r
252 Status = gBS->CreateEvent (\r
253 EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
254 TPL_NOTIFY,\r
255 KeyboardTimerHandler,\r
256 ConsoleIn,\r
257 &ConsoleIn->TimerEvent\r
258 );\r
259 if (EFI_ERROR (Status)) {\r
260 Status = EFI_OUT_OF_RESOURCES;\r
261 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
262 goto ErrorExit;\r
263 }\r
264\r
265 Status = gBS->SetTimer (\r
266 ConsoleIn->TimerEvent,\r
267 TimerPeriodic,\r
268 KEYBOARD_TIMER_INTERVAL\r
269 );\r
270 if (EFI_ERROR (Status)) {\r
271 Status = EFI_OUT_OF_RESOURCES;\r
272 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
273 goto ErrorExit;\r
274 }\r
275\r
276 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
277 EFI_PROGRESS_CODE,\r
278 EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_PRESENCE_DETECT,\r
279 ParentDevicePath\r
280 );\r
281\r
282 //\r
283 // Reset the keyboard device\r
284 //\r
285 Status = ConsoleIn->ConIn.Reset (&ConsoleIn->ConIn, TRUE);\r
286 if (EFI_ERROR (Status)) {\r
287 Status = EFI_DEVICE_ERROR;\r
288 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;\r
289 goto ErrorExit;\r
290 }\r
291\r
292 ConsoleIn->ControllerNameTable = NULL;\r
f3d08ccf 293 AddUnicodeString2 (\r
05fbd06d 294 "eng",\r
295 gPs2KeyboardComponentName.SupportedLanguages,\r
296 &ConsoleIn->ControllerNameTable,\r
f3d08ccf 297 L"PS/2 Keyboard Device",\r
298 TRUE\r
05fbd06d 299 );\r
f3d08ccf 300 AddUnicodeString2 (\r
301 "en",\r
302 gPs2KeyboardComponentName2.SupportedLanguages,\r
303 &ConsoleIn->ControllerNameTable,\r
304 L"PS/2 Keyboard Device",\r
305 FALSE\r
306 );\r
307\r
05fbd06d 308\r
309 //\r
310 // Install protocol interfaces for the keyboard device.\r
311 //\r
312 Status = gBS->InstallMultipleProtocolInterfaces (\r
313 &Controller,\r
314 &gEfiSimpleTextInProtocolGuid,\r
315 &ConsoleIn->ConIn,\r
f3d1e940 316 &gEfiSimpleTextInputExProtocolGuid,\r
317 &ConsoleIn->ConInEx,\r
05fbd06d 318 NULL\r
319 );\r
320 if (EFI_ERROR (Status)) {\r
321 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
322 goto ErrorExit;\r
323 }\r
324\r
325 return Status;\r
326\r
327ErrorExit:\r
328 //\r
329 // Report error code\r
330 //\r
331 if (StatusCode != 0) {\r
332 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
333 EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
334 StatusCode,\r
335 ParentDevicePath\r
336 );\r
337 }\r
338\r
339 if ((ConsoleIn != NULL) && (ConsoleIn->ConIn.WaitForKey != NULL)) {\r
340 gBS->CloseEvent (ConsoleIn->ConIn.WaitForKey);\r
341 }\r
342\r
343 if ((ConsoleIn != NULL) && (ConsoleIn->TimerEvent != NULL)) {\r
344 gBS->CloseEvent (ConsoleIn->TimerEvent);\r
345 }\r
f3d1e940 346 if ((ConsoleIn != NULL) && (ConsoleIn->ConInEx.WaitForKeyEx != NULL)) {\r
347 gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx);\r
348 }\r
349 KbdFreeNotifyList (&ConsoleIn->NotifyList);\r
05fbd06d 350 if ((ConsoleIn != NULL) && (ConsoleIn->ControllerNameTable != NULL)) {\r
351 FreeUnicodeStringTable (ConsoleIn->ControllerNameTable);\r
352 }\r
353 //\r
354 // Since there will be no timer handler for keyboard input any more,\r
355 // exhaust input data just in case there is still keyboard data left\r
356 //\r
357 Status1 = EFI_SUCCESS;\r
358 while (!EFI_ERROR (Status1)) {\r
359 Status1 = KeyboardRead (ConsoleIn, &Data);;\r
360 }\r
361\r
362 if (ConsoleIn != NULL) {\r
363 gBS->FreePool (ConsoleIn);\r
364 }\r
365\r
366 gBS->CloseProtocol (\r
367 Controller,\r
368 &gEfiDevicePathProtocolGuid,\r
369 This->DriverBindingHandle,\r
370 Controller\r
371 );\r
372\r
373 gBS->CloseProtocol (\r
374 Controller,\r
375 &gEfiIsaIoProtocolGuid,\r
376 This->DriverBindingHandle,\r
377 Controller\r
378 );\r
379\r
380 return Status;\r
381}\r
382\r
bcd70414 383/**\r
384 Stop this driver on ControllerHandle. Support stoping any child handles\r
385 created by this driver.\r
386\r
387 @param This Protocol instance pointer.\r
388 @param ControllerHandle Handle of device to stop driver on\r
389 @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of\r
390 children is zero stop the entire bus driver.\r
391 @param ChildHandleBuffer List of Child Handles to Stop.\r
392\r
393 @retval EFI_SUCCESS This driver is removed ControllerHandle\r
394 @retval other This driver was not removed from this device\r
395\r
396**/\r
05fbd06d 397EFI_STATUS\r
398EFIAPI\r
399KbdControllerDriverStop (\r
400 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
401 IN EFI_HANDLE Controller,\r
402 IN UINTN NumberOfChildren,\r
403 IN EFI_HANDLE *ChildHandleBuffer\r
404 )\r
05fbd06d 405{\r
406 EFI_STATUS Status;\r
407 EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn;\r
408 KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;\r
409 UINT8 Data;\r
410\r
411 //\r
412 // Disable Keyboard\r
413 //\r
414 Status = gBS->OpenProtocol (\r
415 Controller,\r
416 &gEfiSimpleTextInProtocolGuid,\r
417 (VOID **) &ConIn,\r
418 This->DriverBindingHandle,\r
419 Controller,\r
420 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
421 );\r
422 if (EFI_ERROR (Status)) {\r
423 return Status;\r
424 }\r
f3d1e940 425 Status = gBS->OpenProtocol (\r
426 Controller,\r
427 &gEfiSimpleTextInputExProtocolGuid,\r
428 NULL,\r
429 This->DriverBindingHandle,\r
430 Controller,\r
431 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
432 );\r
433 if (EFI_ERROR (Status)) {\r
434 return Status;\r
435 }\r
436 \r
05fbd06d 437 ConsoleIn = KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (ConIn);\r
438\r
439 //\r
440 // Report that the keyboard is being disabled\r
441 //\r
442 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
443 EFI_PROGRESS_CODE,\r
444 EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_DISABLE,\r
445 ConsoleIn->DevicePath\r
446 );\r
447\r
448 if (ConsoleIn->TimerEvent) {\r
449 gBS->CloseEvent (ConsoleIn->TimerEvent);\r
450 ConsoleIn->TimerEvent = NULL;\r
451 }\r
452 //\r
453 // Disable the keyboard interface\r
454 //\r
455 Status = DisableKeyboard (ConsoleIn);\r
456\r
457 //\r
458 // Since there will be no timer handler for keyboard input any more,\r
459 // exhaust input data just in case there is still keyboard data left\r
460 //\r
461 Status = EFI_SUCCESS;\r
462 while (!EFI_ERROR (Status)) {\r
463 Status = KeyboardRead (ConsoleIn, &Data);;\r
464 }\r
465 //\r
f3d1e940 466 // Uninstall the SimpleTextIn and SimpleTextInEx protocols\r
05fbd06d 467 //\r
f3d1e940 468 Status = gBS->UninstallMultipleProtocolInterfaces (\r
05fbd06d 469 Controller,\r
470 &gEfiSimpleTextInProtocolGuid,\r
f3d1e940 471 &ConsoleIn->ConIn,\r
472 &gEfiSimpleTextInputExProtocolGuid,\r
473 &ConsoleIn->ConInEx,\r
474 NULL\r
05fbd06d 475 );\r
476 if (EFI_ERROR (Status)) {\r
477 return Status;\r
478 }\r
479\r
480 gBS->CloseProtocol (\r
481 Controller,\r
482 &gEfiDevicePathProtocolGuid,\r
483 This->DriverBindingHandle,\r
484 Controller\r
485 );\r
486\r
487 gBS->CloseProtocol (\r
488 Controller,\r
489 &gEfiIsaIoProtocolGuid,\r
490 This->DriverBindingHandle,\r
491 Controller\r
492 );\r
493\r
494 //\r
495 // Free other resources\r
496 //\r
497 if ((ConsoleIn->ConIn).WaitForKey) {\r
498 gBS->CloseEvent ((ConsoleIn->ConIn).WaitForKey);\r
499 (ConsoleIn->ConIn).WaitForKey = NULL;\r
500 }\r
f3d1e940 501 if (ConsoleIn->ConInEx.WaitForKeyEx != NULL) {\r
502 gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx);\r
503 ConsoleIn->ConInEx.WaitForKeyEx = NULL;\r
504 }\r
505 KbdFreeNotifyList (&ConsoleIn->NotifyList);\r
05fbd06d 506 FreeUnicodeStringTable (ConsoleIn->ControllerNameTable);\r
507 gBS->FreePool (ConsoleIn);\r
508\r
509 return EFI_SUCCESS;\r
510}\r
c21fc3e8 511\r
bcd70414 512/**\r
513 Free the waiting key notify list.\r
514 \r
515 @param ListHead Pointer to list head\r
516**/\r
f3d1e940 517STATIC\r
518EFI_STATUS\r
519KbdFreeNotifyList (\r
520 IN OUT LIST_ENTRY *ListHead\r
521 )\r
f3d1e940 522{\r
523 KEYBOARD_CONSOLE_IN_EX_NOTIFY *NotifyNode;\r
524\r
525 if (ListHead == NULL) {\r
526 return EFI_INVALID_PARAMETER;\r
527 }\r
528 while (!IsListEmpty (ListHead)) {\r
529 NotifyNode = CR (\r
530 ListHead->ForwardLink, \r
531 KEYBOARD_CONSOLE_IN_EX_NOTIFY, \r
532 NotifyEntry, \r
533 KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE\r
534 );\r
535 RemoveEntryList (ListHead->ForwardLink);\r
536 gBS->FreePool (NotifyNode);\r
537 }\r
538 \r
539 return EFI_SUCCESS;\r
540}\r
c21fc3e8 541\r
542/**\r
543 The user Entry Point for module Ps2Keyboard. The user code starts with this function.\r
544\r
545 @param[in] ImageHandle The firmware allocated handle for the EFI image. \r
546 @param[in] SystemTable A pointer to the EFI System Table.\r
547 \r
548 @retval EFI_SUCCESS The entry point is executed successfully.\r
549 @retval other Some error occurs when executing this entry point.\r
550\r
551**/\r
552EFI_STATUS\r
553EFIAPI\r
554InitializePs2Keyboard(\r
555 IN EFI_HANDLE ImageHandle,\r
556 IN EFI_SYSTEM_TABLE *SystemTable\r
557 )\r
558{\r
559 EFI_STATUS Status;\r
560\r
561 //\r
562 // Install driver model protocol(s).\r
563 //\r
f3d08ccf 564 Status = EfiLibInstallDriverBindingComponentName2 (\r
c21fc3e8 565 ImageHandle,\r
566 SystemTable,\r
567 &gKeyboardControllerDriver,\r
568 ImageHandle,\r
569 &gPs2KeyboardComponentName,\r
f3d08ccf 570 &gPs2KeyboardComponentName2\r
c21fc3e8 571 );\r
572 ASSERT_EFI_ERROR (Status);\r
573\r
574\r
575 return Status;\r
576}\r
bcd70414 577\r