huawei: treat CFUN 0 as low power state
The Huawei plugin uses +CFUN=0 to put the modem in low power mode as
+CFUN=4 isn't supported by all Huawei modems. This patch modifies the
plugin to treat CFUN 0 as the 'LOW' power state, which is necessary as
otherwise ModemManager would prevent the modem from transitioning to the
'ON' power state.
(cherry picked from commit 771c83a73a3bd4ddf5045b86bb3d64d71f9d02c1)
BUG=chromium:368597
TEST=Verify that a Huawei dongle that only supports +CFUN=0 (but not ^RFSWITCH=0) can be disabled and re-enabled via shill.
Change-Id: Ibdd79fc7cc0063c78d5269945abe711c72058777
Reviewed-on: https://chromium-review.googlesource.com/198189
Reviewed-by: Ben Chan <benchan@chromium.org>
Commit-Queue: Ben Chan <benchan@chromium.org>
Tested-by: Ben Chan <benchan@chromium.org>
diff --git a/plugins/huawei/mm-broadband-modem-huawei.c b/plugins/huawei/mm-broadband-modem-huawei.c
index b7b98a8..fe8e600 100644
--- a/plugins/huawei/mm-broadband-modem-huawei.c
+++ b/plugins/huawei/mm-broadband-modem-huawei.c
@@ -2845,8 +2845,15 @@
power_state = iface_modem_parent->load_power_state_finish (self, res, &error);
if (error)
g_simple_async_result_take_error (result, error);
- else
+ else {
+ /* As modem_power_down uses +CFUN=0 to put the modem in low state, we treat
+ * CFUN 0 as 'LOW' power state instead of 'OFF'. Otherwise, MMIfaceModem
+ * would prevent the modem from transitioning back to the 'ON' power state. */
+ if (power_state == MM_MODEM_POWER_STATE_OFF)
+ power_state = MM_MODEM_POWER_STATE_LOW;
+
g_simple_async_result_set_op_res_gpointer (result, GUINT_TO_POINTER (power_state), NULL);
+ }
g_simple_async_result_complete (result);
g_object_unref (result);
@@ -3023,6 +3030,8 @@
{
switch (MM_BROADBAND_MODEM_HUAWEI (self)->priv->rfswitch_support) {
case FEATURE_NOT_SUPPORTED:
+ /* +CFUN=0 is supported on all Huawei modems but +CFUN=4 isn't,
+ * thus we use +CFUN=0 to put the modem in low power state. */
mm_base_modem_at_command (MM_BASE_MODEM (self),
"+CFUN=0",
30,