aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-shared-qmi.c59
1 files changed, 38 insertions, 21 deletions
diff --git a/src/mm-shared-qmi.c b/src/mm-shared-qmi.c
index 989e066a..c10beea1 100644
--- a/src/mm-shared-qmi.c
+++ b/src/mm-shared-qmi.c
@@ -35,6 +35,9 @@
/* Default session id to use in LOC operations */
#define DEFAULT_LOC_SESSION_ID 0x10
+/* Default description for the default configuration of the firmware */
+#define DEFAULT_CONFIG_DESCRIPTION "default"
+
/*****************************************************************************/
/* Private data context */
@@ -85,8 +88,9 @@ typedef struct {
guint32 loc_assistance_data_max_part_size;
/* Carrier config helpers */
- GArray *config_list;
- gint config_active_i;
+ gboolean config_active_default;
+ GArray *config_list;
+ gint config_active_i;
} Private;
static void
@@ -2286,7 +2290,7 @@ setup_carrier_config_step (GTask *task)
case SETUP_CARRIER_CONFIG_STEP_CHECK_CHANGE_NEEDED:
g_assert (ctx->config_requested_i >= 0);
- g_assert (priv->config_active_i >= 0);
+ g_assert (priv->config_active_i >= 0 || priv->config_active_default);
if (ctx->config_requested_i == priv->config_active_i) {
mm_info ("Carrier config switching not needed: already using '%s'", ctx->config_requested);
ctx->step = SETUP_CARRIER_CONFIG_STEP_LAST;
@@ -2304,9 +2308,9 @@ setup_carrier_config_step (GTask *task)
QmiConfigTypeAndId type_and_id;
requested_config = &g_array_index (priv->config_list, ConfigInfo, ctx->config_requested_i);
- active_config = &g_array_index (priv->config_list, ConfigInfo, priv->config_active_i);
+ active_config = (priv->config_active_default ? NULL : &g_array_index (priv->config_list, ConfigInfo, priv->config_active_i));
mm_warn ("Carrier config switching needed: '%s' -> '%s'",
- active_config->description, requested_config->description);
+ active_config ? active_config->description : DEFAULT_CONFIG_DESCRIPTION, requested_config->description);
type_and_id.config_type = requested_config->config_type;;
type_and_id.id = requested_config->id;
@@ -2418,6 +2422,7 @@ typedef struct {
GArray *config_list;
guint configs_loaded;
+ gboolean config_active_default;
gint config_active_i;
guint token;
@@ -2468,19 +2473,26 @@ mm_shared_qmi_load_carrier_config_finish (MMIfaceModem *self,
gchar **carrier_config_revision,
GError **error)
{
- Private *priv;
- ConfigInfo *config;
- gssize i;
+ Private *priv;
- i = g_task_propagate_int (G_TASK (res), error);
- if (i < 0)
+ if (!g_task_propagate_boolean (G_TASK (res), error))
return FALSE;
priv = get_private (MM_SHARED_QMI (self));
- config = &g_array_index (priv->config_list, ConfigInfo, i);
+ g_assert (priv->config_active_i >= 0 || priv->config_active_default);
+
+ if (priv->config_active_i >= 0) {
+ ConfigInfo *config;
+
+ config = &g_array_index (priv->config_list, ConfigInfo, priv->config_active_i);
+ *carrier_config_name = g_strdup (config->description);
+ *carrier_config_revision = g_strdup_printf ("%08X", config->version);
+ } else if (priv->config_active_default) {
+ *carrier_config_name = g_strdup (DEFAULT_CONFIG_DESCRIPTION);
+ *carrier_config_revision = NULL;
+ } else
+ g_assert_not_reached ();
- *carrier_config_name = g_strdup (config->description);
- *carrier_config_revision = g_strdup_printf ("%08X", config->version);
return TRUE;
}
@@ -2541,9 +2553,9 @@ get_selected_config_indication (QmiClientPdc *client,
qmi_indication_pdc_get_selected_config_output_get_active_id (output, &active_id, NULL);
if (!active_id) {
- load_carrier_config_abort (task, g_error_new (MM_CORE_ERROR, MM_CORE_ERROR_FAILED,
- "couldn't get selected config: no active id reported"));
- return;
+ mm_dbg ("no carrier config currently selected (default in use)");
+ ctx->config_active_default = TRUE;
+ goto next;
}
g_assert (ctx->config_list);
@@ -2566,6 +2578,8 @@ get_selected_config_indication (QmiClientPdc *client,
return;
}
+ next:
+
/* Go on */
load_carrier_config_context_cleanup_action (ctx);
ctx->step++;
@@ -2700,9 +2714,11 @@ list_configs_indication (QmiClientPdc *client,
return;
}
+ /* If no configs are installed, the module is running with the default one */
if (!configs || !configs->len) {
- load_carrier_config_abort (task, g_error_new (MM_CORE_ERROR, MM_CORE_ERROR_NOT_FOUND,
- "no configurations found"));
+ ctx->config_active_default = TRUE;
+ ctx->step = LOAD_CARRIER_CONFIG_STEP_LAST;
+ load_carrier_config_step (task);
return;
}
@@ -2819,12 +2835,13 @@ load_carrier_config_step (GTask *task)
/* We will now store the loaded information so that we can later on use it
* if needed during the automatic carrier config switching operation */
g_assert (!priv->config_list);
- g_assert (priv->config_active_i < 0);
- g_assert (ctx->config_active_i >= 0);
+ g_assert (priv->config_active_i < 0 && !priv->config_active_default);
+ g_assert (ctx->config_active_i >= 0 || ctx->config_active_default);
priv->config_list = g_array_ref (ctx->config_list);
priv->config_active_i = ctx->config_active_i;
+ priv->config_active_default = ctx->config_active_default;
- g_task_return_int (task, ctx->config_active_i);
+ g_task_return_boolean (task, TRUE);
g_object_unref (task);
break;
}