summaryrefslogtreecommitdiffstats
path: root/plugins/udevng.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/udevng.c')
-rw-r--r--plugins/udevng.c57
1 files changed, 57 insertions, 0 deletions
diff --git a/plugins/udevng.c b/plugins/udevng.c
index e3be629f..2e083d1e 100644
--- a/plugins/udevng.c
+++ b/plugins/udevng.c
@@ -43,6 +43,7 @@ struct modem_info {
char *driver;
GSList *devices;
struct ofono_modem *modem;
+ const char *sysattr;
};
struct device_info {
@@ -51,8 +52,41 @@ struct device_info {
char *interface;
char *number;
char *label;
+ char *sysattr;
};
+static gboolean setup_hso(struct modem_info *modem)
+{
+ const char *control = NULL, *application = NULL, *network = NULL;
+ GSList *list;
+
+ DBG("%s", modem->syspath);
+
+ for (list = modem->devices; list; list = list->next) {
+ struct device_info *info = list->data;
+
+ DBG("%s %s %s %s %s", info->devnode, info->interface,
+ info->number, info->label, info->sysattr);
+
+ if (g_strcmp0(info->sysattr, "Control") == 0)
+ control = info->devnode;
+ else if (g_strcmp0(info->sysattr, "Application") == 0)
+ application = info->devnode;
+ else if (g_strcmp0(info->sysattr, "") == 0 &&
+ g_str_has_prefix(info->devnode, "hso") == TRUE)
+ network = info->devnode;
+ }
+
+ if (control == NULL && application == NULL)
+ return FALSE;
+
+ ofono_modem_set_string(modem->modem, "ControlPort", control);
+ ofono_modem_set_string(modem->modem, "ApplicationPort", application);
+ ofono_modem_set_string(modem->modem, "NetworkInterface", network);
+
+ return TRUE;
+}
+
static gboolean setup_gobi(struct modem_info *modem)
{
const char *device = NULL;
@@ -246,7 +280,9 @@ static gboolean setup_zte(struct modem_info *modem)
static struct {
const char *name;
gboolean (*setup)(struct modem_info *modem);
+ const char *sysattr;
} driver_list[] = {
+ { "hso", setup_hso, "hsotype" },
{ "gobi", setup_gobi },
{ "sierra", setup_sierra },
{ "huawei", setup_huawei },
@@ -258,6 +294,18 @@ static struct {
static GHashTable *modem_list;
+static const char *get_sysattr(const char *driver)
+{
+ unsigned int i;
+
+ for (i = 0; driver_list[i].name; i++) {
+ if (g_str_equal(driver_list[i].name, driver) == TRUE)
+ return driver_list[i].sysattr;
+ }
+
+ return NULL;
+}
+
static void destroy_modem(gpointer data)
{
struct modem_info *modem = data;
@@ -277,6 +325,7 @@ static void destroy_modem(gpointer data)
g_free(info->interface);
g_free(info->number);
g_free(info->label);
+ g_free(info->sysattr);
g_free(info);
list->data = NULL;
@@ -371,6 +420,8 @@ static void add_device(const char *syspath, const char *devname,
modem->devname = g_strdup(devname);
modem->driver = g_strdup(driver);
+ modem->sysattr = get_sysattr(driver);
+
g_hash_table_replace(modem_list, modem->syspath, modem);
}
@@ -384,6 +435,11 @@ static void add_device(const char *syspath, const char *devname,
info->number = g_strdup(number);
info->label = g_strdup(label);
+ if (modem->sysattr != NULL) {
+ info->sysattr = g_strdup(udev_device_get_sysattr_value(device,
+ modem->sysattr));
+ }
+
modem->devices = g_slist_insert_sorted(modem->devices, info,
compare_device);
}
@@ -394,6 +450,7 @@ static struct {
const char *vid;
const char *pid;
} vendor_list[] = {
+ { "hso", "hso" },
{ "gobi", "qcserial" },
{ "sierra", "sierra" },
{ "huawei", "cdc_ether", "12d1" },