Fix: Remove all atoms when attempting to power off
authorDenis Kenzior <denkenz@gmail.com>
Wed, 2 Dec 2009 21:33:25 +0000 (15:33 -0600)
committerDenis Kenzior <denkenz@gmail.com>
Thu, 3 Dec 2009 01:10:07 +0000 (19:10 -0600)
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.

src/modem.c

index c335a38..e6fd1fe 100644 (file)
@@ -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;
        }
 }