From 69aff6183a9e6532b4074c89831d6dcfa81ddcce Mon Sep 17 00:00:00 2001 From: Ben Chan Date: Wed, 23 Jan 2013 17:16:52 -0800 Subject: iface-modem: fix invalid modem state consolidation ModemManager has a bogus modem state transition from 'enabling' to 'disabled': ModemManager[26214]: Modem fully enabled... ModemManager[26214]: Modem /org/freedesktop/ModemManager1/Modem/2: state changed (enabling -> disabled) The root cause seems to be the following: get_current_consolidated_state() in MMIfaceModem returns MM_MODEM_STATE_DISABLED as the default fallback value. When mm_iface_modem_update_state() is invoked to transition the modem state from MM_MODEM_STATE_ENABLING to MM_MODEM_STATE_ENABLED, the following code can potentially cause the final state to be MM_MODEM_STATE_DISABLED instead. /* Enabled may really be searching or registered */ if (new_state == MM_MODEM_STATE_ENABLED) new_state = get_current_consolidated_state (self); https://code.google.com/p/chromium-os/issues/detail?id=38173 --- src/mm-iface-modem.c | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/mm-iface-modem.c b/src/mm-iface-modem.c index 6b812e29..f6af878c 100644 --- a/src/mm-iface-modem.c +++ b/src/mm-iface-modem.c @@ -205,7 +205,7 @@ mm_iface_modem_wait_for_final_state (MMIfaceModem *self, /*****************************************************************************/ -static MMModemState get_current_consolidated_state (MMIfaceModem *self); +static MMModemState get_current_consolidated_state (MMIfaceModem *self, MMModemState modem_state); typedef struct { MMBearer *self; @@ -270,7 +270,7 @@ bearer_status_changed (MMBearer *bearer, new_state = MM_MODEM_STATE_DISCONNECTING; break; case MM_BEARER_STATUS_DISCONNECTED: - new_state = get_current_consolidated_state (self); + new_state = get_current_consolidated_state (self, state); break; } @@ -1184,7 +1184,7 @@ mm_iface_modem_update_state (MMIfaceModem *self, /* Enabled may really be searching or registered */ if (new_state == MM_MODEM_STATE_ENABLED) - new_state = get_current_consolidated_state (self); + new_state = get_current_consolidated_state (self, new_state); /* Update state only if different */ if (new_state != old_state) { @@ -1260,9 +1260,9 @@ subsystem_state_array_free (GArray *array) } static MMModemState -get_current_consolidated_state (MMIfaceModem *self) +get_current_consolidated_state (MMIfaceModem *self, MMModemState modem_state) { - MMModemState consolidated = MM_MODEM_STATE_DISABLED; + MMModemState consolidated = modem_state; GArray *subsystem_states; if (G_UNLIKELY (!state_update_context_quark)) @@ -1293,6 +1293,7 @@ get_current_consolidated_state (MMIfaceModem *self) static MMModemState get_updated_consolidated_state (MMIfaceModem *self, + MMModemState modem_state, const gchar *subsystem, MMModemState subsystem_state) { @@ -1345,7 +1346,7 @@ get_updated_consolidated_state (MMIfaceModem *self, g_array_append_val (subsystem_states, s); } - return get_current_consolidated_state (self); + return get_current_consolidated_state (self, modem_state); } void @@ -1364,7 +1365,7 @@ mm_iface_modem_update_subsystem_state (MMIfaceModem *self, /* We may have different subsystems being handled (e.g. 3GPP and CDMA), and * the registration status value is unique, so if we get subsystem-specific * state updates, we'll need to merge all to get a consolidated one. */ - consolidated = get_updated_consolidated_state (self, subsystem, new_state); + consolidated = get_updated_consolidated_state (self, state, subsystem, new_state); /* Don't update registration-related states while disabling/enabling */ if (state == MM_MODEM_STATE_ENABLING || -- cgit v1.2.3-70-g09d2