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

View File

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

View File

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

View File

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

View File

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

View File

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