95 IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect
99 EFI_DEVICE_PATH_PROTOCOL *DevicePath;
100 EFI_DEVICE_PATH_PROTOCOL *CopyOfDevicePath;
101 EFI_DEVICE_PATH_PROTOCOL *Instance;
102 EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
103 EFI_DEVICE_PATH_PROTOCOL *Next;
105 EFI_HANDLE PreviousHandle;
109 if (DevicePathToConnect == NULL) {
113 CurrentTpl = EfiGetCurrentTpl ();
115 DevicePath = DuplicateDevicePath (DevicePathToConnect);
116 if (DevicePath == NULL) {
117 return EFI_OUT_OF_RESOURCES;
120 CopyOfDevicePath = DevicePath;
129 Instance = GetNextDevicePathInstance (&DevicePath, &
Size);
130 if (Instance == NULL) {
131 FreePool (CopyOfDevicePath);
132 return EFI_OUT_OF_RESOURCES;
136 while (!IsDevicePathEndType (Next)) {
137 Next = NextDevicePathNode (Next);
140 SetDevicePathEndNode (Next);
145 PreviousHandle = NULL;
152 RemainingDevicePath = Instance;
155 if (!EFI_ERROR (Status)) {
156 if (
Handle == PreviousHandle) {
164 if (CurrentTpl == TPL_APPLICATION) {
168 Status = gDS->Dispatch ();
174 Status = EFI_NOT_FOUND;
178 if (!EFI_ERROR (Status)) {
195 gBS->ConnectController (
Handle, NULL, RemainingDevicePath, FALSE);
202 }
while (!EFI_ERROR (Status) && !IsDevicePathEnd (RemainingDevicePath));
203 }
while (DevicePath != NULL);
205 if (CopyOfDevicePath != NULL) {
206 FreePool (CopyOfDevicePath);
356 IN UINT8 HostControllerPI,
357 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
361 EFI_HANDLE *HandleArray;
362 UINTN HandleArrayCount;
364 EFI_PCI_IO_PROTOCOL *PciIo;
366 BOOLEAN AtLeastOneConnected;
371 if (RemainingDevicePath == NULL) {
372 return EFI_INVALID_PARAMETER;
375 if ((DevicePathType (RemainingDevicePath) != MESSAGING_DEVICE_PATH) ||
376 ( (DevicePathSubType (RemainingDevicePath) != MSG_USB_CLASS_DP)
377 && (DevicePathSubType (RemainingDevicePath) != MSG_USB_WWID_DP)
380 return EFI_INVALID_PARAMETER;
383 if ((HostControllerPI != 0xFF) &&
384 (HostControllerPI != 0x00) &&
385 (HostControllerPI != 0x10) &&
386 (HostControllerPI != 0x20) &&
387 (HostControllerPI != 0x30))
389 return EFI_INVALID_PARAMETER;
395 AtLeastOneConnected = FALSE;
396 Status =
gBS->LocateHandleBuffer (
398 &gEfiPciIoProtocolGuid,
403 if (!EFI_ERROR (Status)) {
404 for (Index = 0; Index < HandleArrayCount; Index++) {
405 Status =
gBS->HandleProtocol (
407 &gEfiPciIoProtocolGuid,
410 if (!EFI_ERROR (Status)) {
414 Status = PciIo->Pci.Read (PciIo, EfiPciIoWidthUint8, 0x09, 3, &Class);
415 if (!EFI_ERROR (Status)) {
416 if ((PCI_CLASS_SERIAL == Class[2]) &&
417 (PCI_CLASS_SERIAL_USB == Class[1]))
419 if ((HostControllerPI == Class[0]) || (HostControllerPI == 0xFF)) {
420 Status =
gBS->ConnectController (
426 if (!EFI_ERROR (Status)) {
427 AtLeastOneConnected = TRUE;
435 if (HandleArray != NULL) {
436 FreePool (HandleArray);
439 if (AtLeastOneConnected) {
444 return EFI_NOT_FOUND;