aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAleksander Morgado <aleksander@lanedo.com>2013-02-22 08:58:36 +0100
committerAleksander Morgado <aleksander@lanedo.com>2013-02-22 16:35:56 +0100
commit75d20c15d4f844270cfc6c31fae261412e4b1b59 (patch)
tree1a99f7713ae4d5cd1303d94da8744cdfc5b71fa9
parenta18140e8ed86e6881d1b5f4bcf33620ff791f35e (diff)
api: notify in the interface about the reason why the modem is FAILED
We currently implement 'SIM missing' and 'SIM error', which are probably the most common ones.
-rw-r--r--cli/mmcli-common.c2
-rw-r--r--cli/mmcli-modem.c15
-rw-r--r--docs/reference/api/ModemManager-sections.txt1
-rw-r--r--docs/reference/libmm-glib/libmm-glib-sections.txt7
-rw-r--r--include/ModemManager-enums.h18
-rw-r--r--introspection/org.freedesktop.ModemManager1.Modem.xml10
-rw-r--r--libmm-glib/mm-modem.c18
-rw-r--r--libmm-glib/mm-modem.h2
-rw-r--r--src/mm-broadband-modem.c24
-rw-r--r--src/mm-iface-modem.c31
-rw-r--r--src/mm-iface-modem.h2
11 files changed, 115 insertions, 15 deletions
diff --git a/cli/mmcli-common.c b/cli/mmcli-common.c
index 57651725..b7d6fe66 100644
--- a/cli/mmcli-common.c
+++ b/cli/mmcli-common.c
@@ -1063,6 +1063,8 @@ mmcli_get_state_reason_string (MMModemStateChangeReason reason)
return "User request";
case MM_MODEM_STATE_CHANGE_REASON_SUSPEND:
return "Suspend";
+ case MM_MODEM_STATE_CHANGE_REASON_FAILURE:
+ return "Failure";
}
g_warn_if_reached ();
diff --git a/cli/mmcli-modem.c b/cli/mmcli-modem.c
index fac1798b..7027f53e 100644
--- a/cli/mmcli-modem.c
+++ b/cli/mmcli-modem.c
@@ -351,13 +351,18 @@ print_modem_info (void)
g_print (" -------------------------\n"
" Status | lock: '%s'\n"
" | unlock retries: '%s'\n"
- " | state: '%s'\n"
- " | power state: '%s'\n"
- " | access tech: '%s'\n"
- " | signal quality: '%u' (%s)\n",
+ " | state: '%s'\n",
mm_modem_lock_get_string (mm_modem_get_unlock_required (ctx->modem)),
VALIDATE_UNKNOWN (unlock_retries_string),
- VALIDATE_UNKNOWN (mm_modem_state_get_string (mm_modem_get_state (ctx->modem))),
+ VALIDATE_UNKNOWN (mm_modem_state_get_string (mm_modem_get_state (ctx->modem))));
+
+ if (mm_modem_get_state (ctx->modem) == MM_MODEM_STATE_FAILED)
+ g_print (" | failed reason: '%s'\n",
+ VALIDATE_UNKNOWN (mm_modem_state_failed_reason_get_string (mm_modem_get_state_failed_reason (ctx->modem))));
+
+ g_print (" | power state: '%s'\n"
+ " | access tech: '%s'\n"
+ " | signal quality: '%u' (%s)\n",
VALIDATE_UNKNOWN (mm_modem_power_state_get_string (mm_modem_get_power_state (ctx->modem))),
VALIDATE_UNKNOWN (access_technologies_string),
signal_quality, signal_quality_recent ? "recent" : "cached");
diff --git a/docs/reference/api/ModemManager-sections.txt b/docs/reference/api/ModemManager-sections.txt
index b9837661..37309e9d 100644
--- a/docs/reference/api/ModemManager-sections.txt
+++ b/docs/reference/api/ModemManager-sections.txt
@@ -20,6 +20,7 @@ MMModemLocationSource
MMModemLock
MMModemMode
MMModemState
+MMModemStateFailedReason
MMModemStateChangeReason
MMModemPowerState
MMSmsPduType
diff --git a/docs/reference/libmm-glib/libmm-glib-sections.txt b/docs/reference/libmm-glib/libmm-glib-sections.txt
index 6f5663f5..87b840ed 100644
--- a/docs/reference/libmm-glib/libmm-glib-sections.txt
+++ b/docs/reference/libmm-glib/libmm-glib-sections.txt
@@ -77,6 +77,7 @@ MMModem
mm_modem_get_path
mm_modem_dup_path
mm_modem_get_state
+mm_modem_get_state_failed_reason
mm_modem_get_power_state
mm_modem_get_modem_capabilities
mm_modem_get_current_capabilities
@@ -957,6 +958,7 @@ mm_bearer_ip_family_get_string
mm_bearer_allowed_auth_build_string_from_mask
mm_modem_capability_build_string_from_mask
mm_modem_state_get_string
+mm_modem_state_failed_reason_get_string
mm_modem_state_change_reason_get_string
mm_modem_power_state_get_string
mm_modem_lock_get_string
@@ -981,6 +983,7 @@ mm_firmware_image_type_get_string
mm_modem_capability_get_string
mm_modem_lock_build_string_from_mask
mm_modem_state_build_string_from_mask
+mm_modem_state_failed_reason_build_string_from_mask
mm_modem_state_change_reason_build_string_from_mask
mm_modem_power_state_build_string_from_mask
mm_modem_access_technology_get_string
@@ -1023,6 +1026,7 @@ MM_TYPE_MODEM_LOCATION_SOURCE
MM_TYPE_MODEM_LOCK
MM_TYPE_MODEM_MODE
MM_TYPE_MODEM_STATE
+MM_TYPE_MODEM_STATE_FAILED_REASON
MM_TYPE_MODEM_STATE_CHANGE_REASON
MM_TYPE_MODEM_POWER_STATE
MM_TYPE_SMS_DELIVERY_STATE
@@ -1049,6 +1053,7 @@ mm_modem_lock_get_type
mm_modem_mode_get_type
mm_modem_state_change_reason_get_type
mm_modem_state_get_type
+mm_modem_state_failed_reason_get_type
mm_modem_power_state_get_type
mm_sms_delivery_state_get_type
mm_sms_pdu_type_get_type
@@ -1437,6 +1442,7 @@ mm_gdbus_modem_dup_signal_quality
mm_gdbus_modem_get_sim
mm_gdbus_modem_dup_sim
mm_gdbus_modem_get_state
+mm_gdbus_modem_get_state_failed_reason
mm_gdbus_modem_get_supported_bands
mm_gdbus_modem_dup_supported_bands
mm_gdbus_modem_get_supported_modes
@@ -1496,6 +1502,7 @@ mm_gdbus_modem_set_revision
mm_gdbus_modem_set_signal_quality
mm_gdbus_modem_set_sim
mm_gdbus_modem_set_state
+mm_gdbus_modem_set_state_failed_reason
mm_gdbus_modem_set_power_state
mm_gdbus_modem_set_supported_bands
mm_gdbus_modem_set_supported_modes
diff --git a/include/ModemManager-enums.h b/include/ModemManager-enums.h
index e7554160..abdd2575 100644
--- a/include/ModemManager-enums.h
+++ b/include/ModemManager-enums.h
@@ -129,6 +129,22 @@ typedef enum { /*< underscore_name=mm_modem_state >*/
} MMModemState;
/**
+ * MMModemStateFailedReason:
+ * @MM_MODEM_STATE_FAILED_REASON_NONE: No error.
+ * @MM_MODEM_STATE_FAILED_REASON_UNKNOWN: Unknown error.
+ * @MM_MODEM_STATE_FAILED_REASON_SIM_MISSING: SIM is required but missing.
+ * @MM_MODEM_STATE_FAILED_REASON_SIM_ERROR: SIM is available, but unusable (e.g. permanently locked).
+ *
+ * Enumeration of possible errors when the modem is in @MM_MODEM_STATE_FAILED.
+ */
+typedef enum { /*< underscore_name=mm_modem_state_failed_reason >*/
+ MM_MODEM_STATE_FAILED_REASON_NONE = 0,
+ MM_MODEM_STATE_FAILED_REASON_UNKNOWN = 1,
+ MM_MODEM_STATE_FAILED_REASON_SIM_MISSING = 2,
+ MM_MODEM_STATE_FAILED_REASON_SIM_ERROR = 3,
+} MMModemStateFailedReason;
+
+/**
* MMModemPowerState:
* @MM_MODEM_POWER_STATE_UNKNOWN: Unknown power state.
* @MM_MODEM_POWER_STATE_OFF: Off.
@@ -149,6 +165,7 @@ typedef enum { /*< underscore_name=mm_modem_power_state >*/
* @MM_MODEM_STATE_CHANGE_REASON_UNKNOWN: Reason unknown or not reportable.
* @MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED: State change was requested by an interface user.
* @MM_MODEM_STATE_CHANGE_REASON_SUSPEND: State change was caused by a system suspend.
+ * @MM_MODEM_STATE_CHANGE_REASON_FAILURE: State change was caused by an unrecoverable error.
*
* Enumeration of possible reasons to have changed the modem state.
*/
@@ -156,6 +173,7 @@ typedef enum { /*< underscore_name=mm_modem_state_change_reason >*/
MM_MODEM_STATE_CHANGE_REASON_UNKNOWN = 0,
MM_MODEM_STATE_CHANGE_REASON_USER_REQUESTED = 1,
MM_MODEM_STATE_CHANGE_REASON_SUSPEND = 2,
+ MM_MODEM_STATE_CHANGE_REASON_FAILURE = 3,
} MMModemStateChangeReason;
/**
diff --git a/introspection/org.freedesktop.ModemManager1.Modem.xml b/introspection/org.freedesktop.ModemManager1.Modem.xml
index dfcf97e3..42f80419 100644
--- a/introspection/org.freedesktop.ModemManager1.Modem.xml
+++ b/introspection/org.freedesktop.ModemManager1.Modem.xml
@@ -357,6 +357,16 @@
<property name="State" type="i" access="read" />
<!--
+ StateFailedReason:
+
+ Error specifying why the modem is in
+ <link linkend="MM-MODEM-STATE-FAILED:CAPS"><constant>MM_MODEM_STATE_FAILED</constant></link>
+ state, given as a
+ <link linkend="MMModemStateFailedReason">MMModemStateFailedReason</link> value.
+ -->
+ <property name="StateFailedReason" type="u" access="read" />
+
+ <!--
AccessTechnologies:
Bitmask of <link linkend="MMModemAccessTechnology">MMModemAccessTechnology</link> values,
diff --git a/libmm-glib/mm-modem.c b/libmm-glib/mm-modem.c
index f6aaeebe..dbf03aee 100644
--- a/libmm-glib/mm-modem.c
+++ b/libmm-glib/mm-modem.c
@@ -817,6 +817,24 @@ mm_modem_get_state (MMModem *self)
/*****************************************************************************/
/**
+ * mm_modem_get_state_failed_reason:
+ * @self: A #MMModem.
+ *
+ * Gets the reason specifying why the modem is in #MM_MODEM_STATE_FAILED state.
+ *
+ * Returns: A #MMModemStateFailedReason value.
+ */
+MMModemStateFailedReason
+mm_modem_get_state_failed_reason (MMModem *self)
+{
+ g_return_val_if_fail (MM_IS_MODEM (self), MM_MODEM_STATE_FAILED_REASON_UNKNOWN);
+
+ return (MMModemStateFailedReason) mm_gdbus_modem_get_state_failed_reason (MM_GDBUS_MODEM (self));
+}
+
+/*****************************************************************************/
+
+/**
* mm_modem_get_power_state:
* @self: A #MMModem.
*
diff --git a/libmm-glib/mm-modem.h b/libmm-glib/mm-modem.h
index 7d5801c4..4a627c02 100644
--- a/libmm-glib/mm-modem.h
+++ b/libmm-glib/mm-modem.h
@@ -118,6 +118,8 @@ MMUnlockRetries *mm_modem_peek_unlock_retries (MMModem *self);
MMModemState mm_modem_get_state (MMModem *self);
+MMModemStateFailedReason mm_modem_get_state_failed_reason (MMModem *self);
+
MMModemPowerState mm_modem_get_power_state (MMModem *self);
MMModemAccessTechnology mm_modem_get_access_technologies (MMModem *self);
diff --git a/src/mm-broadband-modem.c b/src/mm-broadband-modem.c
index c0c74410..99011b6c 100644
--- a/src/mm-broadband-modem.c
+++ b/src/mm-broadband-modem.c
@@ -8423,13 +8423,26 @@ iface_modem_initialize_ready (MMBroadbandModem *self,
/* If the modem interface fails to get initialized, we will move the modem
* to a FAILED state. Note that in this case we still export the interface. */
if (!mm_iface_modem_initialize_finish (MM_IFACE_MODEM (self), result, &error)) {
+ MMModemStateFailedReason failed_reason = MM_MODEM_STATE_FAILED_REASON_UNKNOWN;
+
/* Report the new FAILED state */
mm_warn ("Modem couldn't be initialized: %s", error->message);
+
+ if (g_error_matches (error,
+ MM_MOBILE_EQUIPMENT_ERROR,
+ MM_MOBILE_EQUIPMENT_ERROR_SIM_NOT_INSERTED))
+ failed_reason = MM_MODEM_STATE_FAILED_REASON_SIM_MISSING;
+ else if (g_error_matches (error,
+ MM_MOBILE_EQUIPMENT_ERROR,
+ MM_MOBILE_EQUIPMENT_ERROR_SIM_FAILURE) ||
+ g_error_matches (error,
+ MM_MOBILE_EQUIPMENT_ERROR,
+ MM_MOBILE_EQUIPMENT_ERROR_SIM_WRONG))
+ failed_reason = MM_MODEM_STATE_FAILED_REASON_SIM_MISSING;
+
g_error_free (error);
- mm_iface_modem_update_state (MM_IFACE_MODEM (self),
- MM_MODEM_STATE_FAILED,
- MM_MODEM_STATE_CHANGE_REASON_UNKNOWN);
+ mm_iface_modem_update_failed_state (MM_IFACE_MODEM (self), failed_reason);
/* Jump to the firmware step. We allow firmware switching even in failed
* state */
@@ -8474,9 +8487,8 @@ iface_modem_initialize_ready (MMBroadbandModem *self,
g_error_free (error); \
\
/* Report the new FAILED state */ \
- mm_iface_modem_update_state (MM_IFACE_MODEM (self), \
- MM_MODEM_STATE_FAILED, \
- MM_MODEM_STATE_CHANGE_REASON_UNKNOWN); \
+ mm_iface_modem_update_failed_state (MM_IFACE_MODEM (self), \
+ MM_MODEM_STATE_FAILED_REASON_UNKNOWN); \
\
/* Just jump to the last step */ \
ctx->step = INITIALIZE_STEP_LAST; \
diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c
index f02b0bdc..0775add1 100644
--- a/src/mm-iface-modem.c
+++ b/src/mm-iface-modem.c
@@ -1145,10 +1145,11 @@ bearer_list_count_connected (MMBearer *bearer,
(*count)++;
}
-void
-mm_iface_modem_update_state (MMIfaceModem *self,
- MMModemState new_state,
- MMModemStateChangeReason reason)
+static void
+__iface_modem_update_state_internal (MMIfaceModem *self,
+ MMModemState new_state,
+ MMModemStateChangeReason reason,
+ MMModemStateFailedReason failed_reason)
{
MMModemState old_state = MM_MODEM_STATE_UNKNOWN;
MmGdbusModem *skeleton = NULL;
@@ -1207,6 +1208,10 @@ mm_iface_modem_update_state (MMIfaceModem *self,
/* Signal status change */
if (skeleton) {
+ /* Set failure reason */
+ if (failed_reason != mm_gdbus_modem_get_state_failed_reason (skeleton))
+ mm_gdbus_modem_set_state_failed_reason (skeleton, failed_reason);
+
/* Flush current change before signaling the state change,
* so that clients get the proper state already in the
* state-changed callback */
@@ -1239,6 +1244,23 @@ mm_iface_modem_update_state (MMIfaceModem *self,
g_object_unref (bearer_list);
}
+void
+mm_iface_modem_update_state (MMIfaceModem *self,
+ MMModemState new_state,
+ MMModemStateChangeReason reason)
+{
+ g_assert (new_state != MM_MODEM_STATE_FAILED);
+
+ __iface_modem_update_state_internal (self, new_state, reason, MM_MODEM_STATE_FAILED_REASON_NONE);
+}
+
+void
+mm_iface_modem_update_failed_state (MMIfaceModem *self,
+ MMModemStateFailedReason failed_reason)
+{
+ __iface_modem_update_state_internal (self, MM_MODEM_STATE_FAILED, MM_MODEM_STATE_CHANGE_REASON_FAILURE, failed_reason);
+}
+
/*****************************************************************************/
typedef struct {
@@ -4092,6 +4114,7 @@ mm_iface_modem_initialize (MMIfaceModem *self,
mm_gdbus_modem_set_supported_bands (skeleton, mm_common_build_bands_unknown ());
mm_gdbus_modem_set_bands (skeleton, mm_common_build_bands_unknown ());
mm_gdbus_modem_set_power_state (skeleton, MM_MODEM_POWER_STATE_UNKNOWN);
+ mm_gdbus_modem_set_state_failed_reason (skeleton, MM_MODEM_STATE_FAILED_REASON_NONE);
/* Bind our State property */
g_object_bind_property (self, MM_IFACE_MODEM_STATE,
diff --git a/src/mm-iface-modem.h b/src/mm-iface-modem.h
index 451c3f7e..ba9282fe 100644
--- a/src/mm-iface-modem.h
+++ b/src/mm-iface-modem.h
@@ -397,6 +397,8 @@ void mm_iface_modem_update_subsystem_state (MMIfaceModem *self,
void mm_iface_modem_update_state (MMIfaceModem *self,
MMModemState new_state,
MMModemStateChangeReason reason);
+void mm_iface_modem_update_failed_state (MMIfaceModem *self,
+ MMModemStateFailedReason failed_reason);
/* Allow reporting new access tech */
void mm_iface_modem_update_access_technologies (MMIfaceModem *self,