summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorUlrich Mohr <u.mohr@semex-engcon.com>2022-07-26 12:42:19 +0200
committerAleksander Morgado <aleksandermj@chromium.org>2023-02-24 13:28:17 +0000
commitae74fab548a4d015da13b586c2e5c2a206cb7bb0 (patch)
tree4d08569fc5e9212629baf1157509b89a3fb31ce7
parent192c266de3035edb93656dd48a39ad5f4b8ef792 (diff)
downloadModemManager-ae74fab548a4d015da13b586c2e5c2a206cb7bb0.tar.gz
broadband-modem-mbim,qmi-shared: Fallback from qmi uim service only when not supported
When using qmi uim service from mbim broadband modem, a fallback from using qmi uim service to normal mbim operations is done every time a call to qmi_set_primary_sim_slot fails. But this may fall for various reasons, and a fallback only makes sense when the device does not support that call Patch reworked by Aleksander Morgado <aleksandermj@chromium.org> (cherry picked from commit 5ed79518be6710a40729c02b7061a63298c0cf41)
-rw-r--r--src/mm-broadband-modem-mbim.c12
-rw-r--r--src/mm-shared-qmi.c32
2 files changed, 32 insertions, 12 deletions
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index 4cb8fa7a2..4985bb397 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -8937,8 +8937,16 @@ shared_qmi_set_primary_sim_slot_ready (MMIfaceModem *self,
GAsyncResult *res,
GTask *task)
{
- if (!mm_shared_qmi_set_primary_sim_slot_finish (self, res, NULL)) {
- set_primary_sim_slot_mbim (task);
+ g_autoptr(GError) error = NULL;
+
+ if (!mm_shared_qmi_set_primary_sim_slot_finish (self, res, &error)) {
+ /* Fallback to MBIM */
+ if (g_error_matches (error, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED)) {
+ set_primary_sim_slot_mbim (task);
+ return;
+ }
+ g_task_return_error (task, g_steal_pointer (&error));
+ g_object_unref (task);
return;
}
diff --git a/src/mm-shared-qmi.c b/src/mm-shared-qmi.c
index 30913123d..77ce16a87 100644
--- a/src/mm-shared-qmi.c
+++ b/src/mm-shared-qmi.c
@@ -3320,7 +3320,7 @@ uim_get_slot_status_ready (QmiClientUim *client,
LoadSimSlotsContext *ctx;
MMIfaceModem *self;
Private *priv;
- GError *error = NULL;
+ g_autoptr(GError) error = NULL;
GArray *physical_slots = NULL;
GArray *ext_information = NULL;
GArray *slot_eids = NULL;
@@ -3334,7 +3334,13 @@ uim_get_slot_status_ready (QmiClientUim *client,
if (!output ||
!qmi_message_uim_get_slot_status_output_get_result (output, &error) ||
!qmi_message_uim_get_slot_status_output_get_physical_slot_status (output, &physical_slots, &error)) {
- g_task_return_error (task, error);
+ if (g_error_matches (error, QMI_PROTOCOL_ERROR, QMI_PROTOCOL_ERROR_DEVICE_UNSUPPORTED) ||
+ g_error_matches (error, QMI_PROTOCOL_ERROR, QMI_PROTOCOL_ERROR_INVALID_QMI_COMMAND) ||
+ g_error_matches (error, QMI_PROTOCOL_ERROR, QMI_PROTOCOL_ERROR_NOT_SUPPORTED))
+ g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED,
+ "QMI SIM slot switch operation not supported");
+ else
+ g_task_return_error (task, g_steal_pointer (&error));
g_object_unref (task);
return;
}
@@ -3503,13 +3509,13 @@ uim_switch_get_slot_status_ready (QmiClientUim *client,
{
g_autoptr(QmiMessageUimGetSlotStatusOutput) output = NULL;
g_autoptr(QmiMessageUimSwitchSlotInput) input = NULL;
- MMIfaceModem *self;
- GError *error = NULL;
- GArray *physical_slots = NULL;
- guint i;
- guint active_logical_id = 0;
- guint active_slot_number;
- guint slot_number;
+ MMIfaceModem *self;
+ g_autoptr(GError) error = NULL;
+ GArray *physical_slots = NULL;
+ guint i;
+ guint active_logical_id = 0;
+ guint active_slot_number;
+ guint slot_number;
self = g_task_get_source_object (task);
slot_number = GPOINTER_TO_UINT (g_task_get_task_data (task));
@@ -3518,7 +3524,13 @@ uim_switch_get_slot_status_ready (QmiClientUim *client,
if (!output ||
!qmi_message_uim_get_slot_status_output_get_result (output, &error) ||
!qmi_message_uim_get_slot_status_output_get_physical_slot_status (output, &physical_slots, &error)) {
- g_task_return_error (task, error);
+ if (g_error_matches (error, QMI_PROTOCOL_ERROR, QMI_PROTOCOL_ERROR_DEVICE_UNSUPPORTED) ||
+ g_error_matches (error, QMI_PROTOCOL_ERROR, QMI_PROTOCOL_ERROR_INVALID_QMI_COMMAND) ||
+ g_error_matches (error, QMI_PROTOCOL_ERROR, QMI_PROTOCOL_ERROR_NOT_SUPPORTED))
+ g_task_return_new_error (task, MM_CORE_ERROR, MM_CORE_ERROR_UNSUPPORTED,
+ "QMI SIM slot switch operation not supported");
+ else
+ g_task_return_error (task, g_steal_pointer (&error));
g_object_unref (task);
return;
}