aboutsummaryrefslogtreecommitdiff
path: root/src/mm-iface-modem.c
diff options
context:
space:
mode:
authorAleksander Morgado <aleksandermj@chromium.org>2024-02-06 11:06:03 +0000
committerAleksander Morgado <aleksander@aleksander.es>2024-02-08 14:31:19 +0000
commitb61adb162621121f505acc834229ef5b5547047a (patch)
tree731d264155ba9cd1ddf4a61d985bc991233581ce /src/mm-iface-modem.c
parentf6795754bc54eae8e15679d406e77075d2dee96e (diff)
iface-modem: also run disable on failed low power mode update
If the user requested to set the modem in low power mode while enabled, the user is also expecting the device to be implicitly disabled. If for any reason setting the modem to low power mode fails (e.g. it could be not supported by the device), we should still try to run the modem disabling sequence, as that is the expectation.
Diffstat (limited to 'src/mm-iface-modem.c')
-rw-r--r--src/mm-iface-modem.c44
1 files changed, 30 insertions, 14 deletions
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
index 926474e9..c106f9e6 100644
--- a/src/mm-iface-modem.c
+++ b/src/mm-iface-modem.c
@@ -2365,11 +2365,13 @@ typedef struct {
MMIfaceModem *self;
MMModemPowerState power_state;
gboolean disable_after_update;
+ GError *saved_error;
} HandleSetPowerStateContext;
static void
handle_set_power_state_context_free (HandleSetPowerStateContext *ctx)
{
+ g_assert (!ctx->saved_error);
g_object_unref (ctx->skeleton);
g_object_unref (ctx->invocation);
g_object_unref (ctx->self);
@@ -2381,12 +2383,16 @@ disable_after_low_ready (MMBaseModem *self,
GAsyncResult *res,
HandleSetPowerStateContext *ctx)
{
- GError *error = NULL;
+ g_autoptr(GError) error = NULL;
- if (!mm_base_modem_disable_finish (self, res, &error)) {
- mm_obj_warn (self, "failed disabling modem after low-power mode: %s", error->message);
- mm_dbus_method_invocation_take_error (ctx->invocation, error);
- } else {
+ if (!mm_base_modem_disable_finish (self, res, &error))
+ mm_obj_warn (self, "failed disabling modem during low-power mode sequence: %s", error->message);
+
+ if (ctx->saved_error)
+ mm_dbus_method_invocation_take_error (ctx->invocation, g_steal_pointer (&ctx->saved_error));
+ else if (error)
+ mm_dbus_method_invocation_take_error (ctx->invocation, g_steal_pointer (&error));
+ else {
mm_obj_info (self, "disabled modem");
mm_gdbus_modem_complete_set_power_state (ctx->skeleton, ctx->invocation);
}
@@ -2394,6 +2400,16 @@ disable_after_low_ready (MMBaseModem *self,
}
static void
+disable_after_low (MMIfaceModem *self,
+ HandleSetPowerStateContext *ctx)
+{
+ mm_obj_info (self, "automatically disable modem after low-power mode...");
+ mm_base_modem_disable (MM_BASE_MODEM (self),
+ (GAsyncReadyCallback)disable_after_low_ready,
+ ctx);
+}
+
+static void
set_power_state_ready (MMIfaceModem *self,
GAsyncResult *res,
HandleSetPowerStateContext *ctx)
@@ -2402,23 +2418,23 @@ set_power_state_ready (MMIfaceModem *self,
if (!mm_iface_modem_set_power_state_finish (self, res, &error)) {
mm_obj_warn (self, "failed setting power state '%s': %s", mm_modem_power_state_get_string (ctx->power_state), error->message);
+ if (ctx->disable_after_update) {
+ ctx->saved_error = error;
+ disable_after_low (self, ctx);
+ return;
+ }
mm_dbus_method_invocation_take_error (ctx->invocation, error);
handle_set_power_state_context_free (ctx);
return;
}
mm_obj_info (self, "set power state '%s'", mm_modem_power_state_get_string (ctx->power_state));
-
- if (!ctx->disable_after_update) {
- mm_gdbus_modem_complete_set_power_state (ctx->skeleton, ctx->invocation);
- handle_set_power_state_context_free (ctx);
+ if (ctx->disable_after_update) {
+ disable_after_low (self, ctx);
return;
}
-
- mm_obj_info (self, "automatically disable modem after low-power mode...");
- mm_base_modem_disable (MM_BASE_MODEM (self),
- (GAsyncReadyCallback)disable_after_low_ready,
- ctx);
+ mm_gdbus_modem_complete_set_power_state (ctx->skeleton, ctx->invocation);
+ handle_set_power_state_context_free (ctx);
}
static void