aboutsummaryrefslogtreecommitdiff
path: root/plugins/cinterion/mm-broadband-modem-cinterion.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/cinterion/mm-broadband-modem-cinterion.c')
-rw-r--r--plugins/cinterion/mm-broadband-modem-cinterion.c171
1 files changed, 34 insertions, 137 deletions
diff --git a/plugins/cinterion/mm-broadband-modem-cinterion.c b/plugins/cinterion/mm-broadband-modem-cinterion.c
index f931dc58..6e526ad3 100644
--- a/plugins/cinterion/mm-broadband-modem-cinterion.c
+++ b/plugins/cinterion/mm-broadband-modem-cinterion.c
@@ -79,7 +79,7 @@ struct _MMBroadbandModemCinterionPrivate {
gchar *sleep_mode_cmd;
/* Cached supported bands in Cinterion format */
- guint supported_bands[MM_CINTERION_RB_BLOCK_N];
+ guint supported_bands;
/* Cached supported modes for SMS setup */
GArray *cnmi_supported_mode;
@@ -95,13 +95,6 @@ struct _MMBroadbandModemCinterionPrivate {
FeatureSupport swwan_support;
FeatureSupport sind_psinfo_support;
FeatureSupport smoni_support;
-
- /* Flags for model-based behaviors */
- MMCinterionModemFamily modem_family;
- MMCinterionRadioBandFormat rb_format;
-
- /* Command sequence */
- MMBaseModemAtCommandAlloc *cmds;
};
/*****************************************************************************/
@@ -1157,61 +1150,27 @@ scfg_test_ready (MMBaseModem *_self,
response = mm_base_modem_at_command_finish (_self, res, &error);
if (!response ||
!mm_cinterion_parse_scfg_test (response,
- self->priv->modem_family,
mm_broadband_modem_get_current_charset (MM_BROADBAND_MODEM (self)),
&bands,
- &self->priv->rb_format,
&error))
g_task_return_error (task, error);
else {
- if (!mm_cinterion_build_band (bands,
- NULL,
- FALSE,
- self->priv->rb_format,
- self->priv->modem_family,
- self->priv->supported_bands,
- &error))
- g_task_return_error (task, error);
- else
- g_task_return_pointer (task, bands, (GDestroyNotify)g_array_unref);
+ mm_cinterion_build_band (bands, 0, FALSE, &self->priv->supported_bands, NULL);
+ g_assert (self->priv->supported_bands != 0);
+ g_task_return_pointer (task, bands, (GDestroyNotify)g_array_unref);
}
g_object_unref (task);
}
static void
-load_supported_bands (MMIfaceModem *_self,
+load_supported_bands (MMIfaceModem *self,
GAsyncReadyCallback callback,
gpointer user_data)
{
- MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (_self);
- GTask *task;
- MMPort *primary;
- MMKernelDevice *port;
- const gchar *family = NULL;
-
- /* Lookup for the tag specifying which modem family the current device belongs */
- primary = MM_PORT (mm_base_modem_peek_port_primary (MM_BASE_MODEM (self)));
- port = mm_port_peek_kernel_device (primary);
- family = mm_kernel_device_get_global_property (port, "ID_MM_CINTERION_MODEM_FAMILY");
-
- /* if the property is not set, default family */
- self->priv->modem_family = MM_CINTERION_MODEM_FAMILY_DEFAULT;
-
- /* set used family also in the string for mm_obj_dbg */
- if (!family)
- family = "default";
-
- if (g_ascii_strcasecmp (family, "imt") == 0)
- self->priv->modem_family = MM_CINTERION_MODEM_FAMILY_IMT;
- else if (g_ascii_strcasecmp (family, "default") != 0) {
- mm_obj_dbg (self, "cinterion modem family '%s' unknown", family);
- family = "default";
- }
-
- mm_obj_dbg (self, "Using cinterion %s modem family", family);
+ GTask *task;
- task = g_task_new (_self, NULL, callback, user_data);
- mm_base_modem_at_command (MM_BASE_MODEM (_self),
+ task = g_task_new (self, NULL, callback, user_data);
+ mm_base_modem_at_command (MM_BASE_MODEM (self),
"AT^SCFG=?",
3,
FALSE,
@@ -1231,22 +1190,19 @@ load_current_bands_finish (MMIfaceModem *self,
}
static void
-get_band_ready (MMBaseModem *_self,
+get_band_ready (MMBaseModem *self,
GAsyncResult *res,
GTask *task)
{
- MMBroadbandModemCinterion *self = MM_BROADBAND_MODEM_CINTERION (_self);
const gchar *response;
GError *error = NULL;
GArray *bands = NULL;
- response = mm_base_modem_at_command_finish (_self, res, &error);
+ response = mm_base_modem_at_command_finish (self, res, &error);
if (!response ||
!mm_cinterion_parse_scfg_response (response,
- self->priv->modem_family,
mm_broadband_modem_get_current_charset (MM_BROADBAND_MODEM (self)),
&bands,
- self->priv->rb_format,
&error))
g_task_return_error (task, error);
else
@@ -1264,7 +1220,7 @@ load_current_bands (MMIfaceModem *self,
task = g_task_new (self, NULL, callback, user_data);
mm_base_modem_at_command (MM_BASE_MODEM (self),
- "AT^SCFG?",
+ "AT^SCFG=\"Radio/Band\"",
3,
FALSE,
(GAsyncReadyCallback)get_band_ready,
@@ -1297,100 +1253,43 @@ scfg_set_ready (MMBaseModem *self,
}
static void
-scfg_set_ready_sequence (MMBaseModem *_self,
- GAsyncResult *res,
- GTask *task)
-{
- GError *error = NULL;
- gpointer ctx = NULL;
- guint i;
- MMBroadbandModemCinterion *self;
-
- self = g_task_get_source_object (task);
- for (i = 0; self->priv->cmds[i].command; i++)
- mm_base_modem_at_command_alloc_clear (&self->priv->cmds[i]);
- g_free(self->priv->cmds);
- self->priv->cmds = NULL;
-
- mm_base_modem_at_sequence_finish (_self, res, &ctx, &error);
- g_task_return_boolean (task, TRUE);
- g_object_unref (task);
-}
-
-static void
set_bands_3g (GTask *task,
GArray *bands_array)
{
MMBroadbandModemCinterion *self;
GError *error = NULL;
- guint band[MM_CINTERION_RB_BLOCK_N] = { 0 };
+ guint band = 0;
+ gchar *cmd;
self = g_task_get_source_object (task);
if (!mm_cinterion_build_band (bands_array,
self->priv->supported_bands,
FALSE, /* 2G and 3G */
- self->priv->rb_format,
- self->priv->modem_family,
- band,
+ &band,
&error)) {
g_task_return_error (task, error);
g_object_unref (task);
return;
}
- if (self->priv->rb_format == MM_CINTERION_RADIO_BAND_FORMAT_SINGLE) {
- g_autofree gchar *cmd = NULL;
-
- /* Following the setup:
- * AT^SCFG="Radion/Band",<rba>
- * We will set the preferred band equal to the allowed band, so that we force
- * the modem to connect at that specific frequency only. Note that we will be
- * passing a number here!
- *
- * The optional <rbe> field is set to 1, so that changes take effect
- * immediately.
- */
- cmd = g_strdup_printf ("^SCFG=\"Radio/Band\",%u,1", band[MM_CINTERION_RB_BLOCK_LEGACY]);
- mm_base_modem_at_command (MM_BASE_MODEM (self),
- cmd,
- 15,
- FALSE,
- (GAsyncReadyCallback)scfg_set_ready,
- task);
- } else { /* self->priv->rb_format == MM_CINTERION_RADIO_BAND_FORMAT_MULTIPLE */
- if (self->priv->modem_family == MM_CINTERION_MODEM_FAMILY_IMT) {
- g_autofree gchar *bandstr2G = NULL;
- g_autofree gchar *bandstr3G = NULL;
- g_autofree gchar *bandstr4G = NULL;
-
- bandstr2G = g_strdup_printf ("0x%08X", band[MM_CINTERION_RB_BLOCK_GSM]);
- bandstr3G = g_strdup_printf ("0x%08X", band[MM_CINTERION_RB_BLOCK_UMTS]);
- bandstr4G = g_strdup_printf ("0x%08X", band[MM_CINTERION_RB_BLOCK_LTE_LOW]);
- bandstr2G = mm_broadband_modem_take_and_convert_to_current_charset (MM_BROADBAND_MODEM (self), bandstr2G);
- bandstr3G = mm_broadband_modem_take_and_convert_to_current_charset (MM_BROADBAND_MODEM (self), bandstr3G);
- bandstr4G = mm_broadband_modem_take_and_convert_to_current_charset (MM_BROADBAND_MODEM (self), bandstr4G);
- self->priv->cmds = g_new0 (MMBaseModemAtCommandAlloc, 3 + 1);
- self->priv->cmds[0].command = g_strdup_printf ("^SCFG=\"Radio/Band/2G\",\"%s\"", bandstr2G);
- self->priv->cmds[1].command = g_strdup_printf ("^SCFG=\"Radio/Band/3G\",\"%s\"", bandstr3G);
- self->priv->cmds[2].command = g_strdup_printf ("^SCFG=\"Radio/Band/4G\",\"%s\"", bandstr4G);
- self->priv->cmds[0].timeout = self->priv->cmds[1].timeout = self->priv->cmds[2].timeout = 60;
- } else {
- self->priv->cmds = g_new0 (MMBaseModemAtCommandAlloc, 3 + 1);
- self->priv->cmds[0].command = g_strdup_printf ("^SCFG=\"Radio/Band/2G\",\"%08x\",1", band[MM_CINTERION_RB_BLOCK_GSM]);
- self->priv->cmds[1].command = g_strdup_printf ("^SCFG=\"Radio/Band/3G\",\"%08x\",1", band[MM_CINTERION_RB_BLOCK_UMTS]);
- self->priv->cmds[2].command = g_strdup_printf ("^SCFG=\"Radio/Band/4G\",\"%08x\",\"%08x\",1", band[MM_CINTERION_RB_BLOCK_LTE_LOW], band[MM_CINTERION_RB_BLOCK_LTE_HIGH]);
- self->priv->cmds[0].timeout = self->priv->cmds[1].timeout = self->priv->cmds[2].timeout = 15;
- }
-
- mm_base_modem_at_sequence (MM_BASE_MODEM (self),
- (const MMBaseModemAtCommand *)self->priv->cmds,
- NULL,
- NULL,
- (GAsyncReadyCallback)scfg_set_ready_sequence,
- task);
- }
-
+ /* Following the setup:
+ * AT^SCFG="Radion/Band",<rba>
+ * We will set the preferred band equal to the allowed band, so that we force
+ * the modem to connect at that specific frequency only. Note that we will be
+ * passing a number here!
+ *
+ * The optional <rbe> field is set to 1, so that changes take effect
+ * immediately.
+ */
+ cmd = g_strdup_printf ("^SCFG=\"Radio/Band\",%u,1", band);
+ mm_base_modem_at_command (MM_BASE_MODEM (self),
+ cmd,
+ 15,
+ FALSE,
+ (GAsyncReadyCallback)scfg_set_ready,
+ task);
+ g_free (cmd);
}
static void
@@ -1399,7 +1298,7 @@ set_bands_2g (GTask *task,
{
MMBroadbandModemCinterion *self;
GError *error = NULL;
- guint band[MM_CINTERION_RB_BLOCK_N] = { 0 };
+ guint band = 0;
gchar *cmd;
gchar *bandstr;
@@ -1408,9 +1307,7 @@ set_bands_2g (GTask *task,
if (!mm_cinterion_build_band (bands_array,
self->priv->supported_bands,
TRUE, /* 2G only */
- MM_CINTERION_RADIO_BAND_FORMAT_SINGLE,
- 0,
- band,
+ &band,
&error)) {
g_task_return_error (task, error);
g_object_unref (task);
@@ -1418,7 +1315,7 @@ set_bands_2g (GTask *task,
}
/* Build string with the value, in the proper charset */
- bandstr = g_strdup_printf ("%u", band[MM_CINTERION_RB_BLOCK_LEGACY]);
+ bandstr = g_strdup_printf ("%u", band);
bandstr = mm_broadband_modem_take_and_convert_to_current_charset (MM_BROADBAND_MODEM (self), bandstr);
if (!bandstr) {
g_task_return_new_error (task,