diff options
author | Dan Williams <dan@ioncontrol.co> | 2025-04-09 13:26:59 +0000 |
---|---|---|
committer | Dan Williams <dan@ioncontrol.co> | 2025-04-09 13:26:59 +0000 |
commit | c575f5d51867c9a4990d200882b146928a5dce33 (patch) | |
tree | 5e47ac5cd9399aabc3f3701aeb8d6696d98305e7 | |
parent | 467a53f189ddcec87ddba0aa0c72c7d3ca34e2e4 (diff) | |
parent | f5ae14d0b2daae818b195366eaa9b16ecc964dfa (diff) |
Merge request !1322 from 'qmi-no-supported-modes'
modem-helpers-qmi: better handle no supported modes
https://gitlab.freedesktop.org/mobile-broadband/ModemManager/-/merge_requests/1322
-rw-r--r-- | src/mm-modem-helpers-qmi.c | 13 | ||||
-rw-r--r-- | src/mm-modem-helpers-qmi.h | 5 | ||||
-rw-r--r-- | src/mm-shared-qmi.c | 8 | ||||
-rw-r--r-- | src/tests/test-modem-helpers-qmi.c | 40 |
4 files changed, 52 insertions, 14 deletions
diff --git a/src/mm-modem-helpers-qmi.c b/src/mm-modem-helpers-qmi.c index bc0be400..7a87454b 100644 --- a/src/mm-modem-helpers-qmi.c +++ b/src/mm-modem-helpers-qmi.c @@ -2541,13 +2541,22 @@ mm_supported_capabilities_from_qmi_supported_capabilities_context (MMQmiSupporte /* Utility to build list of supported modes */ GArray * -mm_supported_modes_from_qmi_supported_modes_context (MMQmiSupportedModesContext *ctx, - gpointer log_object) +mm_supported_modes_from_qmi_supported_modes_context (MMQmiSupportedModesContext *ctx, + gpointer log_object, + GError **error) { g_autoptr(GArray) combinations = NULL; g_autoptr(GArray) all = NULL; MMModemModeCombination mode; + if (ctx->all == MM_MODEM_MODE_NONE) { + g_set_error (error, + MM_CORE_ERROR, + MM_CORE_ERROR_FAILED, + "No supported modes reported"); + return NULL; + } + /* Start with a mode including ALL */ mode.allowed = ctx->all; mode.preferred = MM_MODEM_MODE_NONE; diff --git a/src/mm-modem-helpers-qmi.h b/src/mm-modem-helpers-qmi.h index 6adb1597..75fdd5f7 100644 --- a/src/mm-modem-helpers-qmi.h +++ b/src/mm-modem-helpers-qmi.h @@ -217,8 +217,9 @@ typedef struct { MMModemCapability current_capabilities; } MMQmiSupportedModesContext; -GArray *mm_supported_modes_from_qmi_supported_modes_context (MMQmiSupportedModesContext *ctx, - gpointer log_object); +GArray *mm_supported_modes_from_qmi_supported_modes_context (MMQmiSupportedModesContext *ctx, + gpointer log_object, + GError **error); /*****************************************************************************/ /* QMI unique id manipulation */ diff --git a/src/mm-shared-qmi.c b/src/mm-shared-qmi.c index f6a7404d..4fd92cb0 100644 --- a/src/mm-shared-qmi.c +++ b/src/mm-shared-qmi.c @@ -1728,6 +1728,7 @@ mm_shared_qmi_load_supported_modes (MMIfaceModem *self, MMQmiSupportedModesContext ctx = { 0 }; guint i; GArray *combinations; + GError *error = NULL; task = g_task_new (self, NULL, callback, user_data); @@ -1753,8 +1754,11 @@ mm_shared_qmi_load_supported_modes (MMIfaceModem *self, ctx.current_capabilities = priv->current_capabilities; ctx.multimode = priv->multimode; - combinations = mm_supported_modes_from_qmi_supported_modes_context (&ctx, self); - g_task_return_pointer (task, combinations, (GDestroyNotify) g_array_unref); + combinations = mm_supported_modes_from_qmi_supported_modes_context (&ctx, self, &error); + if (error) + g_task_return_error (task, error); + else + g_task_return_pointer (task, combinations, (GDestroyNotify) g_array_unref); g_object_unref (task); } diff --git a/src/tests/test-modem-helpers-qmi.c b/src/tests/test-modem-helpers-qmi.c index 7ff1c9f2..576beb68 100644 --- a/src/tests/test-modem-helpers-qmi.c +++ b/src/tests/test-modem-helpers-qmi.c @@ -72,14 +72,22 @@ test_supported_modes_expected (MMQmiSupportedModesContext *ctx, g_autoptr(GArray) built = NULL; g_autofree gchar *expected_str = NULL; g_autofree gchar *built_str = NULL; - - built = mm_supported_modes_from_qmi_supported_modes_context (ctx, NULL); - - expected_str = mm_common_build_mode_combinations_string (expected_modes, n_expected_modes); - built_str = mm_common_build_mode_combinations_string ((MMModemModeCombination *)built->data, built->len); - - /* compare strings, so that the error shows the string values as well */ - g_assert_cmpstr (built_str, ==, expected_str); + g_autoptr(GError) error = NULL; + + built = mm_supported_modes_from_qmi_supported_modes_context (ctx, NULL, &error); + if (built == NULL) { + g_assert_error (error, MM_CORE_ERROR, MM_CORE_ERROR_FAILED); + g_assert_cmpint (n_expected_modes, ==, 0); + } else { + g_assert_no_error (error); + g_assert_cmpint (n_expected_modes, >, 0); + + expected_str = mm_common_build_mode_combinations_string (expected_modes, n_expected_modes); + built_str = mm_common_build_mode_combinations_string ((MMModemModeCombination *)built->data, built->len); + + /* compare strings, so that the error shows the string values as well */ + g_assert_cmpstr (built_str, ==, expected_str); + } } /*****************************************************************************/ @@ -1332,6 +1340,20 @@ test_supported_modes_generic_nr5g_lte_evdo (void) G_N_ELEMENTS (expected_modes)); } +static void +test_supported_modes_generic_none (void) +{ + MMQmiSupportedModesContext ctx; + + /* Dell Snapdragon X62 before FCC unlock reports no supported radio interfaces */ + ctx.multimode = FALSE; + ctx.all = MM_MODEM_MODE_NONE; + + test_supported_modes_expected (&ctx, + NULL, + 0); +} + /*****************************************************************************/ /* System Info processor helper */ @@ -1970,6 +1992,8 @@ int main (int argc, char **argv) g_test_add_func ("/MM/qmi/supported-capabilities/generic/nr5g-lte-evdo", test_supported_capabilities_generic_nr5g_lte_evdo); g_test_add_func ("/MM/qmi/supported-modes/generic/nr5g-lte-evdo", test_supported_modes_generic_nr5g_lte_evdo); + g_test_add_func ("/MM/qmi/supported-modes/generic/none", test_supported_modes_generic_none); + g_test_add_func ("/MM/qmi/registration-state-from-system-info/2g/searching", test_registration_state_from_qmi_system_info_2g_searching); g_test_add_func ("/MM/qmi/registration-state-from-system-info/2g/idle", test_registration_state_from_qmi_system_info_2g_idle); g_test_add_func ("/MM/qmi/registration-state-from-system-info/2g/cs-home", test_registration_state_from_qmi_system_info_2g_cs_home); |