udev: Add automatic detection for Ericsson MBM based devices

This commit is contained in:
Marcel Holtmann 2011-08-10 21:52:40 -07:00
parent 7fd6d3d0ef
commit 3742162017
3 changed files with 59 additions and 130 deletions

View File

@ -34,59 +34,6 @@ ENV{DEVTYPE}!="usb_device", GOTO="ofono_end"
# Ignore fake serial number
ATTRS{serial}=="1234567890ABCDEF", ENV{ID_SERIAL_SHORT}=""
# Ericsson F3507g
ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1900", ENV{OFONO_DRIVER}="mbm"
ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1902", ENV{OFONO_DRIVER}="mbm"
# Ericsson F3607gw
ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1904", ENV{OFONO_DRIVER}="mbm"
ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1905", ENV{OFONO_DRIVER}="mbm"
ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1906", ENV{OFONO_DRIVER}="mbm"
# Ericsson c3607w
ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="190b", ENV{OFONO_DRIVER}="mbm"
ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1049", ENV{OFONO_DRIVER}="mbm"
# Ericsson F3307
ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="190a", ENV{OFONO_DRIVER}="mbm"
ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="1909", ENV{OFONO_DRIVER}="mbm"
# Ericsson F5521gw
ATTRS{idVendor}=="0bdb", ATTRS{idProduct}=="190d", ENV{OFONO_DRIVER}="mbm"
# Sony-Ericsson MD300
ATTRS{idVendor}=="0fce", ATTRS{idProduct}=="d0cf", ENV{OFONO_DRIVER}="mbm"
# Dell 5530 HSDPA
ATTRS{idVendor}=="413c", ATTRS{idProduct}=="8147", ENV{OFONO_DRIVER}="mbm"
# Dell F3607gw
ATTRS{idVendor}=="413c", ATTRS{idProduct}=="8183", ENV{OFONO_DRIVER}="mbm"
ATTRS{idVendor}=="413c", ATTRS{idProduct}=="8184", ENV{OFONO_DRIVER}="mbm"
# Dell F3307
ATTRS{idVendor}=="413c", ATTRS{idProduct}=="818b", ENV{OFONO_DRIVER}="mbm"
ATTRS{idVendor}=="413c", ATTRS{idProduct}=="818c", ENV{OFONO_DRIVER}="mbm"
# HP hs2330 Mobile Broadband Module
ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="271d", ENV{OFONO_DRIVER}="mbm"
# HP hs2320 Mobile Broadband Module
ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="261d", ENV{OFONO_DRIVER}="mbm"
# HP lc2000 Mobile Broadband Module
ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="301d", ENV{OFONO_DRIVER}="mbm"
# HP lc2010 Mobile Broadband Module
ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="2f1d", ENV{OFONO_DRIVER}="mbm"
# Toshiba
ATTRS{idVendor}=="0930", ATTRS{idProduct}=="130b", ENV{OFONO_DRIVER}="mbm"
# Toshiba F3607gw
ATTRS{idVendor}=="0930", ATTRS{idProduct}=="130c", ENV{OFONO_DRIVER}="mbm"
ATTRS{idVendor}=="0930", ATTRS{idProduct}=="1311", ENV{OFONO_DRIVER}="mbm"
# Nokia CDMA Device
ATTRS{idVendor}=="0421", ATTRS{idProduct}=="023e", ENV{OFONO_DRIVER}="nokiacdma"
ATTRS{idVendor}=="0421", ATTRS{idProduct}=="00b6", ENV{OFONO_DRIVER}="nokiacdma"

View File

