summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/mm-bearer-mbim.c28
-rw-r--r--src/mm-broadband-modem-mbim.c73
-rw-r--r--src/mm-sim-mbim.c55
-rw-r--r--src/mm-sms-mbim.c25
4 files changed, 154 insertions, 27 deletions
diff --git a/src/mm-bearer-mbim.c b/src/mm-bearer-mbim.c
index c554c527c..037573344 100644
--- a/src/mm-bearer-mbim.c
+++ b/src/mm-bearer-mbim.c
@@ -107,6 +107,29 @@ peek_ports (gpointer self,
}
/*****************************************************************************/
+/* Common check to see if we got not-opened errors.
+ * When the port is detected not-opened, we'll mark the modem as fully invalid. */
+
+static void
+bearer_ensure_opened (MMBearerMbim *self,
+ const GError *error)
+{
+ if (g_error_matches (error, MBIM_PROTOCOL_ERROR, MBIM_PROTOCOL_ERROR_NOT_OPENED)) {
+ MMBaseModem *modem = NULL;
+
+ g_object_get (G_OBJECT (self),
+ MM_BASE_BEARER_MODEM, &modem,
+ NULL);
+
+ if (modem) {
+ mm_warn ("MBIM device is not opened, reporting invalid modem...");
+ mm_base_modem_reset (MM_BASE_MODEM (modem));
+ g_object_unref (modem);
+ }
+ }
+}
+
+/*****************************************************************************/
/* Connect */
typedef enum {
@@ -435,6 +458,7 @@ ip_configuration_query_ready (MbimDevice *device,
mbim_message_unref (response);
if (error) {
+ bearer_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
connect_context_complete_and_free (ctx);
return;
@@ -496,6 +520,7 @@ connect_set_ready (MbimDevice *device,
mbim_message_unref (response);
if (error) {
+ bearer_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
connect_context_complete_and_free (ctx);
return;
@@ -544,6 +569,7 @@ provisioned_contexts_query_ready (MbimDevice *device,
mbim_provisioned_context_element_array_free (provisioned_contexts);
} else {
+ bearer_ensure_opened (ctx->self, error);
mm_dbg ("Error listing provisioned contexts: %s", error->message);
g_error_free (error);
}
@@ -618,6 +644,7 @@ packet_service_set_ready (MbimDevice *device,
g_error_free (error);
} else {
/* All other errors are fatal */
+ bearer_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
connect_context_complete_and_free (ctx);
return;
@@ -1022,6 +1049,7 @@ disconnect_set_ready (MbimDevice *device,
mbim_message_unref (response);
if (error) {
+ bearer_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
disconnect_context_complete_and_free (ctx);
return;
diff --git a/src/mm-broadband-modem-mbim.c b/src/mm-broadband-modem-mbim.c
index f6891278c..001164d8b 100644
--- a/src/mm-broadband-modem-mbim.c
+++ b/src/mm-broadband-modem-mbim.c
@@ -106,6 +106,21 @@ peek_device (gpointer self,
}
/*****************************************************************************/
+/* Common check to see if we got not-opened errors.
+ * When the port is detected not-opened, we'll mark the modem as fully invalid. */
+
+static void
+modem_ensure_opened (MMBroadbandModemMbim *self,
+ const GError *error)
+{
+ if (g_error_matches (error, MBIM_PROTOCOL_ERROR, MBIM_PROTOCOL_ERROR_NOT_OPENED)) {
+ /* Report invalid modem */
+ mm_warn ("MBIM device is not opened, reporting invalid modem...");
+ mm_base_modem_reset (MM_BASE_MODEM (self));
+ }
+}
+
+/*****************************************************************************/
typedef struct {
MMBroadbandModemMbim *self;
@@ -196,8 +211,10 @@ device_caps_query_ready (MbimDevice *device,
g_simple_async_result_set_op_res_gpointer (ctx->result,
GUINT_TO_POINTER (mask),
NULL);
- } else
+ } else {
+ modem_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
+ }
if (response)
mbim_message_unref (response);
@@ -575,8 +592,10 @@ pin_query_ready (MbimDevice *device,
GUINT_TO_POINTER (MBIM_PIN_TYPE_PIN1),
NULL);
}
- else
+ else {
+ modem_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
+ }
if (response)
mbim_message_unref (response);
@@ -629,6 +648,7 @@ unlock_required_subscriber_ready_state_ready (MbimDevice *device,
/* Fatal errors are reported right away */
if (error) {
+ modem_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
load_unlock_required_context_complete_and_free (ctx);
}
@@ -762,8 +782,10 @@ pin_query_unlock_retries_ready (MbimDevice *device,
remaining_attempts);
}
g_simple_async_result_set_op_res_gpointer (ctx->result, retries, g_object_unref);
- } else
+ } else {
+ modem_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
+ }
if (response)
mbim_message_unref (response);
@@ -834,8 +856,10 @@ own_numbers_subscriber_ready_state_ready (MbimDevice *device,
&telephone_numbers,
&error)) {
g_simple_async_result_set_op_res_gpointer (ctx->result, telephone_numbers, NULL);
- } else
+ } else {
+ modem_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
+ }
if (response)
mbim_message_unref (response);
@@ -911,8 +935,10 @@ radio_state_query_ready (MbimDevice *device,
g_simple_async_result_set_op_res_gpointer (ctx->result,
GUINT_TO_POINTER (state),
NULL);
- } else
+ } else {
+ modem_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
+ }
if (response)
mbim_message_unref (response);
@@ -969,9 +995,10 @@ radio_state_set_down_ready (MbimDevice *device,
if (response)
mbim_message_command_done_get_result (response, &error);
- if (error)
+ if (error) {
+ modem_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
- else
+ } else
g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
if (response)
@@ -1005,9 +1032,10 @@ radio_state_set_up_ready (MbimDevice *device,
g_warn_if_reached ();
}
- if (error)
+ if (error) {
+ modem_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
- else
+ } else
g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
if (response)
@@ -1492,8 +1520,10 @@ pin_list_query_ready (MbimDevice *device,
g_simple_async_result_set_op_res_gpointer (ctx->result,
GUINT_TO_POINTER (mask),
NULL);
- } else
+ } else {
+ modem_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
+ }
if (response)
mbim_message_unref (response);
@@ -1852,6 +1882,7 @@ alert_sms_read_query_ready (MbimDevice *device,
}
if (error) {
+ modem_ensure_opened (self, error);
mm_dbg ("Flash message reading failed: %s", error->message);
g_error_free (error);
}
@@ -2085,9 +2116,10 @@ subscribe_list_set_ready_cb (MbimDevice *device,
if (response)
mbim_message_command_done_get_result (response, &error);
- if (error)
+ if (error) {
+ modem_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
- else
+ } else
g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
if (response)
@@ -2361,8 +2393,10 @@ register_state_query_ready (MbimDevice *device,
provider_id,
provider_name);
g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
- } else
+ } else {
+ modem_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
+ }
if (response)
mbim_message_unref (response);
@@ -2437,9 +2471,10 @@ register_state_set_ready (MbimDevice *device,
error = mm_mobile_equipment_error_from_mbim_nw_error (nw_error);
}
- if (error)
+ if (error) {
+ modem_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
- else
+ } else
g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
if (response)
@@ -2527,8 +2562,10 @@ visible_providers_query_ready (MbimDevice *device,
response = mbim_device_command_finish (device, res, &error);
if (response)
g_simple_async_result_set_op_res_gpointer (ctx->result, response, (GDestroyNotify)mbim_message_unref);
- else
+ else {
+ modem_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
+ }
simple_context_complete_and_free (ctx);
}
@@ -2699,8 +2736,10 @@ sms_read_query_ready (MbimDevice *device,
for (i = 0; i < messages_count; i++)
add_sms_part (ctx->self, pdu_messages[i]);
mbim_sms_pdu_read_record_array_free (pdu_messages);
- } else
+ } else {
+ modem_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
+ }
if (response)
mbim_message_unref (response);
diff --git a/src/mm-sim-mbim.c b/src/mm-sim-mbim.c
index e01a3bad2..17ee0a646 100644
--- a/src/mm-sim-mbim.c
+++ b/src/mm-sim-mbim.c
@@ -64,6 +64,29 @@ peek_device (gpointer self,
}
/*****************************************************************************/
+/* Common check to see if we got not-opened errors.
+ * When the port is detected not-opened, we'll mark the modem as fully invalid. */
+
+static void
+sim_ensure_opened (MMSimMbim *self,
+ const GError *error)
+{
+ if (g_error_matches (error, MBIM_PROTOCOL_ERROR, MBIM_PROTOCOL_ERROR_NOT_OPENED)) {
+ MMBaseModem *modem = NULL;
+
+ g_object_get (G_OBJECT (self),
+ MM_BASE_SIM_MODEM, &modem,
+ NULL);
+
+ if (modem) {
+ mm_warn ("MBIM device is not opened, reporting invalid modem...");
+ mm_base_modem_reset (MM_BASE_MODEM (modem));
+ g_object_unref (modem);
+ }
+ }
+}
+
+/*****************************************************************************/
typedef struct {
MMSimMbim *self;
@@ -128,8 +151,10 @@ simid_subscriber_ready_state_ready (MbimDevice *device,
NULL, /* telephone_numbers */
&error))
g_simple_async_result_set_op_res_gpointer (ctx->result, sim_iccid, (GDestroyNotify)g_free);
- else
+ else {
+ sim_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
+ }
if (response)
mbim_message_unref (response);
@@ -195,8 +220,10 @@ imsi_subscriber_ready_state_ready (MbimDevice *device,
NULL, /* telephone_numbers */
&error))
g_simple_async_result_set_op_res_gpointer (ctx->result, subscriber_id, (GDestroyNotify)g_free);
- else
+ else {
+ sim_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
+ }
if (response)
mbim_message_unref (response);
@@ -261,8 +288,10 @@ load_operator_identifier_ready (MbimDevice *device,
&provider,
&error))
g_simple_async_result_set_op_res_gpointer (ctx->result, provider, (GDestroyNotify)mbim_provider_free);
- else
+ else {
+ sim_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
+ }
if (response)
mbim_message_unref (response);
@@ -327,8 +356,10 @@ load_operator_name_ready (MbimDevice *device,
&provider,
&error))
g_simple_async_result_set_op_res_gpointer (ctx->result, provider, (GDestroyNotify)mbim_provider_free);
- else
+ else {
+ sim_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
+ }
if (response)
mbim_message_unref (response);
@@ -404,9 +435,10 @@ pin_set_enter_ready (MbimDevice *device,
if (response)
mbim_message_unref (response);
- if (error)
+ if (error) {
+ sim_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
- else
+ } else
g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
simple_context_complete_and_free (ctx);
}
@@ -494,9 +526,10 @@ puk_set_enter_ready (MbimDevice *device,
if (response)
mbim_message_unref (response);
- if (error)
+ if (error) {
+ sim_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
- else
+ } else
g_simple_async_result_set_op_res_gboolean (ctx->result, TRUE);
simple_context_complete_and_free (ctx);
}
@@ -570,7 +603,8 @@ pin_set_enable_ready (MbimDevice *device,
error = g_error_new (MM_CORE_ERROR,
MM_CORE_ERROR_WRONG_STATE,
"Need to be unlocked to allow enabling/disabling PIN");
- }
+ } else
+ sim_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
} else
@@ -647,7 +681,8 @@ pin_set_change_ready (MbimDevice *device,
error = g_error_new (MM_CORE_ERROR,
MM_CORE_ERROR_WRONG_STATE,
"Need to be unlocked to allow changing PIN");
- }
+ } else
+ sim_ensure_opened (ctx->self, error);
g_simple_async_result_take_error (ctx->result, error);
} else
diff --git a/src/mm-sms-mbim.c b/src/mm-sms-mbim.c
index 3bdd68a93..5337e4b3f 100644
--- a/src/mm-sms-mbim.c
+++ b/src/mm-sms-mbim.c
@@ -71,6 +71,29 @@ peek_device (gpointer self,
}
/*****************************************************************************/
+/* Common check to see if we got not-opened errors.
+ * When the port is detected not-opened, we'll mark the modem as fully invalid. */
+
+static void
+sms_ensure_opened (MMSmsMbim *self,
+ const GError *error)
+{
+ if (g_error_matches (error, MBIM_PROTOCOL_ERROR, MBIM_PROTOCOL_ERROR_NOT_OPENED)) {
+ MMBaseModem *modem = NULL;
+
+ g_object_get (G_OBJECT (self),
+ MM_BASE_SMS_MODEM, &modem,
+ NULL);
+
+ if (modem) {
+ mm_warn ("MBIM device is not opened, reporting invalid modem...");
+ mm_base_modem_reset (MM_BASE_MODEM (modem));
+ g_object_unref (modem);
+ }
+ }
+}
+
+/*****************************************************************************/
/* Send the SMS */
typedef struct {
@@ -126,6 +149,7 @@ sms_send_set_ready (MbimDevice *device,
mbim_message_unref (response);
if (error) {
+ sms_ensure_opened (MM_SMS_MBIM (ctx->self), error);
g_prefix_error (&error, "Couldn't send SMS part: ");
g_simple_async_result_take_error (ctx->result, error);
sms_send_context_complete_and_free (ctx);
@@ -255,6 +279,7 @@ sms_delete_set_ready (MbimDevice *device,
mbim_message_unref (response);
if (error) {
+ sms_ensure_opened (MM_SMS_MBIM (ctx->self), error);
ctx->n_failed++;
mm_dbg ("Couldn't delete SMS part with index %u: '%s'",
mm_sms_part_get_index ((MMSmsPart *)ctx->current->data),