aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mm-broadband-modem-mbim.c72
-rw-r--r--src/mm-modem-helpers-mbim.c36
-rw-r--r--src/mm-modem-helpers-mbim.h6
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 */