diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2016-11-24 11:37:10 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2017-01-04 14:11:17 +0100 |
commit | 1919138c68d5f91c1fe49daf3eddce653f6d4aa8 (patch) | |
tree | a941f8bef705114f66a8222505a5bea00c7f00d8 | |
parent | 9ca3fde06bc920e2fc15127888dbbfe731a73a56 (diff) |
cinterion: don't check for ^SWWAN support during enabling
Better check for ^SWWAN support during the first time a bearer is going
to be created.
The enabling phase isn't the correct one because this logic is only run
whenever a modem is detected but not hotplugged (i.e. this step is to
'reset' the modem to generic runtime settings).
-rw-r--r-- | plugins/cinterion/mm-broadband-modem-cinterion.c | 150 |
1 files changed, 49 insertions, 101 deletions
diff --git a/plugins/cinterion/mm-broadband-modem-cinterion.c b/plugins/cinterion/mm-broadband-modem-cinterion.c index 0cddaaf1..874d7fa0 100644 --- a/plugins/cinterion/mm-broadband-modem-cinterion.c +++ b/plugins/cinterion/mm-broadband-modem-cinterion.c @@ -1655,98 +1655,6 @@ after_sim_unlock (MMIfaceModem *self, } /*****************************************************************************/ -/* Initializing the modem (during first enabling) */ - -typedef struct { - GSimpleAsyncResult *result; - MMBroadbandModemCinterion *self; -} EnablingModemInitContext; - -static void -enabling_modem_init_context_complete_and_free (EnablingModemInitContext *ctx) -{ - g_simple_async_result_complete (ctx->result); - g_object_unref (ctx->result); - g_object_unref (ctx->self); - g_slice_free (EnablingModemInitContext, ctx); -} - -static gboolean -enabling_modem_init_finish (MMBroadbandModem *self, - GAsyncResult *res, - GError **error) - -{ - return !g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error); -} - -static void -swwan_test_ready (MMBaseModem *self, - GAsyncResult *res, - EnablingModemInitContext *ctx) -{ - MMPort *port = NULL; - GError *error = NULL; - - /* Fetch the result to the SWWAN test */ - mm_base_modem_at_command_full_finish (self, res, &error); - - port = mm_base_modem_peek_best_data_port (self, MM_PORT_TYPE_NET); - - /* SWWAN requires a net port & valid test response*/ - if (mm_port_get_subsys (port) == MM_PORT_SUBSYS_NET && !error) { - mm_dbg ("SWWAN supported"); - ctx->self->priv->swwan_support = FEATURE_SUPPORTED; - } - else { - mm_dbg ("SWWAN unsupported"); - ctx->self->priv->swwan_support = FEATURE_NOT_SUPPORTED; - } - - if (error) /* Error is not valid */ - g_clear_error (&error); - - enabling_modem_init_context_complete_and_free (ctx); -} - -static void -check_for_swwan_support (EnablingModemInitContext *ctx) -{ - mm_base_modem_at_command_full (MM_BASE_MODEM (ctx->self), - mm_base_modem_peek_port_primary (MM_BASE_MODEM (ctx->self)), - "^SWWAN=?", - 6, - FALSE, - FALSE, - NULL, /* cancellable */ - (GAsyncReadyCallback)swwan_test_ready, - ctx); -} - -static void -enabling_modem_init (MMBroadbandModem *self, - GAsyncReadyCallback callback, - gpointer user_data) -{ - EnablingModemInitContext *ctx; - - ctx = g_slice_new0 (EnablingModemInitContext); - ctx->result = g_simple_async_result_new (G_OBJECT (self), - callback, - user_data, - enabling_modem_init); - ctx->self = g_object_ref (self); - - /* Newer Cinterion modems may support SWWAN, which is the same as WWAN. - * Check to see if current modem supports it.*/ - check_for_swwan_support (ctx); - - /* TODO: Before upstream merge. This needs check_for_swwan_support to block - * until it's finish. Otherwise there is race conidion with swwan_support assert? - * I'm really not sure how else to do this other than move it or use sleep :? */ -} - -/*****************************************************************************/ /* Setup ports (Broadband modem class) */ static void @@ -1788,7 +1696,7 @@ cinterion_modem_create_bearer_finish (MMIfaceModem *self, return NULL; bearer = g_simple_async_result_get_op_res_gpointer (G_SIMPLE_ASYNC_RESULT (res)); - mm_dbg ("New cinterion bearer created at DBus path '%s'", mm_base_bearer_get_path (bearer)); + mm_dbg ("New bearer created at DBus path '%s'", mm_base_bearer_get_path (bearer)); return g_object_ref (bearer); } @@ -1825,7 +1733,7 @@ broadband_bearer_new_ready (GObject *source, } static void -create_bearer_for_net_port (CreateBearerContext *ctx) +common_create_bearer (CreateBearerContext *ctx) { switch (ctx->self->priv->swwan_support) { case FEATURE_NOT_SUPPORTED: @@ -1839,10 +1747,10 @@ create_bearer_for_net_port (CreateBearerContext *ctx) case FEATURE_SUPPORTED: mm_dbg ("^SWWAN supported, creating cinterion bearer..."); mm_broadband_bearer_cinterion_new (MM_BROADBAND_MODEM_CINTERION (ctx->self), - ctx->properties, - NULL, /* cancellable */ - (GAsyncReadyCallback)broadband_bearer_cinterion_new_ready, - ctx); + ctx->properties, + NULL, /* cancellable */ + (GAsyncReadyCallback)broadband_bearer_cinterion_new_ready, + ctx); return; default: g_assert_not_reached (); @@ -1850,6 +1758,26 @@ create_bearer_for_net_port (CreateBearerContext *ctx) } static void +swwan_test_ready (MMBaseModem *self, + GAsyncResult *res, + CreateBearerContext *ctx) +{ + /* Fetch the result to the SWWAN test. If no response given (error triggered), + * assume unsupported */ + if (!mm_base_modem_at_command_finish (self, res, NULL)) { + mm_dbg ("SWWAN unsupported"); + ctx->self->priv->swwan_support = FEATURE_NOT_SUPPORTED; + } else { + mm_dbg ("SWWAN supported"); + ctx->self->priv->swwan_support = FEATURE_SUPPORTED; + } + + /* Go on and create the bearer */ + g_assert (ctx->self->priv->swwan_support != FEATURE_SUPPORT_UNKNOWN); + common_create_bearer (ctx); +} + +static void cinterion_modem_create_bearer (MMIfaceModem *self, MMBearerProperties *properties, GAsyncReadyCallback callback, @@ -1865,7 +1793,29 @@ cinterion_modem_create_bearer (MMIfaceModem *self, user_data, cinterion_modem_create_bearer); - create_bearer_for_net_port (ctx); + /* Newer Cinterion modems may support SWWAN, which is the same as WWAN. + * Check to see if current modem supports it.*/ + if (ctx->self->priv->swwan_support == FEATURE_SUPPORT_UNKNOWN) { + /* If we don't have a data port, don't even bother checking for ^SWWAN + * support. */ + if (!mm_base_modem_peek_best_data_port (MM_BASE_MODEM (self), MM_PORT_TYPE_NET)) { + mm_dbg ("skipping ^SWWAN check as no data port is available"); + ctx->self->priv->swwan_support = FEATURE_NOT_SUPPORTED; + } else { + mm_dbg ("checking ^SWWAN support..."); + mm_base_modem_at_command (MM_BASE_MODEM (ctx->self), + "^SWWAN=?", + 6, + TRUE, /* may be cached */ + (GAsyncReadyCallback) swwan_test_ready, + ctx); + return; + } + } + + /* Go on and create the bearer */ + g_assert (ctx->self->priv->swwan_support != FEATURE_SUPPORT_UNKNOWN); + common_create_bearer (ctx); } /*****************************************************************************/ @@ -1994,6 +1944,4 @@ mm_broadband_modem_cinterion_class_init (MMBroadbandModemCinterionClass *klass) /* Virtual methods */ object_class->finalize = finalize; broadband_modem_class->setup_ports = setup_ports; - broadband_modem_class->enabling_modem_init = enabling_modem_init; - broadband_modem_class->enabling_modem_init_finish = enabling_modem_init_finish; } |