+static int setup_device(struct connman_device *device)
+{
+ int err;
+
+ DBG("device %p", device);
+
+ err = register_interface(&device->element);
+ if (err < 0) {
+ if (device->driver->remove)
+ device->driver->remove(device);
+ device->driver = NULL;
+ return err;
+ }
+
+ device_enable(device);
+
+ return 0;
+}
+
+static void probe_driver(struct connman_element *element, gpointer user_data)
+{
+ struct connman_device_driver *driver = user_data;
+
+ DBG("element %p name %s", element, element->name);
+
+ if (element->device == NULL)
+ return;
+
+ if (driver->probe(element->device) < 0)
+ return;
+
+ element->device->driver = driver;
+
+ setup_device(element->device);
+}
+
+static void remove_device(struct connman_device *device)
+{
+ DBG("device %p", device);
+
+ device_disable(device);
+
+ unregister_interface(&device->element);
+
+ if (device->driver->remove)
+ device->driver->remove(device);
+
+ device->driver = NULL;
+}
+
+static void remove_driver(struct connman_element *element, gpointer user_data)
+{
+ struct connman_device_driver *driver = user_data;
+
+ DBG("element %p name %s", element, element->name);
+
+ if (element->device == NULL)
+ return;
+
+ if (element->device->driver == driver)
+ remove_device(element->device);
+}
+
+connman_bool_t __connman_device_has_driver(struct connman_device *device)
+{
+ if (device->driver == NULL)
+ return FALSE;
+
+ return device->registered;
+}
+