diff options
-rw-r--r-- | src/mm-broadband-modem-mbim.c | 72 | ||||
-rw-r--r-- | src/mm-modem-helpers-mbim.c | 36 | ||||
-rw-r--r-- | src/mm-modem-helpers-mbim.h | 6 |
3 files changed, 112 insertions, 2 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c index 3cdd1b49..c687009d 100644 --- a/src/mm-broadband-modem-mbim.c +++ b/src/mm-broadband-modem-mbim.c @@ -3709,6 +3709,76 @@ modem_3gpp_load_nr5g_registration_settings (MMIfaceModem3gpp *_self, } /*****************************************************************************/ +/* Set 5GNR registration settings */ + +static gboolean +modem_3gpp_set_nr5g_registration_settings_finish (MMIfaceModem3gpp *self, + GAsyncResult *res, + GError **error) +{ + return g_task_propagate_boolean (G_TASK (res), error); +} + +static void +set_nr5g_registration_settings_ready (MbimDevice *device, + GAsyncResult *res, + GTask *task) +{ + g_autoptr(MbimMessage) response = NULL; + GError *error = NULL; + + response = mbim_device_command_finish (device, res, &error); + if (!response || !mbim_message_response_get_result (response, MBIM_MESSAGE_TYPE_COMMAND_DONE, &error)) + g_task_return_error (task, error); + else + g_task_return_boolean (task, TRUE); + g_object_unref (task); +} + +static void +modem_3gpp_set_nr5g_registration_settings (MMIfaceModem3gpp *_self, + MMNr5gRegistrationSettings *settings, + GAsyncReadyCallback callback, + gpointer user_data) +{ + MMBroadbandModemMbim *self = MM_BROADBAND_MODEM_MBIM (_self); + GTask *task; + MbimDevice *device; + g_autoptr(MbimMessage) message = NULL; + MbimMicoMode mico_mode; + MbimDrxCycle drx_cycle; + + if (!peek_device (self, &device, callback, user_data)) + return; + + task = g_task_new (self, NULL, callback, user_data); + + if (!self->priv->is_nr5g_registration_settings_supported) { + g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED, + "5GNR registration settings are unsupported"); + g_object_unref (task); + return; + } + + mico_mode = mm_modem_3gpp_mico_mode_to_mbim_mico_mode (mm_nr5g_registration_settings_get_mico_mode (settings)); + drx_cycle = mm_modem_3gpp_drx_cycle_to_mbim_drx_cycle (mm_nr5g_registration_settings_get_drx_cycle (settings)); + + message = mbim_message_ms_basic_connect_extensions_v3_registration_parameters_set_new (mico_mode, + drx_cycle, + MBIM_LADN_INFO_NOT_NEEDED, + MBIM_DEFAULT_PDU_ACTIVATION_HINT_LIKELY, + TRUE, + NULL, /* unnamed ies */ + NULL); + mbim_device_command (device, + message, + 10, + NULL, + (GAsyncReadyCallback)set_nr5g_registration_settings_ready, + task); +} + +/*****************************************************************************/ /* Common unsolicited events setup and cleanup */ static void @@ -8333,6 +8403,8 @@ iface_modem_3gpp_init (MMIfaceModem3gpp *iface) iface->load_nr5g_registration_settings_finish = modem_3gpp_load_nr5g_registration_settings_finish; iface->set_initial_eps_bearer_settings = modem_3gpp_set_initial_eps_bearer_settings; iface->set_initial_eps_bearer_settings_finish = modem_3gpp_set_initial_eps_bearer_settings_finish; + iface->set_nr5g_registration_settings = modem_3gpp_set_nr5g_registration_settings; + iface->set_nr5g_registration_settings_finish = modem_3gpp_set_nr5g_registration_settings_finish; iface->run_registration_checks = modem_3gpp_run_registration_checks; iface->run_registration_checks_finish = modem_3gpp_run_registration_checks_finish; iface->register_in_network = modem_3gpp_register_in_network; diff --git a/src/mm-modem-helpers-mbim.c b/src/mm-modem-helpers-mbim.c index 563537ac..7502a82d 100644 --- a/src/mm-modem-helpers-mbim.c +++ b/src/mm-modem-helpers-mbim.c @@ -707,6 +707,22 @@ mm_modem_3gpp_mico_mode_from_mbim_mico_mode (MbimMicoMode mico_mode) } } +MbimMicoMode +mm_modem_3gpp_mico_mode_to_mbim_mico_mode (MMModem3gppMicoMode mico_mode) +{ + switch (mico_mode) { + case MM_MODEM_3GPP_MICO_MODE_DISABLED: + return MBIM_MICO_MODE_DISABLED; + case MM_MODEM_3GPP_MICO_MODE_ENABLED: + return MBIM_MICO_MODE_ENABLED; + case MM_MODEM_3GPP_MICO_MODE_UNSUPPORTED: + return MBIM_MICO_MODE_UNSUPPORTED; + case MM_MODEM_3GPP_MICO_MODE_UNKNOWN: + default: + return MBIM_MICO_MODE_DEFAULT; + } +} + MMModem3gppDrxCycle mm_modem_3gpp_drx_cycle_from_mbim_drx_cycle (MbimDrxCycle drx_cycle) { @@ -727,6 +743,26 @@ mm_modem_3gpp_drx_cycle_from_mbim_drx_cycle (MbimDrxCycle drx_cycle) } } +MbimDrxCycle +mm_modem_3gpp_drx_cycle_to_mbim_drx_cycle (MMModem3gppDrxCycle drx_cycle) +{ + switch (drx_cycle) { + case MM_MODEM_3GPP_DRX_CYCLE_UNSUPPORTED: + return MBIM_DRX_CYCLE_NOT_SUPPORTED; + case MM_MODEM_3GPP_DRX_CYCLE_32: + return MBIM_DRX_CYCLE_32; + case MM_MODEM_3GPP_DRX_CYCLE_64: + return MBIM_DRX_CYCLE_64; + case MM_MODEM_3GPP_DRX_CYCLE_128: + return MBIM_DRX_CYCLE_128; + case MM_MODEM_3GPP_DRX_CYCLE_256: + return MBIM_DRX_CYCLE_256; + case MM_MODEM_3GPP_DRX_CYCLE_UNKNOWN: + default: + return MBIM_DRX_CYCLE_NOT_SPECIFIED; + } +} + /*****************************************************************************/ MMSmsState diff --git a/src/mm-modem-helpers-mbim.h b/src/mm-modem-helpers-mbim.h index da5d45dd..909d0186 100644 --- a/src/mm-modem-helpers-mbim.h +++ b/src/mm-modem-helpers-mbim.h @@ -84,8 +84,10 @@ gboolean mm_signal_snr_from_coded_value (guint coded_value, gdouble *out_snr, GError **error); -MMModem3gppMicoMode mm_modem_3gpp_mico_mode_from_mbim_mico_mode (MbimMicoMode mico_mode); -MMModem3gppDrxCycle mm_modem_3gpp_drx_cycle_from_mbim_drx_cycle (MbimDrxCycle drx_cycle); +MMModem3gppMicoMode mm_modem_3gpp_mico_mode_from_mbim_mico_mode (MbimMicoMode mico_mode); +MbimMicoMode mm_modem_3gpp_mico_mode_to_mbim_mico_mode (MMModem3gppMicoMode mico_mode); +MMModem3gppDrxCycle mm_modem_3gpp_drx_cycle_from_mbim_drx_cycle (MbimDrxCycle drx_cycle); +MbimDrxCycle mm_modem_3gpp_drx_cycle_to_mbim_drx_cycle (MMModem3gppDrxCycle drx_cycle); /*****************************************************************************/ /* MBIM/SMS to MM translations */ |