-/*++\r
+/** @file\r
+ Support functions to connect/disconnect UEFI Driver model Protocol\r
\r
-Copyright (c) 2006, Intel Corporation \r
-All rights reserved. This program and the accompanying materials \r
-are licensed and made available under the terms and conditions of the BSD License \r
-which accompanies this distribution. The full text of the license may be found at \r
-http://opensource.org/licenses/bsd-license.php \r
- \r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, \r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. \r
+Copyright (c) 2006 - 2008, Intel Corporation. <BR>\r
+All rights reserved. This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution. The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
\r
-Module Name:\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
\r
- DriverSupport.c\r
- \r
-Abstract:\r
-\r
- EFI Driver Support Protocol\r
-\r
-Revision History\r
-\r
---*/\r
+**/\r
\r
#include <DxeMain.h>\r
\r
-BOOLEAN mRepairLoadedImage = FALSE;\r
-\r
-//\r
-// Driver Support Function Prototypes\r
-//\r
-EFI_STATUS\r
-GetHandleFromDriverBinding (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *DriverBindingNeed,\r
- OUT EFI_HANDLE *Handle \r
- );\r
-\r
-EFI_STATUS \r
-CoreConnectSingleController (\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_HANDLE *DriverImageHandle OPTIONAL,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
- );\r
\r
//\r
// Driver Support Functions\r
//\r
-EFI_STATUS \r
+/**\r
+ Connects one or more drivers to a controller.\r
+\r
+ @param ControllerHandle Handle of the controller to be\r
+ connected.\r
+ @param DriverImageHandle DriverImageHandle A pointer to an\r
+ ordered list of driver image\r
+ handles.\r
+ @param RemainingDevicePath RemainingDevicePath A pointer to\r
+ the device path that specifies a\r
+ child of the controller specified\r
+ by ControllerHandle.\r
+ @param Recursive Whether the function would be\r
+ called recursively or not.\r
+\r
+ @return Status code.\r
+\r
+**/\r
+EFI_STATUS\r
EFIAPI\r
CoreConnectController (\r
IN EFI_HANDLE ControllerHandle,\r
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL,\r
IN BOOLEAN Recursive\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Connects one or more drivers to a controller.\r
-\r
-Arguments:\r
-\r
- ControllerHandle - Handle of the controller to be connected.\r
-\r
- DriverImageHandle - DriverImageHandle A pointer to an ordered list of driver image handles.\r
-\r
- RemainingDevicePath - RemainingDevicePath A pointer to the device path that specifies a child of the\r
- controller specified by ControllerHandle.\r
- \r
- Recursive - Whether the function would be called recursively or not.\r
-\r
-Returns:\r
-\r
- Status code.\r
-\r
---*/\r
{\r
EFI_STATUS Status;\r
EFI_STATUS ReturnStatus;\r
EFI_HANDLE *ChildHandleBuffer;\r
UINTN ChildHandleCount;\r
UINTN Index;\r
- EFI_HANDLE *LoadedImageHandleBuffer;\r
- UINTN LoadedImageHandleCount;\r
- LOADED_IMAGE_PRIVATE_DATA *Image;\r
- EFI_HANDLE DeviceHandle;\r
- EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
- \r
+\r
//\r
// Make sure ControllerHandle is valid\r
//\r
//\r
do {\r
ReturnStatus = CoreConnectSingleController (\r
- ControllerHandle,\r
- DriverImageHandle,\r
- AlignedRemainingDevicePath\r
- );\r
+ ControllerHandle,\r
+ DriverImageHandle,\r
+ AlignedRemainingDevicePath\r
+ );\r
} while (ReturnStatus == EFI_NOT_READY);\r
\r
//\r
//\r
for (Link = Handle->Protocols.ForwardLink, ChildHandleCount = 0; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
- for (ProtLink = Prot->OpenList.ForwardLink; \r
- ProtLink != &Prot->OpenList; \r
+ for (ProtLink = Prot->OpenList.ForwardLink;\r
+ ProtLink != &Prot->OpenList;\r
ProtLink = ProtLink->ForwardLink) {\r
OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
//\r
for (Link = Handle->Protocols.ForwardLink, ChildHandleCount = 0; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
- for (ProtLink = Prot->OpenList.ForwardLink; \r
- ProtLink != &Prot->OpenList; \r
+ for (ProtLink = Prot->OpenList.ForwardLink;\r
+ ProtLink != &Prot->OpenList;\r
ProtLink = ProtLink->ForwardLink) {\r
OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
NULL,\r
NULL,\r
TRUE\r
- ); \r
+ );\r
}\r
\r
//\r
CoreFreePool (ChildHandleBuffer);\r
}\r
\r
- //\r
- // If a Stop() function has been called one or more time successfully, then attempt to \r
- // repair the stale DeviceHandle fields of the Loaded Image Protocols\r
- //\r
- if (mRepairLoadedImage) {\r
- //\r
- // Assume that all Loaded Image Protocols can be repaired\r
- //\r
- mRepairLoadedImage = FALSE;\r
-\r
- //\r
- // Get list of all Loaded Image Protocol Instances\r
- //\r
- Status = CoreLocateHandleBuffer (\r
- ByProtocol, \r
- &gEfiLoadedImageProtocolGuid, \r
- NULL,\r
- &LoadedImageHandleCount, \r
- &LoadedImageHandleBuffer\r
- );\r
- if (!EFI_ERROR (Status) && LoadedImageHandleCount != 0) {\r
- for (Index = 0; Index < LoadedImageHandleCount; Index++) {\r
- //\r
- // Retrieve the Loaded Image Protocol\r
- //\r
- Image = CoreLoadedImageInfo (LoadedImageHandleBuffer[Index]);\r
- if (Image != NULL) {\r
- //\r
- // Check to see if the DeviceHandle field is a valid handle\r
- //\r
- Status = CoreValidateHandle (Image->Info.DeviceHandle);\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // The DeviceHandle field is not valid.\r
- // Attempt to locate a device handle with a device path that matches the one\r
- // that was used to originally load the image\r
- //\r
- DevicePath = Image->DeviceHandleDevicePath;\r
- if (DevicePath != NULL) {\r
- Status = CoreLocateDevicePath (&gEfiDevicePathProtocolGuid, &DevicePath, &DeviceHandle);\r
- if (!EFI_ERROR (Status) && (DeviceHandle != NULL_HANDLE) && IsDevicePathEnd(DevicePath)) {\r
- //\r
- // A device handle with a matching device path was found, so update the Loaded Image Protocol\r
- // with the device handle discovered\r
- //\r
- Image->Info.DeviceHandle = DeviceHandle;\r
- } else {\r
- //\r
- // There is still at least one Loaded Image Protocol that requires repair\r
- //\r
- mRepairLoadedImage = TRUE;\r
- }\r
- }\r
- }\r
- }\r
- }\r
- CoreFreePool (LoadedImageHandleBuffer);\r
- }\r
- }\r
-\r
return ReturnStatus;\r
}\r
\r
+\r
+/**\r
+ Add Driver Binding Protocols from Context Driver Image Handles to sorted\r
+ Driver Binding Protocol list.\r
+\r
+ @param DriverBindingHandle Handle of the driver binding\r
+ protocol.\r
+ @param NumberOfSortedDriverBindingProtocols Number Of sorted driver binding\r
+ protocols\r
+ @param SortedDriverBindingProtocols The sorted protocol list.\r
+ @param DriverBindingHandleCount Driver Binding Handle Count.\r
+ @param DriverBindingHandleBuffer The buffer of driver binding\r
+ protocol to be modified.\r
+ @param IsImageHandle Indicate whether\r
+ DriverBindingHandle is an image\r
+ handle\r
+\r
+ @return None.\r
+\r
+**/\r
VOID\r
AddSortedDriverBindingProtocol (\r
IN EFI_HANDLE DriverBindingHandle,\r
- IN OUT UINTN *NumberOfSortedDriverBindingProtocols, \r
+ IN OUT UINTN *NumberOfSortedDriverBindingProtocols,\r
IN OUT EFI_DRIVER_BINDING_PROTOCOL **SortedDriverBindingProtocols,\r
IN UINTN DriverBindingHandleCount,\r
- IN OUT EFI_HANDLE *DriverBindingHandleBuffer\r
+ IN OUT EFI_HANDLE *DriverBindingHandleBuffer,\r
+ IN BOOLEAN IsImageHandle\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Add Driver Binding Protocols from Context Driver Image Handles to sorted \r
- Driver Binding Protocol list.\r
-\r
-Arguments:\r
-\r
- DriverBindingHandle - Handle of the driver binding protocol.\r
-\r
- NumberOfSortedDriverBindingProtocols - Number Of sorted driver binding protocols\r
-\r
- SortedDriverBindingProtocols - The sorted protocol list. \r
- \r
- DriverBindingHandleCount - Driver Binding Handle Count.\r
-\r
- DriverBindingHandleBuffer - The buffer of driver binding protocol to be modified.\r
-\r
-Returns:\r
-\r
- None.\r
-\r
---*/\r
{\r
EFI_STATUS Status;\r
EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
return;\r
}\r
\r
+ //\r
+ // If IsImageHandle is TRUE, then DriverBindingHandle is an image handle\r
+ // Find all the DriverBindingHandles associated with that image handle and add them to the sorted list\r
+ //\r
+ if (IsImageHandle) {\r
+ //\r
+ // Loop through all the Driver Binding Handles\r
+ //\r
+ for (Index = 0; Index < DriverBindingHandleCount; Index++) {\r
+ //\r
+ // Retrieve the Driver Binding Protocol associated with each Driver Binding Handle\r
+ //\r
+ Status = CoreHandleProtocol (\r
+ DriverBindingHandleBuffer[Index],\r
+ &gEfiDriverBindingProtocolGuid,\r
+ (VOID **) &DriverBinding\r
+ );\r
+ if (EFI_ERROR (Status) || DriverBinding == NULL) {\r
+ continue;\r
+ }\r
+\r
+ //\r
+ // If the ImageHandle associated with DriverBinding matches DriverBindingHandle,\r
+ // then add the DriverBindingProtocol[Index] to the sorted list\r
+ //\r
+ if (DriverBinding->ImageHandle == DriverBindingHandle) {\r
+ AddSortedDriverBindingProtocol (\r
+ DriverBindingHandleBuffer[Index],\r
+ NumberOfSortedDriverBindingProtocols,\r
+ SortedDriverBindingProtocols,\r
+ DriverBindingHandleCount,\r
+ DriverBindingHandleBuffer,\r
+ FALSE\r
+ );\r
+ }\r
+ }\r
+ return;\r
+ }\r
+\r
//\r
// Retrieve the Driver Binding Protocol from DriverBindingHandle\r
//\r
Status = CoreHandleProtocol(\r
DriverBindingHandle,\r
&gEfiDriverBindingProtocolGuid,\r
- (VOID **)&DriverBinding\r
+ (VOID **) &DriverBinding\r
);\r
//\r
// If DriverBindingHandle does not support the Driver Binding Protocol then return\r
}\r
}\r
}\r
- \r
-EFI_STATUS \r
-CoreConnectSingleController (\r
- IN EFI_HANDLE ControllerHandle,\r
- IN EFI_HANDLE *ContextDriverImageHandles OPTIONAL,\r
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL \r
- )\r
-/*++\r
\r
-Routine Description:\r
\r
+/**\r
Connects a controller to a driver.\r
\r
-Arguments:\r
-\r
- ControllerHandle - Handle of the controller to be connected.\r
- ContextDriverImageHandles - DriverImageHandle A pointer to an ordered list of driver image handles.\r
- RemainingDevicePath - RemainingDevicePath A pointer to the device path that specifies a child \r
- of the controller specified by ControllerHandle.\r
- \r
-Returns:\r
-\r
- EFI_SUCCESS - One or more drivers were connected to ControllerHandle.\r
- EFI_OUT_OF_RESOURCES - No enough system resources to complete the request.\r
- EFI_NOT_FOUND - No drivers were connected to ControllerHandle.\r
-\r
---*/\r
+ @param ControllerHandle Handle of the controller to be\r
+ connected.\r
+ @param ContextDriverImageHandles DriverImageHandle A pointer to an\r
+ ordered list of driver image\r
+ handles.\r
+ @param RemainingDevicePath RemainingDevicePath A pointer to\r
+ the device path that specifies a\r
+ child of the controller\r
+ specified by ControllerHandle.\r
+\r
+ @retval EFI_SUCCESS One or more drivers were\r
+ connected to ControllerHandle.\r
+ @retval EFI_OUT_OF_RESOURCES No enough system resources to\r
+ complete the request.\r
+ @retval EFI_NOT_FOUND No drivers were connected to\r
+ ControllerHandle.\r
+\r
+**/\r
+EFI_STATUS\r
+CoreConnectSingleController (\r
+ IN EFI_HANDLE ControllerHandle,\r
+ IN EFI_HANDLE *ContextDriverImageHandles OPTIONAL,\r
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL\r
+ )\r
{\r
EFI_STATUS Status;\r
UINTN Index;\r
EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *BusSpecificDriverOverride;\r
UINTN DriverBindingHandleCount;\r
EFI_HANDLE *DriverBindingHandleBuffer;\r
+ UINTN NewDriverBindingHandleCount;\r
+ EFI_HANDLE *NewDriverBindingHandleBuffer;\r
EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
UINTN NumberOfSortedDriverBindingProtocols;\r
EFI_DRIVER_BINDING_PROTOCOL **SortedDriverBindingProtocols;\r
UINTN SortIndex;\r
BOOLEAN OneStarted;\r
BOOLEAN DriverFound;\r
- EFI_HANDLE DriverBindingHandle;\r
\r
- //\r
- // DriverBindingHandle is used for performance measurement, initialize it here just in case.\r
- //\r
- DriverBindingHandle = NULL;\r
//\r
// Initialize local variables\r
//\r
// Get list of all Driver Binding Protocol Instances\r
//\r
Status = CoreLocateHandleBuffer (\r
- ByProtocol, \r
- &gEfiDriverBindingProtocolGuid, \r
+ ByProtocol,\r
+ &gEfiDriverBindingProtocolGuid,\r
NULL,\r
- &DriverBindingHandleCount, \r
+ &DriverBindingHandleCount,\r
&DriverBindingHandleBuffer\r
);\r
if (EFI_ERROR (Status) || (DriverBindingHandleCount == 0)) {\r
for (Index = 0; ContextDriverImageHandles[Index] != NULL; Index++) {\r
AddSortedDriverBindingProtocol (\r
ContextDriverImageHandles[Index],\r
- &NumberOfSortedDriverBindingProtocols, \r
+ &NumberOfSortedDriverBindingProtocols,\r
SortedDriverBindingProtocols,\r
DriverBindingHandleCount,\r
- DriverBindingHandleBuffer\r
+ DriverBindingHandleBuffer,\r
+ FALSE\r
);\r
}\r
}\r
// Add the Platform Driver Override Protocol drivers for ControllerHandle next\r
//\r
Status = CoreLocateProtocol (\r
- &gEfiPlatformDriverOverrideProtocolGuid, \r
- NULL, \r
- (VOID **)&PlatformDriverOverride\r
+ &gEfiPlatformDriverOverrideProtocolGuid,\r
+ NULL,\r
+ (VOID **) &PlatformDriverOverride\r
);\r
if (!EFI_ERROR (Status) && (PlatformDriverOverride != NULL)) {\r
DriverImageHandle = NULL;\r
if (!EFI_ERROR (Status)) {\r
AddSortedDriverBindingProtocol (\r
DriverImageHandle,\r
- &NumberOfSortedDriverBindingProtocols, \r
+ &NumberOfSortedDriverBindingProtocols,\r
SortedDriverBindingProtocols,\r
DriverBindingHandleCount,\r
- DriverBindingHandleBuffer\r
+ DriverBindingHandleBuffer,\r
+ TRUE\r
);\r
}\r
} while (!EFI_ERROR (Status));\r
//\r
// Get the Bus Specific Driver Override Protocol instance on the Controller Handle\r
//\r
- Status = CoreHandleProtocol(\r
- ControllerHandle, \r
- &gEfiBusSpecificDriverOverrideProtocolGuid, \r
- (VOID **)&BusSpecificDriverOverride\r
+ Status = CoreHandleProtocol (\r
+ ControllerHandle,\r
+ &gEfiBusSpecificDriverOverrideProtocolGuid,\r
+ (VOID **) &BusSpecificDriverOverride\r
);\r
if (!EFI_ERROR (Status) && (BusSpecificDriverOverride != NULL)) {\r
DriverImageHandle = NULL;\r
if (!EFI_ERROR (Status)) {\r
AddSortedDriverBindingProtocol (\r
DriverImageHandle,\r
- &NumberOfSortedDriverBindingProtocols, \r
+ &NumberOfSortedDriverBindingProtocols,\r
SortedDriverBindingProtocols,\r
DriverBindingHandleCount,\r
- DriverBindingHandleBuffer\r
+ DriverBindingHandleBuffer,\r
+ TRUE\r
);\r
}\r
} while (!EFI_ERROR (Status));\r
for (Index = 0; Index < DriverBindingHandleCount; Index++) {\r
AddSortedDriverBindingProtocol (\r
DriverBindingHandleBuffer[Index],\r
- &NumberOfSortedDriverBindingProtocols, \r
+ &NumberOfSortedDriverBindingProtocols,\r
SortedDriverBindingProtocols,\r
DriverBindingHandleCount,\r
- DriverBindingHandleBuffer\r
+ DriverBindingHandleBuffer,\r
+ FALSE\r
);\r
}\r
\r
// If the number of Driver Binding Protocols has increased since this function started, then return\r
// EFI_NOT_READY, so it will be restarted\r
//\r
- if (NumberOfSortedDriverBindingProtocols > DriverBindingHandleCount) {\r
+ Status = CoreLocateHandleBuffer (\r
+ ByProtocol,\r
+ &gEfiDriverBindingProtocolGuid,\r
+ NULL,\r
+ &NewDriverBindingHandleCount,\r
+ &NewDriverBindingHandleBuffer\r
+ );\r
+ CoreFreePool (NewDriverBindingHandleBuffer);\r
+ if (NewDriverBindingHandleCount > DriverBindingHandleCount) {\r
//\r
// Free any buffers that were allocated with AllocatePool()\r
//\r
\r
//\r
// Loop through the sorted Driver Binding Protocol Instances in order, and see if\r
- // any of the Driver Binding Protocols support the controller specified by \r
+ // any of the Driver Binding Protocols support the controller specified by\r
// ControllerHandle.\r
//\r
DriverBinding = NULL;\r
if (SortedDriverBindingProtocols[Index] != NULL) {\r
DriverBinding = SortedDriverBindingProtocols[Index];\r
Status = DriverBinding->Supported(\r
- DriverBinding, \r
+ DriverBinding,\r
ControllerHandle,\r
RemainingDevicePath\r
);\r
// A driver was found that supports ControllerHandle, so attempt to start the driver\r
// on ControllerHandle.\r
//\r
- PERF_CODE_BEGIN ();\r
- GetHandleFromDriverBinding (DriverBinding, &DriverBindingHandle);\r
- PERF_CODE_END ();\r
-\r
- PERF_START (DriverBindingHandle, DRIVERBINDING_START_TOK, NULL, 0);\r
+ PERF_START (DriverBinding->DriverBindingHandle, DRIVERBINDING_START_TOK, NULL, 0);\r
Status = DriverBinding->Start (\r
- DriverBinding, \r
+ DriverBinding,\r
ControllerHandle,\r
RemainingDevicePath\r
);\r
- PERF_END (DriverBindingHandle, DRIVERBINDING_START_TOK, NULL, 0);\r
+ PERF_END (DriverBinding->DriverBindingHandle, DRIVERBINDING_START_TOK, NULL, 0);\r
\r
if (!EFI_ERROR (Status)) {\r
//\r
//\r
if (OneStarted) {\r
return EFI_SUCCESS;\r
- } \r
+ }\r
\r
//\r
// If no drivers started and RemainingDevicePath is an End Device Path Node, then return EFI_SUCCESS\r
if (IsDevicePathEnd (RemainingDevicePath)) {\r
return EFI_SUCCESS;\r
}\r
- } \r
+ }\r
\r
//\r
// Otherwise, no drivers were started on ControllerHandle, so return EFI_NOT_FOUND\r
}\r
\r
\r
-EFI_STATUS \r
+\r
+/**\r
+ Disonnects a controller from a driver\r
+\r
+ @param ControllerHandle ControllerHandle The handle of\r
+ the controller from which\r
+ driver(s) are to be\r
+ disconnected.\r
+ @param DriverImageHandle DriverImageHandle The driver to\r
+ disconnect from ControllerHandle.\r
+ @param ChildHandle ChildHandle The handle of the\r
+ child to destroy.\r
+\r
+ @retval EFI_SUCCESS One or more drivers were\r
+ disconnected from the controller.\r
+ @retval EFI_SUCCESS On entry, no drivers are managing\r
+ ControllerHandle.\r
+ @retval EFI_SUCCESS DriverImageHandle is not NULL,\r
+ and on entry DriverImageHandle is\r
+ not managing ControllerHandle.\r
+ @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid\r
+ EFI_HANDLE.\r
+ @retval EFI_INVALID_PARAMETER DriverImageHandle is not NULL,\r
+ and it is not a valid EFI_HANDLE.\r
+ @retval EFI_INVALID_PARAMETER ChildHandle is not NULL, and it\r
+ is not a valid EFI_HANDLE.\r
+ @retval EFI_OUT_OF_RESOURCES There are not enough resources\r
+ available to disconnect any\r
+ drivers from ControllerHandle.\r
+ @retval EFI_DEVICE_ERROR The controller could not be\r
+ disconnected because of a device\r
+ error.\r
+\r
+**/\r
+EFI_STATUS\r
EFIAPI\r
CoreDisconnectController (\r
IN EFI_HANDLE ControllerHandle,\r
IN EFI_HANDLE DriverImageHandle OPTIONAL,\r
IN EFI_HANDLE ChildHandle OPTIONAL\r
)\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Disonnects a controller from a driver\r
-\r
-Arguments:\r
-\r
- ControllerHandle - ControllerHandle The handle of the controller from which driver(s) \r
- are to be disconnected.\r
- DriverImageHandle - DriverImageHandle The driver to disconnect from ControllerHandle.\r
- ChildHandle - ChildHandle The handle of the child to destroy.\r
-\r
-Returns:\r
-\r
- EFI_SUCCESS - One or more drivers were disconnected from the controller.\r
- EFI_SUCCESS - On entry, no drivers are managing ControllerHandle.\r
- EFI_SUCCESS - DriverImageHandle is not NULL, and on entry DriverImageHandle is not managing ControllerHandle.\r
- EFI_INVALID_PARAMETER - ControllerHandle is not a valid EFI_HANDLE.\r
- EFI_INVALID_PARAMETER - DriverImageHandle is not NULL, and it is not a valid EFI_HANDLE.\r
- EFI_INVALID_PARAMETER - ChildHandle is not NULL, and it is not a valid EFI_HANDLE.\r
- EFI_OUT_OF_RESOURCES - There are not enough resources available to disconnect any drivers from ControllerHandle.\r
- EFI_DEVICE_ERROR - The controller could not be disconnected because of a device error.\r
-\r
---*/\r
{\r
EFI_STATUS Status;\r
IHANDLE *Handle;\r
OPEN_PROTOCOL_DATA *OpenData;\r
PROTOCOL_INTERFACE *Prot;\r
EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
- EFI_HANDLE *LoadedImageHandleBuffer;\r
- UINTN LoadedImageHandleCount;\r
- LOADED_IMAGE_PRIVATE_DATA *Image;\r
\r
//\r
// Make sure ControllerHandle is valid\r
// Get list of drivers that are currently managing ControllerHandle\r
//\r
DriverImageHandleBuffer = NULL;\r
- DriverImageHandleCount = 1; \r
- \r
+ DriverImageHandleCount = 1;\r
+\r
if (DriverImageHandle == NULL) {\r
//\r
// Look at each protocol interface for a match\r
CoreAcquireProtocolLock ();\r
for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
- for (ProtLink = Prot->OpenList.ForwardLink; \r
- ProtLink != &Prot->OpenList; \r
+ for (ProtLink = Prot->OpenList.ForwardLink;\r
+ ProtLink != &Prot->OpenList;\r
ProtLink = ProtLink->ForwardLink) {\r
OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
}\r
}\r
CoreReleaseProtocolLock ();\r
- \r
+\r
//\r
// If there are no drivers managing this controller, then return EFI_SUCCESS\r
//\r
CoreAcquireProtocolLock ();\r
for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
- for (ProtLink = Prot->OpenList.ForwardLink; \r
- ProtLink != &Prot->OpenList; \r
+ for (ProtLink = Prot->OpenList.ForwardLink;\r
+ ProtLink != &Prot->OpenList;\r
ProtLink = ProtLink->ForwardLink) {\r
OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
// Get the Driver Binding Protocol of the driver that is managing this controller\r
//\r
Status = CoreHandleProtocol (\r
- DriverImageHandle, \r
- &gEfiDriverBindingProtocolGuid, \r
+ DriverImageHandle,\r
+ &gEfiDriverBindingProtocolGuid,\r
(VOID **)&DriverBinding\r
);\r
if (EFI_ERROR (Status)) {\r
CoreAcquireProtocolLock ();\r
for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
- for (ProtLink = Prot->OpenList.ForwardLink; \r
- ProtLink != &Prot->OpenList; \r
+ for (ProtLink = Prot->OpenList.ForwardLink;\r
+ ProtLink != &Prot->OpenList;\r
ProtLink = ProtLink->ForwardLink) {\r
OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
if (OpenData->AgentHandle == DriverImageHandle) {\r
if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER) != 0) {\r
ChildBufferCount++;\r
- } \r
+ }\r
if ((OpenData->Attributes & EFI_OPEN_PROTOCOL_BY_DRIVER) != 0) {\r
DriverImageHandleValid = TRUE;\r
}\r
CoreAcquireProtocolLock ();\r
for (Link = Handle->Protocols.ForwardLink; Link != &Handle->Protocols; Link = Link->ForwardLink) {\r
Prot = CR(Link, PROTOCOL_INTERFACE, Link, PROTOCOL_INTERFACE_SIGNATURE);\r
- for (ProtLink = Prot->OpenList.ForwardLink; \r
- ProtLink != &Prot->OpenList; \r
+ for (ProtLink = Prot->OpenList.ForwardLink;\r
+ ProtLink != &Prot->OpenList;\r
ProtLink = ProtLink->ForwardLink) {\r
OpenData = CR (ProtLink, OPEN_PROTOCOL_DATA, Link, OPEN_PROTOCOL_DATA_SIGNATURE);\r
if ((OpenData->AgentHandle == DriverImageHandle) &&\r
}\r
\r
if (StopCount > 0) {\r
- //\r
- // If the Loaded Image Protocols do not already need to be repaired, then\r
- // check the status of the DeviceHandle field of all Loaded Image Protocols\r
- // to determine if any of them now need repair because a sucessful Stop()\r
- // may have destroyed the DeviceHandle value in the Loaded Image Protocol\r
- //\r
- if (!mRepairLoadedImage) {\r
- //\r
- // Get list of all Loaded Image Protocol Instances\r
- //\r
- Status = CoreLocateHandleBuffer (\r
- ByProtocol, \r
- &gEfiLoadedImageProtocolGuid, \r
- NULL,\r
- &LoadedImageHandleCount, \r
- &LoadedImageHandleBuffer\r
- );\r
- if (!EFI_ERROR (Status) && LoadedImageHandleCount != 0) {\r
- for (Index = 0; Index < LoadedImageHandleCount; Index++) {\r
- //\r
- // Retrieve the Loaded Image Protocol\r
- //\r
- Image = CoreLoadedImageInfo (LoadedImageHandleBuffer[Index]);\r
- if (Image != NULL) {\r
- //\r
- // Check to see if the DeviceHandle field is a valid handle\r
- //\r
- Status = CoreValidateHandle (Image->Info.DeviceHandle);\r
- if (EFI_ERROR (Status)) {\r
- //\r
- // The DeviceHandle field is not longer a valid handle. This means\r
- // that future calls to ConnectController() need to attemp to repair\r
- // the Loaded Image Protocols with invalid DeviceHandle fields. Set \r
- // the flag used by ConnectController().\r
- //\r
- mRepairLoadedImage = TRUE;\r
- break;\r
- }\r
- }\r
- }\r
- CoreFreePool (LoadedImageHandleBuffer);\r
- }\r
- }\r
Status = EFI_SUCCESS;\r
} else {\r
Status = EFI_NOT_FOUND;\r
}\r
- \r
-Done: \r
+\r
+Done:\r
\r
if (DriverImageHandleBuffer != NULL) {\r
CoreFreePool (DriverImageHandleBuffer);\r
\r
return Status;\r
}\r
-\r
-EFI_STATUS\r
-GetHandleFromDriverBinding (\r
- IN EFI_DRIVER_BINDING_PROTOCOL *DriverBindingNeed,\r
- OUT EFI_HANDLE *Handle \r
- )\r
-/*++\r
-\r
-Routine Description:\r
-\r
- Locate the driver binding handle which a specified driver binding protocol installed on.\r
-\r
-Arguments:\r
-\r
- DriverBindingNeed - The specified driver binding protocol.\r
- \r
- Handle - The driver binding handle which the protocol installed on.\r
- \r
-\r
-Returns:\r
-\r
- EFI_NOT_FOUND - Could not find the handle.\r
- \r
- EFI_SUCCESS - Successfully find the associated driver binding handle.\r
- \r
---*/ \r
- {\r
- EFI_STATUS Status ;\r
- EFI_DRIVER_BINDING_PROTOCOL *DriverBinding;\r
- UINTN DriverBindingHandleCount;\r
- EFI_HANDLE *DriverBindingHandleBuffer;\r
- UINTN Index;\r
- \r
- DriverBindingHandleCount = 0;\r
- DriverBindingHandleBuffer = NULL;\r
- *Handle = NULL_HANDLE;\r
- Status = CoreLocateHandleBuffer (\r
- ByProtocol, \r
- &gEfiDriverBindingProtocolGuid, \r
- NULL,\r
- &DriverBindingHandleCount, \r
- &DriverBindingHandleBuffer\r
- );\r
- if (EFI_ERROR (Status) || DriverBindingHandleCount == 0) {\r
- return EFI_NOT_FOUND;\r
- }\r
- \r
- for (Index = 0 ; Index < DriverBindingHandleCount; Index++ ) {\r
- Status = CoreOpenProtocol(\r
- DriverBindingHandleBuffer[Index],\r
- &gEfiDriverBindingProtocolGuid,\r
- (VOID **)&DriverBinding,\r
- gDxeCoreImageHandle,\r
- NULL,\r
- EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
- );\r
- \r
- if (!EFI_ERROR (Status) && DriverBinding != NULL) {\r
- \r
- if ( DriverBinding == DriverBindingNeed ) {\r
- *Handle = DriverBindingHandleBuffer[Index];\r
- CoreFreePool (DriverBindingHandleBuffer); \r
- return EFI_SUCCESS ;\r
- }\r
- }\r
- }\r
- \r
- CoreFreePool (DriverBindingHandleBuffer);\r
- return EFI_NOT_FOUND ;\r
-}\r
-\r