aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-shared-qmi.c111
1 files changed, 53 insertions, 58 deletions
diff --git a/src/mm-shared-qmi.c b/src/mm-shared-qmi.c
index 982bfd0b..1b18719a 100644
--- a/src/mm-shared-qmi.c
+++ b/src/mm-shared-qmi.c
@@ -1557,73 +1557,68 @@ mm_shared_qmi_load_supported_modes (MMIfaceModem *self,
return;
}
- combinations = g_array_sized_new (FALSE, FALSE, sizeof (MMModemModeCombination), 5);
+ 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_system_selection_preference != 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)
/* 2G-only, 3G-only */
- mode.allowed = MM_MODEM_MODE_2G;
- mode.preferred = MM_MODEM_MODE_NONE;
- g_array_append_val (combinations, mode);
- mode.allowed = MM_MODEM_MODE_3G;
- mode.preferred = MM_MODEM_MODE_NONE;
- g_array_append_val (combinations, mode);
+ 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);
/* 4G-only mode is not possible in multimode GSM/UMTS+CDMA/EVDO+LTE
* devices. This configuration may be selected as "LTE only" capability
* instead. */
- if (!priv->disable_4g_only_mode) {
- mode.allowed = MM_MODEM_MODE_4G;
- mode.preferred = MM_MODEM_MODE_NONE;
- g_array_append_val (combinations, mode);
- }
+ if (!priv->disable_4g_only_mode)
+ ADD_MODE_PREFERENCE (MM_MODEM_MODE_4G, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE, MM_MODEM_MODE_NONE);
- /* 2G+3G */
- mode.allowed = (MM_MODEM_MODE_2G | MM_MODEM_MODE_3G);
- if (priv->feature_nas_system_selection_preference != FEATURE_UNSUPPORTED) {
- mode.preferred = MM_MODEM_MODE_3G;
- g_array_append_val (combinations, mode);
- mode.preferred = MM_MODEM_MODE_2G;
- g_array_append_val (combinations, mode);
- } else {
- mode.preferred = MM_MODEM_MODE_NONE;
- g_array_append_val (combinations, mode);
- }
+ /* 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);
- /* 2G+4G */
- mode.allowed = (MM_MODEM_MODE_2G | MM_MODEM_MODE_4G);
+ /* 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_system_selection_preference != FEATURE_UNSUPPORTED) {
- mode.preferred = MM_MODEM_MODE_4G;
- g_array_append_val (combinations, mode);
- mode.preferred = MM_MODEM_MODE_2G;
- g_array_append_val (combinations, mode);
- } else {
- mode.preferred = MM_MODEM_MODE_NONE;
- g_array_append_val (combinations, mode);
- }
-
- /* 3G+4G */
- mode.allowed = (MM_MODEM_MODE_3G | MM_MODEM_MODE_4G);
- if (priv->feature_nas_system_selection_preference != FEATURE_UNSUPPORTED) {
- mode.preferred = MM_MODEM_MODE_3G;
- g_array_append_val (combinations, mode);
- mode.preferred = MM_MODEM_MODE_4G;
- g_array_append_val (combinations, mode);
- } else {
- mode.preferred = MM_MODEM_MODE_NONE;
- g_array_append_val (combinations, mode);
- }
-
- /* 2G+3G+4G */
- mode.allowed = (MM_MODEM_MODE_2G | MM_MODEM_MODE_3G | MM_MODEM_MODE_4G);
- if (priv->feature_nas_system_selection_preference != FEATURE_UNSUPPORTED) {
- mode.preferred = MM_MODEM_MODE_4G;
- g_array_append_val (combinations, mode);
- mode.preferred = MM_MODEM_MODE_3G;
- g_array_append_val (combinations, mode);
- mode.preferred = MM_MODEM_MODE_2G;
- g_array_append_val (combinations, mode);
- } else {
- mode.preferred = MM_MODEM_MODE_NONE;
- g_array_append_val (combinations, mode);
+ 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_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_4G, 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 */