mirror of
https://github.com/u-boot/u-boot.git
synced 2025-04-19 19:34:35 +00:00
efi_loader: reconnect drivers on failure
efi_disconnect_controller() doesn't reconnect drivers in case of failure. Reconnect the disconnected drivers properly Signed-off-by: Ilias Apalodimas <ilias.apalodimas@linaro.org> Reviewed-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
This commit is contained in:
parent
7aa022c797
commit
239d59a65e
1 changed files with 26 additions and 5 deletions
|
@ -97,6 +97,12 @@ static efi_status_t EFIAPI efi_disconnect_controller(
|
||||||
efi_handle_t driver_image_handle,
|
efi_handle_t driver_image_handle,
|
||||||
efi_handle_t child_handle);
|
efi_handle_t child_handle);
|
||||||
|
|
||||||
|
static
|
||||||
|
efi_status_t EFIAPI efi_connect_controller(efi_handle_t controller_handle,
|
||||||
|
efi_handle_t *driver_image_handle,
|
||||||
|
struct efi_device_path *remain_device_path,
|
||||||
|
bool recursive);
|
||||||
|
|
||||||
/* Called on every callback entry */
|
/* Called on every callback entry */
|
||||||
int __efi_entry_check(void)
|
int __efi_entry_check(void)
|
||||||
{
|
{
|
||||||
|
@ -1298,7 +1304,7 @@ static efi_status_t efi_disconnect_all_drivers
|
||||||
const efi_guid_t *protocol,
|
const efi_guid_t *protocol,
|
||||||
efi_handle_t child_handle)
|
efi_handle_t child_handle)
|
||||||
{
|
{
|
||||||
efi_uintn_t number_of_drivers;
|
efi_uintn_t number_of_drivers, tmp;
|
||||||
efi_handle_t *driver_handle_buffer;
|
efi_handle_t *driver_handle_buffer;
|
||||||
efi_status_t r, ret;
|
efi_status_t r, ret;
|
||||||
|
|
||||||
|
@ -1308,15 +1314,30 @@ static efi_status_t efi_disconnect_all_drivers
|
||||||
return ret;
|
return ret;
|
||||||
if (!number_of_drivers)
|
if (!number_of_drivers)
|
||||||
return EFI_SUCCESS;
|
return EFI_SUCCESS;
|
||||||
ret = EFI_NOT_FOUND;
|
|
||||||
|
tmp = number_of_drivers;
|
||||||
while (number_of_drivers) {
|
while (number_of_drivers) {
|
||||||
r = EFI_CALL(efi_disconnect_controller(
|
ret = EFI_CALL(efi_disconnect_controller(
|
||||||
handle,
|
handle,
|
||||||
driver_handle_buffer[--number_of_drivers],
|
driver_handle_buffer[--number_of_drivers],
|
||||||
child_handle));
|
child_handle));
|
||||||
if (r == EFI_SUCCESS)
|
if (ret != EFI_SUCCESS)
|
||||||
ret = r;
|
goto reconnect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(driver_handle_buffer);
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
reconnect:
|
||||||
|
/* Reconnect all disconnected drivers */
|
||||||
|
for (; number_of_drivers < tmp; number_of_drivers++) {
|
||||||
|
r = EFI_CALL(efi_connect_controller(handle,
|
||||||
|
&driver_handle_buffer[number_of_drivers],
|
||||||
|
NULL, true));
|
||||||
|
if (r != EFI_SUCCESS)
|
||||||
|
EFI_PRINT("Failed to reconnect controller\n");
|
||||||
|
}
|
||||||
|
|
||||||
free(driver_handle_buffer);
|
free(driver_handle_buffer);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue