summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2018-08-08 14:05:54 +0200
committerDan Williams <dcbw@redhat.com>2018-08-21 15:42:36 +0000
commit6b995d912bb63cb4b61657d8ae5073ed46a75517 (patch)
tree571cdfb006e8c5f5c72102ce7c22d13c54f27301
parent4792bb0142abcfb4707e549a8d1a9b4c9ab1574e (diff)
downloadModemManager-aleksander/fibocom.tar.gz
xmm: implement power management operationsaleksander/fibocom
-rw-r--r--plugins/xmm/mm-broadband-modem-mbim-xmm.c6
-rw-r--r--plugins/xmm/mm-broadband-modem-xmm.c11
-rw-r--r--plugins/xmm/mm-shared-xmm.c152
-rw-r--r--plugins/xmm/mm-shared-xmm.h31
4 files changed, 200 insertions, 0 deletions
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
@@ -536,6 +536,158 @@ out:
}
/*****************************************************************************/
+/* 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
shared_xmm_init (gpointer g_iface)
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 */