diff options
Diffstat (limited to 'src/modem.c')
-rw-r--r-- | src/modem.c | 66 |
1 files changed, 38 insertions, 28 deletions
diff --git a/src/modem.c b/src/modem.c index ed75f6a9..8b26bc30 100644 --- a/src/modem.c +++ b/src/modem.c @@ -407,6 +407,30 @@ 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); + + break; + } +} + static void online_cb(const struct ofono_error *error, void *data) { struct ofono_modem *modem = data; @@ -687,9 +711,14 @@ static DBusMessage *modem_set_property(DBusConnection *conn, "Powered", DBUS_TYPE_BOOLEAN, &powered); - if (powered) + if (powered) { modem_change_state(modem, MODEM_STATE_PRE_SIM); - else + + /* Force SIM Ready for devies with no sim atom */ + if (__ofono_modem_find_atom(modem, + OFONO_ATOM_TYPE_SIM) == NULL) + sim_state_watch(OFONO_SIM_STATE_READY, modem); + } else modem_change_state(modem, MODEM_STATE_POWER_OFF); return NULL; @@ -748,9 +777,14 @@ void ofono_modem_set_powered(struct ofono_modem *modem, ofono_bool_t powered) "Powered", DBUS_TYPE_BOOLEAN, &dbus_powered); - if (powered) + if (powered) { modem_change_state(modem, MODEM_STATE_PRE_SIM); - else + + /* Force SIM Ready for devies with no sim atom */ + if (__ofono_modem_find_atom(modem, + OFONO_ATOM_TYPE_SIM) == NULL) + sim_state_watch(OFONO_SIM_STATE_READY, modem); + } else modem_change_state(modem, MODEM_STATE_POWER_OFF); } @@ -1322,30 +1356,6 @@ static void emit_modems() g_free(modems); } -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); - - break; - } -} - static void sim_watch(struct ofono_atom *atom, enum ofono_atom_watch_condition cond, void *data) { |