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:
Richard Hughes 2017-01-07 21:26:34 +00:00
parent 57d8bf6590
commit 46487c944a
6 changed files with 76 additions and 18 deletions

View File

@ -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

View File

@ -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);

View File

@ -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

View File

@ -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);

View File

@ -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,

View File

@ -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)
{