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>
This commit is contained in:
Heiko Thiery
2022-10-26 10:25:59 +02:00
committed by Aleksander Morgado
parent c7effc8390
commit 41bbe42182

View File

@@ -135,14 +135,34 @@ out:
g_object_unref (task); 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 static void
load_connection_status_by_cid (MMBroadbandBearerCinterion *bearer, load_connection_status_by_cid (MMBroadbandBearerCinterion *bearer,
gint cid, gint cid,
gboolean delay,
GAsyncReadyCallback callback, GAsyncReadyCallback callback,
gpointer user_data) gpointer user_data)
{ {
GTask *task; GTask *task;
g_autoptr(MMBaseModem) modem = NULL;
task = g_task_new (bearer, NULL, callback, user_data); task = g_task_new (bearer, NULL, callback, user_data);
if (cid == MM_3GPP_PROFILE_ID_UNKNOWN) { 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_task_set_task_data (task, GUINT_TO_POINTER (cid), NULL);
g_object_get (bearer, /* Some modems require a delay before querying the SWWAN status
MM_BASE_BEARER_MODEM, &modem, * This is only needed for step DIAL_3GPP_CONTEXT_STEP_VALIDATE_CONNECTION
NULL); * and DISCONNECT_3GPP_CONTEXT_STEP_CONNECTION_STATUS. */
if (delay) {
mm_base_modem_at_command (modem, g_timeout_add_seconds (1, (GSourceFunc)swwan_check_status, task);
"^SWWAN?", } else {
5, g_idle_add ((GSourceFunc)swwan_check_status, task);
FALSE, }
(GAsyncReadyCallback) swwan_check_status_ready,
task);
} }
static void static void
@@ -173,6 +191,7 @@ load_connection_status (MMBaseBearer *bearer,
{ {
load_connection_status_by_cid (MM_BROADBAND_BEARER_CINTERION (bearer), load_connection_status_by_cid (MM_BROADBAND_BEARER_CINTERION (bearer),
mm_base_bearer_get_profile_id (bearer), mm_base_bearer_get_profile_id (bearer),
FALSE,
callback, callback,
user_data); 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); ctx->step, DIAL_3GPP_CONTEXT_STEP_LAST, usb_interface_configs[ctx->usb_interface_config_index].swwan_index);
load_connection_status_by_cid (ctx->self, load_connection_status_by_cid (ctx->self,
(gint) ctx->cid, (gint) ctx->cid,
TRUE,
(GAsyncReadyCallback) dial_connection_status_ready, (GAsyncReadyCallback) dial_connection_status_ready,
task); task);
return; return;
@@ -609,6 +629,7 @@ disconnect_3gpp_context_step (GTask *task)
usb_interface_configs[ctx->usb_interface_config_index].swwan_index); usb_interface_configs[ctx->usb_interface_config_index].swwan_index);
load_connection_status_by_cid (MM_BROADBAND_BEARER_CINTERION (ctx->self), load_connection_status_by_cid (MM_BROADBAND_BEARER_CINTERION (ctx->self),
(gint) ctx->cid, (gint) ctx->cid,
TRUE,
(GAsyncReadyCallback) disconnect_connection_status_ready, (GAsyncReadyCallback) disconnect_connection_status_ready,
task); task);
return; return;