diff options
author | Heiko Thiery <heiko.thiery@gmail.com> | 2022-10-26 10:25:59 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2022-11-28 09:45:09 +0000 |
commit | 41bbe421824b5b4639395747185e2da3f44fa7f3 (patch) | |
tree | e06e9b3cf4d770b9bde8e83975cd6e0a8355b1b7 /plugins | |
parent | c7effc8390e49f42a1971587b2bb6e2ecf39e67f (diff) |
cinterion: add a delay to the ^SWWAN? command
There are modems where the status in response is not available
immediatly. Doing a delayed request will solve the issue.
Suggested-by: Giacinto Cifelli <gciofono@gmail.com>
Suggested-by: Aleksander Morgado <aleksandermj@chromium.org>
Signed-off-by: Heiko Thiery <heiko.thiery@gmail.com>
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/cinterion/mm-broadband-bearer-cinterion.c | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/plugins/cinterion/mm-broadband-bearer-cinterion.c b/plugins/cinterion/mm-broadband-bearer-cinterion.c index e67d461c..b31669f0 100644 --- a/plugins/cinterion/mm-broadband-bearer-cinterion.c +++ b/plugins/cinterion/mm-broadband-bearer-cinterion.c @@ -135,14 +135,34 @@ out: g_object_unref (task); } +static gboolean +swwan_check_status (GTask *task) +{ + MMBroadbandBearerCinterion *bearer; + g_autoptr(MMBaseModem) modem = NULL; + + bearer = g_task_get_source_object (task); + g_object_get (bearer, + MM_BASE_BEARER_MODEM, &modem, + NULL); + mm_base_modem_at_command (modem, + "^SWWAN?", + 5, + FALSE, + (GAsyncReadyCallback) swwan_check_status_ready, + task); + + return G_SOURCE_REMOVE; +} + static void load_connection_status_by_cid (MMBroadbandBearerCinterion *bearer, gint cid, + gboolean delay, GAsyncReadyCallback callback, gpointer user_data) { - GTask *task; - g_autoptr(MMBaseModem) modem = NULL; + GTask *task; task = g_task_new (bearer, NULL, callback, user_data); if (cid == MM_3GPP_PROFILE_ID_UNKNOWN) { @@ -154,16 +174,14 @@ load_connection_status_by_cid (MMBroadbandBearerCinterion *bearer, g_task_set_task_data (task, GUINT_TO_POINTER (cid), NULL); - g_object_get (bearer, - MM_BASE_BEARER_MODEM, &modem, - NULL); - - mm_base_modem_at_command (modem, - "^SWWAN?", - 5, - FALSE, - (GAsyncReadyCallback) swwan_check_status_ready, - task); + /* Some modems require a delay before querying the SWWAN status + * This is only needed for step DIAL_3GPP_CONTEXT_STEP_VALIDATE_CONNECTION + * and DISCONNECT_3GPP_CONTEXT_STEP_CONNECTION_STATUS. */ + if (delay) { + g_timeout_add_seconds (1, (GSourceFunc)swwan_check_status, task); + } else { + g_idle_add ((GSourceFunc)swwan_check_status, task); + } } static void @@ -173,6 +191,7 @@ load_connection_status (MMBaseBearer *bearer, { load_connection_status_by_cid (MM_BROADBAND_BEARER_CINTERION (bearer), mm_base_bearer_get_profile_id (bearer), + FALSE, callback, user_data); } @@ -411,6 +430,7 @@ dial_3gpp_context_step (GTask *task) ctx->step, DIAL_3GPP_CONTEXT_STEP_LAST, usb_interface_configs[ctx->usb_interface_config_index].swwan_index); load_connection_status_by_cid (ctx->self, (gint) ctx->cid, + TRUE, (GAsyncReadyCallback) dial_connection_status_ready, task); return; @@ -609,6 +629,7 @@ disconnect_3gpp_context_step (GTask *task) usb_interface_configs[ctx->usb_interface_config_index].swwan_index); load_connection_status_by_cid (MM_BROADBAND_BEARER_CINTERION (ctx->self), (gint) ctx->cid, + TRUE, (GAsyncReadyCallback) disconnect_connection_status_ready, task); return; |