mirror of
https://git.proxmox.com/git/fwupd
synced 2025-08-06 04:57:59 +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;
|
||||
}
|
||||
|
||||
gboolean
|
||||
static gboolean
|
||||
fu_plugin_dell_toggle_flash (FuPlugin *plugin,
|
||||
FuDevice *device,
|
||||
GError **error,
|
||||
gboolean enable)
|
||||
{
|
||||
@ -1063,7 +1062,7 @@ fu_plugin_update_prepare (FuPlugin *plugin,
|
||||
FuDevice *device,
|
||||
GError **error)
|
||||
{
|
||||
return fu_plugin_dell_toggle_flash(plugin, device, error, TRUE);
|
||||
return fu_plugin_dell_toggle_flash (plugin, error, TRUE);
|
||||
}
|
||||
|
||||
gboolean
|
||||
@ -1071,23 +1070,19 @@ fu_plugin_update_cleanup (FuPlugin *plugin,
|
||||
FuDevice *device,
|
||||
GError **error)
|
||||
{
|
||||
return fu_plugin_dell_toggle_flash(plugin, device, error, FALSE);
|
||||
return fu_plugin_dell_toggle_flash (plugin, error, FALSE);
|
||||
}
|
||||
|
||||
gboolean
|
||||
fu_plugin_coldplug_prepare (FuPlugin *plugin,
|
||||
FuDevice *device,
|
||||
GError **error)
|
||||
fu_plugin_coldplug_prepare (FuPlugin *plugin, GError **error)
|
||||
{
|
||||
return fu_plugin_dell_toggle_flash(plugin, device, error, TRUE);
|
||||
return fu_plugin_dell_toggle_flash (plugin, error, TRUE);
|
||||
}
|
||||
|
||||
gboolean
|
||||
fu_plugin_coldplug_cleanup (FuPlugin *plugin,
|
||||
FuDevice *device,
|
||||
GError **error)
|
||||
fu_plugin_coldplug_cleanup (FuPlugin *plugin, GError **error)
|
||||
{
|
||||
return fu_plugin_dell_toggle_flash(plugin, device, error, FALSE);
|
||||
return fu_plugin_dell_toggle_flash (plugin, error, FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -34,12 +34,6 @@ fu_plugin_dell_inject_fake_data (FuPlugin *plugin,
|
||||
gboolean
|
||||
fu_plugin_dell_toggle_device_mode (const efi_guid_t, int);
|
||||
|
||||
gboolean
|
||||
fu_plugin_dell_toggle_flash (FuPlugin *,
|
||||
FuDevice *,
|
||||
GError **,
|
||||
gboolean);
|
||||
|
||||
gboolean
|
||||
fu_plugin_dell_detect_tpm (FuPlugin *plugin, GError **error);
|
||||
|
||||
|
@ -2320,6 +2320,15 @@ fu_main_plugins_coldplug (FuMainPrivate *priv)
|
||||
{
|
||||
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");
|
||||
g_assert (ptask != NULL);
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
/* 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
|
||||
|
@ -38,6 +38,10 @@ gboolean fu_plugin_runner_startup (FuPlugin *plugin,
|
||||
GError **error);
|
||||
gboolean fu_plugin_runner_coldplug (FuPlugin *plugin,
|
||||
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,
|
||||
FuDevice *device,
|
||||
GError **error);
|
||||
|
@ -33,6 +33,10 @@ gboolean fu_plugin_startup (FuPlugin *plugin,
|
||||
GError **error);
|
||||
gboolean fu_plugin_coldplug (FuPlugin *plugin,
|
||||
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,
|
||||
FuDevice *dev,
|
||||
GBytes *blob_fw,
|
||||
|
@ -360,6 +360,50 @@ fu_plugin_runner_coldplug (FuPlugin *plugin, GError **error)
|
||||
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
|
||||
fu_plugin_runner_update_prepare (FuPlugin *plugin, FuDevice *device, GError **error)
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user