connman_bool_t offlinemode;
connman_bool_t blocked;
connman_bool_t powered;
+ connman_bool_t powered_pending;
connman_bool_t powered_persistent;
connman_bool_t carrier;
connman_bool_t scanning;
DBG("device %p powered %d", device, powered);
- if (device->powered == powered)
+ if (device->powered_pending == powered)
return -EALREADY;
+ device->powered_pending = powered;
+
if (!driver)
return -EINVAL;
return -EALREADY;
device->powered = powered;
+ device->powered_pending = powered;
type = __connman_device_get_service_type(device);
DBG("device %p blocked %d", device, blocked);
- if (device->blocked == blocked)
- return -EALREADY;
-
device->blocked = blocked;
if (device->offlinemode == TRUE)
if (!device->driver || !device->driver->enable)
return -EOPNOTSUPP;
- if (device->powered == TRUE)
+ if (device->powered_pending == TRUE)
return -EALREADY;
+ device->powered_pending = TRUE;
+
err = device->driver->enable(device);
if (err < 0)
return err;
if (device->powered == FALSE)
return -ENOLINK;
+ if (device->powered_pending == FALSE)
+ return -EALREADY;
+
+ device->powered_pending = FALSE;
+
clear_scan_trigger(device);
g_hash_table_remove_all(device->networks);