From 837bf2e33a2bfc3fab4eace27e255f178aae03d8 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Mon, 14 Apr 2014 16:24:28 -0500 Subject: [PATCH] wwan: set modem to low power state when disabling When WWAN airplane mode is enabled, set modems to low power state to ensure they are in airplane mode if either (a) the machine does not have an rfkill switch, or (b) the modem is not tied to any rfkill switch (eg, external USB/SDIO/etc). --- src/devices/wwan/nm-modem-broadband.c | 28 ++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/src/devices/wwan/nm-modem-broadband.c b/src/devices/wwan/nm-modem-broadband.c index 5541bc5ea6..5adb733d29 100644 --- a/src/devices/wwan/nm-modem-broadband.c +++ b/src/devices/wwan/nm-modem-broadband.c @@ -532,6 +532,25 @@ get_user_pass (NMModem *modem, /*****************************************************************************/ /* Query/Update enabled state */ +static void +set_power_state_low_ready (MMModem *modem, + GAsyncResult *result, + NMModemBroadband *self) +{ + GError *error = NULL; + + if (!mm_modem_set_power_state_finish (modem, result, &error)) { + /* Log but ignore errors; not all modems support low power state */ + nm_log_dbg (LOGD_MB, "(%s) failed to set modem low power state: %s", + nm_modem_get_uid (NM_MODEM (self)), + error && error->message ? error->message : "(unknown)"); + g_clear_error (&error); + } + + /* Balance refcount */ + g_object_unref (self); +} + static void modem_disable_ready (MMModem *modem_iface, GAsyncResult *res, @@ -539,7 +558,14 @@ modem_disable_ready (MMModem *modem_iface, { GError *error = NULL; - if (!mm_modem_disable_finish (modem_iface, res, &error)) { + if (mm_modem_disable_finish (modem_iface, res, &error)) { + /* Once disabled, move to low-power mode */ + mm_modem_set_power_state (modem_iface, + MM_MODEM_POWER_STATE_LOW, + NULL, + (GAsyncReadyCallback) set_power_state_low_ready, + g_object_ref (self)); + } else { nm_log_warn (LOGD_MB, "(%s) failed to disable modem: %s", nm_modem_get_uid (NM_MODEM (self)), error && error->message ? error->message : "(unknown)");