summaryrefslogtreecommitdiffstats
path: root/plugins
diff options
context:
space:
mode:
authorDenis Kenzior <denkenz@gmail.com>2010-06-07 19:04:36 -0500
committerDenis Kenzior <denkenz@gmail.com>2010-06-07 19:04:36 -0500
commit71ea72adf22d948252725e8a3981a4a0b0e90320 (patch)
treeffffa4bd6da6bbe7a925ff1ef02e3e2c3304efde /plugins
parent5c0bdac34795a6e05ca8edc4d47a2383c962d123 (diff)
downloadofono-71ea72adf22d948252725e8a3981a4a0b0e90320.tar.bz2
udev: Fixup Huawei detection
Diffstat (limited to 'plugins')
-rw-r--r--plugins/ofono.rules38
-rw-r--r--plugins/udev.c71
2 files changed, 65 insertions, 44 deletions
diff --git a/plugins/ofono.rules b/plugins/ofono.rules
index abae06ac..d057dcaa 100644
--- a/plugins/ofono.rules
+++ b/plugins/ofono.rules
@@ -2,18 +2,32 @@
ACTION!="add|change", GOTO="ofono_end"
-SUBSYSTEM!="tty", GOTO="ofono_typ_end"
-KERNEL!="ttyUSB[0-9]*", GOTO="ofono_typ_end"
-
-# HUAWEI E176
-ENV{ID_VENDOR_ID}=="12d1", ENV{ID_MODEL_ID}=="1003", ENV{ID_IFACE}=="00", ENV{OFONO_TYP}="PRIMARY"
-ENV{ID_VENDOR_ID}=="12d1", ENV{ID_MODEL_ID}=="1003", ENV{ID_IFACE}=="01", ENV{OFONO_TYP}="SECONDARY"
-# HUAWEI E1552
-# TODO: Add ID_MODEL_ID aka idProduct for E1552
-#ENV{ID_VENDOR_ID}=="12d1", ENV{ID_MODEL_ID}=="1003", ENV{ID_IFACE}=="00", ENV{OFONO_TYP}="PRIMARY"
-#ENV{ID_VENDOR_ID}=="12d1", ENV{ID_MODEL_ID}=="1003", ENV{ID_IFACE}=="02", ENV{OFONO_TYP}="SECONDARY"
-
-LABEL="ofono_typ_end"
+SUBSYSTEM!="tty", GOTO="ofono_huawei_end"
+KERNEL!="ttyUSB[0-9]*", GOTO="ofono_huawei_end"
+
+SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="?*", ENV{OFONO_IFACE_NUM}="$attr{bInterfaceNumber}"
+
+# Generic 0x1001
+ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1001", ENV{OFONO_IFACE_NUM}=="00", ENV{OFONO_HUAWEI_TYPE}="Modem"
+ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1001", ENV{OFONO_IFACE_NUM}=="02", ENV{OFONO_HUAWEI_TYPE}="Pcui"
+
+# Generic 0x1003
+ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1003", ENV{OFONO_IFACE_NUM}=="00", ENV{OFONO_HUAWEI_TYPE}="Modem"
+ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1003", ENV{OFONO_IFACE_NUM}=="01", ENV{OFONO_HUAWEI_TYPE}="Pcui"
+
+# E510
+ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1411", ENV{OFONO_IFACE_NUM}=="00", ENV{OFONO_HUAWEI_TYPE}="Modem"
+ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1411", ENV{OFONO_IFACE_NUM}=="02", ENV{OFONO_HUAWEI_TYPE}="Pcui"
+
+# K4505
+ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1464", ENV{OFONO_IFACE_NUM}=="00", ENV{OFONO_HUAWEI_TYPE}="Modem"
+ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1464", ENV{OFONO_IFACE_NUM}=="04", ENV{OFONO_HUAWEI_TYPE}="Pcui"
+
+# K3765
+ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1465", ENV{OFONO_IFACE_NUM}=="00", ENV{OFONO_HUAWEI_TYPE}="Modem"
+ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1465", ENV{OFONO_IFACE_NUM}=="04", ENV{OFONO_HUAWEI_TYPE}="Pcui"
+
+LABEL="ofono_huawei_end"
SUBSYSTEM!="usb", GOTO="ofono_end"
ENV{DEVTYPE}!="usb_device", GOTO="ofono_end"
diff --git a/plugins/udev.c b/plugins/udev.c
index 8680ff68..178f3834 100644
--- a/plugins/udev.c
+++ b/plugins/udev.c
@@ -202,52 +202,59 @@ static void add_huawei(struct ofono_modem *modem,
struct udev_device *udev_device)
{
struct udev_list_entry *entry;
- const char *devnode, *serial_typ = NULL;
- int primary, secondary;
-
- primary = ofono_modem_get_integer(modem, "PrimaryRegistered");
- secondary = ofono_modem_get_integer(modem, "SecondaryRegistered");
-
- if (primary && secondary)
+ const char *devnode, *type;
+ int ppp, pcui;
+
+ /*
+ * Huawei dongles tend to break up their ports into:
+ * - Modem - Used for PPP
+ * - Diag - Used for diagnostics, not usually AT command enabled
+ * - PCUI - auxiliary channel where unsolicited events are sent
+ *
+ * The unsolicited events are controlled with ^PORTSEL command,
+ * and defaults to 0 (the PCUI port)
+ *
+ * Surprising the PCUI port is usually last on the usb interface list
+ */
+ ppp = ofono_modem_get_integer(modem, "ModemRegistered");
+ pcui = ofono_modem_get_integer(modem, "PcuiRegistered");
+
+ if (ppp & pcui)
return;
entry = udev_device_get_properties_list_entry(udev_device);
while (entry) {
const char *name = udev_list_entry_get_name(entry);
+ type = udev_list_entry_get_value(entry);
- if (g_strcmp0(name, "OFONO_TYP") == 0) {
- serial_typ = udev_list_entry_get_value(entry);
-
- if (g_strcmp0(serial_typ, "PRIMARY") == 0) {
- if (primary != 0)
- return;
-
- devnode = udev_device_get_devnode(udev_device);
- ofono_modem_set_string(modem, "Device",
- devnode);
-
- primary = 1;
- ofono_modem_set_integer(modem, "PrimaryRegistered", primary);
- }
+ if (g_str_equal(name, "OFONO_HUAWEI_TYPE") != TRUE) {
+ entry = udev_list_entry_get_next(entry);
+ continue;
+ }
- if (g_strcmp0(serial_typ, "SECONDARY") == 0) {
- if (secondary != 0)
- return;
+ if (g_str_equal(type, "Modem") == TRUE) {
+ if (ppp != 0)
+ return;
- devnode = udev_device_get_devnode(udev_device);
- ofono_modem_set_string(modem, "SecondaryDevice", devnode);
+ devnode = udev_device_get_devnode(udev_device);
+ ofono_modem_set_string(modem, "Modem", devnode);
+ ppp = 1;
+ ofono_modem_set_integer(modem, "ModemRegistered", ppp);
+ } else if (g_str_equal(type, "Pcui") == TRUE) {
+ if (pcui != 0)
+ return;
- secondary = 1;
- ofono_modem_set_integer(modem, "SecondaryRegistered",
- secondary);
- }
+ devnode = udev_device_get_devnode(udev_device);
+ ofono_modem_set_string(modem, "Pcui", devnode);
+ pcui = 1;
+ ofono_modem_set_integer(modem, "PcuiRegistered", pcui);
}
- entry = udev_list_entry_get_next(entry);
+ break;
}
- if (primary && secondary)
+ if (ppp && pcui)
ofono_modem_register(modem);
}