diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2018-10-05 13:17:28 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2018-10-09 16:04:26 +0200 |
commit | c7d5902c15957d1487c83f13614b155a18b5f2b6 (patch) | |
tree | 0e959e9468f6fc299b4568d4b4734a358dc303dd /src/mm-modem-helpers-qmi.c | |
parent | c906da415ced0b8bd2ca99e7624f2fe2b0dc63d5 (diff) |
shared-qmi: implement support for the 'extended' LTE band list
This will allow us to configure via mmcli devices that support LTE
bands that would not fit in the standard TLVs (e.g. band 66 below)
or bands which aren't really reported in the standard TLVs (e.g. bands
46 and 48 below).
$ sudo qmicli -d /dev/cdc-wdm0 -p --dms-get-band-capabilities
[/dev/cdc-wdm0] Device band capabilities retrieved:
Bands: 'wcdma-2100, wcdma-pcs-1900, wcdma-1700-us, wcdma-850-us, wcdma-800, wcdma-900, wcdma-1700-japan, wcdma-850-japan'
LTE bands: '1, 2, 3, 4, 5, 7, 8, 12, 13, 14, 17, 18, 19, 20, 25, 38, 39, 40, 41, 42, 43'
LTE bands (extended): '1, 2, 3, 4, 5, 7, 8, 12, 13, 14, 17, 18, 19, 20, 25, 26, 28, 29, 30, 32, 38, 39, 40, 41, 42, 43, 46, 48, 66'
Diffstat (limited to 'src/mm-modem-helpers-qmi.c')
-rw-r--r-- | src/mm-modem-helpers-qmi.c | 131 |
1 files changed, 114 insertions, 17 deletions
diff --git a/src/mm-modem-helpers-qmi.c b/src/mm-modem-helpers-qmi.c index 5df34478..e48d2eb7 100644 --- a/src/mm-modem-helpers-qmi.c +++ b/src/mm-modem-helpers-qmi.c @@ -302,15 +302,51 @@ dms_add_qmi_lte_bands (GArray *mm_bands, } } +static void +dms_add_extended_qmi_lte_bands (GArray *mm_bands, + GArray *extended_qmi_bands) +{ + guint i; + + g_assert (mm_bands != NULL); + + if (!extended_qmi_bands) + return; + + for (i = 0; i < extended_qmi_bands->len; i++) { + guint16 val; + + val = g_array_index (extended_qmi_bands, guint16, i); + + /* MM_MODEM_BAND_EUTRAN_1 = 31, + * ... + * MM_MODEM_BAND_EUTRAN_71 = 101 + */ + if (val < 1 || val > 71) + mm_dbg ("Unexpected LTE band supported by module: EUTRAN %u", val); + else { + MMModemBand band; + + band = (MMModemBand)(val + MM_MODEM_BAND_EUTRAN_1 - 1); + g_array_append_val (mm_bands, band); + } + } +} + GArray * mm_modem_bands_from_qmi_band_capabilities (QmiDmsBandCapability qmi_bands, - QmiDmsLteBandCapability qmi_lte_bands) + QmiDmsLteBandCapability qmi_lte_bands, + GArray *extended_qmi_lte_bands) { GArray *mm_bands; mm_bands = g_array_new (FALSE, FALSE, sizeof (MMModemBand)); dms_add_qmi_bands (mm_bands, qmi_bands); - dms_add_qmi_lte_bands (mm_bands, qmi_lte_bands); + + if (extended_qmi_lte_bands) + dms_add_extended_qmi_lte_bands (mm_bands, extended_qmi_lte_bands); + else + dms_add_qmi_lte_bands (mm_bands, qmi_lte_bands); return mm_bands; } @@ -463,15 +499,57 @@ nas_add_qmi_lte_bands (GArray *mm_bands, } } +static void +nas_add_extended_qmi_lte_bands (GArray *mm_bands, + const guint64 *extended_qmi_lte_bands, + guint extended_qmi_lte_bands_size) +{ + guint i; + + g_assert (mm_bands != NULL); + + for (i = 0; i < extended_qmi_lte_bands_size; i++) { + guint j; + + for (j = 0; j < 64; j++) { + guint val; + + if (!(extended_qmi_lte_bands[i] & (((guint64) 1) << j))) + continue; + + val = 1 + j + (i * 64); + + /* MM_MODEM_BAND_EUTRAN_1 = 31, + * ... + * MM_MODEM_BAND_EUTRAN_71 = 101 + */ + if (val < 1 || val > 71) + mm_dbg ("Unexpected LTE band supported by module: EUTRAN %u", val); + else { + MMModemBand band; + + band = (val + MM_MODEM_BAND_EUTRAN_1 - 1); + g_array_append_val (mm_bands, band); + } + } + } +} + GArray * mm_modem_bands_from_qmi_band_preference (QmiNasBandPreference qmi_bands, - QmiNasLteBandPreference qmi_lte_bands) + QmiNasLteBandPreference qmi_lte_bands, + const guint64 *extended_qmi_lte_bands, + guint extended_qmi_lte_bands_size) { GArray *mm_bands; mm_bands = g_array_new (FALSE, FALSE, sizeof (MMModemBand)); nas_add_qmi_bands (mm_bands, qmi_bands); - nas_add_qmi_lte_bands (mm_bands, qmi_lte_bands); + + if (extended_qmi_lte_bands && extended_qmi_lte_bands_size) + nas_add_extended_qmi_lte_bands (mm_bands, extended_qmi_lte_bands, extended_qmi_lte_bands_size); + else + nas_add_qmi_lte_bands (mm_bands, qmi_lte_bands); return mm_bands; } @@ -479,32 +557,51 @@ mm_modem_bands_from_qmi_band_preference (QmiNasBandPreference qmi_bands, void mm_modem_bands_to_qmi_band_preference (GArray *mm_bands, QmiNasBandPreference *qmi_bands, - QmiNasLteBandPreference *qmi_lte_bands) + QmiNasLteBandPreference *qmi_lte_bands, + guint64 *extended_qmi_lte_bands, + guint extended_qmi_lte_bands_size) { guint i; *qmi_bands = 0; *qmi_lte_bands = 0; + memset (extended_qmi_lte_bands, 0, extended_qmi_lte_bands_size * sizeof (guint64)); for (i = 0; i < mm_bands->len; i++) { MMModemBand band; band = g_array_index (mm_bands, MMModemBand, i); - if (band >= MM_MODEM_BAND_EUTRAN_1 && band <= MM_MODEM_BAND_EUTRAN_44) { - /* Add LTE band preference */ - guint j; - - for (j = 0; j < G_N_ELEMENTS (nas_lte_bands_map); j++) { - if (nas_lte_bands_map[j].mm_band == band) { - *qmi_lte_bands |= nas_lte_bands_map[j].qmi_band; - break; + if (band >= MM_MODEM_BAND_EUTRAN_1 && band <= MM_MODEM_BAND_EUTRAN_71) { + if (extended_qmi_lte_bands && extended_qmi_lte_bands_size) { + /* Add extended LTE band preference */ + guint val; + guint j; + guint k; + + /* it's really (band - MM_MODEM_BAND_EUTRAN_1 +1 -1), because + * we want EUTRAN1 in index 0 */ + val = band - MM_MODEM_BAND_EUTRAN_1; + j = val / 64; + g_assert (j < extended_qmi_lte_bands_size); + k = val % 64; + + extended_qmi_lte_bands[j] |= ((guint64)1 << k); + } else { + /* Add LTE band preference */ + guint j; + + for (j = 0; j < G_N_ELEMENTS (nas_lte_bands_map); j++) { + if (nas_lte_bands_map[j].mm_band == band) { + *qmi_lte_bands |= nas_lte_bands_map[j].qmi_band; + break; + } } - } - if (j == G_N_ELEMENTS (nas_lte_bands_map)) - mm_dbg ("Cannot add the following LTE band: '%s'", - mm_modem_band_get_string (band)); + if (j == G_N_ELEMENTS (nas_lte_bands_map)) + mm_dbg ("Cannot add the following LTE band: '%s'", + mm_modem_band_get_string (band)); + } } else { /* Add non-LTE band preference */ guint j; |