diff options
author | Dan Williams <dan@ioncontrol.co> | 2025-02-27 15:30:17 -0600 |
---|---|---|
committer | Dan Williams <dan@ioncontrol.co> | 2025-03-27 23:51:17 +0000 |
commit | bad476558179ffe07dcb389c1d69b28887f74d91 (patch) | |
tree | 15aa56254497515c32883f2c1b676a489d538efb | |
parent | 8d2a91c9207e9f9e0dcffc236d8463f3bfc894ab (diff) |
broadband-modem: detect modem modes with +CEREG and +C5GREG
Some AT-based modems like the Quectel Unisoc-based RM500U don't
support the older AT commands we used to detect modes like
AT*CNTI=2 and AT+WS46. Add support for detecting 4G and 5G
with generic commands too.
Fixes: https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/issues/786
Signed-off-by: Dan Williams <dan@ioncontrol.co>
-rw-r--r-- | src/mm-broadband-modem.c | 62 |
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)) { |