]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c
ShellPkg: Update bcfg command response output
[mirror_edk2.git] / ShellPkg / Library / UefiShellDriver1CommandsLib / Connect.c
CommitLineData
4ba49616 1/** @file\r
2 Main file for connect shell Driver1 function.\r
3\r
0ff81081 4 Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>\r
4ba49616 5 This program and the accompanying materials\r
6 are licensed and made available under the terms and conditions of the BSD License\r
7 which accompanies this distribution. The full text of the license may be found at\r
8 http://opensource.org/licenses/bsd-license.php\r
9\r
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
12\r
13**/\r
14\r
15#include "UefiShellDriver1CommandsLib.h"\r
16\r
0ff81081
QS
17/**\r
18 Create all handles associate with every device path node.\r
19\r
20 @param DevicePathToConnect The device path which will be connected.\r
21\r
22 @retval EFI_SUCCESS All handles associate with every device path node\r
23 have been created.\r
24 @retval EFI_INVALID_PARAMETER DevicePathToConnect is NULL.\r
25 @retval EFI_NOT_FOUND Create the handle associate with one device path\r
26 node failed\r
27\r
28**/\r
29EFI_STATUS\r
30ShellConnectDevicePath (\r
31 IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect\r
32 )\r
33{\r
34 EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;\r
35 EFI_STATUS Status;\r
36 EFI_HANDLE Handle;\r
36d6448c 37 EFI_HANDLE PreviousHandle;\r
0ff81081
QS
38 \r
39 if (DevicePathToConnect == NULL) {\r
40 return EFI_INVALID_PARAMETER;\r
41 }\r
36d6448c
QS
42\r
43 PreviousHandle = NULL;\r
44 do{ \r
0ff81081
QS
45 RemainingDevicePath = DevicePathToConnect;\r
46 Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &Handle);\r
36d6448c 47 \r
0ff81081 48 if (!EFI_ERROR (Status) && (Handle != NULL)) {\r
36d6448c
QS
49 if (PreviousHandle == Handle) {\r
50 Status = EFI_NOT_FOUND;\r
51 } else {\r
52 PreviousHandle = Handle;\r
53 Status = gBS->ConnectController (Handle, NULL, RemainingDevicePath, FALSE);\r
54 }\r
0ff81081 55 }\r
36d6448c
QS
56 \r
57 } while (!EFI_ERROR (Status) && !IsDevicePathEnd (RemainingDevicePath) );\r
58 \r
0ff81081
QS
59 return Status;\r
60 \r
61}\r
62\r
63/**\r
64 Connect drivers for PCI root bridge.\r
65 \r
66 @retval EFI_SUCCESS Connect drivers successfully.\r
67 @retval EFI_NOT_FOUND Cannot find PCI root bridge device.\r
68\r
69**/\r
70EFI_STATUS\r
71ShellConnectPciRootBridge (\r
72 VOID\r
73 )\r
74{ \r
75 UINTN RootBridgeHandleCount;\r
76 EFI_HANDLE *RootBridgeHandleBuffer;\r
77 UINTN RootBridgeIndex;\r
78 EFI_STATUS Status;\r
79 \r
80 RootBridgeHandleCount = 0;\r
81 \r
82 Status = gBS->LocateHandleBuffer ( \r
83 ByProtocol, \r
84 &gEfiPciRootBridgeIoProtocolGuid, \r
85 NULL, \r
86 &RootBridgeHandleCount, \r
87 &RootBridgeHandleBuffer \r
88 );\r
89 if (EFI_ERROR (Status)) {\r
90 return Status;\r
91 }\r
92 \r
93 for (RootBridgeIndex = 0; RootBridgeIndex < RootBridgeHandleCount; RootBridgeIndex++) { \r
94 gBS->ConnectController (RootBridgeHandleBuffer[RootBridgeIndex], NULL, NULL, FALSE); \r
95 } \r
d86b04fb
QS
96\r
97 FreePool (RootBridgeHandleBuffer);\r
0ff81081
QS
98 \r
99 return EFI_SUCCESS;\r
100}\r
101\r
102\r
4ba49616 103/**\r
361a8267 104 Connect controller(s) and driver(s).\r
105\r
0ff81081
QS
106 @param[in] ControllerHandle The handle to the controller. Should have driver binding on it.\r
107 @param[in] DriverHandle The handle to the driver. Should have driver binding.\r
361a8267 108 @param[in] Recursive TRUE to connect recursively, FALSE otherwise.\r
109 @param[in] Output TRUE to have info on the screen, FALSE otherwise.\r
110 @param[in] AlwaysOutput Override Output for errors.\r
111\r
112 @retval EFI_SUCCESS The operation was successful.\r
4ba49616 113**/\r
114EFI_STATUS\r
115EFIAPI\r
116ConnectControllers (\r
117 IN CONST EFI_HANDLE ControllerHandle OPTIONAL,\r
118 IN CONST EFI_HANDLE DriverHandle OPTIONAL,\r
119 IN CONST BOOLEAN Recursive,\r
120 IN CONST BOOLEAN Output,\r
121 IN CONST BOOLEAN AlwaysOutput\r
122 )\r
123{\r
124 EFI_STATUS Status;\r
125 EFI_STATUS Status2;\r
126 EFI_HANDLE *ControllerHandleList;\r
127 EFI_HANDLE *DriverHandleList;\r
128 EFI_HANDLE *HandleWalker;\r
129\r
130 ControllerHandleList = NULL;\r
131 Status = EFI_NOT_FOUND;\r
132 Status2 = EFI_NOT_FOUND;\r
133\r
134 //\r
135 // If we have a single handle to connect make that a 'list'\r
136 //\r
137 if (DriverHandle == NULL) {\r
138 DriverHandleList = NULL;\r
139 } else {\r
361a8267 140 DriverHandleList = AllocateZeroPool(2*sizeof(EFI_HANDLE));\r
4ba49616 141 if (DriverHandleList == NULL) {\r
142 return (EFI_OUT_OF_RESOURCES);\r
143 }\r
144 DriverHandleList[0] = DriverHandle;\r
145 DriverHandleList[1] = NULL;\r
146 }\r
147\r
148 //\r
149 // do we connect all controllers (with a loop) or a single one...\r
150 // This is where we call the gBS->ConnectController function.\r
151 //\r
152 if (ControllerHandle == NULL) {\r
153 ControllerHandleList = GetHandleListByProtocol(&gEfiDevicePathProtocolGuid);\r
154 for (HandleWalker = ControllerHandleList\r
155 ; HandleWalker != NULL && *HandleWalker != NULL\r
156 ; HandleWalker++\r
157 ){\r
158 Status = gBS->ConnectController(*HandleWalker, DriverHandleList, NULL, Recursive);\r
159 if (!EFI_ERROR(Status)) {\r
160 Status2 = EFI_SUCCESS;\r
161 }\r
162 if ((Output && !EFI_ERROR(Status)) || AlwaysOutput) {\r
163 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Connect", ConvertHandleToHandleIndex(*HandleWalker), Status);\r
164 }\r
165 }\r
166 } else {\r
167 Status = gBS->ConnectController(ControllerHandle, DriverHandleList, NULL, Recursive);\r
168 if (!EFI_ERROR(Status)) {\r
169 Status2 = EFI_SUCCESS;\r
170 }\r
171 if ((Output && !EFI_ERROR(Status)) || AlwaysOutput) {\r
172 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Connect", ConvertHandleToHandleIndex(ControllerHandle), Status);\r
173 }\r
174 }\r
175\r
176 //\r
177 // Free any memory we allocated.\r
178 //\r
179 if (ControllerHandleList != NULL) {\r
180 FreePool(ControllerHandleList);\r
181 }\r
182 if (DriverHandleList != NULL) {\r
183 FreePool(DriverHandleList);\r
184 }\r
185 return (Status2);\r
186}\r
187\r
361a8267 188/**\r
189 Do a connect from an EFI variable via it's key name.\r
190\r
191 @param[in] Key The name of the EFI Variable.\r
192\r
193 @retval EFI_SUCCESS The operation was successful.\r
194**/\r
4ba49616 195EFI_STATUS\r
196EFIAPI\r
d86b04fb 197ShellConnectFromDevPaths (\r
4ba49616 198 IN CONST CHAR16 *Key\r
199 )\r
200{\r
201 EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
36d6448c
QS
202 EFI_DEVICE_PATH_PROTOCOL *CopyOfDevPath;\r
203 EFI_DEVICE_PATH_PROTOCOL *Instance; \r
204 EFI_DEVICE_PATH_PROTOCOL *Next;\r
4ba49616 205 UINTN Length;\r
0ff81081
QS
206 UINTN Index;\r
207 UINTN HandleArrayCount;\r
36d6448c 208 UINTN Size;\r
0ff81081 209 EFI_HANDLE *HandleArray;\r
4ba49616 210 EFI_STATUS Status;\r
0ff81081
QS
211 BOOLEAN AtLeastOneConnected;\r
212 EFI_PCI_IO_PROTOCOL *PciIo;\r
213 UINT8 Class[3];\r
214 \r
4ba49616 215 DevPath = NULL;\r
216 Length = 0;\r
0ff81081 217 AtLeastOneConnected = FALSE;\r
36d6448c 218\r
4ba49616 219 //\r
220 // Get the DevicePath buffer from the variable...\r
221 //\r
222 Status = gRT->GetVariable((CHAR16*)Key, (EFI_GUID*)&gEfiGlobalVariableGuid, NULL, &Length, DevPath);\r
223 if (Status == EFI_BUFFER_TOO_SMALL) {\r
361a8267 224 DevPath = AllocateZeroPool(Length);\r
0ff81081
QS
225 if (DevPath == NULL) {\r
226 return EFI_OUT_OF_RESOURCES;\r
227 }\r
4ba49616 228 Status = gRT->GetVariable((CHAR16*)Key, (EFI_GUID*)&gEfiGlobalVariableGuid, NULL, &Length, DevPath);\r
36d6448c
QS
229 if (EFI_ERROR (Status)) {\r
230 if (DevPath != NULL) {\r
231 FreePool (DevPath);\r
232 }\r
233 return Status;\r
234 }\r
235 } else if (EFI_ERROR (Status)) {\r
236 return Status;\r
4ba49616 237 }\r
238\r
239 Status = EFI_NOT_FOUND;\r
36d6448c
QS
240\r
241 CopyOfDevPath = DevPath;\r
4ba49616 242 //\r
243 // walk the list of devices and connect them\r
244 //\r
36d6448c
QS
245 do {\r
246 //\r
247 // Check every instance of the console variable\r
248 //\r
249 Instance = GetNextDevicePathInstance (&CopyOfDevPath, &Size);\r
250 if (Instance == NULL) {\r
251 if (DevPath != NULL) {\r
252 FreePool (DevPath);\r
253 }\r
254 return EFI_UNSUPPORTED;\r
255 }\r
256\r
257 Next = Instance;\r
258 while (!IsDevicePathEndType (Next)) {\r
259 Next = NextDevicePathNode (Next);\r
260 }\r
261\r
262 SetDevicePathEndNode (Next);\r
4ba49616 263 //\r
0ff81081 264 // connect short form device path\r
4ba49616 265 //\r
36d6448c
QS
266 if ((DevicePathType (Instance) == MESSAGING_DEVICE_PATH) &&\r
267 ((DevicePathSubType (Instance) == MSG_USB_CLASS_DP)\r
268 || (DevicePathSubType (Instance) == MSG_USB_WWID_DP)\r
0ff81081 269 )) {\r
0ff81081
QS
270 \r
271 Status = ShellConnectPciRootBridge ();\r
272 if (EFI_ERROR(Status)) {\r
36d6448c 273 FreePool(Instance);\r
0ff81081
QS
274 FreePool(DevPath);\r
275 return Status;\r
4ba49616 276 }\r
0ff81081
QS
277 \r
278 Status = gBS->LocateHandleBuffer (\r
279 ByProtocol,\r
280 &gEfiPciIoProtocolGuid,\r
281 NULL,\r
282 &HandleArrayCount,\r
283 &HandleArray\r
284 );\r
285 \r
286 if (!EFI_ERROR (Status)) {\r
287 for (Index = 0; Index < HandleArrayCount; Index++) {\r
288 Status = gBS->HandleProtocol (\r
289 HandleArray[Index],\r
290 &gEfiPciIoProtocolGuid,\r
291 (VOID **)&PciIo\r
292 );\r
293 \r
294 if (!EFI_ERROR (Status)) {\r
295 Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Class);\r
296 if (!EFI_ERROR (Status)) {\r
297 if ((PCI_CLASS_SERIAL == Class[2]) &&\r
298 (PCI_CLASS_SERIAL_USB == Class[1])) {\r
299 Status = gBS->ConnectController (\r
300 HandleArray[Index],\r
301 NULL,\r
302 Instance,\r
303 FALSE\r
304 );\r
305 if (!EFI_ERROR(Status)) {\r
306 AtLeastOneConnected = TRUE;\r
307 }\r
308 }\r
309 }\r
310 }\r
311 }\r
312 }\r
313\r
314 if (HandleArray != NULL) {\r
315 FreePool (HandleArray);\r
316 }\r
0ff81081
QS
317 } else { \r
318 //\r
319 // connect the entire device path\r
320 //\r
0ff81081
QS
321 Status = ShellConnectDevicePath (Instance);\r
322 if (!EFI_ERROR (Status)) {\r
323 AtLeastOneConnected = TRUE;\r
324 }\r
4ba49616 325 }\r
36d6448c 326 FreePool (Instance);\r
0ff81081 327 \r
36d6448c 328 } while (CopyOfDevPath != NULL);\r
0ff81081 329 \r
4ba49616 330 if (DevPath != NULL) {\r
331 FreePool(DevPath);\r
332 }\r
0ff81081
QS
333\r
334 if (AtLeastOneConnected) {\r
335 return EFI_SUCCESS;\r
336 } else {\r
337 return EFI_NOT_FOUND;\r
338 }\r
339 \r
4ba49616 340}\r
341\r
361a8267 342/**\r
343 Convert the handle identifiers from strings and then connect them.\r
344\r
345 One of them should have driver binding and either can be NULL.\r
346\r
347 @param[in] Handle1 The first handle.\r
348 @param[in] Handle2 The second handle.\r
349 @param[in] Recursive TRUE to do connect recursively. FALSE otherwise.\r
350 @param[in] Output TRUE to have output to screen. FALSE otherwise.\r
351\r
352 @retval EFI_SUCCESS The operation was successful.\r
353**/\r
4ba49616 354EFI_STATUS\r
355EFIAPI\r
356ConvertAndConnectControllers (\r
361a8267 357 IN EFI_HANDLE *Handle1 OPTIONAL,\r
358 IN EFI_HANDLE *Handle2 OPTIONAL,\r
4ba49616 359 IN CONST BOOLEAN Recursive,\r
360 IN CONST BOOLEAN Output\r
361 )\r
362{\r
4ba49616 363 //\r
364 // if only one is NULL verify it's the proper one...\r
365 //\r
366 if ( (Handle1 == NULL && Handle2 != NULL)\r
367 || (Handle1 != NULL && Handle2 == NULL)\r
368 ){\r
369 //\r
370 // Figure out which one should be NULL and move the handle to the right place.\r
371 // If Handle1 is NULL then test Handle2 and vise versa.\r
372 // The one that DOES has driver binding must be Handle2\r
373 //\r
374 if (Handle1 == NULL) {\r
375 if (EFI_ERROR(gBS->OpenProtocol(Handle2, &gEfiDriverBindingProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
376 // swap\r
377 Handle1 = Handle2;\r
378 Handle2 = NULL;\r
379 } else {\r
380 // We're all good...\r
381 }\r
382 } else {\r
383 if (EFI_ERROR(gBS->OpenProtocol(Handle1, &gEfiDriverBindingProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
384 // We're all good...\r
385 } else {\r
386 // swap\r
387 Handle2 = Handle1;\r
388 Handle1 = NULL;\r
389 }\r
390 }\r
391 }\r
392\r
361a8267 393 return (ConnectControllers(Handle1, Handle2, Recursive, Output, (BOOLEAN)(Handle2 != NULL && Handle1 != NULL)));\r
4ba49616 394}\r
395\r
396STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
397 {L"-c", TypeFlag},\r
398 {L"-r", TypeFlag},\r
399 {NULL, TypeMax}\r
400 };\r
401\r
402/**\r
403 Function for 'connect' command.\r
404\r
405 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
406 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
407**/\r
408SHELL_STATUS\r
409EFIAPI\r
410ShellCommandRunConnect (\r
411 IN EFI_HANDLE ImageHandle,\r
412 IN EFI_SYSTEM_TABLE *SystemTable\r
413 )\r
414{\r
415 EFI_STATUS Status;\r
416 LIST_ENTRY *Package;\r
417 CHAR16 *ProblemParam;\r
418 SHELL_STATUS ShellStatus;\r
419 CONST CHAR16 *Param1;\r
420 CONST CHAR16 *Param2;\r
421 UINTN Count;\r
361a8267 422 EFI_HANDLE Handle1;\r
423 EFI_HANDLE Handle2;\r
424 UINT64 Intermediate;\r
4ba49616 425\r
426 ShellStatus = SHELL_SUCCESS;\r
4ba49616 427 //\r
428 // initialize the shell lib (we must be in non-auto-init...)\r
429 //\r
430 Status = ShellInitialize();\r
431 ASSERT_EFI_ERROR(Status);\r
432\r
433 Status = CommandInit();\r
434 ASSERT_EFI_ERROR(Status);\r
435\r
436 //\r
437 // parse the command line\r
438 //\r
439 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
440 if (EFI_ERROR(Status)) {\r
441 if (Status == EFI_VOLUME_CORRUPTED && ProblemParam != NULL) {\r
442 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
443 FreePool(ProblemParam);\r
444 ShellStatus = SHELL_INVALID_PARAMETER;\r
445 } else {\r
446 ASSERT(FALSE);\r
447 }\r
448 } else {\r
449 //\r
450 // if more than 2 'value' parameters (plus the name one) or either -r or -c with any value parameters we have too many parameters\r
451 //\r
6878e7a7 452 Count = (gInReconnect?0x4:0x3);\r
453 if ((ShellCommandLineGetCount(Package) > Count)\r
4ba49616 454 ||((ShellCommandLineGetFlag(Package, L"-r") || ShellCommandLineGetFlag(Package, L"-c")) && ShellCommandLineGetCount(Package)>1)\r
455 ||(ShellCommandLineGetFlag(Package, L"-r") && ShellCommandLineGetFlag(Package, L"-c") )\r
456 ){\r
457 //\r
458 // error for too many parameters\r
459 //\r
460 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
461 ShellStatus = SHELL_INVALID_PARAMETER;\r
462 } else if (ShellCommandLineGetFlag(Package, L"-c")) {\r
463 //\r
464 // do the conin and conout from EFI variables\r
465 // if the first fails dont 'loose' the error\r
466 //\r
d86b04fb 467 Status = ShellConnectFromDevPaths(L"ConInDev");\r
4ba49616 468 if (EFI_ERROR(Status)) {\r
d86b04fb 469 ShellConnectFromDevPaths(L"ConOutDev");\r
4ba49616 470 } else {\r
d86b04fb 471 Status = ShellConnectFromDevPaths(L"ConOutDev");\r
4ba49616 472 }\r
473 if (EFI_ERROR(Status)) {\r
d86b04fb 474 ShellConnectFromDevPaths(L"ErrOutDev");\r
4ba49616 475 } else {\r
d86b04fb 476 Status = ShellConnectFromDevPaths(L"ErrOutDev");\r
4ba49616 477 }\r
478 if (EFI_ERROR(Status)) {\r
d86b04fb 479 ShellConnectFromDevPaths(L"ErrOut");\r
4ba49616 480 } else {\r
d86b04fb 481 Status = ShellConnectFromDevPaths(L"ErrOut");\r
4ba49616 482 }\r
483 if (EFI_ERROR(Status)) {\r
d86b04fb 484 ShellConnectFromDevPaths(L"ConIn");\r
4ba49616 485 } else {\r
d86b04fb 486 Status = ShellConnectFromDevPaths(L"ConIn");\r
4ba49616 487 }\r
488 if (EFI_ERROR(Status)) {\r
d86b04fb 489 ShellConnectFromDevPaths(L"ConOut");\r
4ba49616 490 } else {\r
d86b04fb 491 Status = ShellConnectFromDevPaths(L"ConOut");\r
4ba49616 492 }\r
493 if (EFI_ERROR(Status)) {\r
494 ShellStatus = SHELL_DEVICE_ERROR;\r
495 }\r
496 } else {\r
497 //\r
498 // 0, 1, or 2 specific handles and possibly recursive\r
499 //\r
361a8267 500 Param1 = ShellCommandLineGetRawValue(Package, 1);\r
501 Param2 = ShellCommandLineGetRawValue(Package, 2);\r
502 Count = ShellCommandLineGetCount(Package);\r
503\r
6878e7a7 504 if (Param1 != NULL) {\r
505 Status = ShellConvertStringToUint64(Param1, &Intermediate, TRUE, FALSE);\r
506 Handle1 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
507 if (EFI_ERROR(Status)) {\r
508 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param1);\r
509 ShellStatus = SHELL_INVALID_PARAMETER;\r
510 }\r
511 } else {\r
512 Handle1 = NULL;\r
361a8267 513 }\r
6878e7a7 514\r
515 if (Param2 != NULL) {\r
516 Status = ShellConvertStringToUint64(Param2, &Intermediate, TRUE, FALSE);\r
517 Handle2 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
518 if (EFI_ERROR(Status)) {\r
519 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param2);\r
520 ShellStatus = SHELL_INVALID_PARAMETER;\r
521 }\r
522 } else {\r
523 Handle2 = NULL;\r
361a8267 524 }\r
525 \r
526 if (ShellStatus == SHELL_SUCCESS) {\r
527 if (Param1 != NULL && Handle1 == NULL){\r
528 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param1);\r
529 ShellStatus = SHELL_INVALID_PARAMETER;\r
530 } else if (Param2 != NULL && Handle2 == NULL) {\r
531 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param2);\r
532 ShellStatus = SHELL_INVALID_PARAMETER;\r
6b825919 533 } else if (Handle2 != NULL && Handle1 != NULL && EFI_ERROR(gBS->OpenProtocol(Handle2, &gEfiDriverBindingProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
534 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param2);\r
535 ShellStatus = SHELL_INVALID_PARAMETER;\r
361a8267 536 } else {\r
537 Status = ConvertAndConnectControllers(Handle1, Handle2, ShellCommandLineGetFlag(Package, L"-r"), (BOOLEAN)(Count!=0));\r
538 if (EFI_ERROR(Status)) {\r
539 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CONNECT_NONE), gShellDriver1HiiHandle);\r
540 ShellStatus = SHELL_DEVICE_ERROR;\r
541 }\r
4ba49616 542 }\r
543 }\r
544 }\r
545\r
546 ShellCommandLineFreeVarList (Package);\r
547 }\r
548 return (ShellStatus);\r
549}\r
550\r