mirror of
https://git.proxmox.com/git/fwupd
synced 2025-08-07 01:08:52 +00:00
Add the ability to run a prepare->exec->cleanup on coldplug
The idea here is that plugins can 'wake up' hardware in prepare, and put it back into powersaving mode when doing cleanup.
This commit is contained in:
parent
57d8bf6590
commit
46487c944a
@ -1018,9 +1018,8 @@ fu_plugin_update_offline (FuPlugin *plugin,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
static gboolean
|
||||||
fu_plugin_dell_toggle_flash (FuPlugin *plugin,
|
fu_plugin_dell_toggle_flash (FuPlugin *plugin,
|
||||||
FuDevice *device,
|
|
||||||
GError **error,
|
GError **error,
|
||||||
gboolean enable)
|
gboolean enable)
|
||||||
{
|
{
|
||||||
@ -1063,7 +1062,7 @@ fu_plugin_update_prepare (FuPlugin *plugin,
|
|||||||
FuDevice *device,
|
FuDevice *device,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
return fu_plugin_dell_toggle_flash(plugin, device, error, TRUE);
|
return fu_plugin_dell_toggle_flash (plugin, error, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
@ -1071,23 +1070,19 @@ fu_plugin_update_cleanup (FuPlugin *plugin,
|
|||||||
FuDevice *device,
|
FuDevice *device,
|
||||||
GError **error)
|
GError **error)
|
||||||
{
|
{
|
||||||
return fu_plugin_dell_toggle_flash(plugin, device, error, FALSE);
|
return fu_plugin_dell_toggle_flash (plugin, error, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
fu_plugin_coldplug_prepare (FuPlugin *plugin,
|
fu_plugin_coldplug_prepare (FuPlugin *plugin, GError **error)
|
||||||
FuDevice *device,
|
|
||||||
GError **error)
|
|
||||||
{
|
{
|
||||||
return fu_plugin_dell_toggle_flash(plugin, device, error, TRUE);
|
return fu_plugin_dell_toggle_flash (plugin, error, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
fu_plugin_coldplug_cleanup (FuPlugin *plugin,
|
fu_plugin_coldplug_cleanup (FuPlugin *plugin, GError **error)
|
||||||
FuDevice *device,
|
|
||||||
GError **error)
|
|
||||||
{
|
{
|
||||||
return fu_plugin_dell_toggle_flash(plugin, device, error, FALSE);
|
return fu_plugin_dell_toggle_flash (plugin, error, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -34,12 +34,6 @@ fu_plugin_dell_inject_fake_data (FuPlugin *plugin,
|
|||||||
gboolean
|
gboolean
|
||||||
fu_plugin_dell_toggle_device_mode (const efi_guid_t, int);
|
fu_plugin_dell_toggle_device_mode (const efi_guid_t, int);
|
||||||
|
|
||||||
gboolean
|
|
||||||
fu_plugin_dell_toggle_flash (FuPlugin *,
|
|
||||||
FuDevice *,
|
|
||||||
GError **,
|
|
||||||
gboolean);
|
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
fu_plugin_dell_detect_tpm (FuPlugin *plugin, GError **error);
|
fu_plugin_dell_detect_tpm (FuPlugin *plugin, GError **error);
|
||||||
|
|
||||||
|
@ -2320,6 +2320,15 @@ fu_main_plugins_coldplug (FuMainPrivate *priv)
|
|||||||
{
|
{
|
||||||
g_autoptr(AsProfileTask) ptask = NULL;
|
g_autoptr(AsProfileTask) ptask = NULL;
|
||||||
|
|
||||||
|
/* prepare */
|
||||||
|
for (guint i = 0; i < priv->plugins->len; i++) {
|
||||||
|
g_autoptr(GError) error = NULL;
|
||||||
|
FuPlugin *plugin = g_ptr_array_index (priv->plugins, i);
|
||||||
|
if (!fu_plugin_runner_coldplug_prepare (plugin, &error))
|
||||||
|
g_warning ("failed to prepare coldplug: %s", error->message);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* exec */
|
||||||
ptask = as_profile_start_literal (priv->profile, "FuMain:coldplug");
|
ptask = as_profile_start_literal (priv->profile, "FuMain:coldplug");
|
||||||
g_assert (ptask != NULL);
|
g_assert (ptask != NULL);
|
||||||
for (guint i = 0; i < priv->plugins->len; i++) {
|
for (guint i = 0; i < priv->plugins->len; i++) {
|
||||||
@ -2335,6 +2344,14 @@ fu_main_plugins_coldplug (FuMainPrivate *priv)
|
|||||||
g_warning ("disabling plugin because: %s", error->message);
|
g_warning ("disabling plugin because: %s", error->message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* cleanup */
|
||||||
|
for (guint i = 0; i < priv->plugins->len; i++) {
|
||||||
|
g_autoptr(GError) error = NULL;
|
||||||
|
FuPlugin *plugin = g_ptr_array_index (priv->plugins, i);
|
||||||
|
if (!fu_plugin_runner_coldplug_cleanup (plugin, &error))
|
||||||
|
g_warning ("failed to cleanup coldplug: %s", error->message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@ -38,6 +38,10 @@ gboolean fu_plugin_runner_startup (FuPlugin *plugin,
|
|||||||
GError **error);
|
GError **error);
|
||||||
gboolean fu_plugin_runner_coldplug (FuPlugin *plugin,
|
gboolean fu_plugin_runner_coldplug (FuPlugin *plugin,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
gboolean fu_plugin_runner_coldplug_prepare (FuPlugin *plugin,
|
||||||
|
GError **error);
|
||||||
|
gboolean fu_plugin_runner_coldplug_cleanup (FuPlugin *plugin,
|
||||||
|
GError **error);
|
||||||
gboolean fu_plugin_runner_update_prepare (FuPlugin *plugin,
|
gboolean fu_plugin_runner_update_prepare (FuPlugin *plugin,
|
||||||
FuDevice *device,
|
FuDevice *device,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
@ -33,6 +33,10 @@ gboolean fu_plugin_startup (FuPlugin *plugin,
|
|||||||
GError **error);
|
GError **error);
|
||||||
gboolean fu_plugin_coldplug (FuPlugin *plugin,
|
gboolean fu_plugin_coldplug (FuPlugin *plugin,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
gboolean fu_plugin_coldplug_prepare (FuPlugin *plugin,
|
||||||
|
GError **error);
|
||||||
|
gboolean fu_plugin_coldplug_cleanup (FuPlugin *plugin,
|
||||||
|
GError **error);
|
||||||
gboolean fu_plugin_update_online (FuPlugin *plugin,
|
gboolean fu_plugin_update_online (FuPlugin *plugin,
|
||||||
FuDevice *dev,
|
FuDevice *dev,
|
||||||
GBytes *blob_fw,
|
GBytes *blob_fw,
|
||||||
|
@ -360,6 +360,50 @@ fu_plugin_runner_coldplug (FuPlugin *plugin, GError **error)
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
fu_plugin_runner_coldplug_prepare (FuPlugin *plugin, GError **error)
|
||||||
|
{
|
||||||
|
FuPluginPrivate *priv = GET_PRIVATE (plugin);
|
||||||
|
FuPluginStartupFunc func = NULL;
|
||||||
|
|
||||||
|
/* not enabled */
|
||||||
|
if (!priv->enabled)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* optional */
|
||||||
|
g_module_symbol (priv->module, "fu_plugin_coldplug_prepare", (gpointer *) &func);
|
||||||
|
if (func == NULL)
|
||||||
|
return TRUE;
|
||||||
|
g_debug ("performing coldplug_prepare() on %s", priv->name);
|
||||||
|
if (!func (plugin, error)) {
|
||||||
|
g_prefix_error (error, "failed to prepare for coldplug %s: ", priv->name);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
fu_plugin_runner_coldplug_cleanup (FuPlugin *plugin, GError **error)
|
||||||
|
{
|
||||||
|
FuPluginPrivate *priv = GET_PRIVATE (plugin);
|
||||||
|
FuPluginStartupFunc func = NULL;
|
||||||
|
|
||||||
|
/* not enabled */
|
||||||
|
if (!priv->enabled)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* optional */
|
||||||
|
g_module_symbol (priv->module, "fu_plugin_coldplug_cleanup", (gpointer *) &func);
|
||||||
|
if (func == NULL)
|
||||||
|
return TRUE;
|
||||||
|
g_debug ("performing coldplug_cleanup() on %s", priv->name);
|
||||||
|
if (!func (plugin, error)) {
|
||||||
|
g_prefix_error (error, "failed to cleanup coldplug %s: ", priv->name);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
fu_plugin_runner_update_prepare (FuPlugin *plugin, FuDevice *device, GError **error)
|
fu_plugin_runner_update_prepare (FuPlugin *plugin, FuDevice *device, GError **error)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user