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