diff options
author | Tomasz Bursztyka <tomasz.bursztyka@linux.intel.com> | 2012-10-15 15:35:21 +0300 |
---|---|---|
committer | Patrik Flykt <patrik.flykt@linux.intel.com> | 2012-10-16 15:06:30 +0300 |
commit | 47f491badb3abce50e805567974893f1e7af15bc (patch) | |
tree | 5bbf437b860eb41b6a8c543c61d516a905ac0600 /src | |
parent | 287c19dc6093d7b55f52741e1af90a742249a534 (diff) | |
download | connman-47f491badb3abce50e805567974893f1e7af15bc.tar.gz connman-47f491badb3abce50e805567974893f1e7af15bc.tar.bz2 connman-47f491badb3abce50e805567974893f1e7af15bc.zip |
technology: Properly handle rfkill driven state
Diffstat (limited to 'src')
-rw-r--r-- | src/technology.c | 52 |
1 files changed, 43 insertions, 9 deletions
diff --git a/src/technology.c b/src/technology.c index 4ae5b865..44eeb136 100644 --- a/src/technology.c +++ b/src/technology.c @@ -1198,6 +1198,9 @@ int __connman_technology_remove_device(struct connman_device *device) static void powered_changed(struct connman_technology *technology) { + if (technology->dbus_registered == FALSE) + return; + if (technology->pending_reply != NULL) { g_dbus_send_reply(connection, technology->pending_reply, DBUS_TYPE_INVALID); @@ -1235,6 +1238,9 @@ int __connman_technology_enabled(enum connman_service_type type) if (technology == NULL) return -ENXIO; + if (technology->rfkill_driven == TRUE) + return 0; + return technology_enabled(technology); } @@ -1254,11 +1260,22 @@ static int technology_disabled(struct connman_technology *technology) int __connman_technology_disabled(enum connman_service_type type) { struct connman_technology *technology; + GSList *list; technology = technology_find(type); if (technology == NULL) return -ENXIO; + if (technology->rfkill_driven == TRUE) + return 0; + + for (list = technology->device_list; list != NULL; list = list->next) { + struct connman_device *device = list->data; + + if (connman_device_get_powered(device) == TRUE) + return 0; + } + return technology_disabled(technology); } @@ -1325,6 +1342,7 @@ static connman_bool_t technology_apply_rfkill_change(struct connman_technology * connman_bool_t softblock, connman_bool_t hardblock) { + gboolean hardblock_changed = FALSE; gboolean apply = TRUE; GList *start, *list; @@ -1348,19 +1366,35 @@ static connman_bool_t technology_apply_rfkill_change(struct connman_technology * goto softblock_change; technology->hardblocked = hardblock; - - if (hardblock == TRUE) { - DBG("%s is switched off.", get_name(technology->type)); - technology_disable(technology); - technology_dbus_unregister(technology); - } else { - technology_enable(technology); - technology_dbus_register(technology); - } + hardblock_changed = TRUE; softblock_change: + if (apply == FALSE && technology->softblocked != softblock) + apply = TRUE; + + if (apply == FALSE) + return technology->hardblocked; + technology->softblocked = softblock; + if (technology->hardblocked == TRUE || + technology->softblocked == TRUE) { + if (technology_disabled(technology) != -EALREADY) + technology_affect_devices(technology, FALSE); + } else if (technology->hardblocked == FALSE && + technology->softblocked == FALSE) { + if (technology_enabled(technology) != -EALREADY) + technology_affect_devices(technology, TRUE); + } + + if (hardblock_changed == TRUE) { + if (technology->hardblocked == TRUE) { + DBG("%s is switched off.", get_name(technology->type)); + technology_dbus_unregister(technology); + } else + technology_dbus_register(technology); + } + return technology->hardblocked; } |