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