@ -96,79 +96,6 @@ static const char *get_serial(struct udev_device *udev_device)
return serial;
}
#define MODEM_DEVICE "ModemDevice"
#define DATA_DEVICE "DataDevice"
#define GPS_DEVICE "GPSDevice"
#define NETWORK_INTERFACE "NetworkInterface"
static void add_mbm(struct ofono_modem *modem,
struct udev_device *udev_device)
{
const char *desc, *devnode;
const char *device, *data, *network;
int registered;
desc = udev_device_get_sysattr_value(udev_device, "device/interface");
if (desc == NULL)
return;
DBG("desc: %s", desc);
registered = ofono_modem_get_integer(modem, "Registered");
if (registered == 0 &&
(g_str_has_suffix(desc, "Minicard Modem") ||
g_str_has_suffix(desc, "Minicard Modem 2") ||
g_str_has_suffix(desc, "Mini-Card Modem") ||
g_str_has_suffix(desc, "Broadband Modem") ||
g_str_has_suffix(desc, "Module Modem") ||
g_str_has_suffix(desc, "Broadband USB Modem"))) {
devnode = udev_device_get_devnode(udev_device);
if (ofono_modem_get_string(modem, MODEM_DEVICE) == NULL)
ofono_modem_set_string(modem, MODEM_DEVICE, devnode);
else
ofono_modem_set_string(modem, DATA_DEVICE, devnode);
} else if (registered == 0 &&
(g_str_has_suffix(desc, "Minicard Data Modem") ||
g_str_has_suffix(desc, "Mini-Card Data Modem") ||
g_str_has_suffix(desc, "Module Data Modem") ||
g_str_has_suffix(desc, "Module\xc2\xa0""Data Modem") ||
g_str_has_suffix(desc, "Broadband Data Modem"))) {
devnode = udev_device_get_devnode(udev_device);
ofono_modem_set_string(modem, DATA_DEVICE, devnode);
} else if (g_str_has_suffix(desc, "Minicard GPS Port") ||
g_str_has_suffix(desc, "Mini-Card GPS Port") ||
g_str_has_suffix(desc, "Module NMEA") ||
g_str_has_suffix(desc, "Broadband GPS Port")) {
devnode = udev_device_get_devnode(udev_device);
ofono_modem_set_string(modem, GPS_DEVICE, devnode);
} else if (registered == 0 &&
(g_str_has_suffix(desc, "Minicard Network Adapter") ||
g_str_has_suffix(desc, "Mini-Card Network Adapter") ||
g_str_has_suffix(desc, "Broadband Network Adapter") ||
g_str_has_suffix(desc, "Module Network Adapter") ||
g_str_has_suffix(desc, "Minicard NetworkAdapter"))) {
devnode = get_property(udev_device, "INTERFACE");
ofono_modem_set_string(modem, NETWORK_INTERFACE, devnode);
} else {
return;
}
if (registered == 1)
return;
device = ofono_modem_get_string(modem, MODEM_DEVICE);
data = ofono_modem_get_string(modem, DATA_DEVICE);
network = ofono_modem_get_string(modem, NETWORK_INTERFACE);
if (device != NULL && data != 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)
{
@ -407,9 +334,7 @@ done:
g_hash_table_insert(devpath_list, g_strdup(curpath), g_strdup(devpath));
if (g_strcmp0(driver, "mbm") == 0)
add_mbm(modem, udev_device);
else if (g_strcmp0(driver, "ifx") == 0)
if (g_strcmp0(driver, "ifx") == 0)
add_ifx(modem, udev_device);
else if (g_strcmp0(driver, "isiusb") == 0)
add_isi(modem, udev_device);

View File

@ -55,6 +55,52 @@ struct device_info {
char *sysattr;
};
static gboolean setup_mbm(struct modem_info *modem)
{
const char *mdm = NULL, *app = NULL, *network = NULL, *gps = 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_str_has_suffix(info->sysattr, "Modem") == TRUE ||
g_str_has_suffix(info->sysattr,
"Modem 2") == TRUE) {
if (mdm == NULL)
mdm = info->devnode;
else
app = info->devnode;
} else if (g_str_has_suffix(info->sysattr,
"GPS Port") == TRUE ||
g_str_has_suffix(info->sysattr,
"Module NMEA") == TRUE) {
gps = info->devnode;
} else if (g_str_has_suffix(info->sysattr,
"Network Adapter") == TRUE ||
g_str_has_suffix(info->sysattr,
"NetworkAdapter") == TRUE) {
network = info->devnode;
}
}
if (mdm == NULL || app == NULL)
return FALSE;
DBG("modem=%s data=%s network=%s gps=%s", mdm, app, network, gps);
ofono_modem_set_string(modem->modem, "ModemDevice", mdm);
ofono_modem_set_string(modem->modem, "DataDevice", app);
ofono_modem_set_string(modem->modem, "GPSDevice", gps);
ofono_modem_set_string(modem->modem, "NetworkInterface", network);
return TRUE;
}
static gboolean setup_hso(struct modem_info *modem)
{
const char *control = NULL, *application = NULL, *network = NULL;
@ -451,7 +497,8 @@ static struct {
gboolean (*setup)(struct modem_info *modem);
const char *sysattr;
} driver_list[] = {
{ "hso", setup_hso, "hsotype" },
{ "mbm", setup_mbm, "device/interface" },
{ "hso", setup_hso, "hsotype" },
{ "gobi", setup_gobi, },
{ "sierra", setup_sierra },
{ "huawei", setup_huawei },
@ -625,6 +672,16 @@ static struct {
const char *vid;
const char *pid;
} vendor_list[] = {
{ "mbm", "cdc_acm", "0bdb" },
{ "mbm" "cdc_ether", "0bdb" },
{ "mbm", "cdc_acm", "0fce" },
{ "mbm", "cdc_ether", "0fce" },
{ "mbm", "cdc_acm", "413c" },
{ "mbm", "cdc_ether", "413c" },
{ "mbm", "cdc_acm", "03f0" },
{ "mbm", "cdc_ether", "03f0" },
{ "mbm", "cdc_acm", "0930" },
{ "mbm", "cdc_ether", "0930" },
{ "hso", "hso" },
{ "gobi", "qcserial" },
{ "sierra", "sierra" },