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
|
# Speed Up
|
||||||
ATTRS{idVendor}=="2020", ENV{OFONO_DRIVER}="speedup"
|
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
|
# Ericsson F3507g
|
||||||
ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1900", ENV{OFONO_DRIVER}="mbm"
|
ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1900", ENV{OFONO_DRIVER}="mbm"
|
||||||
ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1902", 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,
|
static void add_ifx(struct ofono_modem *modem,
|
||||||
struct udev_device *udev_device)
|
struct udev_device *udev_device)
|
||||||
{
|
{
|
||||||
|
@ -570,8 +524,6 @@ done:
|
||||||
|
|
||||||
if (g_strcmp0(driver, "mbm") == 0)
|
if (g_strcmp0(driver, "mbm") == 0)
|
||||||
add_mbm(modem, udev_device);
|
add_mbm(modem, udev_device);
|
||||||
else if (g_strcmp0(driver, "hso") == 0)
|
|
||||||
add_hso(modem, udev_device);
|
|
||||||
else if (g_strcmp0(driver, "ifx") == 0)
|
else if (g_strcmp0(driver, "ifx") == 0)
|
||||||
add_ifx(modem, udev_device);
|
add_ifx(modem, udev_device);
|
||||||
else if (g_strcmp0(driver, "nokia") == 0)
|
else if (g_strcmp0(driver, "nokia") == 0)
|
||||||
|
|
|
@ -43,6 +43,7 @@ struct modem_info {
|
||||||
char *driver;
|
char *driver;
|
||||||
GSList *devices;
|
GSList *devices;
|
||||||
struct ofono_modem *modem;
|
struct ofono_modem *modem;
|
||||||
|
const char *sysattr;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct device_info {
|
struct device_info {
|
||||||
|
@ -51,8 +52,41 @@ struct device_info {
|
||||||
char *interface;
|
char *interface;
|
||||||
char *number;
|
char *number;
|
||||||
char *label;
|
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)
|
static gboolean setup_gobi(struct modem_info *modem)
|
||||||
{
|
{
|
||||||
const char *device = NULL;
|
const char *device = NULL;
|
||||||
|
@ -246,7 +280,9 @@ static gboolean setup_zte(struct modem_info *modem)
|
||||||
static struct {
|
static struct {
|
||||||
const char *name;
|
const char *name;
|
||||||
gboolean (*setup)(struct modem_info *modem);
|
gboolean (*setup)(struct modem_info *modem);
|
||||||
|
const char *sysattr;
|
||||||
} driver_list[] = {
|
} driver_list[] = {
|
||||||
|
{ "hso", setup_hso, "hsotype" },
|
||||||
{ "gobi", setup_gobi },
|
{ "gobi", setup_gobi },
|
||||||
{ "sierra", setup_sierra },
|
{ "sierra", setup_sierra },
|
||||||
{ "huawei", setup_huawei },
|
{ "huawei", setup_huawei },
|
||||||
|
@ -258,6 +294,18 @@ static struct {
|
||||||
|
|
||||||
static GHashTable *modem_list;
|
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)
|
static void destroy_modem(gpointer data)
|
||||||
{
|
{
|
||||||
struct modem_info *modem = data;
|
struct modem_info *modem = data;
|
||||||
|
@ -277,6 +325,7 @@ static void destroy_modem(gpointer data)
|
||||||
g_free(info->interface);
|
g_free(info->interface);
|
||||||
g_free(info->number);
|
g_free(info->number);
|
||||||
g_free(info->label);
|
g_free(info->label);
|
||||||
|
g_free(info->sysattr);
|
||||||
g_free(info);
|
g_free(info);
|
||||||
|
|
||||||
list->data = NULL;
|
list->data = NULL;
|
||||||
|
@ -371,6 +420,8 @@ static void add_device(const char *syspath, const char *devname,
|
||||||
modem->devname = g_strdup(devname);
|
modem->devname = g_strdup(devname);
|
||||||
modem->driver = g_strdup(driver);
|
modem->driver = g_strdup(driver);
|
||||||
|
|
||||||
|
modem->sysattr = get_sysattr(driver);
|
||||||
|
|
||||||
g_hash_table_replace(modem_list, modem->syspath, modem);
|
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->number = g_strdup(number);
|
||||||
info->label = g_strdup(label);
|
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,
|
modem->devices = g_slist_insert_sorted(modem->devices, info,
|
||||||
compare_device);
|
compare_device);
|
||||||
}
|
}
|
||||||
|
@ -394,6 +450,7 @@ static struct {
|
||||||
const char *vid;
|
const char *vid;
|
||||||
const char *pid;
|
const char *pid;
|
||||||
} vendor_list[] = {
|
} vendor_list[] = {
|
||||||
|
{ "hso", "hso" },
|
||||||
{ "gobi", "qcserial" },
|
{ "gobi", "qcserial" },
|
||||||
{ "sierra", "sierra" },
|
{ "sierra", "sierra" },
|
||||||
{ "huawei", "cdc_ether", "12d1" },
|
{ "huawei", "cdc_ether", "12d1" },
|
||||||
|
|
Loading…
Reference in New Issue