summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@aleksander.es>2014-12-26 16:22:47 +0100
committerAleksander Morgado <aleksander@aleksander.es>2014-12-26 16:26:32 +0100
commitdf06d3a7547b3e14e09b8bfc8db0193578bd17df (patch)
tree791b3f96544babb70b588c6bf50e91eb5e9c88ad
parenta982b30d94f1755d501f09f384bf16ad26369add (diff)
downloadModemManager-aleksander/mbim-not-open.tar.gz
mbim: if not-opened errors are detected, fully reprobe the modem portsaleksander/mbim-not-open
When suspending, ModemManager keeps the state of the modem (MBIM open), but the modem itself gets fully reseted and needs an explicit new MBIM open, or otherwise the MBIM port will keep on saying that it was not opened: [/dev/cdc-wdm1] Received message (translated)... >>>>>> Header: >>>>>> length = 16 >>>>>> type = function-error (0x80000004) >>>>>> transaction = 12 >>>>>> Contents: >>>>>> error = 'NotOpened' (0x00000005) In order to avoid this, we will mark the modem as requesting a Reset, so that the Manager object removes all port information and also launches a full automatic reprobing. https://bugs.freedesktop.org/show_bug.cgi?id=84994
-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),