udev: Use fully automatic detection for Option HSO devices

This commit is contained in:
Marcel Holtmann 2011-08-06 14:06:16 +02:00
parent 9ef2e27b11
commit 4cabdedafd
3 changed files with 57 additions and 57 deletions

View File

@ -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"

View File

@ -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)

View File

@ -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" },