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:

committed by
Aleksander Morgado

parent
c7effc8390
commit
41bbe42182
@@ -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;
|
||||||
|
Reference in New Issue
Block a user