Add device type for Nozomi based hardware
[connman] / src / device.c
index 3930d75..c972c08 100644 (file)
@@ -60,6 +60,9 @@ static const char *type2description(enum connman_device_type type)
        case CONNMAN_DEVICE_TYPE_BLUETOOTH:
                return "Bluetooth";
        case CONNMAN_DEVICE_TYPE_HSO:
+       case CONNMAN_DEVICE_TYPE_NOZOMI:
+       case CONNMAN_DEVICE_TYPE_HUAWEI:
+       case CONNMAN_DEVICE_TYPE_NOVATEL:
                return "Cellular";
        }
 
@@ -81,6 +84,9 @@ static const char *type2string(enum connman_device_type type)
        case CONNMAN_DEVICE_TYPE_BLUETOOTH:
                return "bluetooth";
        case CONNMAN_DEVICE_TYPE_HSO:
+       case CONNMAN_DEVICE_TYPE_HUAWEI:
+       case CONNMAN_DEVICE_TYPE_NOZOMI:
+       case CONNMAN_DEVICE_TYPE_NOVATEL:
                return "cellular";
        }
 
@@ -90,6 +96,8 @@ static const char *type2string(enum connman_device_type type)
 static const char *policy2string(enum connman_device_policy policy)
 {
        switch (policy) {
+       case CONNMAN_DEVICE_POLICY_UNKNOWN:
+               break;
        case CONNMAN_DEVICE_POLICY_IGNORE:
                return "ignore";
        case CONNMAN_DEVICE_POLICY_OFF:
@@ -98,9 +106,9 @@ static const char *policy2string(enum connman_device_policy policy)
                return "auto";
        case CONNMAN_DEVICE_POLICY_MANUAL:
                return "manual";
-       default:
-               return NULL;
        }
+
+       return NULL;
 }
 
 static enum connman_device_policy string2policy(const char *policy)
@@ -159,6 +167,10 @@ static int set_policy(DBusConnection *connection,
                return 0;
 
        switch (policy) {
+       case CONNMAN_DEVICE_POLICY_UNKNOWN:
+               return -EINVAL;
+       case CONNMAN_DEVICE_POLICY_IGNORE:
+               break;
        case CONNMAN_DEVICE_POLICY_OFF:
                if (device->powered == TRUE)
                        err = set_powered(device, FALSE);
@@ -168,8 +180,6 @@ static int set_policy(DBusConnection *connection,
                if (device->powered == FALSE)
                        err = set_powered(device, TRUE);
                break;
-       default:
-               break;
        }
 
        if (err < 0)
@@ -469,6 +479,37 @@ static void unregister_interface(struct connman_element *element)
                                                CONNMAN_DEVICE_INTERFACE);
 }
 
+static void device_enable(struct connman_device *device)
+{
+       DBG("device %p", device);
+
+       if (device->policy == CONNMAN_DEVICE_POLICY_IGNORE ||
+                               device->policy == CONNMAN_DEVICE_POLICY_OFF)
+               return;
+
+       if (device->powered == TRUE)
+               return;
+
+       if (device->driver->enable)
+               device->driver->enable(device);
+}
+
+static void device_disable(struct connman_device *device)
+{
+       DBG("device %p", device);
+
+       if (device->policy == CONNMAN_DEVICE_POLICY_IGNORE)
+               return;
+
+       if (device->powered == FALSE)
+               return;
+
+       g_hash_table_remove_all(device->networks);
+
+       if (device->driver->disable)
+               device->driver->disable(device);
+}
+
 static GSList *driver_list = NULL;
 
 static gint compare_priority(gconstpointer a, gconstpointer b)
@@ -499,6 +540,25 @@ int connman_device_driver_register(struct connman_device_driver *driver)
        return 0;
 }
 
+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) {
+               device_disable(element->device);
+
+               if (driver->remove)
+                       driver->remove(element->device);
+
+               element->device->driver = NULL;
+       }
+}
+
 /**
  * connman_device_driver_unregister:
  * @driver: device driver definition
@@ -510,6 +570,9 @@ void connman_device_driver_unregister(struct connman_device_driver *driver)
        DBG("driver %p name %s", driver, driver->name);
 
        driver_list = g_slist_remove(driver_list, driver);
+
+       __connman_element_foreach(NULL, CONNMAN_ELEMENT_TYPE_DEVICE,
+                                               remove_driver, driver);
 }
 
 static void unregister_network(gpointer data)
@@ -533,6 +596,7 @@ static void device_destruct(struct connman_element *element)
        g_free(device->interface);
 
        g_hash_table_destroy(device->networks);
+       device->networks = NULL;
 }
 
 /**
@@ -564,12 +628,20 @@ struct connman_device *connman_device_create(const char *node,
        device->element.index = -1;
 
        switch (type) {
+       case CONNMAN_DEVICE_TYPE_UNKNOWN:
+       case CONNMAN_DEVICE_TYPE_VENDOR:
+       case CONNMAN_DEVICE_TYPE_WIFI:
+       case CONNMAN_DEVICE_TYPE_WIMAX:
+       case CONNMAN_DEVICE_TYPE_BLUETOOTH:
+       case CONNMAN_DEVICE_TYPE_HSO:
+       case CONNMAN_DEVICE_TYPE_NOZOMI:
+       case CONNMAN_DEVICE_TYPE_HUAWEI:
+       case CONNMAN_DEVICE_TYPE_NOVATEL:
+               device->element.subtype = CONNMAN_ELEMENT_SUBTYPE_UNKNOWN;
+               break;
        case CONNMAN_DEVICE_TYPE_ETHERNET:
                device->element.subtype = CONNMAN_ELEMENT_SUBTYPE_ETHERNET;
                break;
-       default:
-               device->element.subtype = CONNMAN_ELEMENT_SUBTYPE_UNKNOWN;
-               break;
        }
 
        device->element.device = device;
@@ -958,37 +1030,6 @@ void connman_device_set_data(struct connman_device *device, void *data)
        device->driver_data = data;
 }
 
-static void device_enable(struct connman_device *device)
-{
-       DBG("device %p", device);
-
-       if (device->policy == CONNMAN_DEVICE_POLICY_IGNORE ||
-                               device->policy == CONNMAN_DEVICE_POLICY_OFF)
-               return;
-
-       if (device->powered == TRUE)
-               return;
-
-       if (device->driver->enable)
-               device->driver->enable(device);
-}
-
-static void device_disable(struct connman_device *device)
-{
-       DBG("device %p", device);
-
-       if (device->policy == CONNMAN_DEVICE_POLICY_IGNORE)
-               return;
-
-       if (device->powered == FALSE)
-               return;
-
-       g_hash_table_remove_all(device->networks);
-
-       if (device->driver->disable)
-               device->driver->disable(device);
-}
-
 static gboolean match_driver(struct connman_device *device,
                                        struct connman_device_driver *driver)
 {