summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2010-08-30 14:32:08 -0500
committerDenis Kenzior <denkenz@gmail.com>2010-08-30 14:32:08 -0500
commit88024972df46d4ababbaf39354615e8a8d603cfc (patch)
tree213b9ab96783b061a585581a77cb52e7ecdaa993 /src
parent4292b2dbeda6bf31115abb8e5f9839d61e0a1272 (diff)
downloadofono-88024972df46d4ababbaf39354615e8a8d603cfc.tar.bz2
modem: Skip waiting for sim_ready if no sim atom
For modems that do not have a SIM atom (e.g. HFP, DUN) we should skip waiting for the sim_ready notification that will never arrive.
Diffstat (limited to 'src')
-rw-r--r--src/modem.c66
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)
{