aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDan Williams <dan@ioncontrol.co>2025-03-27 23:54:34 +0000
committerDan Williams <dan@ioncontrol.co>2025-03-27 23:54:34 +0000
commit61656dcb3d8262b60e9e0bb839440f71383bf125 (patch)
tree15aa56254497515c32883f2c1b676a489d538efb
parent8d2a91c9207e9f9e0dcffc236d8463f3bfc894ab (diff)
parentbad476558179ffe07dcb389c1d69b28887f74d91 (diff)
Merge request !1301 from 'mode-detect-4g-5g'
broadband-modem: detect modem modes with +CEREG and +C5GREG https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/merge_requests/1301 Closes #786
-rw-r--r--src/mm-broadband-modem.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index 20b4a036..4b13fd09 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -1730,6 +1730,8 @@ typedef struct {
gboolean run_cnti;
gboolean run_ws46;
gboolean run_gcap;
+ gboolean run_cereg;
+ gboolean run_c5greg;
} LoadSupportedModesContext;
static GArray *
@@ -1760,6 +1762,42 @@ modem_load_supported_modes_finish (MMIfaceModem *self,
static void load_supported_modes_step (GTask *task);
static void
+supported_modes_c5greg_ready (MMBaseModem *_self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ LoadSupportedModesContext *ctx;
+ g_autoptr(GError) error = NULL;
+
+ ctx = g_task_get_task_data (task);
+
+ mm_base_modem_at_command_finish (_self, res, &error);
+ if (!error)
+ ctx->mode |= MM_MODEM_MODE_5G;
+
+ ctx->run_c5greg = FALSE;
+ load_supported_modes_step (task);
+}
+
+static void
+supported_modes_cereg_ready (MMBaseModem *_self,
+ GAsyncResult *res,
+ GTask *task)
+{
+ LoadSupportedModesContext *ctx;
+ g_autoptr(GError) error = NULL;
+
+ ctx = g_task_get_task_data (task);
+
+ mm_base_modem_at_command_finish (_self, res, &error);
+ if (!error)
+ ctx->mode |= MM_MODEM_MODE_4G;
+
+ ctx->run_cereg = FALSE;
+ load_supported_modes_step (task);
+}
+
+static void
supported_modes_gcap_ready (MMBaseModem *_self,
GAsyncResult *res,
GTask *task)
@@ -1974,6 +2012,28 @@ load_supported_modes_step (GTask *task)
return;
}
+ if (ctx->run_cereg) {
+ mm_base_modem_at_command (
+ MM_BASE_MODEM (self),
+ "+CEREG=?",
+ 3,
+ TRUE, /* allow caching */
+ (GAsyncReadyCallback)supported_modes_cereg_ready,
+ task);
+ return;
+ }
+
+ if (ctx->run_c5greg) {
+ mm_base_modem_at_command (
+ MM_BASE_MODEM (self),
+ "+C5GREG=?",
+ 3,
+ TRUE, /* allow caching */
+ (GAsyncReadyCallback)supported_modes_c5greg_ready,
+ task);
+ return;
+ }
+
/* All done.
* If no mode found, error */
if (ctx->mode == MM_MODEM_MODE_NONE)
@@ -2003,6 +2063,8 @@ modem_load_supported_modes (MMIfaceModem *self,
/* Run +WS46=? and *CNTI=2 */
ctx->run_ws46 = TRUE;
ctx->run_cnti = TRUE;
+ ctx->run_cereg = TRUE;
+ ctx->run_c5greg = TRUE;
}
if (mm_iface_modem_is_cdma (self)) {