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