From 912e8578319d125f6f997bc7fe240dda6f5dbd12 Mon Sep 17 00:00:00 2001 From: "Maciej S. Szmigiero" Date: Sat, 11 Jan 2025 14:33:21 +0100 Subject: [PATCH] shared-xmm: keep GPS port open if GPS is enabled We need to keep GPS port open if would not be kept open otherwise (like it is the case with a locked/non-enabled modem). Otherwise: * While GPS can be enabled in that modem state the traces don't reach MM API consumers since nothing is servicing the serial port. * Once modem actually gets enabled the queued GPS output in the modem serial port floods the main port and often confuses the init sequence. We also have to make sure that we don't stop GPS during the init sequence if it is supposed to be running, otherwise there will be the same issue as commit d3a2aebf16ac ("mbm: don't stop GPS interface on reinitialization if it should be running") fixed for mbm. Signed-off-by: Maciej S. Szmigiero --- src/plugins/xmm/mm-shared-xmm.c | 31 +++++++++++++++++++++++++++++-- 1 file changed, 29 insertions(+), 2 deletions(-) diff --git a/src/plugins/xmm/mm-shared-xmm.c b/src/plugins/xmm/mm-shared-xmm.c index d63cf1b6..0142f404 100644 --- a/src/plugins/xmm/mm-shared-xmm.c +++ b/src/plugins/xmm/mm-shared-xmm.c @@ -64,6 +64,7 @@ typedef struct { MMModemLocationSource enabled_sources; GpsEngineState gps_engine_state; MMPortSerialAt *gps_port; + gboolean gps_port_open; GRegex *xlsrstop_regex; GRegex *nmea_regex; @@ -75,6 +76,13 @@ static void private_free (Private *priv) { g_assert (!priv->pending_gps_engine_stop_task); + + if (priv->gps_port_open) { + g_assert (priv->gps_port); + mm_port_serial_close (MM_PORT_SERIAL (priv->gps_port)); + priv->gps_port_open = FALSE; + } + g_clear_object (&priv->gps_port); if (priv->supported_modes) g_array_unref (priv->supported_modes); @@ -1029,6 +1037,7 @@ xlcslsr_ready (MMBaseModem *self, const gchar *response; GError *error = NULL; Private *priv; + g_autoptr(GError) reopen_error = NULL; priv = get_private (MM_SHARED_XMM (self)); ctx = g_task_get_task_data (task); @@ -1051,6 +1060,18 @@ xlcslsr_ready (MMBaseModem *self, NULL); priv->gps_engine_state = ctx->state; + /* + * Keep GPS port open if would not be kept open otherwise + * (like with a locked/non-enabled modem). + */ + g_assert (!priv->gps_port_open); + if (!mm_port_serial_open (MM_PORT_SERIAL (priv->gps_port), &reopen_error)) { + mm_obj_warn (self, "unexpected GPS port reopen error: %s", + reopen_error->message); + } else { + priv->gps_port_open = TRUE; + } + g_task_return_boolean (task, TRUE); g_object_unref (task); } @@ -1171,6 +1192,12 @@ gps_engine_stopped (GTask *task) priv->gps_port, priv->nmea_regex, NULL, NULL, NULL); + + if (priv->gps_port_open) { + mm_port_serial_close (MM_PORT_SERIAL (priv->gps_port)); + priv->gps_port_open = FALSE; + } + g_clear_object (&priv->gps_port); priv->gps_engine_state = GPS_ENGINE_STATE_OFF; @@ -1687,9 +1714,9 @@ mm_shared_xmm_setup_ports (MMBroadbandModem *self) NULL, NULL, NULL); } - /* Setup the GPS port */ + /* Setup the GPS port and stop GPS if it is not supposed to be running */ gps_port = shared_xmm_get_gps_control_port (MM_SHARED_XMM (self), NULL); - if (gps_port) { + if (gps_port && priv->gps_engine_state == GPS_ENGINE_STATE_OFF) { /* After running AT+XLSRSTOP we may get an unsolicited response * reporting its status, we just ignore it. */ mm_port_serial_at_add_unsolicited_msg_handler (