mirror of git://git.sysmocom.de/ofono
udev: Use fully automatic detection for Option HSO devices
This commit is contained in:
parent
9ef2e27b11
commit
4cabdedafd
|
@ -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"
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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" },
|
||||
|
|
Loading…
Reference in New Issue