summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2009-12-02 15:33:25 -0600
committerDenis Kenzior <denkenz@gmail.com>2009-12-02 19:10:07 -0600
commitdac0ccc8a8696bbf0f8db26218fa5d9ff7304d4f (patch)
tree4a9c2932f0c997d9fb361797d22feec7b3f47441 /src
parentcf98ebb6533223bf1ce998d3fbfde3f372951ba5 (diff)
downloadofono-dac0ccc8a8696bbf0f8db26218fa5d9ff7304d4f.tar.bz2
Fix: Remove all atoms when attempting to power off
The current behavior is to remove atoms when the modem has powered off successfully. The modem driver must now take special precautions to cancel all pending actions of the atom drivers, since they would have been destroyed.
Diffstat (limited to 'src')
-rw-r--r--src/modem.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/src/modem.c b/src/modem.c
index c335a387..e6fd1fe0 100644
--- a/src/modem.c
+++ b/src/modem.c
@@ -399,14 +399,20 @@ static int set_powered(struct ofono_modem *modem, ofono_bool_t powered)
const struct ofono_modem_driver *driver = modem->driver;
int err = -EINVAL;
- if (driver == NULL)
- return -EINVAL;
-
if (modem->powered_pending == powered)
return -EALREADY;
+ /* Remove the atoms even if the driver is no longer available */
+ if (powered == FALSE) {
+ remove_all_atoms(modem);
+ modem->call_ids = 0;
+ }
+
modem->powered_pending = powered;
+ if (driver == NULL)
+ return -EINVAL;
+
if (powered == TRUE) {
if (driver->enable)
err = driver->enable(modem);
@@ -499,9 +505,6 @@ static DBusMessage *modem_set_property(DBusConnection *conn,
if (powered) {
if (modem->driver->pre_sim)
modem->driver->pre_sim(modem);
- } else {
- remove_all_atoms(modem);
- modem->call_ids = 0;
}
return NULL;
@@ -562,9 +565,6 @@ void ofono_modem_set_powered(struct ofono_modem *modem, ofono_bool_t powered)
if (powered) {
if (modem->driver->pre_sim)
modem->driver->pre_sim(modem);
- } else {
- remove_all_atoms(modem);
- modem->call_ids = 0;
}
}