aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-iface-modem.c16
-rw-r--r--src/mm-iface-modem.h2
-rw-r--r--src/mm-modem-helpers-qmi.c15
-rw-r--r--src/mm-modem-helpers.c41
4 files changed, 63 insertions, 11 deletions
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
index c9f5c174..a39fd001 100644
--- a/src/mm-iface-modem.c
+++ b/src/mm-iface-modem.c
@@ -5515,6 +5515,22 @@ mm_iface_modem_is_4g_only (MMIfaceModem *self)
FALSE);
}
+gboolean
+mm_iface_modem_is_5g (MMIfaceModem *self)
+{
+ return find_supported_mode (self, MM_MODEM_MODE_5G, NULL);
+}
+
+gboolean
+mm_iface_modem_is_5g_only (MMIfaceModem *self)
+{
+ gboolean only;
+
+ return (find_supported_mode (self, MM_MODEM_MODE_5G, &only) ?
+ only :
+ FALSE);
+}
+
/*****************************************************************************/
MMModemCapability
diff --git a/src/mm-iface-modem.h b/src/mm-iface-modem.h
index 4cb68608..13be87ad 100644
--- a/src/mm-iface-modem.h
+++ b/src/mm-iface-modem.h
@@ -402,6 +402,8 @@ gboolean mm_iface_modem_is_3g (MMIfaceModem *self);
gboolean mm_iface_modem_is_3g_only (MMIfaceModem *self);
gboolean mm_iface_modem_is_4g (MMIfaceModem *self);
gboolean mm_iface_modem_is_4g_only (MMIfaceModem *self);
+gboolean mm_iface_modem_is_5g (MMIfaceModem *self);
+gboolean mm_iface_modem_is_5g_only (MMIfaceModem *self);
/* Helpers to query properties */
const gchar *mm_iface_modem_get_model (MMIfaceModem *self);
diff --git a/src/mm-modem-helpers-qmi.c b/src/mm-modem-helpers-qmi.c
index d735c0d4..1ac3bd3f 100644
--- a/src/mm-modem-helpers-qmi.c
+++ b/src/mm-modem-helpers-qmi.c
@@ -975,6 +975,9 @@ mm_modem_mode_from_qmi_rat_mode_preference (QmiNasRatModePreference qmi)
if (qmi & QMI_NAS_RAT_MODE_PREFERENCE_LTE)
mode |= MM_MODEM_MODE_4G;
+ if (qmi & QMI_NAS_RAT_MODE_PREFERENCE_5GNR)
+ mode |= MM_MODEM_MODE_5G;
+
return mode;
}
@@ -1002,6 +1005,9 @@ mm_modem_mode_to_qmi_rat_mode_preference (MMModemMode mode,
if (mode & MM_MODEM_MODE_4G)
pref |= QMI_NAS_RAT_MODE_PREFERENCE_LTE;
+
+ if (mode & MM_MODEM_MODE_5G)
+ pref |= QMI_NAS_RAT_MODE_PREFERENCE_5GNR;
}
return pref;
@@ -1107,6 +1113,14 @@ mm_modem_mode_to_qmi_acquisition_order_preference (MMModemMode allowed,
array = g_array_new (FALSE, FALSE, sizeof (QmiNasRadioInterface));
+ if (allowed & MM_MODEM_MODE_5G) {
+ value = QMI_NAS_RADIO_INTERFACE_5GNR;
+ if (preferred == MM_MODEM_MODE_5G)
+ g_array_prepend_val (array, value);
+ else
+ g_array_append_val (array, value);
+ }
+
if (allowed & MM_MODEM_MODE_4G) {
value = QMI_NAS_RADIO_INTERFACE_LTE;
if (preferred == MM_MODEM_MODE_4G)
@@ -1300,6 +1314,7 @@ mm_modem_mode_to_qmi_gsm_wcdma_acquisition_order_preference (MMModemMode mode,
return QMI_NAS_GSM_WCDMA_ACQUISITION_ORDER_PREFERENCE_AUTOMATIC;
case MM_MODEM_MODE_CS:
case MM_MODEM_MODE_4G:
+ case MM_MODEM_MODE_5G:
case MM_MODEM_MODE_ANY:
default:
break;
diff --git a/src/mm-modem-helpers.c b/src/mm-modem-helpers.c
index e12a26b7..940ca40a 100644
--- a/src/mm-modem-helpers.c
+++ b/src/mm-modem-helpers.c
@@ -1047,22 +1047,38 @@ typedef struct {
MMModemMode mode;
} Ws46Mode;
-/* 3GPP TS 27.007 r14, section 5.9: select wireless network +WS46 */
+/* 3GPP TS 27.007 v16.3.0, section 5.9: select wireless network +WS46 */
static const Ws46Mode ws46_modes[] = {
/* GSM Digital Cellular Systems (GERAN only) */
{ 12, MM_MODEM_MODE_2G },
/* UTRAN only */
{ 22, MM_MODEM_MODE_3G },
/* 3GPP Systems (GERAN, UTRAN and E-UTRAN) */
- { 25, MM_MODEM_MODE_ANY },
+ { 25, MM_MODEM_MODE_2G | MM_MODEM_MODE_3G | MM_MODEM_MODE_4G },
/* E-UTRAN only */
{ 28, MM_MODEM_MODE_4G },
/* GERAN and UTRAN */
{ 29, MM_MODEM_MODE_2G | MM_MODEM_MODE_3G },
/* GERAN and E-UTRAN */
{ 30, MM_MODEM_MODE_2G | MM_MODEM_MODE_4G },
- /* UERAN and E-UTRAN */
+ /* UTRAN and E-UTRAN */
{ 31, MM_MODEM_MODE_3G | MM_MODEM_MODE_4G },
+ /* GERAN, UTRAN, E-UTRAN and NG-RAN */
+ { 35, MM_MODEM_MODE_2G | MM_MODEM_MODE_3G | MM_MODEM_MODE_4G | MM_MODEM_MODE_5G },
+ /* NG-RAN only */
+ { 36, MM_MODEM_MODE_5G },
+ /* E-UTRAN and NG-RAN */
+ { 37, MM_MODEM_MODE_4G | MM_MODEM_MODE_5G },
+ /* UTRAN, E-UTRAN and NG-RAN */
+ { 38, MM_MODEM_MODE_3G | MM_MODEM_MODE_4G | MM_MODEM_MODE_5G },
+ /* GERAN, E-UTRAN and NG-RAN */
+ { 39, MM_MODEM_MODE_2G | MM_MODEM_MODE_4G | MM_MODEM_MODE_5G },
+ /* UTRAN and NG-RAN */
+ { 40, MM_MODEM_MODE_3G | MM_MODEM_MODE_5G },
+ /* GERAN, UTRAN and NG-RAN */
+ { 41, MM_MODEM_MODE_2G | MM_MODEM_MODE_3G | MM_MODEM_MODE_5G },
+ /* GERAN and NG-RAN */
+ { 42, MM_MODEM_MODE_2G | MM_MODEM_MODE_5G },
};
GArray *
@@ -1078,6 +1094,7 @@ mm_3gpp_parse_ws46_test_response (const gchar *response,
guint val;
guint i;
guint j;
+ gboolean supported_5g = FALSE;
gboolean supported_4g = FALSE;
gboolean supported_3g = FALSE;
gboolean supported_2g = FALSE;
@@ -1109,14 +1126,14 @@ mm_3gpp_parse_ws46_test_response (const gchar *response,
for (j = 0; j < G_N_ELEMENTS (ws46_modes); j++) {
if (ws46_modes[j].ws46 == val) {
- if (val != 25) {
- if (ws46_modes[j].mode & MM_MODEM_MODE_4G)
- supported_4g = TRUE;
- if (ws46_modes[j].mode & MM_MODEM_MODE_3G)
- supported_3g = TRUE;
- if (ws46_modes[j].mode & MM_MODEM_MODE_2G)
- supported_2g = TRUE;
- }
+ if (ws46_modes[j].mode & MM_MODEM_MODE_5G)
+ supported_5g = TRUE;
+ if (ws46_modes[j].mode & MM_MODEM_MODE_4G)
+ supported_4g = TRUE;
+ if (ws46_modes[j].mode & MM_MODEM_MODE_3G)
+ supported_3g = TRUE;
+ if (ws46_modes[j].mode & MM_MODEM_MODE_2G)
+ supported_2g = TRUE;
g_array_append_val (modes, ws46_modes[j].mode);
break;
}
@@ -1145,6 +1162,8 @@ mm_3gpp_parse_ws46_test_response (const gchar *response,
*mode |= MM_MODEM_MODE_3G;
if (supported_4g)
*mode |= MM_MODEM_MODE_4G;
+ if (supported_5g)
+ *mode |= MM_MODEM_MODE_5G;
if (*mode == 0) {
inner_error = g_error_new (MM_CORE_ERROR, MM_CORE_ERROR_FAILED, "No way to fixup the ANY value");