]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[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
47d20b54 26 IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect\r
0ff81081
QS
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
47d20b54 39 do {\r
0ff81081 40 RemainingDevicePath = DevicePathToConnect;\r
47d20b54 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
47d20b54 48 Status = gBS->ConnectController (Handle, NULL, RemainingDevicePath, FALSE);\r
36d6448c 49 }\r
0ff81081 50 }\r
47d20b54 51 } while (!EFI_ERROR (Status) && !IsDevicePathEnd (RemainingDevicePath));\r
ba0014b9 52\r
0ff81081 53 return Status;\r
0ff81081
QS
54}\r
55\r
56/**\r
57 Connect drivers for PCI root bridge.\r
ba0014b9 58\r
0ff81081
QS
59 @retval EFI_SUCCESS Connect drivers successfully.\r
60 @retval EFI_NOT_FOUND Cannot find PCI root bridge device.\r
61\r
62**/\r
63EFI_STATUS\r
64ShellConnectPciRootBridge (\r
65 VOID\r
66 )\r
ba0014b9 67{\r
47d20b54
MK
68 UINTN RootBridgeHandleCount;\r
69 EFI_HANDLE *RootBridgeHandleBuffer;\r
70 UINTN RootBridgeIndex;\r
71 EFI_STATUS Status;\r
ba0014b9 72\r
0ff81081 73 RootBridgeHandleCount = 0;\r
ba0014b9
LG
74\r
75 Status = gBS->LocateHandleBuffer (\r
47d20b54
MK
76 ByProtocol,\r
77 &gEfiPciRootBridgeIoProtocolGuid,\r
78 NULL,\r
79 &RootBridgeHandleCount,\r
80 &RootBridgeHandleBuffer\r
81 );\r
0ff81081
QS
82 if (EFI_ERROR (Status)) {\r
83 return Status;\r
84 }\r
ba0014b9
LG
85\r
86 for (RootBridgeIndex = 0; RootBridgeIndex < RootBridgeHandleCount; RootBridgeIndex++) {\r
87 gBS->ConnectController (RootBridgeHandleBuffer[RootBridgeIndex], NULL, NULL, FALSE);\r
88 }\r
d86b04fb
QS
89\r
90 FreePool (RootBridgeHandleBuffer);\r
ba0014b9 91\r
0ff81081
QS
92 return EFI_SUCCESS;\r
93}\r
94\r
4ba49616 95/**\r
361a8267 96 Connect controller(s) and driver(s).\r
97\r
0ff81081
QS
98 @param[in] ControllerHandle The handle to the controller. Should have driver binding on it.\r
99 @param[in] DriverHandle The handle to the driver. Should have driver binding.\r
361a8267 100 @param[in] Recursive TRUE to connect recursively, FALSE otherwise.\r
101 @param[in] Output TRUE to have info on the screen, FALSE otherwise.\r
102 @param[in] AlwaysOutput Override Output for errors.\r
103\r
104 @retval EFI_SUCCESS The operation was successful.\r
4ba49616 105**/\r
106EFI_STATUS\r
4ba49616 107ConnectControllers (\r
47d20b54
MK
108 IN CONST EFI_HANDLE ControllerHandle OPTIONAL,\r
109 IN CONST EFI_HANDLE DriverHandle OPTIONAL,\r
110 IN CONST BOOLEAN Recursive,\r
111 IN CONST BOOLEAN Output,\r
112 IN CONST BOOLEAN AlwaysOutput\r
4ba49616 113 )\r
114{\r
47d20b54
MK
115 EFI_STATUS Status;\r
116 EFI_STATUS Status2;\r
117 EFI_HANDLE *ControllerHandleList;\r
118 EFI_HANDLE *DriverHandleList;\r
119 EFI_HANDLE *HandleWalker;\r
4ba49616 120\r
47d20b54
MK
121 ControllerHandleList = NULL;\r
122 Status = EFI_NOT_FOUND;\r
123 Status2 = EFI_NOT_FOUND;\r
4ba49616 124\r
125 //\r
126 // If we have a single handle to connect make that a 'list'\r
127 //\r
128 if (DriverHandle == NULL) {\r
129 DriverHandleList = NULL;\r
130 } else {\r
47d20b54 131 DriverHandleList = AllocateZeroPool (2*sizeof (EFI_HANDLE));\r
4ba49616 132 if (DriverHandleList == NULL) {\r
133 return (EFI_OUT_OF_RESOURCES);\r
134 }\r
47d20b54 135\r
4ba49616 136 DriverHandleList[0] = DriverHandle;\r
137 DriverHandleList[1] = NULL;\r
138 }\r
139\r
140 //\r
141 // do we connect all controllers (with a loop) or a single one...\r
142 // This is where we call the gBS->ConnectController function.\r
143 //\r
144 if (ControllerHandle == NULL) {\r
47d20b54 145 ControllerHandleList = GetHandleListByProtocol (&gEfiDevicePathProtocolGuid);\r
4ba49616 146 for (HandleWalker = ControllerHandleList\r
47d20b54
MK
147 ; HandleWalker != NULL && *HandleWalker != NULL\r
148 ; HandleWalker++\r
149 )\r
150 {\r
151 Status = gBS->ConnectController (*HandleWalker, DriverHandleList, NULL, Recursive);\r
152 if (!EFI_ERROR (Status)) {\r
4ba49616 153 Status2 = EFI_SUCCESS;\r
154 }\r
47d20b54
MK
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
4ba49616 158 }\r
159 }\r
160 } else {\r
47d20b54
MK
161 Status = gBS->ConnectController (ControllerHandle, DriverHandleList, NULL, Recursive);\r
162 if (!EFI_ERROR (Status)) {\r
4ba49616 163 Status2 = EFI_SUCCESS;\r
164 }\r
47d20b54
MK
165\r
166 if ((Output && !EFI_ERROR (Status)) || AlwaysOutput) {\r
167 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Connect", ConvertHandleToHandleIndex (ControllerHandle), Status);\r
4ba49616 168 }\r
169 }\r
170\r
171 //\r
172 // Free any memory we allocated.\r
173 //\r
174 if (ControllerHandleList != NULL) {\r
47d20b54 175 FreePool (ControllerHandleList);\r
4ba49616 176 }\r
47d20b54 177\r
4ba49616 178 if (DriverHandleList != NULL) {\r
47d20b54 179 FreePool (DriverHandleList);\r
4ba49616 180 }\r
47d20b54 181\r
4ba49616 182 return (Status2);\r
183}\r
184\r
361a8267 185/**\r
186 Do a connect from an EFI variable via it's key name.\r
187\r
188 @param[in] Key The name of the EFI Variable.\r
189\r
190 @retval EFI_SUCCESS The operation was successful.\r
191**/\r
4ba49616 192EFI_STATUS\r
d86b04fb 193ShellConnectFromDevPaths (\r
47d20b54 194 IN CONST CHAR16 *Key\r
4ba49616 195 )\r
196{\r
197 EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
36d6448c 198 EFI_DEVICE_PATH_PROTOCOL *CopyOfDevPath;\r
ba0014b9 199 EFI_DEVICE_PATH_PROTOCOL *Instance;\r
36d6448c 200 EFI_DEVICE_PATH_PROTOCOL *Next;\r
4ba49616 201 UINTN Length;\r
0ff81081
QS
202 UINTN Index;\r
203 UINTN HandleArrayCount;\r
36d6448c 204 UINTN Size;\r
0ff81081 205 EFI_HANDLE *HandleArray;\r
4ba49616 206 EFI_STATUS Status;\r
0ff81081
QS
207 BOOLEAN AtLeastOneConnected;\r
208 EFI_PCI_IO_PROTOCOL *PciIo;\r
209 UINT8 Class[3];\r
ba0014b9 210\r
47d20b54
MK
211 DevPath = NULL;\r
212 Length = 0;\r
0ff81081 213 AtLeastOneConnected = FALSE;\r
36d6448c 214\r
4ba49616 215 //\r
216 // Get the DevicePath buffer from the variable...\r
217 //\r
47d20b54 218 Status = gRT->GetVariable ((CHAR16 *)Key, (EFI_GUID *)&gEfiGlobalVariableGuid, NULL, &Length, DevPath);\r
4ba49616 219 if (Status == EFI_BUFFER_TOO_SMALL) {\r
47d20b54 220 DevPath = AllocateZeroPool (Length);\r
0ff81081
QS
221 if (DevPath == NULL) {\r
222 return EFI_OUT_OF_RESOURCES;\r
223 }\r
47d20b54
MK
224\r
225 Status = gRT->GetVariable ((CHAR16 *)Key, (EFI_GUID *)&gEfiGlobalVariableGuid, NULL, &Length, DevPath);\r
36d6448c
QS
226 if (EFI_ERROR (Status)) {\r
227 if (DevPath != NULL) {\r
228 FreePool (DevPath);\r
229 }\r
47d20b54 230\r
36d6448c
QS
231 return Status;\r
232 }\r
233 } else if (EFI_ERROR (Status)) {\r
234 return Status;\r
4ba49616 235 }\r
236\r
237 Status = EFI_NOT_FOUND;\r
36d6448c
QS
238\r
239 CopyOfDevPath = DevPath;\r
4ba49616 240 //\r
241 // walk the list of devices and connect them\r
242 //\r
36d6448c
QS
243 do {\r
244 //\r
245 // Check every instance of the console variable\r
246 //\r
247 Instance = GetNextDevicePathInstance (&CopyOfDevPath, &Size);\r
248 if (Instance == NULL) {\r
249 if (DevPath != NULL) {\r
250 FreePool (DevPath);\r
251 }\r
47d20b54 252\r
36d6448c
QS
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 265 if ((DevicePathType (Instance) == MESSAGING_DEVICE_PATH) &&\r
47d20b54
MK
266 ( (DevicePathSubType (Instance) == MSG_USB_CLASS_DP)\r
267 || (DevicePathSubType (Instance) == MSG_USB_WWID_DP)\r
268 ))\r
269 {\r
0ff81081 270 Status = ShellConnectPciRootBridge ();\r
47d20b54
MK
271 if (EFI_ERROR (Status)) {\r
272 FreePool (Instance);\r
273 FreePool (DevPath);\r
0ff81081 274 return Status;\r
4ba49616 275 }\r
ba0014b9 276\r
0ff81081 277 Status = gBS->LocateHandleBuffer (\r
47d20b54
MK
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
47d20b54
MK
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
47d20b54
MK
297 (PCI_CLASS_SERIAL_USB == Class[1]))\r
298 {\r
0ff81081 299 Status = gBS->ConnectController (\r
47d20b54
MK
300 HandleArray[Index],\r
301 NULL,\r
302 Instance,\r
303 FALSE\r
304 );\r
305 if (!EFI_ERROR (Status)) {\r
0ff81081
QS
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
ba0014b9 317 } else {\r
0ff81081
QS
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
ba0014b9 326\r
47d20b54 327 FreePool (Instance);\r
36d6448c 328 } while (CopyOfDevPath != NULL);\r
ba0014b9 329\r
4ba49616 330 if (DevPath != NULL) {\r
47d20b54 331 FreePool (DevPath);\r
4ba49616 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
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
61d505df
LE
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
47d20b54
MK
364 if ( ((Handle1 == NULL) && (Handle2 != NULL))\r
365 || ((Handle1 != NULL) && (Handle2 == NULL))\r
366 )\r
367 {\r
4ba49616 368 //\r
369 // Figure out which one should be NULL and move the handle to the right place.\r
370 // If Handle1 is NULL then test Handle2 and vise versa.\r
371 // The one that DOES has driver binding must be Handle2\r
372 //\r
373 if (Handle1 == NULL) {\r
47d20b54 374 if (EFI_ERROR (gBS->OpenProtocol (Handle2, &gEfiDriverBindingProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
4ba49616 375 // swap\r
376 Handle1 = Handle2;\r
377 Handle2 = NULL;\r
378 } else {\r
379 // We're all good...\r
380 }\r
381 } else {\r
47d20b54 382 if (EFI_ERROR (gBS->OpenProtocol (Handle1, &gEfiDriverBindingProtocolGuid, NULL, NULL, gImageHandle, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
4ba49616 383 // We're all good...\r
384 } else {\r
385 // swap\r
386 Handle2 = Handle1;\r
387 Handle1 = NULL;\r
388 }\r
389 }\r
390 }\r
391\r
47d20b54 392 return (ConnectControllers (Handle1, Handle2, Recursive, Output, (BOOLEAN)(Handle2 != NULL && Handle1 != NULL)));\r
4ba49616 393}\r
394\r
47d20b54
MK
395STATIC CONST SHELL_PARAM_ITEM ParamList[] = {\r
396 { L"-c", TypeFlag },\r
397 { L"-r", TypeFlag },\r
398 { NULL, TypeMax }\r
399};\r
4ba49616 400\r
401/**\r
402 Function for 'connect' command.\r
403\r
404 @param[in] ImageHandle Handle to the Image (NULL if Internal).\r
405 @param[in] SystemTable Pointer to the System Table (NULL if Internal).\r
406**/\r
407SHELL_STATUS\r
408EFIAPI\r
409ShellCommandRunConnect (\r
410 IN EFI_HANDLE ImageHandle,\r
411 IN EFI_SYSTEM_TABLE *SystemTable\r
412 )\r
413{\r
47d20b54
MK
414 EFI_STATUS Status;\r
415 LIST_ENTRY *Package;\r
416 CHAR16 *ProblemParam;\r
417 SHELL_STATUS ShellStatus;\r
418 CONST CHAR16 *Param1;\r
419 CONST CHAR16 *Param2;\r
420 UINTN Count;\r
421 EFI_HANDLE Handle1;\r
422 EFI_HANDLE Handle2;\r
423 UINT64 Intermediate;\r
424\r
425 ShellStatus = SHELL_SUCCESS;\r
4ba49616 426 //\r
427 // initialize the shell lib (we must be in non-auto-init...)\r
428 //\r
47d20b54
MK
429 Status = ShellInitialize ();\r
430 ASSERT_EFI_ERROR (Status);\r
4ba49616 431\r
47d20b54
MK
432 Status = CommandInit ();\r
433 ASSERT_EFI_ERROR (Status);\r
4ba49616 434\r
435 //\r
436 // parse the command line\r
437 //\r
438 Status = ShellCommandLineParse (ParamList, &Package, &ProblemParam, TRUE);\r
47d20b54
MK
439 if (EFI_ERROR (Status)) {\r
440 if ((Status == EFI_VOLUME_CORRUPTED) && (ProblemParam != NULL)) {\r
441 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, L"connect", ProblemParam);\r
442 FreePool (ProblemParam);\r
4ba49616 443 ShellStatus = SHELL_INVALID_PARAMETER;\r
444 } else {\r
47d20b54 445 ASSERT (FALSE);\r
4ba49616 446 }\r
447 } else {\r
448 //\r
449 // 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
450 //\r
47d20b54
MK
451 Count = (gInReconnect ? 0x4 : 0x3);\r
452 if ( (ShellCommandLineGetCount (Package) > Count)\r
453 || (ShellCommandLineGetFlag (Package, L"-c") && (ShellCommandLineGetCount (Package) > 1))\r
454 || (ShellCommandLineGetFlag (Package, L"-r") && (ShellCommandLineGetCount (Package) > 2))\r
455 || (ShellCommandLineGetFlag (Package, L"-r") && ShellCommandLineGetFlag (Package, L"-c"))\r
456 )\r
457 {\r
4ba49616 458 //\r
459 // error for too many parameters\r
460 //\r
47d20b54 461 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle, L"connect");\r
4ba49616 462 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54 463 } else if (ShellCommandLineGetFlag (Package, L"-c")) {\r
4ba49616 464 //\r
465 // do the conin and conout from EFI variables\r
466 // if the first fails dont 'loose' the error\r
467 //\r
47d20b54
MK
468 Status = ShellConnectFromDevPaths (L"ConInDev");\r
469 if (EFI_ERROR (Status)) {\r
470 ShellConnectFromDevPaths (L"ConOutDev");\r
4ba49616 471 } else {\r
47d20b54 472 Status = ShellConnectFromDevPaths (L"ConOutDev");\r
4ba49616 473 }\r
47d20b54
MK
474\r
475 if (EFI_ERROR (Status)) {\r
476 ShellConnectFromDevPaths (L"ErrOutDev");\r
4ba49616 477 } else {\r
47d20b54 478 Status = ShellConnectFromDevPaths (L"ErrOutDev");\r
4ba49616 479 }\r
47d20b54
MK
480\r
481 if (EFI_ERROR (Status)) {\r
482 ShellConnectFromDevPaths (L"ErrOut");\r
4ba49616 483 } else {\r
47d20b54 484 Status = ShellConnectFromDevPaths (L"ErrOut");\r
4ba49616 485 }\r
47d20b54
MK
486\r
487 if (EFI_ERROR (Status)) {\r
488 ShellConnectFromDevPaths (L"ConIn");\r
4ba49616 489 } else {\r
47d20b54 490 Status = ShellConnectFromDevPaths (L"ConIn");\r
4ba49616 491 }\r
47d20b54
MK
492\r
493 if (EFI_ERROR (Status)) {\r
494 ShellConnectFromDevPaths (L"ConOut");\r
4ba49616 495 } else {\r
47d20b54 496 Status = ShellConnectFromDevPaths (L"ConOut");\r
4ba49616 497 }\r
47d20b54
MK
498\r
499 if (EFI_ERROR (Status)) {\r
4ba49616 500 ShellStatus = SHELL_DEVICE_ERROR;\r
501 }\r
502 } else {\r
503 //\r
504 // 0, 1, or 2 specific handles and possibly recursive\r
505 //\r
47d20b54
MK
506 Param1 = ShellCommandLineGetRawValue (Package, 1);\r
507 Param2 = ShellCommandLineGetRawValue (Package, 2);\r
508 Count = ShellCommandLineGetCount (Package);\r
361a8267 509\r
6878e7a7 510 if (Param1 != NULL) {\r
47d20b54
MK
511 Status = ShellConvertStringToUint64 (Param1, &Intermediate, TRUE, FALSE);\r
512 Handle1 = ConvertHandleIndexToHandle ((UINTN)Intermediate);\r
513 if (EFI_ERROR (Status)) {\r
514 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param1);\r
6878e7a7 515 ShellStatus = SHELL_INVALID_PARAMETER;\r
516 }\r
517 } else {\r
518 Handle1 = NULL;\r
361a8267 519 }\r
6878e7a7 520\r
521 if (Param2 != NULL) {\r
47d20b54
MK
522 Status = ShellConvertStringToUint64 (Param2, &Intermediate, TRUE, FALSE);\r
523 Handle2 = ConvertHandleIndexToHandle ((UINTN)Intermediate);\r
524 if (EFI_ERROR (Status)) {\r
525 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param2);\r
6878e7a7 526 ShellStatus = SHELL_INVALID_PARAMETER;\r
527 }\r
528 } else {\r
529 Handle2 = NULL;\r
361a8267 530 }\r
ba0014b9 531\r
361a8267 532 if (ShellStatus == SHELL_SUCCESS) {\r
47d20b54
MK
533 if ((Param1 != NULL) && (Handle1 == NULL)) {\r
534 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param1);\r
361a8267 535 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
536 } else if ((Param2 != NULL) && (Handle2 == NULL)) {\r
537 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param2);\r
361a8267 538 ShellStatus = SHELL_INVALID_PARAMETER;\r
47d20b54
MK
539 } else if ((Handle2 != NULL) && (Handle1 != NULL) && EFI_ERROR (gBS->OpenProtocol (Handle2, &gEfiDriverBindingProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
540 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, L"connect", Param2);\r
6b825919 541 ShellStatus = SHELL_INVALID_PARAMETER;\r
361a8267 542 } else {\r
47d20b54
MK
543 Status = ConvertAndConnectControllers (Handle1, Handle2, ShellCommandLineGetFlag (Package, L"-r"), (BOOLEAN)(Count != 0));\r
544 if (EFI_ERROR (Status)) {\r
545 ShellPrintHiiEx (-1, -1, NULL, STRING_TOKEN (STR_CONNECT_NONE), gShellDriver1HiiHandle);\r
361a8267 546 ShellStatus = SHELL_DEVICE_ERROR;\r
547 }\r
4ba49616 548 }\r
549 }\r
550 }\r
551\r
552 ShellCommandLineFreeVarList (Package);\r
553 }\r
47d20b54 554\r
4ba49616 555 return (ShellStatus);\r
556}\r