]> git.proxmox.com Git - mirror_edk2.git/blame - ShellPkg/Library/UefiShellDriver1CommandsLib/Connect.c
ShellPkg: Fixes and updates for the 'devices' command
[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
96 \r
97 return EFI_SUCCESS;\r
98}\r
99\r
100\r
4ba49616 101/**\r
361a8267 102 Connect controller(s) and driver(s).\r
103\r
0ff81081
QS
104 @param[in] ControllerHandle The handle to the controller. Should have driver binding on it.\r
105 @param[in] DriverHandle The handle to the driver. Should have driver binding.\r
361a8267 106 @param[in] Recursive TRUE to connect recursively, FALSE otherwise.\r
107 @param[in] Output TRUE to have info on the screen, FALSE otherwise.\r
108 @param[in] AlwaysOutput Override Output for errors.\r
109\r
110 @retval EFI_SUCCESS The operation was successful.\r
4ba49616 111**/\r
112EFI_STATUS\r
113EFIAPI\r
114ConnectControllers (\r
115 IN CONST EFI_HANDLE ControllerHandle OPTIONAL,\r
116 IN CONST EFI_HANDLE DriverHandle OPTIONAL,\r
117 IN CONST BOOLEAN Recursive,\r
118 IN CONST BOOLEAN Output,\r
119 IN CONST BOOLEAN AlwaysOutput\r
120 )\r
121{\r
122 EFI_STATUS Status;\r
123 EFI_STATUS Status2;\r
124 EFI_HANDLE *ControllerHandleList;\r
125 EFI_HANDLE *DriverHandleList;\r
126 EFI_HANDLE *HandleWalker;\r
127\r
128 ControllerHandleList = NULL;\r
129 Status = EFI_NOT_FOUND;\r
130 Status2 = EFI_NOT_FOUND;\r
131\r
132 //\r
133 // If we have a single handle to connect make that a 'list'\r
134 //\r
135 if (DriverHandle == NULL) {\r
136 DriverHandleList = NULL;\r
137 } else {\r
361a8267 138 DriverHandleList = AllocateZeroPool(2*sizeof(EFI_HANDLE));\r
4ba49616 139 if (DriverHandleList == NULL) {\r
140 return (EFI_OUT_OF_RESOURCES);\r
141 }\r
142 DriverHandleList[0] = DriverHandle;\r
143 DriverHandleList[1] = NULL;\r
144 }\r
145\r
146 //\r
147 // do we connect all controllers (with a loop) or a single one...\r
148 // This is where we call the gBS->ConnectController function.\r
149 //\r
150 if (ControllerHandle == NULL) {\r
151 ControllerHandleList = GetHandleListByProtocol(&gEfiDevicePathProtocolGuid);\r
152 for (HandleWalker = ControllerHandleList\r
153 ; HandleWalker != NULL && *HandleWalker != NULL\r
154 ; HandleWalker++\r
155 ){\r
156 Status = gBS->ConnectController(*HandleWalker, DriverHandleList, NULL, Recursive);\r
157 if (!EFI_ERROR(Status)) {\r
158 Status2 = EFI_SUCCESS;\r
159 }\r
160 if ((Output && !EFI_ERROR(Status)) || AlwaysOutput) {\r
161 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Connect", ConvertHandleToHandleIndex(*HandleWalker), Status);\r
162 }\r
163 }\r
164 } else {\r
165 Status = gBS->ConnectController(ControllerHandle, DriverHandleList, NULL, Recursive);\r
166 if (!EFI_ERROR(Status)) {\r
167 Status2 = EFI_SUCCESS;\r
168 }\r
169 if ((Output && !EFI_ERROR(Status)) || AlwaysOutput) {\r
170 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN(STR_HANDLE_RESULT), gShellDriver1HiiHandle, L"Connect", ConvertHandleToHandleIndex(ControllerHandle), Status);\r
171 }\r
172 }\r
173\r
174 //\r
175 // Free any memory we allocated.\r
176 //\r
177 if (ControllerHandleList != NULL) {\r
178 FreePool(ControllerHandleList);\r
179 }\r
180 if (DriverHandleList != NULL) {\r
181 FreePool(DriverHandleList);\r
182 }\r
183 return (Status2);\r
184}\r
185\r
361a8267 186/**\r
187 Do a connect from an EFI variable via it's key name.\r
188\r
189 @param[in] Key The name of the EFI Variable.\r
190\r
191 @retval EFI_SUCCESS The operation was successful.\r
192**/\r
4ba49616 193EFI_STATUS\r
194EFIAPI\r
195ConnectFromDevPaths (\r
196 IN CONST CHAR16 *Key\r
197 )\r
198{\r
199 EFI_DEVICE_PATH_PROTOCOL *DevPath;\r
36d6448c
QS
200 EFI_DEVICE_PATH_PROTOCOL *CopyOfDevPath;\r
201 EFI_DEVICE_PATH_PROTOCOL *Instance; \r
202 EFI_DEVICE_PATH_PROTOCOL *Next;\r
4ba49616 203 UINTN Length;\r
0ff81081
QS
204 UINTN Index;\r
205 UINTN HandleArrayCount;\r
36d6448c 206 UINTN Size;\r
0ff81081 207 EFI_HANDLE *HandleArray;\r
4ba49616 208 EFI_STATUS Status;\r
0ff81081
QS
209 BOOLEAN AtLeastOneConnected;\r
210 EFI_PCI_IO_PROTOCOL *PciIo;\r
211 UINT8 Class[3];\r
212 \r
4ba49616 213 DevPath = NULL;\r
214 Length = 0;\r
0ff81081 215 AtLeastOneConnected = FALSE;\r
36d6448c 216\r
4ba49616 217 //\r
218 // Get the DevicePath buffer from the variable...\r
219 //\r
220 Status = gRT->GetVariable((CHAR16*)Key, (EFI_GUID*)&gEfiGlobalVariableGuid, NULL, &Length, DevPath);\r
221 if (Status == EFI_BUFFER_TOO_SMALL) {\r
361a8267 222 DevPath = AllocateZeroPool(Length);\r
0ff81081
QS
223 if (DevPath == NULL) {\r
224 return EFI_OUT_OF_RESOURCES;\r
225 }\r
4ba49616 226 Status = gRT->GetVariable((CHAR16*)Key, (EFI_GUID*)&gEfiGlobalVariableGuid, NULL, &Length, DevPath);\r
36d6448c
QS
227 if (EFI_ERROR (Status)) {\r
228 if (DevPath != NULL) {\r
229 FreePool (DevPath);\r
230 }\r
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
252 return EFI_UNSUPPORTED;\r
253 }\r
254\r
255 Next = Instance;\r
256 while (!IsDevicePathEndType (Next)) {\r
257 Next = NextDevicePathNode (Next);\r
258 }\r
259\r
260 SetDevicePathEndNode (Next);\r
4ba49616 261 //\r
0ff81081 262 // connect short form device path\r
4ba49616 263 //\r
36d6448c
QS
264 if ((DevicePathType (Instance) == MESSAGING_DEVICE_PATH) &&\r
265 ((DevicePathSubType (Instance) == MSG_USB_CLASS_DP)\r
266 || (DevicePathSubType (Instance) == MSG_USB_WWID_DP)\r
0ff81081 267 )) {\r
0ff81081
QS
268 \r
269 Status = ShellConnectPciRootBridge ();\r
270 if (EFI_ERROR(Status)) {\r
36d6448c 271 FreePool(Instance);\r
0ff81081
QS
272 FreePool(DevPath);\r
273 return Status;\r
4ba49616 274 }\r
0ff81081
QS
275 \r
276 Status = gBS->LocateHandleBuffer (\r
277 ByProtocol,\r
278 &gEfiPciIoProtocolGuid,\r
279 NULL,\r
280 &HandleArrayCount,\r
281 &HandleArray\r
282 );\r
283 \r
284 if (!EFI_ERROR (Status)) {\r
285 for (Index = 0; Index < HandleArrayCount; Index++) {\r
286 Status = gBS->HandleProtocol (\r
287 HandleArray[Index],\r
288 &gEfiPciIoProtocolGuid,\r
289 (VOID **)&PciIo\r
290 );\r
291 \r
292 if (!EFI_ERROR (Status)) {\r
293 Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Class);\r
294 if (!EFI_ERROR (Status)) {\r
295 if ((PCI_CLASS_SERIAL == Class[2]) &&\r
296 (PCI_CLASS_SERIAL_USB == Class[1])) {\r
297 Status = gBS->ConnectController (\r
298 HandleArray[Index],\r
299 NULL,\r
300 Instance,\r
301 FALSE\r
302 );\r
303 if (!EFI_ERROR(Status)) {\r
304 AtLeastOneConnected = TRUE;\r
305 }\r
306 }\r
307 }\r
308 }\r
309 }\r
310 }\r
311\r
312 if (HandleArray != NULL) {\r
313 FreePool (HandleArray);\r
314 }\r
0ff81081
QS
315 } else { \r
316 //\r
317 // connect the entire device path\r
318 //\r
0ff81081
QS
319 Status = ShellConnectDevicePath (Instance);\r
320 if (!EFI_ERROR (Status)) {\r
321 AtLeastOneConnected = TRUE;\r
322 }\r
4ba49616 323 }\r
36d6448c 324 FreePool (Instance);\r
0ff81081 325 \r
36d6448c 326 } while (CopyOfDevPath != NULL);\r
0ff81081 327 \r
4ba49616 328 if (DevPath != NULL) {\r
329 FreePool(DevPath);\r
330 }\r
0ff81081
QS
331\r
332 if (AtLeastOneConnected) {\r
333 return EFI_SUCCESS;\r
334 } else {\r
335 return EFI_NOT_FOUND;\r
336 }\r
337 \r
4ba49616 338}\r
339\r
361a8267 340/**\r
341 Convert the handle identifiers from strings and then connect them.\r
342\r
343 One of them should have driver binding and either can be NULL.\r
344\r
345 @param[in] Handle1 The first handle.\r
346 @param[in] Handle2 The second handle.\r
347 @param[in] Recursive TRUE to do connect recursively. FALSE otherwise.\r
348 @param[in] Output TRUE to have output to screen. FALSE otherwise.\r
349\r
350 @retval EFI_SUCCESS The operation was successful.\r
351**/\r
4ba49616 352EFI_STATUS\r
353EFIAPI\r
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
440 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_PROBLEM), gShellDriver1HiiHandle, ProblemParam);\r
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
4ba49616 452 ||((ShellCommandLineGetFlag(Package, L"-r") || ShellCommandLineGetFlag(Package, L"-c")) && ShellCommandLineGetCount(Package)>1)\r
453 ||(ShellCommandLineGetFlag(Package, L"-r") && ShellCommandLineGetFlag(Package, L"-c") )\r
454 ){\r
455 //\r
456 // error for too many parameters\r
457 //\r
458 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_TOO_MANY), gShellDriver1HiiHandle);\r
459 ShellStatus = SHELL_INVALID_PARAMETER;\r
460 } else if (ShellCommandLineGetFlag(Package, L"-c")) {\r
461 //\r
462 // do the conin and conout from EFI variables\r
463 // if the first fails dont 'loose' the error\r
464 //\r
465 Status = ConnectFromDevPaths(L"ConInDev");\r
466 if (EFI_ERROR(Status)) {\r
467 ConnectFromDevPaths(L"ConOutDev");\r
468 } else {\r
469 Status = ConnectFromDevPaths(L"ConOutDev");\r
470 }\r
471 if (EFI_ERROR(Status)) {\r
4ccd9214 472 ConnectFromDevPaths(L"ErrOutDev");\r
4ba49616 473 } else {\r
4ccd9214 474 Status = ConnectFromDevPaths(L"ErrOutDev");\r
4ba49616 475 }\r
476 if (EFI_ERROR(Status)) {\r
4ccd9214 477 ConnectFromDevPaths(L"ErrOut");\r
4ba49616 478 } else {\r
4ccd9214 479 Status = ConnectFromDevPaths(L"ErrOut");\r
4ba49616 480 }\r
481 if (EFI_ERROR(Status)) {\r
482 ConnectFromDevPaths(L"ConIn");\r
483 } else {\r
484 Status = ConnectFromDevPaths(L"ConIn");\r
485 }\r
486 if (EFI_ERROR(Status)) {\r
487 ConnectFromDevPaths(L"ConOut");\r
488 } else {\r
489 Status = ConnectFromDevPaths(L"ConOut");\r
490 }\r
491 if (EFI_ERROR(Status)) {\r
492 ShellStatus = SHELL_DEVICE_ERROR;\r
493 }\r
494 } else {\r
495 //\r
496 // 0, 1, or 2 specific handles and possibly recursive\r
497 //\r
361a8267 498 Param1 = ShellCommandLineGetRawValue(Package, 1);\r
499 Param2 = ShellCommandLineGetRawValue(Package, 2);\r
500 Count = ShellCommandLineGetCount(Package);\r
501\r
6878e7a7 502 if (Param1 != NULL) {\r
503 Status = ShellConvertStringToUint64(Param1, &Intermediate, TRUE, FALSE);\r
504 Handle1 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
505 if (EFI_ERROR(Status)) {\r
506 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param1);\r
507 ShellStatus = SHELL_INVALID_PARAMETER;\r
508 }\r
509 } else {\r
510 Handle1 = NULL;\r
361a8267 511 }\r
6878e7a7 512\r
513 if (Param2 != NULL) {\r
514 Status = ShellConvertStringToUint64(Param2, &Intermediate, TRUE, FALSE);\r
515 Handle2 = ConvertHandleIndexToHandle((UINTN)Intermediate);\r
516 if (EFI_ERROR(Status)) {\r
517 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param2);\r
518 ShellStatus = SHELL_INVALID_PARAMETER;\r
519 }\r
520 } else {\r
521 Handle2 = NULL;\r
361a8267 522 }\r
523 \r
524 if (ShellStatus == SHELL_SUCCESS) {\r
525 if (Param1 != NULL && Handle1 == NULL){\r
526 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param1);\r
527 ShellStatus = SHELL_INVALID_PARAMETER;\r
528 } else if (Param2 != NULL && Handle2 == NULL) {\r
529 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param2);\r
530 ShellStatus = SHELL_INVALID_PARAMETER;\r
6b825919 531 } else if (Handle2 != NULL && Handle1 != NULL && EFI_ERROR(gBS->OpenProtocol(Handle2, &gEfiDriverBindingProtocolGuid, NULL, gImageHandle, NULL, EFI_OPEN_PROTOCOL_TEST_PROTOCOL))) {\r
532 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_GEN_INV_HANDLE), gShellDriver1HiiHandle, Param2);\r
533 ShellStatus = SHELL_INVALID_PARAMETER;\r
361a8267 534 } else {\r
535 Status = ConvertAndConnectControllers(Handle1, Handle2, ShellCommandLineGetFlag(Package, L"-r"), (BOOLEAN)(Count!=0));\r
536 if (EFI_ERROR(Status)) {\r
537 ShellPrintHiiEx(-1, -1, NULL, STRING_TOKEN (STR_CONNECT_NONE), gShellDriver1HiiHandle);\r
538 ShellStatus = SHELL_DEVICE_ERROR;\r
539 }\r
4ba49616 540 }\r
541 }\r
542 }\r
543\r
544 ShellCommandLineFreeVarList (Package);\r
545 }\r
546 return (ShellStatus);\r
547}\r
548\r