]>
Commit | Line | Data |
---|---|---|
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 | |
24 | EFI_STATUS\r | |
25 | ShellConnectDevicePath (\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 | |
63 | EFI_STATUS\r | |
64 | ShellConnectPciRootBridge (\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 |
106 | EFI_STATUS\r | |
4ba49616 | 107 | ConnectControllers (\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 | 192 | EFI_STATUS\r |
d86b04fb | 193 | ShellConnectFromDevPaths (\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 | 353 | EFI_STATUS\r |
4ba49616 | 354 | ConvertAndConnectControllers (\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 |
395 | STATIC 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 | |
407 | SHELL_STATUS\r | |
408 | EFIAPI\r | |
409 | ShellCommandRunConnect (\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 |