aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-modem-helpers-qmi.c62
-rw-r--r--src/mm-modem-helpers-qmi.h4
-rw-r--r--src/mm-shared-qmi.c59
3 files changed, 125 insertions, 0 deletions
diff --git a/src/mm-modem-helpers-qmi.c b/src/mm-modem-helpers-qmi.c
index 8228438d..d5316363 100644
--- a/src/mm-modem-helpers-qmi.c
+++ b/src/mm-modem-helpers-qmi.c
@@ -599,11 +599,50 @@ nas_add_extended_qmi_lte_bands (GArray *mm_bands,
}
}
+static void
+nas_add_qmi_nr5g_bands (GArray *mm_bands,
+ const guint64 *qmi_nr5g_bands,
+ guint qmi_nr5g_bands_size,
+ gpointer log_object)
+{
+ guint i;
+
+ g_assert (mm_bands != NULL);
+
+ for (i = 0; i < qmi_nr5g_bands_size; i++) {
+ guint j;
+
+ for (j = 0; j < 64; j++) {
+ guint val;
+
+ if (!(qmi_nr5g_bands[i] & (((guint64) 1) << j)))
+ continue;
+
+ val = 1 + j + (i * 64);
+
+ /* MM_MODEM_BAND_NGRAN_1 = 301,
+ * ...
+ * MM_MODEM_BAND_NGRAN_261 = 561
+ */
+ if (val < 1 || val > 261)
+ mm_obj_dbg (log_object, "unexpected NR5G band supported by module: NGRAN %u", val);
+ else {
+ MMModemBand band;
+
+ band = (val + MM_MODEM_BAND_NGRAN_1 - 1);
+ g_array_append_val (mm_bands, band);
+ }
+ }
+ }
+}
+
GArray *
mm_modem_bands_from_qmi_band_preference (QmiNasBandPreference qmi_bands,
QmiNasLteBandPreference qmi_lte_bands,
const guint64 *extended_qmi_lte_bands,
guint extended_qmi_lte_bands_size,
+ const guint64 *qmi_nr5g_bands,
+ guint qmi_nr5g_bands_size,
gpointer log_object)
{
GArray *mm_bands;
@@ -616,6 +655,9 @@ mm_modem_bands_from_qmi_band_preference (QmiNasBandPreference qmi_bands,
else
nas_add_qmi_lte_bands (mm_bands, qmi_lte_bands);
+ if (qmi_nr5g_bands && qmi_nr5g_bands_size)
+ nas_add_qmi_nr5g_bands (mm_bands, qmi_nr5g_bands, qmi_nr5g_bands_size, log_object);
+
return mm_bands;
}
@@ -625,6 +667,8 @@ mm_modem_bands_to_qmi_band_preference (GArray *mm_bands,
QmiNasLteBandPreference *qmi_lte_bands,
guint64 *extended_qmi_lte_bands,
guint extended_qmi_lte_bands_size,
+ guint64 *qmi_nr5g_bands,
+ guint qmi_nr5g_bands_size,
gpointer log_object)
{
guint i;
@@ -633,6 +677,8 @@ mm_modem_bands_to_qmi_band_preference (GArray *mm_bands,
*qmi_lte_bands = 0;
if (extended_qmi_lte_bands)
memset (extended_qmi_lte_bands, 0, extended_qmi_lte_bands_size * sizeof (guint64));
+ if (qmi_nr5g_bands)
+ memset (qmi_nr5g_bands, 0, qmi_nr5g_bands_size * sizeof (guint64));
for (i = 0; i < mm_bands->len; i++) {
MMModemBand band;
@@ -669,6 +715,22 @@ mm_modem_bands_to_qmi_band_preference (GArray *mm_bands,
mm_obj_dbg (log_object, "cannot add the following LTE band: '%s'",
mm_modem_band_get_string (band));
}
+ } else if (band >= MM_MODEM_BAND_NGRAN_1 && band <= MM_MODEM_BAND_NGRAN_261) {
+ if (qmi_nr5g_bands && qmi_nr5g_bands_size) {
+ /* Add NR5G band preference */
+ guint val;
+ guint j;
+ guint k;
+
+ /* it's really (band - MM_MODEM_BAND_NGRAN_1 +1 -1), because
+ * we want NGRAN1 in index 0 */
+ val = band - MM_MODEM_BAND_NGRAN_1;
+ j = val / 64;
+ g_assert (j < qmi_nr5g_bands_size);
+ k = val % 64;
+
+ qmi_nr5g_bands[j] |= ((guint64)1 << k);
+ }
} else {
/* Add non-LTE band preference */
guint j;
diff --git a/src/mm-modem-helpers-qmi.h b/src/mm-modem-helpers-qmi.h
index 152da3ed..b9682aba 100644
--- a/src/mm-modem-helpers-qmi.h
+++ b/src/mm-modem-helpers-qmi.h
@@ -89,12 +89,16 @@ GArray *mm_modem_bands_from_qmi_band_preference (QmiNasBandPreference qmi_ba
QmiNasLteBandPreference qmi_lte_bands,
const guint64 *extended_qmi_lte_bands,
guint extended_qmi_lte_bands_size,
+ const guint64 *qmi_nr5g_bands,
+ guint qmi_nr5g_bands_size,
gpointer log_object);
void mm_modem_bands_to_qmi_band_preference (GArray *mm_bands,
QmiNasBandPreference *qmi_bands,
QmiNasLteBandPreference *qmi_lte_bands,
guint64 *extended_qmi_lte_bands,
guint extended_qmi_lte_bands_size,
+ guint64 *qmi_nr5g_bands,
+ guint qmi_nr5g_bands_size,
gpointer log_object);
MMModem3gppRegistrationState mm_modem_3gpp_registration_state_from_qmi_registration_state (QmiNasAttachState attach_state,
diff --git a/src/mm-shared-qmi.c b/src/mm-shared-qmi.c
index 604d00eb..f6b2a44d 100644
--- a/src/mm-shared-qmi.c
+++ b/src/mm-shared-qmi.c
@@ -1946,6 +1946,10 @@ load_bands_get_system_selection_preference_ready (QmiClientNas *client,
QmiNasLteBandPreference lte_band_preference_mask = 0;
guint64 extended_lte_band_preference[4] = { 0 };
guint extended_lte_band_preference_size = 0;
+ guint64 nr5g_sa_band_preference[8] = { 0 };
+ guint64 nr5g_nsa_band_preference[8] = { 0 };
+ guint64 nr5g_band_preference[8] = { 0 };
+ guint nr5g_band_preference_size = 0;
self = g_task_get_source_object (task);
priv = get_private (self);
@@ -1976,10 +1980,40 @@ load_bands_get_system_selection_preference_ready (QmiClientNas *client,
NULL))
extended_lte_band_preference_size = G_N_ELEMENTS (extended_lte_band_preference);
+ if (qmi_message_nas_get_system_selection_preference_output_get_nr5g_sa_band_preference (
+ output,
+ &nr5g_sa_band_preference[0],
+ &nr5g_sa_band_preference[1],
+ &nr5g_sa_band_preference[2],
+ &nr5g_sa_band_preference[3],
+ &nr5g_sa_band_preference[4],
+ &nr5g_sa_band_preference[5],
+ &nr5g_sa_band_preference[6],
+ &nr5g_sa_band_preference[7],
+ NULL) || qmi_message_nas_get_system_selection_preference_output_get_nr5g_nsa_band_preference (
+ output,
+ &nr5g_nsa_band_preference[0],
+ &nr5g_nsa_band_preference[1],
+ &nr5g_nsa_band_preference[2],
+ &nr5g_nsa_band_preference[3],
+ &nr5g_nsa_band_preference[4],
+ &nr5g_nsa_band_preference[5],
+ &nr5g_nsa_band_preference[6],
+ &nr5g_nsa_band_preference[7],
+ NULL)) {
+ guint i;
+
+ nr5g_band_preference_size = G_N_ELEMENTS (nr5g_band_preference);
+ for (i = 0; i < nr5g_band_preference_size; i++)
+ nr5g_band_preference[i] = nr5g_sa_band_preference[i] | nr5g_nsa_band_preference[i];
+ }
+
mm_bands = mm_modem_bands_from_qmi_band_preference (band_preference_mask,
lte_band_preference_mask,
extended_lte_band_preference_size ? extended_lte_band_preference : NULL,
extended_lte_band_preference_size,
+ nr5g_band_preference_size ? nr5g_band_preference : NULL,
+ nr5g_band_preference_size,
self);
if (mm_bands->len == 0) {
@@ -2071,6 +2105,7 @@ mm_shared_qmi_set_current_bands (MMIfaceModem *self,
QmiNasBandPreference qmi_bands = 0;
QmiNasLteBandPreference qmi_lte_bands = 0;
guint64 extended_qmi_lte_bands[4] = { 0 };
+ guint64 qmi_nr5g_bands[8] = { 0 };
if (!mm_shared_qmi_ensure_client (MM_SHARED_QMI (self),
QMI_SERVICE_NAS, &client,
@@ -2096,6 +2131,8 @@ mm_shared_qmi_set_current_bands (MMIfaceModem *self,
&qmi_lte_bands,
priv->feature_nas_ssp_extended_lte_band_preference == FEATURE_SUPPORTED ? extended_qmi_lte_bands : NULL,
G_N_ELEMENTS (extended_qmi_lte_bands),
+ qmi_nr5g_bands,
+ G_N_ELEMENTS (qmi_nr5g_bands),
self);
input = qmi_message_nas_set_system_selection_preference_input_new ();
@@ -2112,6 +2149,28 @@ mm_shared_qmi_set_current_bands (MMIfaceModem *self,
else
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_nr5g_sa_band_preference (
+ input,
+ qmi_nr5g_bands[0],
+ qmi_nr5g_bands[1],
+ qmi_nr5g_bands[2],
+ qmi_nr5g_bands[3],
+ qmi_nr5g_bands[4],
+ qmi_nr5g_bands[5],
+ qmi_nr5g_bands[6],
+ qmi_nr5g_bands[7],
+ NULL);
+ qmi_message_nas_set_system_selection_preference_input_set_nr5g_nsa_band_preference (
+ input,
+ qmi_nr5g_bands[0],
+ qmi_nr5g_bands[1],
+ qmi_nr5g_bands[2],
+ qmi_nr5g_bands[3],
+ qmi_nr5g_bands[4],
+ qmi_nr5g_bands[5],
+ qmi_nr5g_bands[6],
+ qmi_nr5g_bands[7],
+ NULL);
qmi_message_nas_set_system_selection_preference_input_set_change_duration (input, QMI_NAS_CHANGE_DURATION_PERMANENT, NULL);
qmi_client_nas_set_system_selection_preference (