diff options
author | Aleksander Morgado <aleksandermj@chromium.org> | 2024-02-06 11:06:03 +0000 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2024-02-08 14:31:19 +0000 |
commit | b61adb162621121f505acc834229ef5b5547047a (patch) | |
tree | 731d264155ba9cd1ddf4a61d985bc991233581ce /src/mm-iface-modem.c | |
parent | f6795754bc54eae8e15679d406e77075d2dee96e (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.c | 44 |
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 |