diff options
author | Aleksander Morgado <aleksander@aleksander.es> | 2021-10-17 18:31:35 +0200 |
---|---|---|
committer | Aleksander Morgado <aleksander@aleksander.es> | 2021-10-19 08:27:23 +0000 |
commit | 0fbcf8ddc1a6630798148c082bc4fdef53849af4 (patch) | |
tree | 5fcf80234cb840b91eb76346796b6d7ae0db7577 | |
parent | 316c91da0a19bfb92a97ea77a332bd32a37f7fce (diff) |
broadband-modem-mbim: add 5G support to supported modes loading
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 136 | ||||
-rw-r--r-- | src/mm-modem-helpers-mbim.c | 20 |
2 files changed, 98 insertions, 58 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 249af620..c3582b28 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -890,24 +890,26 @@ modem_load_device_identifier (MMIfaceModem *self, /* Supported modes loading (Modem interface) */ static GArray * -modem_load_supported_modes_finish (MMIfaceModem *self, - GAsyncResult *res, - GError **error) +modem_load_supported_modes_finish (MMIfaceModem *self, + GAsyncResult *res, + GError **error) { -#if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED - if (MM_BROADBAND_MODEM_MBIM (self)->priv->qmi_capability_and_mode_switching) - return mm_shared_qmi_load_supported_modes_finish (self, res, error); -#endif return g_task_propagate_pointer (G_TASK (res), error); } static void -load_supported_modes_mbim (GTask *task) +load_supported_modes_mbim (GTask *task, + MbimDevice *device) { MMBroadbandModemMbim *self; - MMModemModeCombination mode; - MMModemMode all; - GArray *supported; + GArray *all; + GArray *combinations; + GArray *filtered; + MMModemMode mask_all; + MMModemModeCombination mode = { + .allowed = MM_MODEM_MODE_NONE, + .preferred = MM_MODEM_MODE_NONE, + }; self = g_task_get_source_object (task); @@ -920,60 +922,98 @@ load_supported_modes_mbim (GTask *task) return; } - all = 0; - - /* 3GPP... */ - if (self->priv->caps_data_class & (MBIM_DATA_CLASS_GPRS | - MBIM_DATA_CLASS_EDGE)) - all |= MM_MODEM_MODE_2G; - if (self->priv->caps_data_class & (MBIM_DATA_CLASS_UMTS | - MBIM_DATA_CLASS_HSDPA | - MBIM_DATA_CLASS_HSUPA)) - all |= MM_MODEM_MODE_3G; - if (self->priv->caps_data_class & MBIM_DATA_CLASS_LTE) - all |= MM_MODEM_MODE_4G; - if (self->priv->caps_data_class & (MBIM_DATA_CLASS_5G_NSA | - MBIM_DATA_CLASS_5G_SA)) - all |= MM_MODEM_MODE_5G; - - /* 3GPP2... */ - if (self->priv->caps_data_class & MBIM_DATA_CLASS_1XRTT) - all |= MM_MODEM_MODE_2G; - if (self->priv->caps_data_class & (MBIM_DATA_CLASS_1XEVDO | - MBIM_DATA_CLASS_1XEVDO_REVA | - MBIM_DATA_CLASS_1XEVDV | - MBIM_DATA_CLASS_3XRTT | - MBIM_DATA_CLASS_1XEVDO_REVB)) - all |= MM_MODEM_MODE_3G; - if (self->priv->caps_data_class & MBIM_DATA_CLASS_UMB) - all |= MM_MODEM_MODE_4G; - - /* Build a mask with all supported modes */ - supported = g_array_sized_new (FALSE, FALSE, sizeof (MMModemModeCombination), 1); - mode.allowed = all; + /* Build all */ + mask_all = mm_modem_mode_from_mbim_data_class (self->priv->caps_data_class); + mode.allowed = mask_all; mode.preferred = MM_MODEM_MODE_NONE; - g_array_append_val (supported, mode); + all = g_array_sized_new (FALSE, FALSE, sizeof (MMModemModeCombination), 1); + g_array_append_val (all, mode); + + combinations = g_array_new (FALSE, FALSE, sizeof (MMModemModeCombination)); + + /* When using MBIMEx we can enable the mode switching operation because + * we'll be able to know if the modes requested are the ones configured + * as preferred after the operation. */ + if (mbim_device_check_ms_mbimex_version (device, 2, 0)) { +#define ADD_MODE_PREFERENCE(MODE_MASK) do { \ + mode.allowed = MODE_MASK; \ + mode.preferred = MM_MODEM_MODE_NONE; \ + g_array_append_val (combinations, mode); \ + } while (0) + + /* 2G, 3G */ + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_3G); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G | MM_MODEM_MODE_3G); + + /* +4G */ + ADD_MODE_PREFERENCE (MM_MODEM_MODE_4G); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G | MM_MODEM_MODE_4G); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_3G | MM_MODEM_MODE_4G); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G | MM_MODEM_MODE_3G | MM_MODEM_MODE_4G); + + /* +5G */ + ADD_MODE_PREFERENCE (MM_MODEM_MODE_5G); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G | MM_MODEM_MODE_5G); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_3G | MM_MODEM_MODE_5G); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_4G | MM_MODEM_MODE_5G); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G | MM_MODEM_MODE_3G | MM_MODEM_MODE_5G); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G | MM_MODEM_MODE_4G | MM_MODEM_MODE_5G); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_3G | MM_MODEM_MODE_4G | MM_MODEM_MODE_5G); + ADD_MODE_PREFERENCE (MM_MODEM_MODE_2G | MM_MODEM_MODE_3G | MM_MODEM_MODE_4G | MM_MODEM_MODE_5G); + + filtered = mm_filter_supported_modes (all, combinations, self); + g_array_unref (combinations); + g_array_unref (all); +#undef ADD_MODE_PREFERENCE + } else + filtered = all; - g_task_return_pointer (task, supported, (GDestroyNotify) g_array_unref); + g_task_return_pointer (task, filtered, (GDestroyNotify)g_array_unref); g_object_unref (task); } +#if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED + +static void +shared_qmi_load_supported_modes_ready (MMIfaceModem *self, + GAsyncResult *res, + GTask *task) +{ + GArray *combinations; + GError *error = NULL; + + combinations = mm_shared_qmi_load_supported_modes_finish (self, res, &error); + if (!combinations) + g_task_return_error (task, error); + else + g_task_return_pointer (task, combinations, (GDestroyNotify)g_array_unref); + g_object_unref (task); +} + +#endif + static void modem_load_supported_modes (MMIfaceModem *self, GAsyncReadyCallback callback, gpointer user_data) { - GTask *task; + GTask *task; + MbimDevice *device; + + if (!peek_device (self, &device, callback, user_data)) + return; + + task = g_task_new (self, NULL, callback, user_data); #if defined WITH_QMI && QMI_MBIM_QMUX_SUPPORTED if (MM_BROADBAND_MODEM_MBIM (self)->priv->qmi_capability_and_mode_switching) { - mm_shared_qmi_load_supported_modes (self, callback, user_data); + mm_shared_qmi_load_supported_modes (self, (GAsyncReadyCallback)shared_qmi_load_supported_modes_ready, task); return; } #endif - task = g_task_new (self, NULL, callback, user_data); - load_supported_modes_mbim (task); + load_supported_modes_mbim (task, device); } /*****************************************************************************/ diff --git a/src/mm-modem-helpers-mbim.c b/src/mm-modem-helpers-mbim.c index c6946760..8157f9f6 100644 --- a/src/mm-modem-helpers-mbim.c +++ b/src/mm-modem-helpers-mbim.c @@ -143,16 +143,16 @@ mm_modem_mode_from_mbim_data_class (MbimDataClass data_class) mask |= MM_MODEM_MODE_5G; /* 3GPP2... */ - if (self->priv->caps_data_class & MBIM_DATA_CLASS_1XRTT) - all |= MM_MODEM_MODE_2G; - if (self->priv->caps_data_class & (MBIM_DATA_CLASS_1XEVDO | - MBIM_DATA_CLASS_1XEVDO_REVA | - MBIM_DATA_CLASS_1XEVDV | - MBIM_DATA_CLASS_3XRTT | - MBIM_DATA_CLASS_1XEVDO_REVB)) - all |= MM_MODEM_MODE_3G; - if (self->priv->caps_data_class & MBIM_DATA_CLASS_UMB) - all |= MM_MODEM_MODE_4G; + if (data_class & MBIM_DATA_CLASS_1XRTT) + mask |= MM_MODEM_MODE_2G; + if (data_class & (MBIM_DATA_CLASS_1XEVDO | + MBIM_DATA_CLASS_1XEVDO_REVA | + MBIM_DATA_CLASS_1XEVDV | + MBIM_DATA_CLASS_3XRTT | + MBIM_DATA_CLASS_1XEVDO_REVB)) + mask |= MM_MODEM_MODE_3G; + if (data_class & MBIM_DATA_CLASS_UMB) + mask |= MM_MODEM_MODE_4G; return mask; } |