diff --git a/plugins/ofono.rules b/plugins/ofono.rules index 555125a4..3fc3cd4b 100644 --- a/plugins/ofono.rules +++ b/plugins/ofono.rules @@ -83,15 +83,6 @@ ATTRS{idVendor}=="1c9e", ATTRS{idProduct}=="9e00", ENV{OFONO_DRIVER}="speedupcdm # Speed Up ATTRS{idVendor}=="2020", ENV{OFONO_DRIVER}="speedup" -# Option Globetrotter -ATTRS{idVendor}=="0af0", ATTRS{idProduct}=="6911", ENV{OFONO_DRIVER}="hso" -ATTRS{idVendor}=="0af0", ATTRS{idProduct}=="6971", ENV{OFONO_DRIVER}="hso" -ATTRS{idVendor}=="0af0", ATTRS{idProduct}=="7401", ENV{OFONO_DRIVER}="hso" -ATTRS{idVendor}=="0af0", ATTRS{idProduct}=="7601", ENV{OFONO_DRIVER}="hso" -ATTRS{idVendor}=="0af0", ATTRS{idProduct}=="7701", ENV{OFONO_DRIVER}="hso" -ATTRS{idVendor}=="0af0", ATTRS{idProduct}=="7901", ENV{OFONO_DRIVER}="hso" -ATTRS{idVendor}=="0af0", ATTRS{idProduct}=="9000", ENV{OFONO_DRIVER}="hso" - # Ericsson F3507g ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1900", ENV{OFONO_DRIVER}="mbm" ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1902", ENV{OFONO_DRIVER}="mbm" diff --git a/plugins/udev.c b/plugins/udev.c index a97d0b69..c4e7f6bf 100644 --- a/plugins/udev.c +++ b/plugins/udev.c @@ -169,52 +169,6 @@ static void add_mbm(struct ofono_modem *modem, } } -#define APPLICATION_PORT "ApplicationPort" -#define CONTROL_PORT "ControlPort" - -static void add_hso(struct ofono_modem *modem, - struct udev_device *udev_device) -{ - const char *subsystem, *type, *devnode; - const char *app, *control, *network; - int registered; - - DBG("modem %p", modem); - - subsystem = udev_device_get_subsystem(udev_device); - if (subsystem == NULL) - return; - - registered = ofono_modem_get_integer(modem, "Registered"); - if (registered != 0) - return; - - type = udev_device_get_sysattr_value(udev_device, "hsotype"); - - if (type != NULL) { - devnode = udev_device_get_devnode(udev_device); - - if (g_str_has_suffix(type, "Application") == TRUE) - ofono_modem_set_string(modem, APPLICATION_PORT, devnode); - else if (g_str_has_suffix(type, "Control") == TRUE) - ofono_modem_set_string(modem, CONTROL_PORT, devnode); - } else if (g_str_equal(subsystem, "net") == TRUE) { - devnode = get_property(udev_device, "INTERFACE"); - ofono_modem_set_string(modem, NETWORK_INTERFACE, devnode); - } else { - return; - } - - app = ofono_modem_get_string(modem, APPLICATION_PORT); - control = ofono_modem_get_string(modem, CONTROL_PORT); - network = ofono_modem_get_string(modem, NETWORK_INTERFACE); - - if (app != NULL && control != NULL && network != NULL) { - ofono_modem_set_integer(modem, "Registered", 1); - ofono_modem_register(modem); - } -} - static void add_ifx(struct ofono_modem *modem, struct udev_device *udev_device) { @@ -570,8 +524,6 @@ done: if (g_strcmp0(driver, "mbm") == 0) add_mbm(modem, udev_device); - else if (g_strcmp0(driver, "hso") == 0) - add_hso(modem, udev_device); else if (g_strcmp0(driver, "ifx") == 0) add_ifx(modem, udev_device); else if (g_strcmp0(driver, "nokia") == 0) 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" },