diff options
Diffstat (limited to 'plugins/udev.c')
-rw-r--r-- | plugins/udev.c | 71 |
1 files changed, 39 insertions, 32 deletions
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); } |