base-manager: allow using the low power modem setting with quick suspend/resume
Kind of defeats the purpose of the quick suspend/resume, but I can see how this could be useful. E.g. in ChromeOS the modems are put in low power mode during suspend (triggered by the connection manager) and the quick suspend/resume is also enabled by default for a quicker resume process that doesn't involve full modem reprobe.
This commit is contained in:
committed by
Aleksander Morgado
parent
bbd11cda4b
commit
c592cde3f0
+13
-3
@@ -63,10 +63,10 @@ sleeping_cb (MMSleepMonitor *sleep_monitor)
|
||||
{
|
||||
if (mm_context_get_test_low_power_suspend_resume ()) {
|
||||
mm_dbg ("removing devices and setting them in low power mode... (sleeping)");
|
||||
mm_base_manager_shutdown (manager, TRUE, TRUE);
|
||||
mm_base_manager_shutdown (manager, TRUE, TRUE, TRUE);
|
||||
} else {
|
||||
mm_dbg ("removing devices... (sleeping)");
|
||||
mm_base_manager_shutdown (manager, FALSE, FALSE);
|
||||
mm_base_manager_shutdown (manager, FALSE, FALSE, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -77,6 +77,15 @@ resuming_cb (MMSleepMonitor *sleep_monitor)
|
||||
mm_base_manager_start (manager, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
sleeping_quick_cb (MMSleepMonitor *sleep_monitor)
|
||||
{
|
||||
if (mm_context_get_test_low_power_suspend_resume ()) {
|
||||
mm_dbg ("setting modem in low power mode... (sleeping)");
|
||||
mm_base_manager_shutdown (manager, TRUE, TRUE, FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
resuming_quick_cb (MMSleepMonitor *sleep_monitor)
|
||||
{
|
||||
@@ -211,6 +220,7 @@ main (int argc, char *argv[])
|
||||
else if (mm_context_get_test_quick_suspend_resume ()) {
|
||||
mm_dbg ("Quick suspend/resume hooks enabled");
|
||||
sleep_monitor = mm_sleep_monitor_get ();
|
||||
g_signal_connect (sleep_monitor, MM_SLEEP_MONITOR_SLEEPING, G_CALLBACK (sleeping_quick_cb), NULL);
|
||||
g_signal_connect (sleep_monitor, MM_SLEEP_MONITOR_RESUMING, G_CALLBACK (resuming_quick_cb), NULL);
|
||||
} else {
|
||||
mm_dbg ("Full suspend/resume hooks enabled");
|
||||
@@ -233,7 +243,7 @@ main (int argc, char *argv[])
|
||||
if (manager) {
|
||||
GTimer *timer;
|
||||
|
||||
mm_base_manager_shutdown (manager, TRUE, FALSE);
|
||||
mm_base_manager_shutdown (manager, TRUE, FALSE, TRUE);
|
||||
|
||||
/* Wait for all modems to be disabled and removed, but don't wait
|
||||
* forever: if disabling the modems takes longer than 20s, just
|
||||
|
||||
+18
-5
@@ -656,6 +656,7 @@ mm_base_manager_start (MMBaseManager *self,
|
||||
typedef struct {
|
||||
MMBaseManager *self;
|
||||
gboolean low_power;
|
||||
gboolean remove;
|
||||
} DisableContext;
|
||||
|
||||
static void
|
||||
@@ -691,7 +692,10 @@ shutdown_low_power_ready (MMIfaceModem *modem,
|
||||
if (!mm_iface_modem_set_power_state_finish (modem, res, &error))
|
||||
mm_obj_info (ctx->self, "changing to low power state failed: %s", error->message);
|
||||
|
||||
remove_device_after_disable (MM_BASE_MODEM (modem), ctx);
|
||||
if (ctx->remove)
|
||||
remove_device_after_disable (MM_BASE_MODEM (modem), ctx);
|
||||
else
|
||||
disable_context_free (ctx);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -714,7 +718,10 @@ shutdown_disable_ready (MMBaseModem *modem,
|
||||
return;
|
||||
}
|
||||
|
||||
remove_device_after_disable (modem, ctx);
|
||||
if (ctx->remove)
|
||||
remove_device_after_disable (modem, ctx);
|
||||
else
|
||||
disable_context_free (ctx);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -732,6 +739,8 @@ foreach_disable (gpointer key,
|
||||
ctx = g_slice_new0 (DisableContext);
|
||||
ctx->self = g_object_ref (foreach_ctx->self);
|
||||
ctx->low_power = foreach_ctx->low_power;
|
||||
ctx->remove = foreach_ctx->remove;
|
||||
|
||||
mm_base_modem_disable (modem, (GAsyncReadyCallback)shutdown_disable_ready, ctx);
|
||||
}
|
||||
|
||||
@@ -752,7 +761,8 @@ foreach_remove (gpointer key,
|
||||
void
|
||||
mm_base_manager_shutdown (MMBaseManager *self,
|
||||
gboolean disable,
|
||||
gboolean low_power)
|
||||
gboolean low_power,
|
||||
gboolean remove)
|
||||
{
|
||||
g_return_if_fail (self != NULL);
|
||||
g_return_if_fail (MM_IS_BASE_MANAGER (self));
|
||||
@@ -764,6 +774,7 @@ mm_base_manager_shutdown (MMBaseManager *self,
|
||||
DisableContext foreach_ctx = {
|
||||
.self = self,
|
||||
.low_power = low_power,
|
||||
.remove = remove,
|
||||
};
|
||||
g_hash_table_foreach (self->priv->devices, (GHFunc)foreach_disable, &foreach_ctx);
|
||||
|
||||
@@ -774,8 +785,10 @@ mm_base_manager_shutdown (MMBaseManager *self,
|
||||
return;
|
||||
}
|
||||
|
||||
/* Otherwise, just remove directly */
|
||||
g_hash_table_foreach_remove (self->priv->devices, (GHRFunc)foreach_remove, self);
|
||||
if (remove) {
|
||||
/* Otherwise, just remove directly */
|
||||
g_hash_table_foreach_remove (self->priv->devices, (GHRFunc)foreach_remove, self);
|
||||
}
|
||||
}
|
||||
|
||||
guint32
|
||||
|
||||
@@ -73,7 +73,8 @@ void mm_base_manager_start (MMBaseManager *manager,
|
||||
|
||||
void mm_base_manager_shutdown (MMBaseManager *manager,
|
||||
gboolean disable,
|
||||
gboolean power_low);
|
||||
gboolean power_low,
|
||||
gboolean remove);
|
||||
|
||||
#if defined WITH_SUSPEND_RESUME
|
||||
void mm_base_manager_sync (MMBaseManager *manager);
|
||||
|
||||
Reference in New Issue
Block a user