From: Alok Barsode <[email protected]>

If we get a device before the technology driver was registered we
would lose track of it as we ignoed it. Adding a device list which
can keep a track of technologyless devices untill the driver for
them is loaded. If the driver is not compiled in the devices will
remain in the list.
---
v2: Used g_slist_prepend instead of g_slist_append.

 src/technology.c |   45 +++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 43 insertions(+), 2 deletions(-)

diff --git a/src/technology.c b/src/technology.c
index 9ff80dc..24de48f 100644
--- a/src/technology.c
+++ b/src/technology.c
@@ -34,6 +34,12 @@ static DBusConnection *connection;
 
 static GSList *technology_list = NULL;
 
+/*
+ * List of devices with no technology associated with them either because of
+ * no compiled in support or the driver is not yet loaded.
+*/
+static GSList *techless_device_list = NULL;
+
 static connman_bool_t global_offlinemode;
 
 struct connman_rfkill {
@@ -86,11 +92,35 @@ static gint compare_priority(gconstpointer a, gconstpointer 
b)
  */
 int connman_technology_driver_register(struct connman_technology_driver 
*driver)
 {
+       GSList *list;
+       struct connman_device *device;
+       enum connman_service_type type;
+
        DBG("Registering %s driver", driver->name);
 
        driver_list = g_slist_insert_sorted(driver_list, driver,
                                                        compare_priority);
 
+       if (techless_device_list == NULL)
+               return 0;
+
+       /*
+        * Check for technology less devices if this driver
+        * can service any of them.
+       */
+       for (list = techless_device_list; list; list = list->next) {
+               device = list->data;
+
+               type = __connman_device_get_service_type(device);
+               if (type != driver->type)
+                       continue;
+
+               techless_device_list = g_slist_remove(techless_device_list,
+                                                               device);
+
+               __connman_technology_add_device(device);
+       }
+
        return 0;
 }
 
@@ -902,8 +932,16 @@ int __connman_technology_add_device(struct connman_device 
*device)
        type = __connman_device_get_service_type(device);
 
        technology = technology_get(type);
-       if (technology == NULL)
+       if (technology == NULL) {
+               /*
+                * Since no driver can be found for this device at the moment we
+                * add it to the techless device list.
+               */
+               techless_device_list = g_slist_prepend(techless_device_list,
+                                                               device);
+
                return -ENXIO;
+       }
 
        if (technology->enable_persistent && !global_offlinemode)
                __connman_device_enable(device);
@@ -927,8 +965,11 @@ int __connman_technology_remove_device(struct 
connman_device *device)
        type = __connman_device_get_service_type(device);
 
        technology = technology_find(type);
-       if (technology == NULL)
+       if (technology == NULL) {
+               techless_device_list = g_slist_remove(techless_device_list,
+                                                               device);
                return -ENXIO;
+       }
 
        technology->device_list = g_slist_remove(technology->device_list,
                                                                device);
-- 
1.7.5.4

_______________________________________________
connman mailing list
[email protected]
http://lists.connman.net/listinfo/connman

Reply via email to