From 6b995d912bb63cb4b61657d8ae5073ed46a75517 Mon Sep 17 00:00:00 2001 From: Aleksander Morgado Date: Wed, 8 Aug 2018 14:05:54 +0200 Subject: xmm: implement power management operations --- plugins/xmm/mm-broadband-modem-mbim-xmm.c | 6 ++ plugins/xmm/mm-broadband-modem-xmm.c | 11 +++ plugins/xmm/mm-shared-xmm.c | 152 ++++++++++++++++++++++++++++++ plugins/xmm/mm-shared-xmm.h | 31 ++++++ 4 files changed, 200 insertions(+) diff --git a/plugins/xmm/mm-broadband-modem-mbim-xmm.c b/plugins/xmm/mm-broadband-modem-mbim-xmm.c index e4e76d7e1..1f903c69a 100644 --- a/plugins/xmm/mm-broadband-modem-mbim-xmm.c +++ b/plugins/xmm/mm-broadband-modem-mbim-xmm.c @@ -73,6 +73,12 @@ iface_modem_init (MMIfaceModem *iface) iface->load_current_bands_finish = mm_shared_xmm_load_current_bands_finish; iface->set_current_bands = mm_shared_xmm_set_current_bands; iface->set_current_bands_finish = mm_shared_xmm_set_current_bands_finish; + + /* power up/down already managed via MBIM */ + iface->modem_power_off = mm_shared_xmm_power_off; + iface->modem_power_off_finish = mm_shared_xmm_power_off_finish; + iface->reset = mm_shared_xmm_reset; + iface->reset_finish = mm_shared_xmm_reset_finish; } static void diff --git a/plugins/xmm/mm-broadband-modem-xmm.c b/plugins/xmm/mm-broadband-modem-xmm.c index f59577221..cf9bdeb70 100644 --- a/plugins/xmm/mm-broadband-modem-xmm.c +++ b/plugins/xmm/mm-broadband-modem-xmm.c @@ -73,6 +73,17 @@ iface_modem_init (MMIfaceModem *iface) iface->load_current_bands_finish = mm_shared_xmm_load_current_bands_finish; iface->set_current_bands = mm_shared_xmm_set_current_bands; iface->set_current_bands_finish = mm_shared_xmm_set_current_bands_finish; + + iface->load_power_state = mm_shared_xmm_load_power_state; + iface->load_power_state_finish = mm_shared_xmm_load_power_state_finish; + iface->modem_power_up = mm_shared_xmm_power_up; + iface->modem_power_up_finish = mm_shared_xmm_power_up_finish; + iface->modem_power_down = mm_shared_xmm_power_down; + iface->modem_power_down_finish = mm_shared_xmm_power_down_finish; + iface->modem_power_off = mm_shared_xmm_power_off; + iface->modem_power_off_finish = mm_shared_xmm_power_off_finish; + iface->reset = mm_shared_xmm_reset; + iface->reset_finish = mm_shared_xmm_reset_finish; } static void diff --git a/plugins/xmm/mm-shared-xmm.c b/plugins/xmm/mm-shared-xmm.c index f31af6ea5..5e562dffd 100644 --- a/plugins/xmm/mm-shared-xmm.c +++ b/plugins/xmm/mm-shared-xmm.c @@ -535,6 +535,158 @@ out: g_free (command); } +/*****************************************************************************/ +/* Power state loading (Modem interface) */ + +MMModemPowerState +mm_shared_xmm_load_power_state_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error) +{ + guint state; + const gchar *response; + + response = mm_base_modem_at_command_finish (MM_BASE_MODEM (self), res, error); + if (!response) + return MM_MODEM_POWER_STATE_UNKNOWN; + + if (!mm_3gpp_parse_cfun_query_response (response, &state, error)) + return MM_MODEM_POWER_STATE_UNKNOWN; + + switch (state) { + case 1: + return MM_MODEM_POWER_STATE_ON; + case 4: + return MM_MODEM_POWER_STATE_LOW; + default: + break; + } + + g_set_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED, + "Unknown +CFUN state: %u", state); + return MM_MODEM_POWER_STATE_UNKNOWN; +} + +void +mm_shared_xmm_load_power_state (MMIfaceModem *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + mm_base_modem_at_command (MM_BASE_MODEM (self), + "+CFUN?", + 3, + FALSE, + callback, + user_data); +} + +/*****************************************************************************/ +/* Modem power up/down/off (Modem interface) */ + +static gboolean +common_modem_power_operation_finish (MMSharedXmm *self, + GAsyncResult *res, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (res), error); +} + +static void +power_operation_ready (MMBaseModem *self, + GAsyncResult *res, + GTask *task) +{ + GError *error = NULL; + + if (!mm_base_modem_at_command_finish (self, res, &error)) + g_task_return_error (task, error); + else + g_task_return_boolean (task, TRUE); + g_object_unref (task); +} + +static void +common_modem_power_operation (MMSharedXmm *self, + const gchar *command, + GAsyncReadyCallback callback, + gpointer user_data) +{ + GTask *task; + + task = g_task_new (self, NULL, callback, user_data); + + mm_base_modem_at_command (MM_BASE_MODEM (self), + command, + 30, + FALSE, + (GAsyncReadyCallback) power_operation_ready, + task); +} + +gboolean +mm_shared_xmm_reset_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error) +{ + return common_modem_power_operation_finish (MM_SHARED_XMM (self), res, error); +} + +void +mm_shared_xmm_reset (MMIfaceModem *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + common_modem_power_operation (MM_SHARED_XMM (self), "+CFUN=16", callback, user_data); +} + +gboolean +mm_shared_xmm_power_off_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error) +{ + return common_modem_power_operation_finish (MM_SHARED_XMM (self), res, error); +} + +void +mm_shared_xmm_power_off (MMIfaceModem *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + common_modem_power_operation (MM_SHARED_XMM (self), "+CPWROFF", callback, user_data); +} + +gboolean +mm_shared_xmm_power_down_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error) +{ + return common_modem_power_operation_finish (MM_SHARED_XMM (self), res, error); +} + +void +mm_shared_xmm_power_down (MMIfaceModem *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + common_modem_power_operation (MM_SHARED_XMM (self), "+CFUN=4", callback, user_data); +} + +gboolean +mm_shared_xmm_power_up_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error) +{ + return common_modem_power_operation_finish (MM_SHARED_XMM (self), res, error); +} + +void +mm_shared_xmm_power_up (MMIfaceModem *self, + GAsyncReadyCallback callback, + gpointer user_data) +{ + common_modem_power_operation (MM_SHARED_XMM (self), "+CFUN=1", callback, user_data); +} + /*****************************************************************************/ static void diff --git a/plugins/xmm/mm-shared-xmm.h b/plugins/xmm/mm-shared-xmm.h index 144eed270..9fd610d00 100644 --- a/plugins/xmm/mm-shared-xmm.h +++ b/plugins/xmm/mm-shared-xmm.h @@ -82,4 +82,35 @@ gboolean mm_shared_xmm_set_current_bands_finish (MMIfaceModem *self, GAsyncResult *res, GError **error); +void mm_shared_xmm_load_power_state (MMIfaceModem *self, + GAsyncReadyCallback callback, + gpointer user_data); +MMModemPowerState mm_shared_xmm_load_power_state_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error); +void mm_shared_xmm_power_up (MMIfaceModem *self, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean mm_shared_xmm_power_up_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error); +void mm_shared_xmm_power_down (MMIfaceModem *self, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean mm_shared_xmm_power_down_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error); +void mm_shared_xmm_power_off (MMIfaceModem *self, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean mm_shared_xmm_power_off_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error); +void mm_shared_xmm_reset (MMIfaceModem *self, + GAsyncReadyCallback callback, + gpointer user_data); +gboolean mm_shared_xmm_reset_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error); + #endif /* MM_SHARED_XMM_H */ -- cgit v1.2.1