return FALSE;
}
+static void enable_element(struct connman_element *element)
+{
+ if (element->type != CONNMAN_ELEMENT_TYPE_DEVICE)
+ return;
+
+ if (element->policy != CONNMAN_ELEMENT_POLICY_AUTO)
+ return;
+
+ if (element->driver && element->driver->enable) {
+ if (element->driver->enable(element) == 0)
+ element->enabled = TRUE;
+ }
+}
+
static gboolean probe_driver(GNode *node, gpointer data)
{
struct connman_element *element = node->data;
__connman_element_lock(element);
element->driver = driver;
__connman_element_unlock(element);
+
+ enable_element(element);
}
return FALSE;
return 0;
}
+static void disable_element(struct connman_element *element)
+{
+ if (element->policy != CONNMAN_ELEMENT_POLICY_AUTO)
+ return;
+
+ if (element->enabled == FALSE)
+ return;
+
+ if (element->driver && element->driver->disable) {
+ if (element->driver->disable(element) == 0)
+ element->enabled = FALSE;
+ }
+}
+
static gboolean remove_driver(GNode *node, gpointer data)
{
struct connman_element *element = node->data;
DBG("element %p name %s", element, element->name);
if (element->driver == driver) {
+ disable_element(element);
+
if (driver->remove)
driver->remove(element);
__connman_element_lock(element);
element->driver = driver;
__connman_element_unlock(element);
+
+ enable_element(element);
break;
}
}