Adding support for enumerating PCIe types of modems in ofono
---
plugins/udevng.c | 187 +++++++++++++++++++++++++++++++++++++++++--------------
1 file changed, 140 insertions(+), 47 deletions(-)
diff --git a/plugins/udevng.c b/plugins/udevng.c
index 1b54b4a..9690990 100644
--- a/plugins/udevng.c
+++ b/plugins/udevng.c
@@ -41,6 +41,7 @@
enum modem_type {
MODEM_TYPE_USB,
MODEM_TYPE_SERIAL,
+ MODEM_TYPE_PCIE,
};
struct modem_info {
@@ -1229,26 +1230,45 @@ static gboolean setup_xmm7xxx(struct modem_info *modem)
info->interface, info->number, info->label,
info->sysattr, info->subsystem);
- if (g_strcmp0(modem->model,"095a") == 0) {
- if (g_strcmp0(info->subsystem, "tty") == 0) {
- if (g_strcmp0(info->number, "00") == 0)
- mdm = info->devnode;
- } else if (g_strcmp0(info->subsystem, "net") == 0) {
- if (g_strcmp0(info->number, "06") == 0)
- net = info->devnode;
- if (g_strcmp0(info->number, "08") == 0)
- net2 = info->devnode;
- if (g_strcmp0(info->number, "0a") == 0)
- net3 = info->devnode;
+ if (g_strcmp0(info->subsystem, "pci") == 0) {
+ if ((g_strcmp0(modem->vendor,"0x8086") == 0) &&
+ (g_strcmp0(modem->model,"0x7560") ==
0)) {
+ mdm = "/dev/iat";
+ net = "inm0";
+ net2 = "inm1";
+ net3 = "inm2";
+ ofono_modem_set_string(modem->modem,
+ "CtrlPath",
"/PCIE/IOSM/CTRL/1");
+ ofono_modem_set_string(modem->modem, "DataPath",
+ "/PCIE/IOSM/IPS/");
}
- } else {
- if (g_strcmp0(info->subsystem, "tty") == 0) {
- if (g_strcmp0(info->number, "02") == 0)
- mdm = info->devnode;
- } else if (g_strcmp0(info->subsystem, "net") == 0) {
- if (g_strcmp0(info->number, "00") == 0)
- net = info->devnode;
+ } else { /* For USB */
+ if (g_strcmp0(modem->model,"095a") == 0) {
+ if (g_strcmp0(info->subsystem, "tty") == 0) {
+ if (g_strcmp0(info->number, "00") == 0)
+ mdm = info->devnode;
+ } else if (g_strcmp0(info->subsystem, "net") ==
0) {
+ if (g_strcmp0(info->number, "06") == 0)
+ net = info->devnode;
+ if (g_strcmp0(info->number, "08") == 0)
+ net2 = info->devnode;
+ if (g_strcmp0(info->number, "0a") == 0)
+ net3 = info->devnode;
+ }
+ } else {
+ if (g_strcmp0(info->subsystem, "tty") == 0) {
+ if (g_strcmp0(info->number, "02") == 0)
+ mdm = info->devnode;
+ } else if (g_strcmp0(info->subsystem, "net") ==
0) {
+ if (g_strcmp0(info->number, "00") == 0)
+ net = info->devnode;
+ }
}
+
+ ofono_modem_set_string(modem->modem, "CtrlPath",
+ "/USBCDC/0");
+ ofono_modem_set_string(modem->modem, "DataPath",
+ "/USBHS/NCM/");
}
}
@@ -1266,9 +1286,6 @@ static gboolean setup_xmm7xxx(struct modem_info *modem)
if (net3)
ofono_modem_set_string(modem->modem, "NetworkInterface3", net3);
- ofono_modem_set_string(modem->modem, "CtrlPath", "/USBCDC/0");
- ofono_modem_set_string(modem->modem, "DataPath", "/USBHS/NCM/");
-
return TRUE;
}
@@ -1437,6 +1454,7 @@ static void destroy_modem(gpointer data)
switch (modem->type) {
case MODEM_TYPE_USB:
+ case MODEM_TYPE_PCIE:
for (list = modem->devices; list; list = list->next) {
struct device_info *info = list->data;
@@ -1467,6 +1485,7 @@ static gboolean check_remove(gpointer key, gpointer
value, gpointer user_data)
switch (modem->type) {
case MODEM_TYPE_USB:
+ case MODEM_TYPE_PCIE:
for (list = modem->devices; list; list = list->next) {
struct device_info *info = list->data;
@@ -1612,16 +1631,8 @@ static void add_device(const char *syspath, const char
*devname,
if (devpath == NULL)
return;
- devnode = udev_device_get_devnode(device);
- if (devnode == NULL) {
- devnode = udev_device_get_property_value(device, "INTERFACE");
- if (devnode == NULL)
- return;
- }
-
- usb_interface = udev_device_get_parent_with_subsystem_devtype(device,
- "usb", "usb_interface");
- if (usb_interface == NULL)
+ subsystem = udev_device_get_subsystem(device);
+ if (subsystem == NULL)
return;
modem = g_hash_table_lookup(modem_list, syspath);
@@ -1630,7 +1641,12 @@ static void add_device(const char *syspath, const char
*devname,
if (modem == NULL)
return;
- modem->type = MODEM_TYPE_USB;
+ if ((g_str_equal(subsystem, "usb") == TRUE) ||
+ (g_str_equal(subsystem, "usbmisc") == TRUE))
+ modem->type = MODEM_TYPE_USB;
+ else if (g_str_equal(subsystem, "pci") == TRUE)
+ modem->type = MODEM_TYPE_PCIE;
+
modem->syspath = g_strdup(syspath);
modem->devname = g_strdup(devname);
modem->driver = g_strdup(driver);
@@ -1642,30 +1658,60 @@ static void add_device(const char *syspath, const char
*devname,
g_hash_table_replace(modem_list, modem->syspath, modem);
}
- interface = udev_device_get_property_value(usb_interface, "INTERFACE");
- number = udev_device_get_property_value(device, "ID_USB_INTERFACE_NUM");
+ label = udev_device_get_property_value(device, "OFONO_LABEL");
- /* If environment variable is not set, get value from attributes (or
parent's ones) */
- if (number == NULL) {
- number = udev_device_get_sysattr_value(device,
+ if (modem->type == MODEM_TYPE_USB) {
+ devnode = udev_device_get_devnode(device);
+ if (devnode == NULL) {
+ devnode = udev_device_get_property_value(device,
+ "INTERFACE");
+ if (devnode == NULL)
+ return;
+ }
+
+ usb_interface = udev_device_get_parent_with_subsystem_devtype(
+ device, "usb",
+ "usb_interface");
+ if (usb_interface == NULL)
+ return;
+
+ interface = udev_device_get_property_value(usb_interface,
+ "INTERFACE");
+ number = udev_device_get_property_value(device,
+ "ID_USB_INTERFACE_NUM");
+
+ if (number == NULL)
+ number = udev_device_get_sysattr_value(device,
"bInterfaceNumber");
- if (number == NULL) {
- parent = udev_device_get_parent(device);
- number = udev_device_get_sysattr_value(parent,
+ if (!label)
+ label = udev_device_get_property_value(usb_interface,
+ "OFONO_LABEL");
+ } else {
+ devnode = NULL;
+ interface = udev_device_get_property_value(device,
+ "INTERFACE");
+ number = udev_device_get_sysattr_value(device,
"bInterfaceNumber");
- }
- }
- label = udev_device_get_property_value(device, "OFONO_LABEL");
- if (!label)
- label = udev_device_get_property_value(usb_interface,
+ if (!label)
+ label = udev_device_get_property_value(device,
"OFONO_LABEL");
+ }
- subsystem = udev_device_get_subsystem(device);
+ /*
+ *If environment variable is not set, get value from attributes
+ *(or parent's ones)
+ */
+ if (number == NULL) {
+ parent = udev_device_get_parent(device);
+ number = udev_device_get_sysattr_value(parent,
+ "bInterfaceNumber");
+ }
if (modem->sysattr != NULL)
- sysattr = udev_device_get_sysattr_value(device, modem->sysattr);
+ sysattr = udev_device_get_sysattr_value(device,
+ modem->sysattr);
else
sysattr = NULL;
@@ -1772,6 +1818,7 @@ static struct {
{ "telit", "cdc_acm", "1bc7", "0036" },
{ "xmm7xxx", "cdc_acm", "8087" },
{ "xmm7xxx", "cdc_ncm", "8087" },
+ { "xmm7xxx", "imc_ipc", "0x8086", "0x7560"},
{ }
};
@@ -1858,6 +1905,49 @@ static void check_usb_device(struct udev_device *device)
add_device(syspath, devname, driver, vendor, model, device);
}
+static void check_pci_device(struct udev_device *device)
+{
+ const char *syspath, *devname, *driver;
+ const char *vendor = NULL, *model = NULL, *drv = NULL;
+ unsigned int i;
+
+ syspath = udev_device_get_syspath(device);
+
+ if (syspath == NULL)
+ return;
+
+ devname = udev_device_get_devnode(device);
+ vendor = udev_device_get_sysattr_value(device, "vendor");
+ model = udev_device_get_sysattr_value(device, "device");
+ driver = udev_device_get_property_value(device, "OFONO_DRIVER");
+ drv = udev_device_get_property_value(device, "DRIVER");
+ DBG("%s [%s:%s]", drv, vendor, model);
+
+ if (vendor == NULL || model == NULL || drv == NULL)
+ return;
+
+ for (i = 0; vendor_list[i].driver; i++) {
+ if (g_str_equal(vendor_list[i].drv, drv) == FALSE)
+ continue;
+
+ if (vendor_list[i].vid) {
+ if (!g_str_equal(vendor_list[i].vid, vendor))
+ continue;
+ }
+
+ if (vendor_list[i].pid) {
+ if (!g_str_equal(vendor_list[i].pid, model))
+ continue;
+ }
+
+ driver = vendor_list[i].driver;
+ }
+
+ if (driver == NULL)
+ return;
+
+ add_device(syspath, devname, driver, vendor, model, device);
+}
static void check_device(struct udev_device *device)
{
const char *bus;
@@ -1872,6 +1962,8 @@ static void check_device(struct udev_device *device)
if ((g_str_equal(bus, "usb") == TRUE) ||
(g_str_equal(bus, "usbmisc") == TRUE))
check_usb_device(device);
+ else if (g_str_equal(bus, "pci") == TRUE)
+ check_pci_device(device);
else
add_serial_device(device);
@@ -1932,6 +2024,7 @@ static void enumerate_devices(struct udev *context)
udev_enumerate_add_match_subsystem(enumerate, "usbmisc");
udev_enumerate_add_match_subsystem(enumerate, "net");
udev_enumerate_add_match_subsystem(enumerate, "hsi");
+ udev_enumerate_add_match_subsystem(enumerate, "pci");
udev_enumerate_scan_devices(enumerate);
--
1.9.1
_______________________________________________
ofono mailing list
[email protected]
https://lists.ofono.org/mailman/listinfo/ofono