--- src/modem.c | 72 ++++++++++++++++++++++++++++++++-------------------------- 1 files changed, 40 insertions(+), 32 deletions(-) diff --git a/src/modem.c b/src/modem.c index 9ed52c1..64500f6 100644 --- a/src/modem.c +++ b/src/modem.c @@ -61,6 +61,7 @@ enum modem_state { struct ofono_modem { char *path; enum modem_state modem_state; + enum modem_state old_state; GSList *atoms; struct ofono_watchlist *atom_watches; GSList *interface_list; @@ -414,48 +415,26 @@ static void modem_change_state(struct ofono_modem *modem, } } -static void sim_state_watch(enum ofono_sim_state new_state, void *user) -{ - struct ofono_modem *modem = user; - - switch (new_state) { - case OFONO_SIM_STATE_NOT_PRESENT: - modem_change_state(modem, MODEM_STATE_PRE_SIM); - break; - case OFONO_SIM_STATE_INSERTED: - break; - case OFONO_SIM_STATE_READY: - modem_change_state(modem, MODEM_STATE_OFFLINE); - - /* - * If we don't have the set_online method, also proceed - * straight to the online state - */ - if (modem->driver->set_online == NULL) - modem_change_state(modem, MODEM_STATE_ONLINE); - - modem->reset = FALSE; - - break; - } -} - static void online_cb(const struct ofono_error *error, void *data) { struct ofono_modem *modem = data; DBusMessage *reply; if (error->type == OFONO_ERROR_TYPE_NO_ERROR && - modem->modem_state == MODEM_STATE_OFFLINE) + modem->modem_state == MODEM_STATE_OFFLINE) { + modem_change_state(modem, MODEM_STATE_ONLINE); + + if (modem->reset) { + modem->reset = FALSE; + return; + } + reply = dbus_message_new_method_return(modem->pending); - else + } else { reply = __ofono_error_failed(modem->pending); + } __ofono_dbus_pending_reply(&modem->pending, reply); - - if (error->type == OFONO_ERROR_TYPE_NO_ERROR && - modem->modem_state == MODEM_STATE_OFFLINE) - modem_change_state(modem, MODEM_STATE_ONLINE); } static void offline_cb(const struct ofono_error *error, void *data) @@ -475,6 +454,34 @@ static void offline_cb(const struct ofono_error *error, void *data) modem_change_state(modem, MODEM_STATE_OFFLINE); } +static void sim_state_watch(enum ofono_sim_state new_state, void *user) +{ + struct ofono_modem *modem = user; + + switch (new_state) { + case OFONO_SIM_STATE_NOT_PRESENT: + modem_change_state(modem, MODEM_STATE_PRE_SIM); + break; + case OFONO_SIM_STATE_INSERTED: + break; + case OFONO_SIM_STATE_READY: + modem_change_state(modem, MODEM_STATE_OFFLINE); + + /* + * If we don't have the set_online method, also proceed + * straight to the online state + */ + if (modem->driver->set_online == NULL) + modem_change_state(modem, MODEM_STATE_ONLINE); + else if (modem->old_state > MODEM_STATE_OFFLINE) + modem->driver->set_online(modem, 1, online_cb, modem); + else + modem->reset = FALSE; + + break; + } +} + static DBusMessage *set_property_online(struct ofono_modem *modem, DBusMessage *msg, DBusMessageIter *var) @@ -1586,6 +1593,7 @@ static gboolean __reset_modem(void *data) struct ofono_modem *modem = data; int err; + modem->old_state = modem->modem_state; modem->reset = TRUE; err = set_powered(modem, FALSE); -- 1.7.3.1