diff options
Diffstat (limited to 'src/mm-modem-helpers-qmi.c')
-rw-r--r-- | src/mm-modem-helpers-qmi.c | 131 |
1 files changed, 125 insertions, 6 deletions
diff --git a/src/mm-modem-helpers-qmi.c b/src/mm-modem-helpers-qmi.c index ccc2a912..5df34478 100644 --- a/src/mm-modem-helpers-qmi.c +++ b/src/mm-modem-helpers-qmi.c @@ -754,6 +754,25 @@ mm_modem_access_technologies_from_qmi_data_capability_array (GArray *data_capabi /*****************************************************************************/ MMModemMode +mm_modem_mode_from_qmi_nas_radio_interface (QmiNasRadioInterface iface) +{ + switch (iface) { + case QMI_NAS_RADIO_INTERFACE_CDMA_1X: + case QMI_NAS_RADIO_INTERFACE_GSM: + return MM_MODEM_MODE_2G; + case QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO: + case QMI_NAS_RADIO_INTERFACE_UMTS: + return MM_MODEM_MODE_3G; + case QMI_NAS_RADIO_INTERFACE_LTE: + return MM_MODEM_MODE_4G; + default: + return MM_MODEM_MODE_NONE; + } +} + +/*****************************************************************************/ + +MMModemMode mm_modem_mode_from_qmi_radio_technology_preference (QmiNasRadioTechnologyPreference qmi) { MMModemMode mode = MM_MODEM_MODE_NONE; @@ -909,6 +928,94 @@ mm_modem_capability_to_qmi_rat_mode_preference (MMModemCapability caps) /*****************************************************************************/ +GArray * +mm_modem_capability_to_qmi_acquisition_order_preference (MMModemCapability caps) +{ + GArray *array; + QmiNasRadioInterface value; + + array = g_array_new (FALSE, FALSE, sizeof (QmiNasRadioInterface)); + + if (caps & MM_MODEM_CAPABILITY_LTE) { + value = QMI_NAS_RADIO_INTERFACE_LTE; + g_array_append_val (array, value); + } + + if (caps & MM_MODEM_CAPABILITY_GSM_UMTS) { + value = QMI_NAS_RADIO_INTERFACE_UMTS; + g_array_append_val (array, value); + value = QMI_NAS_RADIO_INTERFACE_GSM; + g_array_append_val (array, value); + } + + if (caps & MM_MODEM_CAPABILITY_CDMA_EVDO) { + value = QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO; + g_array_append_val (array, value); + value = QMI_NAS_RADIO_INTERFACE_CDMA_1X; + g_array_append_val (array, value); + } + + return array; +} + +GArray * +mm_modem_mode_to_qmi_acquisition_order_preference (MMModemMode allowed, + MMModemMode preferred, + gboolean is_cdma, + gboolean is_3gpp) +{ + GArray *array; + QmiNasRadioInterface value; + + array = g_array_new (FALSE, FALSE, sizeof (QmiNasRadioInterface)); + + if (allowed & MM_MODEM_MODE_4G) { + value = QMI_NAS_RADIO_INTERFACE_LTE; + if (preferred == MM_MODEM_MODE_4G) + g_array_prepend_val (array, value); + else + g_array_append_val (array, value); + } + + if (allowed & MM_MODEM_MODE_3G) { + if (is_cdma) { + value = QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO; + if (preferred == MM_MODEM_MODE_3G) + g_array_prepend_val (array, value); + else + g_array_append_val (array, value); + } + if (is_3gpp) { + value = QMI_NAS_RADIO_INTERFACE_UMTS; + if (preferred == MM_MODEM_MODE_3G) + g_array_prepend_val (array, value); + else + g_array_append_val (array, value); + } + } + + if (allowed & MM_MODEM_MODE_2G) { + if (is_cdma) { + value = QMI_NAS_RADIO_INTERFACE_CDMA_1X; + if (preferred == MM_MODEM_MODE_2G) + g_array_prepend_val (array, value); + else + g_array_append_val (array, value); + } + if (is_3gpp) { + value = QMI_NAS_RADIO_INTERFACE_GSM; + if (preferred == MM_MODEM_MODE_2G) + g_array_prepend_val (array, value); + else + g_array_append_val (array, value); + } + } + + return array; +} + +/*****************************************************************************/ + MMModemCapability mm_modem_capability_from_qmi_radio_technology_preference (QmiNasRadioTechnologyPreference qmi) { @@ -1200,6 +1307,15 @@ mm_bearer_allowed_auth_to_qmi_authentication (MMBearerAllowedAuth auth) /*****************************************************************************/ +/** + * The only case where we need to apply some logic to decide what the current + * capabilities are is when we have a multimode CDMA/EVDO+GSM/UMTS device, in + * which case we'll check the SSP and TP current values to decide which + * capabilities are present and which have been disabled. + * + * For all the other cases, the DMS capabilities are exactly the current ones, + * as there would be no capability switching support. + */ MMModemCapability mm_modem_capability_from_qmi_capabilities_context (MMQmiCapabilitiesContext *ctx) { @@ -1209,16 +1325,19 @@ mm_modem_capability_from_qmi_capabilities_context (MMQmiCapabilitiesContext *ctx gchar *dms_capabilities_str; gchar *tmp_str; - /* SSP logic to gather capabilities uses the Mode Preference TLV if available, - * and if not available it falls back to using Band Preference TLVs */ + /* If not a multimode device, we're done */ +#define MULTIMODE (MM_MODEM_CAPABILITY_GSM_UMTS | MM_MODEM_CAPABILITY_CDMA_EVDO) + if ((ctx->dms_capabilities & MULTIMODE) != MULTIMODE) + return ctx->dms_capabilities; + + /* We have a multimode CDMA/EVDO+GSM/UMTS device, check SSP and TP */ + + /* SSP logic to gather capabilities uses the Mode Preference TLV if available */ if (ctx->nas_ssp_mode_preference_mask) tmp = mm_modem_capability_from_qmi_rat_mode_preference (ctx->nas_ssp_mode_preference_mask); - /* If no value retrieved from SSP, check TP. We only process TP * values if not 'auto'. */ - if ( tmp == MM_MODEM_CAPABILITY_NONE - && ctx->nas_tp_mask - && ctx->nas_tp_mask != QMI_NAS_RADIO_TECHNOLOGY_PREFERENCE_AUTO) + else if (ctx->nas_tp_mask && (ctx->nas_tp_mask != QMI_NAS_RADIO_TECHNOLOGY_PREFERENCE_AUTO)) tmp = mm_modem_capability_from_qmi_radio_technology_preference (ctx->nas_tp_mask); /* Final capabilities are the intersection between the Technology |