diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2022-01-30 21:33:38 +0100 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2022-01-31 22:48:57 +0100 |
commit | b323a731370be607f2529b1df976ec64a4f7c2e8 (patch) | |
tree | 3fe38d7538314e0e343b26d98bb5ba514b386d2b /src | |
parent | 6efde107142692996a5b9f44f323710baa8f40bc (diff) |
modem-helpers-qmi: new helper to build array of supported modes
Diffstat (limited to 'src')
-rw-r--r-- | src/mm-modem-helpers-qmi.c | 96 | ||||
-rw-r--r-- | src/mm-modem-helpers-qmi.h | 17 | ||||
-rw-r--r-- | src/mm-shared-qmi.c | 110 |
3 files changed, 125 insertions, 98 deletions
diff --git a/src/mm-modem-helpers-qmi.c b/src/mm-modem-helpers-qmi.c index e33a8232..5d5ddc7b 100644 --- a/src/mm-modem-helpers-qmi.c +++ b/src/mm-modem-helpers-qmi.c @@ -1929,6 +1929,102 @@ mm_supported_capabilities_from_qmi_supported_capabilities_context (MMQmiSupporte } /*****************************************************************************/ +/* Utility to build list of supported modes */ + +GArray * +mm_supported_modes_from_qmi_supported_modes_context (MMQmiSupportedModesContext *ctx, + gpointer log_object) +{ + g_autoptr(GArray) combinations = NULL; + g_autoptr(GArray) all = NULL; + MMModemModeCombination mode; + + /* Start with a mode including ALL */ + mode.allowed = ctx->all; + mode.preferred = MM_MODEM_MODE_NONE; + all = g_array_sized_new (FALSE, FALSE, sizeof (MMModemModeCombination), 1); + g_array_append_val (all, mode); + + /* If SSP and TP are not supported, ignore supported mode management */ + if (!ctx->nas_ssp_supported && !ctx->nas_tp_supported) + return g_steal_pointer (&all); + + combinations = g_array_new (FALSE, FALSE, sizeof (MMModemModeCombination)); + +#define ADD_MODE_PREFERENCE(MODE1, MODE2, MODE3, MODE4) do { \ + mode.allowed = MODE1; \ + if (MODE2 != MM_MODEM_MODE_NONE) { \ + mode.allowed |= MODE2; \ + if (MODE3 != MM_MODEM_MODE_NONE) { \ + mode.allowed |= MODE3; \ + if (MODE4 != MM_MODEM_MODE_NONE) \ + mode.allowed |= MODE4; \ + } \ + if (ctx->nas_ssp_supported) { \ + if (MODE3 != MM_MODEM_MODE_NONE) { \ + if (MODE4 != MM_MODEM_MODE_NONE) { \ + mode.preferred = MODE4; \ + g_array_append_val (combinations, mode); \ + } \ + mode.preferred = MODE3; \ + g_array_append_val (combinations, mode); \ + } \ + mode.preferred = MODE2; \ + g_array_append_val (combinations, mode); \ + mode.preferred = MODE1; \ + g_array_append_val (combinations, mode); \ + } else { \ + mode.preferred = MM_MODEM_MODE_NONE; \ + g_array_append_val (combinations, mode); \ + } \ + } else { \ + mode.allowed = MODE1; \ + mode.preferred = MM_MODEM_MODE_NONE; \ + g_array_append_val (combinations, mode); \ + } \ + } while (0) + + if ((ctx->current_capabilities & MULTIMODE)) { + /* 2G-only, 3G-only */ + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_3G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); + } + + if (!(ctx->current_capabilities & MULTIMODE)) { + /* 4G-only */ + ADD_MODE_PREFERENCE (MM_MODEM_MODE_4G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); + } + + if ((ctx->current_capabilities & MULTIMODE)) { + /* 2G, 3G, 4G combinations */ + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_3G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_4G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_3G, MM_MODEM_MODE_4G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_3G, MM_MODEM_MODE_4G, MM_MODEM_MODE_NONE); + } + + /* 5G related mode combinations are only supported when NAS SSP is supported, + * as there is no 5G support in NAS TP. */ + if (ctx->nas_ssp_supported) { + if (!(ctx->current_capabilities & MULTIMODE)) { + ADD_MODE_PREFERENCE (MM_MODEM_MODE_5G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_4G, MM_MODEM_MODE_5G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); + } + if ((ctx->current_capabilities & MULTIMODE)) { + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_5G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_3G, MM_MODEM_MODE_5G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_3G, MM_MODEM_MODE_5G, MM_MODEM_MODE_NONE); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_4G, MM_MODEM_MODE_5G, MM_MODEM_MODE_NONE); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_3G, MM_MODEM_MODE_4G, MM_MODEM_MODE_5G, MM_MODEM_MODE_NONE); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_3G, MM_MODEM_MODE_4G, MM_MODEM_MODE_5G); + } + } + + /* Filter out unsupported modes */ + return mm_filter_supported_modes (all, combinations, log_object); +} + +/*****************************************************************************/ MMOmaSessionType mm_oma_session_type_from_qmi_oma_session_type (QmiOmaSessionType qmi_session_type) diff --git a/src/mm-modem-helpers-qmi.h b/src/mm-modem-helpers-qmi.h index 4d974d2a..fecefc6d 100644 --- a/src/mm-modem-helpers-qmi.h +++ b/src/mm-modem-helpers-qmi.h @@ -187,6 +187,23 @@ GArray *mm_supported_capabilities_from_qmi_supported_capabilities_context (MMQmi gpointer log_object); /*****************************************************************************/ +/* Utility to build list of supported modes from various sources */ + +typedef struct { + /* NAS System Selection Preference */ + gboolean nas_ssp_supported; + /* NAS Technology Preference */ + gboolean nas_tp_supported; + /* Mask with all supported modes */ + MMModemMode all; + /* Current Capabilities */ + MMModemCapability current_capabilities; +} MMQmiSupportedModesContext; + +GArray *mm_supported_modes_from_qmi_supported_modes_context (MMQmiSupportedModesContext *ctx, + gpointer log_object); + +/*****************************************************************************/ /* QMI unique id manipulation */ gchar *mm_qmi_unique_id_to_firmware_unique_id (GArray *qmi_unique_id, diff --git a/src/mm-shared-qmi.c b/src/mm-shared-qmi.c index 828137d4..088242aa 100644 --- a/src/mm-shared-qmi.c +++ b/src/mm-shared-qmi.c @@ -1678,14 +1678,11 @@ mm_shared_qmi_load_supported_modes (MMIfaceModem *self, GAsyncReadyCallback callback, gpointer user_data) { - GTask *task; - GArray *combinations; - MMModemModeCombination mode; - Private *priv; - MMModemMode mask_all; - guint i; - GArray *all; - GArray *filtered; + GTask *task; + Private *priv; + MMQmiSupportedModesContext ctx = { 0 }; + guint i; + GArray *combinations; task = g_task_new (self, NULL, callback, user_data); @@ -1694,99 +1691,16 @@ mm_shared_qmi_load_supported_modes (MMIfaceModem *self, g_assert (priv->current_capabilities); /* Build all, based on the supported radio interfaces */ - mask_all = MM_MODEM_MODE_NONE; + ctx.all = MM_MODEM_MODE_NONE; for (i = 0; i < priv->supported_radio_interfaces->len; i++) - mask_all |= mm_modem_mode_from_qmi_radio_interface (g_array_index (priv->supported_radio_interfaces, QmiDmsRadioInterface, i), self); - mode.allowed = mask_all; - mode.preferred = MM_MODEM_MODE_NONE; - all = g_array_sized_new (FALSE, FALSE, sizeof (MMModemModeCombination), 1); - g_array_append_val (all, mode); - - /* If SSP and TP are not supported, ignore supported mode management */ - if (priv->feature_nas_ssp == FEATURE_UNSUPPORTED && priv->feature_nas_tp == FEATURE_UNSUPPORTED) { - g_task_return_pointer (task, all, (GDestroyNotify) g_array_unref); - g_object_unref (task); - return; - } + ctx.all |= mm_modem_mode_from_qmi_radio_interface (g_array_index (priv->supported_radio_interfaces, QmiDmsRadioInterface, i), self); - combinations = g_array_new (FALSE, FALSE, sizeof (MMModemModeCombination)); - -#define ADD_MODE_PREFERENCE(MODE1, MODE2, MODE3, MODE4) do { \ - mode.allowed = MODE1; \ - if (MODE2 != MM_MODEM_MODE_NONE) { \ - mode.allowed |= MODE2; \ - if (MODE3 != MM_MODEM_MODE_NONE) { \ - mode.allowed |= MODE3; \ - if (MODE4 != MM_MODEM_MODE_NONE) \ - mode.allowed |= MODE4; \ - } \ - if (priv->feature_nas_ssp != FEATURE_UNSUPPORTED) { \ - if (MODE3 != MM_MODEM_MODE_NONE) { \ - if (MODE4 != MM_MODEM_MODE_NONE) { \ - mode.preferred = MODE4; \ - g_array_append_val (combinations, mode); \ - } \ - mode.preferred = MODE3; \ - g_array_append_val (combinations, mode); \ - } \ - mode.preferred = MODE2; \ - g_array_append_val (combinations, mode); \ - mode.preferred = MODE1; \ - g_array_append_val (combinations, mode); \ - } else { \ - mode.preferred = MM_MODEM_MODE_NONE; \ - g_array_append_val (combinations, mode); \ - } \ - } else { \ - mode.allowed = MODE1; \ - mode.preferred = MM_MODEM_MODE_NONE; \ - g_array_append_val (combinations, mode); \ - } \ - } while (0) -#define MULTIMODE (MM_MODEM_CAPABILITY_GSM_UMTS | MM_MODEM_CAPABILITY_CDMA_EVDO) - - if ((priv->current_capabilities & MULTIMODE)) { - /* 2G-only, 3G-only */ - ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); - ADD_MODE_PREFERENCE (MM_MODEM_MODE_3G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); - } - - if (!(priv->current_capabilities & MULTIMODE)) { - /* 4G-only */ - ADD_MODE_PREFERENCE (MM_MODEM_MODE_4G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); - } - - if ((priv->current_capabilities & MULTIMODE)) { - /* 2G, 3G, 4G combinations */ - ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_3G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); - ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_4G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); - ADD_MODE_PREFERENCE (MM_MODEM_MODE_3G, MM_MODEM_MODE_4G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); - ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_3G, MM_MODEM_MODE_4G, MM_MODEM_MODE_NONE); - } - - /* 5G related mode combinations are only supported when NAS SSP is supported, - * as there is no 5G support in NAS TP. */ - if (priv->feature_nas_ssp != FEATURE_UNSUPPORTED) { - if (!(priv->current_capabilities & MULTIMODE)) { - ADD_MODE_PREFERENCE (MM_MODEM_MODE_5G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); - ADD_MODE_PREFERENCE (MM_MODEM_MODE_4G, MM_MODEM_MODE_5G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); - } - if ((priv->current_capabilities & MULTIMODE)) { - ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_5G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); - ADD_MODE_PREFERENCE (MM_MODEM_MODE_3G, MM_MODEM_MODE_5G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE); - ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_3G, MM_MODEM_MODE_5G, MM_MODEM_MODE_NONE); - ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_4G, MM_MODEM_MODE_5G, MM_MODEM_MODE_NONE); - ADD_MODE_PREFERENCE (MM_MODEM_MODE_3G, MM_MODEM_MODE_4G, MM_MODEM_MODE_5G, MM_MODEM_MODE_NONE); - ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G, MM_MODEM_MODE_3G, MM_MODEM_MODE_4G, MM_MODEM_MODE_5G); - } - } - - /* Filter out unsupported modes */ - filtered = mm_filter_supported_modes (all, combinations, self); - g_array_unref (all); - g_array_unref (combinations); + ctx.nas_ssp_supported = (priv->feature_nas_ssp == FEATURE_SUPPORTED); + ctx.nas_tp_supported = (priv->feature_nas_tp == FEATURE_SUPPORTED); + ctx.current_capabilities = priv->current_capabilities; - g_task_return_pointer (task, filtered, (GDestroyNotify) g_array_unref); + combinations = mm_supported_modes_from_qmi_supported_modes_context (&ctx, self); + g_task_return_pointer (task, combinations, (GDestroyNotify) g_array_unref); g_object_unref (task); } |