]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Bus/Isa/Ps2KeyboardDxe/Ps2Keyboard.c
Remove ambiguous auto-increment usage. (gcc warning)
[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
65EFI_STATUS\r
66EFIAPI\r
67KbdControllerDriverSupported (\r
68 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
69 IN EFI_HANDLE Controller,\r
70 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
71 )\r
72/*++\r
73\r
74Routine Description:\r
75\r
76 ControllerDriver Protocol Method\r
77\r
78Arguments:\r
79\r
80Returns:\r
81\r
82--*/\r
83// GC_TODO: This - add argument and description to function comment\r
84// GC_TODO: Controller - add argument and description to function comment\r
85// GC_TODO: RemainingDevicePath - add argument and description to function comment\r
86{\r
87 EFI_STATUS Status;\r
88 EFI_ISA_IO_PROTOCOL *IsaIo;\r
89\r
90 //\r
91 // Open the IO Abstraction(s) needed to perform the supported test\r
92 //\r
93 Status = gBS->OpenProtocol (\r
94 Controller,\r
95 &gEfiIsaIoProtocolGuid,\r
96 (VOID **) &IsaIo,\r
97 This->DriverBindingHandle,\r
98 Controller,\r
99 EFI_OPEN_PROTOCOL_BY_DRIVER\r
100 );\r
101 if (EFI_ERROR (Status)) {\r
102 return Status;\r
103 }\r
104 //\r
105 // Use the ISA I/O Protocol to see if Controller is the Keyboard controller\r
106 //\r
107 if (IsaIo->ResourceList->Device.HID != EISA_PNP_ID (0x303) || IsaIo->ResourceList->Device.UID != 0) {\r
108 Status = EFI_UNSUPPORTED;\r
109 }\r
110 //\r
111 // Close the I/O Abstraction(s) used to perform the supported test\r
112 //\r
113 gBS->CloseProtocol (\r
114 Controller,\r
115 &gEfiIsaIoProtocolGuid,\r
116 This->DriverBindingHandle,\r
117 Controller\r
118 );\r
119\r
120 return Status;\r
121}\r
122\r
123EFI_STATUS\r
124EFIAPI\r
125KbdControllerDriverStart (\r
126 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
127 IN EFI_HANDLE Controller,\r
128 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
129 )\r
130/*++\r
131\r
132Routine Description:\r
133\r
134Arguments:\r
135\r
136Returns:\r
137\r
138--*/\r
139// GC_TODO: This - add argument and description to function comment\r
140// GC_TODO: Controller - add argument and description to function comment\r
141// GC_TODO: RemainingDevicePath - add argument and description to function comment\r
142// GC_TODO: EFI_INVALID_PARAMETER - add return value to function comment\r
143{\r
144 EFI_STATUS Status;\r
145 EFI_STATUS Status1;\r
146 EFI_ISA_IO_PROTOCOL *IsaIo;\r
147 KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;\r
148 UINT8 Data;\r
149 EFI_STATUS_CODE_VALUE StatusCode;\r
150 EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;\r
151\r
152 StatusCode = 0;\r
153\r
154 Status = gBS->OpenProtocol (\r
155 Controller,\r
156 &gEfiDevicePathProtocolGuid,\r
157 (VOID **) &ParentDevicePath,\r
158 This->DriverBindingHandle,\r
159 Controller,\r
160 EFI_OPEN_PROTOCOL_BY_DRIVER\r
161 );\r
162 if (EFI_ERROR (Status)) {\r
163 return Status;\r
164 }\r
165 //\r
166 // Report that the keyboard is being enabled\r
167 //\r
168 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
169 EFI_PROGRESS_CODE,\r
170 EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_ENABLE,\r
171 ParentDevicePath\r
172 );\r
173\r
174 //\r
175 // Get the ISA I/O Protocol on Controller's handle\r
176 //\r
177 Status = gBS->OpenProtocol (\r
178 Controller,\r
179 &gEfiIsaIoProtocolGuid,\r
180 (VOID **) &IsaIo,\r
181 This->DriverBindingHandle,\r
182 Controller,\r
183 EFI_OPEN_PROTOCOL_BY_DRIVER\r
184 );\r
185 if (EFI_ERROR (Status)) {\r
186 gBS->CloseProtocol (\r
187 Controller,\r
188 &gEfiDevicePathProtocolGuid,\r
189 This->DriverBindingHandle,\r
190 Controller\r
191 );\r
192 return EFI_INVALID_PARAMETER;\r
193 }\r
194 //\r
195 // Allocate private data\r
196 //\r
197 ConsoleIn = AllocateZeroPool (sizeof (KEYBOARD_CONSOLE_IN_DEV));\r
198 if (ConsoleIn == NULL) {\r
199 Status = EFI_OUT_OF_RESOURCES;\r
200 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
201 goto ErrorExit;\r
202 }\r
203 //\r
204 // Setup the device instance\r
205 //\r
206 ConsoleIn->Signature = KEYBOARD_CONSOLE_IN_DEV_SIGNATURE;\r
207 ConsoleIn->Handle = Controller;\r
208 (ConsoleIn->ConIn).Reset = KeyboardEfiReset;\r
209 (ConsoleIn->ConIn).ReadKeyStroke = KeyboardReadKeyStroke;\r
210 ConsoleIn->DataRegisterAddress = KEYBOARD_8042_DATA_REGISTER;\r
211 ConsoleIn->StatusRegisterAddress = KEYBOARD_8042_STATUS_REGISTER;\r
212 ConsoleIn->CommandRegisterAddress = KEYBOARD_8042_COMMAND_REGISTER;\r
213 ConsoleIn->IsaIo = IsaIo;\r
214 ConsoleIn->ScancodeBufStartPos = 0;\r
215 ConsoleIn->ScancodeBufEndPos = KEYBOARD_BUFFER_MAX_COUNT - 1;\r
216 ConsoleIn->ScancodeBufCount = 0;\r
217 ConsoleIn->Ctrled = FALSE;\r
218 ConsoleIn->Alted = FALSE;\r
219 ConsoleIn->DevicePath = ParentDevicePath;\r
220\r
f3d1e940 221 ConsoleIn->ConInEx.Reset = KeyboardEfiResetEx;\r
222 ConsoleIn->ConInEx.ReadKeyStrokeEx = KeyboardReadKeyStrokeEx;\r
223 ConsoleIn->ConInEx.SetState = KeyboardSetState;\r
224 ConsoleIn->ConInEx.RegisterKeyNotify = KeyboardRegisterKeyNotify;\r
225 ConsoleIn->ConInEx.UnregisterKeyNotify = KeyboardUnregisterKeyNotify; \r
226 \r
227 InitializeListHead (&ConsoleIn->NotifyList);\r
05fbd06d 228 //\r
229 // Setup the WaitForKey event\r
230 //\r
231 Status = gBS->CreateEvent (\r
232 EVT_NOTIFY_WAIT,\r
233 TPL_NOTIFY,\r
234 KeyboardWaitForKey,\r
235 &(ConsoleIn->ConIn),\r
236 &((ConsoleIn->ConIn).WaitForKey)\r
237 );\r
238 if (EFI_ERROR (Status)) {\r
239 Status = EFI_OUT_OF_RESOURCES;\r
240 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
241 goto ErrorExit;\r
242 }\r
243 //\r
f3d1e940 244 // Setup the WaitForKeyEx event\r
245 // \r
246 Status = gBS->CreateEvent (\r
247 EVT_NOTIFY_WAIT,\r
248 TPL_NOTIFY,\r
249 KeyboardWaitForKeyEx,\r
250 &(ConsoleIn->ConInEx),\r
251 &(ConsoleIn->ConInEx.WaitForKeyEx)\r
252 );\r
253 if (EFI_ERROR (Status)) {\r
254 Status = EFI_OUT_OF_RESOURCES;\r
255 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
256 goto ErrorExit;\r
257 }\r
05fbd06d 258 // Setup a periodic timer, used for reading keystrokes at a fixed interval\r
259 //\r
260 Status = gBS->CreateEvent (\r
261 EVT_TIMER | EVT_NOTIFY_SIGNAL,\r
262 TPL_NOTIFY,\r
263 KeyboardTimerHandler,\r
264 ConsoleIn,\r
265 &ConsoleIn->TimerEvent\r
266 );\r
267 if (EFI_ERROR (Status)) {\r
268 Status = EFI_OUT_OF_RESOURCES;\r
269 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
270 goto ErrorExit;\r
271 }\r
272\r
273 Status = gBS->SetTimer (\r
274 ConsoleIn->TimerEvent,\r
275 TimerPeriodic,\r
276 KEYBOARD_TIMER_INTERVAL\r
277 );\r
278 if (EFI_ERROR (Status)) {\r
279 Status = EFI_OUT_OF_RESOURCES;\r
280 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
281 goto ErrorExit;\r
282 }\r
283\r
284 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
285 EFI_PROGRESS_CODE,\r
286 EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_PRESENCE_DETECT,\r
287 ParentDevicePath\r
288 );\r
289\r
290 //\r
291 // Reset the keyboard device\r
292 //\r
293 Status = ConsoleIn->ConIn.Reset (&ConsoleIn->ConIn, TRUE);\r
294 if (EFI_ERROR (Status)) {\r
295 Status = EFI_DEVICE_ERROR;\r
296 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;\r
297 goto ErrorExit;\r
298 }\r
299\r
300 ConsoleIn->ControllerNameTable = NULL;\r
f3d08ccf 301 AddUnicodeString2 (\r
05fbd06d 302 "eng",\r
303 gPs2KeyboardComponentName.SupportedLanguages,\r
304 &ConsoleIn->ControllerNameTable,\r
f3d08ccf 305 L"PS/2 Keyboard Device",\r
306 TRUE\r
05fbd06d 307 );\r
f3d08ccf 308 AddUnicodeString2 (\r
309 "en",\r
310 gPs2KeyboardComponentName2.SupportedLanguages,\r
311 &ConsoleIn->ControllerNameTable,\r
312 L"PS/2 Keyboard Device",\r
313 FALSE\r
314 );\r
315\r
05fbd06d 316\r
317 //\r
318 // Install protocol interfaces for the keyboard device.\r
319 //\r
320 Status = gBS->InstallMultipleProtocolInterfaces (\r
321 &Controller,\r
322 &gEfiSimpleTextInProtocolGuid,\r
323 &ConsoleIn->ConIn,\r
f3d1e940 324 &gEfiSimpleTextInputExProtocolGuid,\r
325 &ConsoleIn->ConInEx,\r
05fbd06d 326 NULL\r
327 );\r
328 if (EFI_ERROR (Status)) {\r
329 StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;\r
330 goto ErrorExit;\r
331 }\r
332\r
333 return Status;\r
334\r
335ErrorExit:\r
336 //\r
337 // Report error code\r
338 //\r
339 if (StatusCode != 0) {\r
340 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
341 EFI_ERROR_CODE | EFI_ERROR_MINOR,\r
342 StatusCode,\r
343 ParentDevicePath\r
344 );\r
345 }\r
346\r
347 if ((ConsoleIn != NULL) && (ConsoleIn->ConIn.WaitForKey != NULL)) {\r
348 gBS->CloseEvent (ConsoleIn->ConIn.WaitForKey);\r
349 }\r
350\r
351 if ((ConsoleIn != NULL) && (ConsoleIn->TimerEvent != NULL)) {\r
352 gBS->CloseEvent (ConsoleIn->TimerEvent);\r
353 }\r
f3d1e940 354 if ((ConsoleIn != NULL) && (ConsoleIn->ConInEx.WaitForKeyEx != NULL)) {\r
355 gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx);\r
356 }\r
357 KbdFreeNotifyList (&ConsoleIn->NotifyList);\r
05fbd06d 358 if ((ConsoleIn != NULL) && (ConsoleIn->ControllerNameTable != NULL)) {\r
359 FreeUnicodeStringTable (ConsoleIn->ControllerNameTable);\r
360 }\r
361 //\r
362 // Since there will be no timer handler for keyboard input any more,\r
363 // exhaust input data just in case there is still keyboard data left\r
364 //\r
365 Status1 = EFI_SUCCESS;\r
366 while (!EFI_ERROR (Status1)) {\r
367 Status1 = KeyboardRead (ConsoleIn, &Data);;\r
368 }\r
369\r
370 if (ConsoleIn != NULL) {\r
371 gBS->FreePool (ConsoleIn);\r
372 }\r
373\r
374 gBS->CloseProtocol (\r
375 Controller,\r
376 &gEfiDevicePathProtocolGuid,\r
377 This->DriverBindingHandle,\r
378 Controller\r
379 );\r
380\r
381 gBS->CloseProtocol (\r
382 Controller,\r
383 &gEfiIsaIoProtocolGuid,\r
384 This->DriverBindingHandle,\r
385 Controller\r
386 );\r
387\r
388 return Status;\r
389}\r
390\r
391EFI_STATUS\r
392EFIAPI\r
393KbdControllerDriverStop (\r
394 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
395 IN EFI_HANDLE Controller,\r
396 IN UINTN NumberOfChildren,\r
397 IN EFI_HANDLE *ChildHandleBuffer\r
398 )\r
399/*++\r
400\r
401 Routine Description:\r
402\r
403 Arguments:\r
404\r
405 Returns:\r
406\r
407--*/\r
408// GC_TODO: This - add argument and description to function comment\r
409// GC_TODO: Controller - add argument and description to function comment\r
410// GC_TODO: NumberOfChildren - add argument and description to function comment\r
411// GC_TODO: ChildHandleBuffer - add argument and description to function comment\r
412// GC_TODO: EFI_SUCCESS - add return value to function comment\r
413{\r
414 EFI_STATUS Status;\r
415 EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn;\r
416 KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;\r
417 UINT8 Data;\r
418\r
419 //\r
420 // Disable Keyboard\r
421 //\r
422 Status = gBS->OpenProtocol (\r
423 Controller,\r
424 &gEfiSimpleTextInProtocolGuid,\r
425 (VOID **) &ConIn,\r
426 This->DriverBindingHandle,\r
427 Controller,\r
428 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
429 );\r
430 if (EFI_ERROR (Status)) {\r
431 return Status;\r
432 }\r
f3d1e940 433 Status = gBS->OpenProtocol (\r
434 Controller,\r
435 &gEfiSimpleTextInputExProtocolGuid,\r
436 NULL,\r
437 This->DriverBindingHandle,\r
438 Controller,\r
439 EFI_OPEN_PROTOCOL_TEST_PROTOCOL\r
440 );\r
441 if (EFI_ERROR (Status)) {\r
442 return Status;\r
443 }\r
444 \r
05fbd06d 445 ConsoleIn = KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (ConIn);\r
446\r
447 //\r
448 // Report that the keyboard is being disabled\r
449 //\r
450 REPORT_STATUS_CODE_WITH_DEVICE_PATH (\r
451 EFI_PROGRESS_CODE,\r
452 EFI_PERIPHERAL_KEYBOARD | EFI_P_PC_DISABLE,\r
453 ConsoleIn->DevicePath\r
454 );\r
455\r
456 if (ConsoleIn->TimerEvent) {\r
457 gBS->CloseEvent (ConsoleIn->TimerEvent);\r
458 ConsoleIn->TimerEvent = NULL;\r
459 }\r
460 //\r
461 // Disable the keyboard interface\r
462 //\r
463 Status = DisableKeyboard (ConsoleIn);\r
464\r
465 //\r
466 // Since there will be no timer handler for keyboard input any more,\r
467 // exhaust input data just in case there is still keyboard data left\r
468 //\r
469 Status = EFI_SUCCESS;\r
470 while (!EFI_ERROR (Status)) {\r
471 Status = KeyboardRead (ConsoleIn, &Data);;\r
472 }\r
473 //\r
f3d1e940 474 // Uninstall the SimpleTextIn and SimpleTextInEx protocols\r
05fbd06d 475 //\r
f3d1e940 476 Status = gBS->UninstallMultipleProtocolInterfaces (\r
05fbd06d 477 Controller,\r
478 &gEfiSimpleTextInProtocolGuid,\r
f3d1e940 479 &ConsoleIn->ConIn,\r
480 &gEfiSimpleTextInputExProtocolGuid,\r
481 &ConsoleIn->ConInEx,\r
482 NULL\r
05fbd06d 483 );\r
484 if (EFI_ERROR (Status)) {\r
485 return Status;\r
486 }\r
487\r
488 gBS->CloseProtocol (\r
489 Controller,\r
490 &gEfiDevicePathProtocolGuid,\r
491 This->DriverBindingHandle,\r
492 Controller\r
493 );\r
494\r
495 gBS->CloseProtocol (\r
496 Controller,\r
497 &gEfiIsaIoProtocolGuid,\r
498 This->DriverBindingHandle,\r
499 Controller\r
500 );\r
501\r
502 //\r
503 // Free other resources\r
504 //\r
505 if ((ConsoleIn->ConIn).WaitForKey) {\r
506 gBS->CloseEvent ((ConsoleIn->ConIn).WaitForKey);\r
507 (ConsoleIn->ConIn).WaitForKey = NULL;\r
508 }\r
f3d1e940 509 if (ConsoleIn->ConInEx.WaitForKeyEx != NULL) {\r
510 gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx);\r
511 ConsoleIn->ConInEx.WaitForKeyEx = NULL;\r
512 }\r
513 KbdFreeNotifyList (&ConsoleIn->NotifyList);\r
05fbd06d 514 FreeUnicodeStringTable (ConsoleIn->ControllerNameTable);\r
515 gBS->FreePool (ConsoleIn);\r
516\r
517 return EFI_SUCCESS;\r
518}\r
c21fc3e8 519\r
f3d1e940 520STATIC\r
521EFI_STATUS\r
522KbdFreeNotifyList (\r
523 IN OUT LIST_ENTRY *ListHead\r
524 )\r
525/*++\r
526\r
527Routine Description:\r
528\r
529Arguments:\r
530\r
531 ListHead - The list head\r
532\r
533Returns:\r
534\r
535 EFI_SUCCESS - Free the notify list successfully\r
536 EFI_INVALID_PARAMETER - ListHead is invalid.\r
537\r
538--*/\r
539{\r
540 KEYBOARD_CONSOLE_IN_EX_NOTIFY *NotifyNode;\r
541\r
542 if (ListHead == NULL) {\r
543 return EFI_INVALID_PARAMETER;\r
544 }\r
545 while (!IsListEmpty (ListHead)) {\r
546 NotifyNode = CR (\r
547 ListHead->ForwardLink, \r
548 KEYBOARD_CONSOLE_IN_EX_NOTIFY, \r
549 NotifyEntry, \r
550 KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE\r
551 );\r
552 RemoveEntryList (ListHead->ForwardLink);\r
553 gBS->FreePool (NotifyNode);\r
554 }\r
555 \r
556 return EFI_SUCCESS;\r
557}\r
c21fc3e8 558\r
559/**\r
560 The user Entry Point for module Ps2Keyboard. The user code starts with this function.\r
561\r
562 @param[in] ImageHandle The firmware allocated handle for the EFI image. \r
563 @param[in] SystemTable A pointer to the EFI System Table.\r
564 \r
565 @retval EFI_SUCCESS The entry point is executed successfully.\r
566 @retval other Some error occurs when executing this entry point.\r
567\r
568**/\r
569EFI_STATUS\r
570EFIAPI\r
571InitializePs2Keyboard(\r
572 IN EFI_HANDLE ImageHandle,\r
573 IN EFI_SYSTEM_TABLE *SystemTable\r
574 )\r
575{\r
576 EFI_STATUS Status;\r
577\r
578 //\r
579 // Install driver model protocol(s).\r
580 //\r
f3d08ccf 581 Status = EfiLibInstallDriverBindingComponentName2 (\r
c21fc3e8 582 ImageHandle,\r
583 SystemTable,\r
584 &gKeyboardControllerDriver,\r
585 ImageHandle,\r
586 &gPs2KeyboardComponentName,\r
f3d08ccf 587 &gPs2KeyboardComponentName2\r
c21fc3e8 588 );\r
589 ASSERT_EFI_ERROR (Status);\r
590\r
591\r
592 return Status;\r
593}\r