|
@@ -1021,29 +1021,6 @@ out:
|
|
|
return EFI_EXIT(r);
|
|
|
}
|
|
|
|
|
|
-/*
|
|
|
- * Reinstall protocol interface.
|
|
|
- *
|
|
|
- * This function implements the ReinstallProtocolInterface service.
|
|
|
- * See the Unified Extensible Firmware Interface (UEFI) specification
|
|
|
- * for details.
|
|
|
- *
|
|
|
- * @handle handle on which the protocol shall be
|
|
|
- * reinstalled
|
|
|
- * @protocol GUID of the protocol to be installed
|
|
|
- * @old_interface interface to be removed
|
|
|
- * @new_interface interface to be installed
|
|
|
- * @return status code
|
|
|
- */
|
|
|
-static efi_status_t EFIAPI efi_reinstall_protocol_interface(
|
|
|
- efi_handle_t handle, const efi_guid_t *protocol,
|
|
|
- void *old_interface, void *new_interface)
|
|
|
-{
|
|
|
- EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, old_interface,
|
|
|
- new_interface);
|
|
|
- return EFI_EXIT(EFI_ACCESS_DENIED);
|
|
|
-}
|
|
|
-
|
|
|
/*
|
|
|
* Get all drivers associated to a controller.
|
|
|
* The allocated buffer has to be freed with free().
|
|
@@ -2774,6 +2751,49 @@ out:
|
|
|
return EFI_EXIT(ret);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * Reinstall protocol interface.
|
|
|
+ *
|
|
|
+ * This function implements the ReinstallProtocolInterface service.
|
|
|
+ * See the Unified Extensible Firmware Interface (UEFI) specification
|
|
|
+ * for details.
|
|
|
+ *
|
|
|
+ * The old interface is uninstalled. The new interface is installed.
|
|
|
+ * Drivers are connected.
|
|
|
+ *
|
|
|
+ * @handle handle on which the protocol shall be
|
|
|
+ * reinstalled
|
|
|
+ * @protocol GUID of the protocol to be installed
|
|
|
+ * @old_interface interface to be removed
|
|
|
+ * @new_interface interface to be installed
|
|
|
+ * @return status code
|
|
|
+ */
|
|
|
+static efi_status_t EFIAPI efi_reinstall_protocol_interface(
|
|
|
+ efi_handle_t handle, const efi_guid_t *protocol,
|
|
|
+ void *old_interface, void *new_interface)
|
|
|
+{
|
|
|
+ efi_status_t ret;
|
|
|
+
|
|
|
+ EFI_ENTRY("%p, %pUl, %p, %p", handle, protocol, old_interface,
|
|
|
+ new_interface);
|
|
|
+ ret = EFI_CALL(efi_uninstall_protocol_interface(handle, protocol,
|
|
|
+ old_interface));
|
|
|
+ if (ret != EFI_SUCCESS)
|
|
|
+ goto out;
|
|
|
+ ret = EFI_CALL(efi_install_protocol_interface(&handle, protocol,
|
|
|
+ EFI_NATIVE_INTERFACE,
|
|
|
+ new_interface));
|
|
|
+ if (ret != EFI_SUCCESS)
|
|
|
+ goto out;
|
|
|
+ /*
|
|
|
+ * The returned status code has to be ignored.
|
|
|
+ * Do not create an error if no suitable driver for the handle exists.
|
|
|
+ */
|
|
|
+ EFI_CALL(efi_connect_controller(handle, NULL, NULL, true));
|
|
|
+out:
|
|
|
+ return EFI_EXIT(ret);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Get all child controllers associated to a driver.
|
|
|
* The allocated buffer has to be freed with free().
|