---
 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

_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to