aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2012-10-15 12:41:22 +0200
committerAleksander Morgado <aleksander@lanedo.com>2012-10-15 12:41:33 +0200
commite6930921af46a7ccbe05c7973ae3bdc4043d1d20 (patch)
treeaa2ff07bf61a1a8abe92fcbb5da13959cb75aafa /src
parentb0eca9c09c167f3467acd20493b68224dc1ef04c (diff)
broadband-modem-qmi: map 'any' to all supported bands when setting current bands
Diffstat (limited to 'src')
-rw-r--r--src/mm-broadband-modem-qmi.c46
-rw-r--r--src/mm-modem-helpers-qmi.c5
2 files changed, 39 insertions, 12 deletions
diff --git a/src/mm-broadband-modem-qmi.c b/src/mm-broadband-modem-qmi.c
index d1a5ea04..4d85dec0 100644
--- a/src/mm-broadband-modem-qmi.c
+++ b/src/mm-broadband-modem-qmi.c
@@ -65,6 +65,9 @@ struct _MMBroadbandModemQmiPrivate {
gchar *meid;
gchar *esn;
+ /* Cached supported frequency bands; in order to handle ANY */
+ GArray *supported_bands;
+
/* 3GPP and CDMA share unsolicited events setup/enable/disable/cleanup */
gboolean unsolicited_events_enabled;
gboolean unsolicited_events_setup;
@@ -1292,15 +1295,23 @@ modem_load_unlock_retries (MMIfaceModem *self,
/* Load supported bands (Modem interface) */
static GArray *
-modem_load_supported_bands_finish (MMIfaceModem *self,
+modem_load_supported_bands_finish (MMIfaceModem *_self,
GAsyncResult *res,
GError **error)
{
+ MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self);
+
if (g_simple_async_result_propagate_error (G_SIMPLE_ASYNC_RESULT (res), error))
return NULL;
- return (GArray *) g_array_ref (g_simple_async_result_get_op_res_gpointer (
- G_SIMPLE_ASYNC_RESULT (res)));
+ if (self->priv->supported_bands)
+ g_array_unref (self->priv->supported_bands);
+
+ /* Cache the supported bands value */
+ self->priv->supported_bands = g_array_ref (g_simple_async_result_get_op_res_gpointer (
+ G_SIMPLE_ASYNC_RESULT (res)));
+
+ return g_array_ref (self->priv->supported_bands);
}
static void
@@ -1583,11 +1594,12 @@ bands_set_system_selection_preference_ready (QmiClientNas *client,
}
static void
-set_bands (MMIfaceModem *self,
+set_bands (MMIfaceModem *_self,
GArray *bands_array,
GAsyncReadyCallback callback,
gpointer user_data)
{
+ MMBroadbandModemQmi *self = MM_BROADBAND_MODEM_QMI (_self);
QmiMessageNasSetSystemSelectionPreferenceInput *input;
GSimpleAsyncResult *result;
QmiClient *client = NULL;
@@ -1604,12 +1616,30 @@ set_bands (MMIfaceModem *self,
user_data,
set_bands);
- input = qmi_message_nas_set_system_selection_preference_input_new ();
+ /* Handle ANY separately */
+ if (bands_array->len == 1 &&
+ g_array_index (bands_array, MMModemBand, 0) == MM_MODEM_BAND_ANY) {
+ if (!self->priv->supported_bands) {
+ g_simple_async_result_set_error (result,
+ MM_CORE_ERROR,
+ MM_CORE_ERROR_FAILED,
+ "Cannot handle 'ANY' if supported bands are unknown");
+ g_simple_async_result_complete_in_idle (result);
+ g_object_unref (result);
+ return;
+ }
- mm_modem_bands_to_qmi_band_preference (bands_array, &qmi_bands, &qmi_lte_bands);
+ mm_modem_bands_to_qmi_band_preference (self->priv->supported_bands,
+ &qmi_bands,
+ &qmi_lte_bands);
+ } else
+ mm_modem_bands_to_qmi_band_preference (bands_array,
+ &qmi_bands,
+ &qmi_lte_bands);
+ input = qmi_message_nas_set_system_selection_preference_input_new ();
qmi_message_nas_set_system_selection_preference_input_set_band_preference (input, qmi_bands, NULL);
- if (mm_iface_modem_is_3gpp_lte (self))
+ if (mm_iface_modem_is_3gpp_lte (_self))
qmi_message_nas_set_system_selection_preference_input_set_lte_band_preference (input, qmi_lte_bands, NULL);
qmi_message_nas_set_system_selection_preference_input_set_change_duration (input, QMI_NAS_CHANGE_DURATION_PERMANENT, NULL);
@@ -7195,6 +7225,8 @@ finalize (GObject *object)
g_free (self->priv->esn);
g_free (self->priv->current_operator_id);
g_free (self->priv->current_operator_description);
+ if (self->priv->supported_bands)
+ g_array_unref (self->priv->supported_bands);
G_OBJECT_CLASS (mm_broadband_modem_qmi_parent_class)->finalize (object);
}
diff --git a/src/mm-modem-helpers-qmi.c b/src/mm-modem-helpers-qmi.c
index f17a3789..0b727791 100644
--- a/src/mm-modem-helpers-qmi.c
+++ b/src/mm-modem-helpers-qmi.c
@@ -465,11 +465,6 @@ mm_modem_bands_to_qmi_band_preference (GArray *mm_bands,
*qmi_bands = 0;
*qmi_lte_bands = 0;
- /* Handle ANY separately */
- if (mm_bands->len == 1 &&
- g_array_index (mm_bands, MMModemBand, 0) == MM_MODEM_BAND_ANY)
- return;
-
for (i = 0; i < mm_bands->len; i++) {
MMModemBand band;