From 78508b7dcea158c3e54386f8bfdaf0fd855ea169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stig=20M=2E=20Baugst=C3=B8?= <1129097-stigma@users.noreply.gitlab.freedesktop.org> Date: Wed, 23 Oct 2024 17:10:31 +0200 Subject: [PATCH] bearer-qmi: add udev device tag ID_MM_QMI_PCO_DISABLED to disable PCO MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Some modems like the Qualcomm-based Cellient MPL200 and SimTech SIM7100E will crash some time after requesting operator reserved PCO. The new udev tag ID_MM_QMI_PCO_DISABLED disables the PCO settings request when set, indirectly disabling PCO. Signed-off-by: Stig M. Baugstø <1129097-stigma@users.noreply.gitlab.freedesktop.org> --- src/mm-bearer-qmi.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/mm-bearer-qmi.c b/src/mm-bearer-qmi.c index 4e64e220..0918c05f 100644 --- a/src/mm-bearer-qmi.c +++ b/src/mm-bearer-qmi.c @@ -1103,10 +1103,12 @@ get_current_settings_ready (QmiClientWds *client, static void get_current_settings (GTask *task, QmiClientWds *client) { - ConnectContext *ctx; - QmiMessageWdsGetCurrentSettingsInput *input; - QmiWdsRequestedSettings requested; + MMBearerQmi *self; + ConnectContext *ctx; + QmiMessageWdsGetCurrentSettingsInput *input; + QmiWdsRequestedSettings requested; + self = g_task_get_source_object (task); ctx = g_task_get_task_data (task); g_assert (ctx->running_ipv4 || ctx->running_ipv6); @@ -1116,8 +1118,15 @@ get_current_settings (GTask *task, QmiClientWds *client) QMI_WDS_REQUESTED_SETTINGS_GATEWAY_INFO | QMI_WDS_REQUESTED_SETTINGS_MTU | QMI_WDS_REQUESTED_SETTINGS_DOMAIN_NAME_LIST | - QMI_WDS_REQUESTED_SETTINGS_IP_FAMILY | - QMI_WDS_REQUESTED_SETTINGS_OPERATOR_RESERVED_PCO; + QMI_WDS_REQUESTED_SETTINGS_IP_FAMILY; + + /* Modems like Qualcomm MPL200 and SimTech SIM7100E eventually crash when enabling PCO. + * Avoid crashing by skip registering for PCO */ + if (!mm_kernel_device_get_global_property_as_boolean (mm_port_peek_kernel_device (MM_PORT (ctx->qmi)), + "ID_MM_QMI_PCO_DISABLED")) { + mm_obj_dbg (self, "Requesting QMI WDS Operator Reserved PCO"); + requested |= QMI_WDS_REQUESTED_SETTINGS_OPERATOR_RESERVED_PCO; + } input = qmi_message_wds_get_current_settings_input_new (); qmi_message_wds_get_current_settings_input_set_requested_settings (input, requested, NULL);