diff options
Diffstat (limited to 'IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c')
-rw-r--r-- | IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c b/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c index fe96e2c098..0e456dd516 100644 --- a/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c +++ b/IntelFrameworkModulePkg/Library/GenericBdsLib/BdsConnect.c @@ -1,7 +1,7 @@ /** @file
BDS Lib functions which relate with connect the device
-Copyright (c) 2004 - 2008, Intel Corporation. All rights reserved.<BR>
+Copyright (c) 2004 - 2012, Intel Corporation. All rights reserved.<BR>
This program and the accompanying materials
are licensed and made available under the terms and conditions of the BSD License
which accompanies this distribution. The full text of the license may be found at
@@ -69,11 +69,13 @@ BdsLibGenericConnectAll ( /**
This function will create all handles associate with every device
path node. If the handle associate with one device path node can not
- be created success, then still give one chance to do the dispatch,
- which load the missing drivers if possible.
+ be created successfully, Dispatch service which load the missing drivers
+ is called according to input parameter, since in some cases no driver
+ dependency is assumed exist, so may need not to call this service.
@param DevicePathToConnect The device path which will be connected, it can be
a multi-instance device path
+ @param NeedDispatch Whether requires dispatch service during connection
@retval EFI_SUCCESS All handles associate with every device path node
have been created
@@ -83,9 +85,9 @@ BdsLibGenericConnectAll ( **/
EFI_STATUS
-EFIAPI
-BdsLibConnectDevicePath (
- IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect
+ConnectDevicePathInternal (
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect,
+ IN BOOLEAN NeedDispatch
)
{
EFI_STATUS Status;
@@ -150,7 +152,15 @@ BdsLibConnectDevicePath ( // Status == EFI_SUCCESS means a driver was dispatched
// Status == EFI_NOT_FOUND means no new drivers were dispatched
//
- Status = gDS->Dispatch ();
+ if (NeedDispatch) {
+ Status = gDS->Dispatch ();
+ } else {
+ //
+ // Always return EFI_NOT_FOUND here
+ // to prevent dead loop when control handle is found but connection failded case
+ //
+ Status = EFI_NOT_FOUND;
+ }
}
if (!EFI_ERROR (Status)) {
@@ -191,6 +201,31 @@ BdsLibConnectDevicePath ( /**
+ This function will create all handles associate with every device
+ path node. If the handle associate with one device path node can not
+ be created successfully, then still give chance to do the dispatch,
+ which load the missing drivers if possible.
+
+ @param DevicePathToConnect The device path which will be connected, it can be
+ a multi-instance device path
+
+ @retval EFI_SUCCESS All handles associate with every device path node
+ have been created
+ @retval EFI_OUT_OF_RESOURCES There is no resource to create new handles
+ @retval EFI_NOT_FOUND Create the handle associate with one device path
+ node failed
+
+**/
+EFI_STATUS
+EFIAPI
+BdsLibConnectDevicePath (
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePathToConnect
+ )
+{
+ return ConnectDevicePathInternal(DevicePathToConnect, TRUE);
+}
+
+/**
This function will connect all current system handles recursively.
gBS->ConnectController() service is invoked for each handle exist in system handler buffer.
|