diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-broadband-modem-qmi.c | 46 | ||||
-rw-r--r-- | src/mm-modem-helpers-qmi.c | 5 |
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; |