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" +SUBSYSTEM!="tty", GOTO="ofono_huawei_end" +KERNEL!="ttyUSB[0-9]*", GOTO="ofono_huawei_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" +SUBSYSTEMS=="usb", ATTRS{bInterfaceNumber}=="?*", ENV{OFONO_IFACE_NUM}="$attr{bInterfaceNumber}" -LABEL="ofono_typ_end" +# 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; + const char *devnode, *type; + int ppp, pcui; - primary = ofono_modem_get_integer(modem, "PrimaryRegistered"); - secondary = ofono_modem_get_integer(modem, "SecondaryRegistered"); + /* + * 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 (primary && secondary) + 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_strcmp0(serial_typ, "SECONDARY") == 0) { - if (secondary != 0) - return; - - devnode = udev_device_get_devnode(udev_device); - ofono_modem_set_string(modem, "SecondaryDevice", devnode); - - secondary = 1; - ofono_modem_set_integer(modem, "SecondaryRegistered", - secondary); - } - + if (g_str_equal(name, "OFONO_HUAWEI_TYPE") != TRUE) { + entry = udev_list_entry_get_next(entry); + continue; } - entry = udev_list_entry_get_next(entry); + if (g_str_equal(type, "Modem") == TRUE) { + if (ppp != 0) + return; + + 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; + + devnode = udev_device_get_devnode(udev_device); + ofono_modem_set_string(modem, "Pcui", devnode); + + pcui = 1; + ofono_modem_set_integer(modem, "PcuiRegistered", pcui); + } + + break; } - if (primary && secondary) + if (ppp && pcui) ofono_modem_register(modem); }