---
This is needed for the coming isimodem2.5 patches to work.
Please note that this is not building unless the gisi patch
"gisi: Updated subscriptions and pipe handling to accomodate additional isimodem
versions" is added first.
We are currently looking at your comments on that one and will send in an update as soon
as we can.
But we want your comment on this one as well :-)
Best Regards,
Jessica Nilsson
Makefile.am | 4 +
drivers/isimodem/debug.c | 39 ++++
drivers/isimodem/debug.h | 4 +
drivers/isimodem/mtc.h | 38 ++++
drivers/isimodem/version.h | 26 +++
plugins/ofono.rules | 3 +
plugins/u8500.c | 477 ++++++++++++++++++++++++++++++++++++++++++++
plugins/udev.c | 5 +-
8 files changed, 595 insertions(+), 1 deletions(-)
create mode 100644 drivers/isimodem/version.h
create mode 100644 plugins/u8500.c
diff --git a/Makefile.am b/Makefile.am
index e6b308b..36d2ce0 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -107,6 +107,7 @@ builtin_sources += $(gisi_sources) \
drivers/isimodem/mtc.h \
drivers/isimodem/debug.h \
drivers/isimodem/isiutil.h \
+ drivers/isimodem/version.h \
drivers/isimodem/debug.c \
drivers/isimodem/phonebook.c \
drivers/isimodem/devinfo.c \
@@ -141,6 +142,9 @@ builtin_sources += plugins/isiusb.c
builtin_modules += n900
builtin_sources += plugins/n900.c plugins/nokia-gpio.h plugins/nokia-gpio.c
+
+builtin_modules += u8500
+builtin_sources += plugins/u8500.c
endif
if ATMODEM
diff --git a/drivers/isimodem/debug.c b/drivers/isimodem/debug.c
index 3d667b4..097233d 100644
--- a/drivers/isimodem/debug.c
+++ b/drivers/isimodem/debug.c
@@ -165,6 +165,45 @@ const char *mtc_modem_state_name(enum mtc_modem_state value)
return "MTC_<UNKNOWN>";
}
+const char *mce_message_id_name(enum mce_message_id value)
+{
+ switch (value) {
+ _(MCE_MODEM_STATE_IND);
+ _(MCE_MODEM_STATE_QUERY_REQ);
+ _(MCE_MODEM_STATE_QUERY_RESP);
+ _(MCE_RF_STATE_REQ);
+ _(MCE_RF_STATE_RESP);
+ _(MCE_RF_STATE_IND);
+ _(MCE_RF_STATE_QUERY_REQ);
+ _(MCE_RF_STATE_QUERY_RESP);
+ _(MCE_POWER_OFF_REQ);
+ _(MCE_POWER_OFF_RESP);
+ }
+ return "MCE_<UNKNOWN>";
+}
+
+const char *mce_modem_state_name(enum mce_modem_state value)
+{
+ switch (value) {
+ _(MCE_NORMAL);
+ _(MCE_LOCAL);
+ _(MCE_SW_RESET);
+ _(MCE_POWER_OFF);
+ }
+ return "MCE_<UNKNOWN>";
+}
+
+const char *mce_status_info(enum mce_status_info value)
+{
+ switch (value) {
+ _(MCE_OK);
+ _(MCE_FAIL);
+ _(MCE_ALREADY_ACTIVE);
+ _(MCE_TRANSITION_ONGOING);
+ }
+ return "MCE_<UNKNOWN>";
+}
+
const char *sms_isi_cause_name(enum sms_isi_cause value)
{
switch (value) {
diff --git a/drivers/isimodem/debug.h b/drivers/isimodem/debug.h
index e149c2c..4733bf4 100644
--- a/drivers/isimodem/debug.h
+++ b/drivers/isimodem/debug.h
@@ -42,6 +42,10 @@ const char *mtc_isi_cause_name(enum mtc_isi_cause value);
const char *mtc_message_id_name(enum mtc_message_id value);
const char *mtc_modem_state_name(enum mtc_modem_state value);
+const char *mce_message_id_name(enum mce_message_id value);
+const char *mce_modem_state_name(enum mce_modem_state value);
+const char *mce_status_info(enum mce_status_info value);
+
const char *sms_gsm_cause_name(enum sms_gsm_cause value);
const char *sms_isi_cause_name(enum sms_isi_cause value);
const char *sms_message_id_name(enum sms_message_id value);
diff --git a/drivers/isimodem/mtc.h b/drivers/isimodem/mtc.h
index 2db3e94..57e5040 100644
--- a/drivers/isimodem/mtc.h
+++ b/drivers/isimodem/mtc.h
@@ -27,9 +27,47 @@ extern "C" {
#endif
#define PN_MTC 0x15
+#define PN_MODEM_MCE 0xC2
#define MTC_TIMEOUT 5
#define MTC_STATE_REQ_TIMEOUT (6 + 5)
+enum mce_message_id {
+ MCE_MODEM_STATE_IND = 0x00,
+ MCE_MODEM_STATE_QUERY_REQ = 0x01,
+ MCE_MODEM_STATE_QUERY_RESP = 0x02,
+ MCE_RF_STATE_REQ = 0x03,
+ MCE_RF_STATE_RESP = 0x04,
+ MCE_RF_STATE_IND = 0x05,
+ MCE_RF_STATE_QUERY_REQ = 0x06,
+ MCE_RF_STATE_QUERY_RESP = 0x07,
+ MCE_POWER_OFF_REQ = 0x08,
+ MCE_POWER_OFF_RESP = 0x09
+};
+
+enum mce_rf_state {
+ MCE_RF_OFF = 0x00,
+ MCE_RF_ON = 0x01
+};
+
+enum mce_status_info {
+ MCE_OK = 0x00,
+ MCE_FAIL = 0x01,
+ MCE_ALREADY_ACTIVE = 0x06,
+ MCE_TRANSITION_ONGOING = 0x16
+};
+
+enum mce_modem_state {
+ MCE_NORMAL = 0x00,
+ MCE_LOCAL = 0x01,
+ MCE_SW_RESET = 0x80,
+ MCE_POWER_OFF = 0x81
+};
+
+enum mce_isi_action {
+ MCE_START = 0x03,
+ MCE_READY = 0x04
+};
+
enum mtc_isi_cause {
MTC_OK = 0x00,
MTC_FAIL = 0x01,
diff --git a/drivers/isimodem/version.h b/drivers/isimodem/version.h
new file mode 100644
index 0000000..9b0a993
--- /dev/null
+++ b/drivers/isimodem/version.h
@@ -0,0 +1,26 @@
+
+/*
+ *
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) ST-Ericsson SA 2011.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+enum isi_version {
+ ISI_20 = 0,
+ ISI_25 = 1
+};
diff --git a/plugins/ofono.rules b/plugins/ofono.rules
index 111f071..333bff0 100644
--- a/plugins/ofono.rules
+++ b/plugins/ofono.rules
@@ -356,6 +356,9 @@ SUBSYSTEMS=="usb", ENV{OFONO_DRIVER}="isiusb",
ENV{OFONO_ISI_ADDRESS}="16"
# Nokia N900 modem
SUBSYSTEMS=="hsi", ENV{OFONO_DRIVER}="n900",
ENV{OFONO_ISI_ADDRESS}="108"
+# STE u8500
+KERNEL=="shrm0", ENV{OFONO_DRIVER}="u8500"
+
LABEL="ofono_isi_end"
SUBSYSTEM!="usb", GOTO="ofono_end"
diff --git a/plugins/u8500.c b/plugins/u8500.c
new file mode 100644
index 0000000..6ee9e5c
--- /dev/null
+++ b/plugins/u8500.c
@@ -0,0 +1,477 @@
+/*
+ *
+ * oFono - Open Source Telephony
+ *
+ * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * Copyright (C) ST-Ericsson SA 2011.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <errno.h>
+#include <stdlib.h>
+#include <string.h>
+#include <glib.h>
+
+#include <gisi/netlink.h>
+#include <gisi/modem.h>
+#include <gisi/client.h>
+#include <gisi/message.h>
+
+#define OFONO_API_SUBJECT_TO_CHANGE
+#include <ofono/plugin.h>
+#include <ofono/log.h>
+#include <ofono/modem.h>
+#include <ofono/devinfo.h>
+#include <ofono/phonebook.h>
+#include <ofono/netreg.h>
+#include <ofono/voicecall.h>
+#include <ofono/sms.h>
+#include <ofono/cbs.h>
+#include <ofono/sim.h>
+#include <ofono/ussd.h>
+#include <ofono/ssn.h>
+#include <ofono/call-forwarding.h>
+#include <ofono/call-settings.h>
+#include <ofono/call-barring.h>
+#include <ofono/call-meter.h>
+#include <ofono/radio-settings.h>
+#include <ofono/gprs.h>
+#include <ofono/gprs-context.h>
+
+#include "drivers/isimodem/isimodem.h"
+#include "drivers/isimodem/isiutil.h"
+#include "drivers/isimodem/mtc.h"
+#include "drivers/isimodem/debug.h"
+#include "drivers/isimodem/version.h"
+
+struct isi_data {
+ char const *ifname;
+ GIsiModem *modem;
+ GIsiClient *client;
+ GIsiPhonetNetlink *link;
+ GIsiPhonetLinkState linkstate;
+ unsigned interval;
+ int reported;
+ ofono_bool_t online;
+ struct isi_cb_data *online_cbd;
+};
+
+static const GIsiVersion modemversion = {
+ .major = 2,
+ .minor = 5,
+};
+
+static gboolean check_response_status(const GIsiMessage *msg, uint8_t msgid)
+{
+ if (g_isi_msg_error(msg) < 0) {
+ DBG("Error: %s", strerror(-g_isi_msg_error(msg)));
+ return FALSE;
+ }
+
+ if (g_isi_msg_id(msg) != msgid) {
+ DBG("Unexpected msg: %s",
+ mce_message_id_name(g_isi_msg_id(msg)));
+ return FALSE;
+ }
+ return TRUE;
+}
+
+static void report_powered(struct ofono_modem *modem, struct isi_data *isi,
+ ofono_bool_t powered)
+{
+ if (powered == isi->reported)
+ return;
+
+ isi->reported = powered;
+ ofono_modem_set_powered(modem, powered);
+}
+
+static void report_online(struct isi_data *isi, ofono_bool_t online)
+{
+ struct isi_cb_data *cbd = isi->online_cbd;
+ ofono_modem_online_cb_t cb = cbd->cb;
+
+ isi->online_cbd = NULL;
+
+ if (isi->online == online)
+ CALLBACK_WITH_SUCCESS(cb, cbd->data);
+ else
+ CALLBACK_WITH_FAILURE(cb, cbd->data);
+
+ g_free(cbd);
+}
+
+static void set_power_by_mce_state(struct ofono_modem *modem,
+ struct isi_data *isi, int mce_state)
+{
+ switch (mce_state) {
+ case MCE_POWER_OFF:
+ report_powered(modem, isi, FALSE);
+ break;
+ case MCE_NORMAL:
+
+ default:
+ report_powered(modem, isi, TRUE);
+ break;
+ }
+}
+
+static void mce_state_ind_cb(const GIsiMessage *msg, void *data)
+{
+ struct ofono_modem *modem = data;
+ struct isi_data *isi = ofono_modem_get_data(modem);
+ uint8_t state;
+ uint8_t action;
+
+ if (isi == NULL || g_isi_msg_id(msg) != MCE_MODEM_STATE_IND)
+ return;
+
+ if (!g_isi_msg_data_get_byte(msg, 0, &state) ||
+ !g_isi_msg_data_get_byte(msg, 1, &action))
+ return;
+
+ switch (action) {
+ case MCE_START:
+ DBG("target modem state: %s (0x%02X)",
+ mce_modem_state_name(state), state);
+ break;
+
+ case MCE_READY:
+ DBG("current modem state: %s (0x%02X)",
+ mce_modem_state_name(state), state);
+ set_power_by_mce_state(modem, isi, state);
+ break;
+ default:
+ break;
+ }
+}
+
+static void mce_query_cb(const GIsiMessage *msg, void *data)
+{
+ struct ofono_modem *modem = data;
+ struct isi_data *isi = ofono_modem_get_data(modem);
+ uint8_t current;
+ uint8_t target;
+
+ if (!check_response_status(msg, MCE_MODEM_STATE_QUERY_RESP))
+ return;
+
+ if (!g_isi_msg_data_get_byte(msg, 0, ¤t) ||
+ !g_isi_msg_data_get_byte(msg, 1, &target))
+ return;
+
+ DBG("Modem state: current=%s (0x%02X) target=%s (0x%02X)",
+ mce_modem_state_name(current), current,
+ mce_modem_state_name(target), target);
+
+ if (current == target)
+ set_power_by_mce_state(modem, isi, current);
+}
+
+static gboolean bootstrap_current_state(gpointer user)
+{
+ struct ofono_modem *om = user;
+ struct isi_data *isi = ofono_modem_get_data(om);
+
+ const uint8_t req[] = {
+ MCE_MODEM_STATE_QUERY_REQ,
+ 0x00, 0x00 /* Filler */
+ };
+ size_t len = sizeof(req);
+
+ g_isi_client_send(isi->client, req, len, mce_query_cb, om, NULL);
+
+ return FALSE;
+}
+
+static void reachable_cb(const GIsiMessage *msg, void *data)
+{
+ struct ofono_modem *om = data;
+ struct isi_data *isi = ofono_modem_get_data(om);
+
+ if (!g_isi_msg_error(msg) < 0)
+ return;
+
+ ISI_VERSION_DBG(msg);
+
+ g_isi_client_ind_subscribe(isi->client, MCE_MODEM_STATE_IND,
+ mce_state_ind_cb, om);
+
+ /*
+ * FIXME: There is a theoretical race condition here:
+ * g_isi_client_ind_subscribe() adds the actual message
+ * sending for committing changes to subscriptions in idle
+ * loop, which may or may not preserve ordering. Thus, we
+ * might miss a state indication if the bootstrap request ends
+ * up being sent first.
+ */
+ g_idle_add(bootstrap_current_state, om);
+}
+
+static void phonet_status_cb(GIsiModem *modem, GIsiPhonetLinkState st,
+ char const *ifname, void *data)
+{
+ struct ofono_modem *om = data;
+ struct isi_data *isi = ofono_modem_get_data(om);
+
+ DBG("Link %s (%u) is %s", isi->ifname, g_isi_modem_index(isi->modem),
+ st == PN_LINK_REMOVED ? "removed" :
+ st == PN_LINK_DOWN ? "down" : "up");
+
+ isi->linkstate = st;
+
+ if (st == PN_LINK_UP)
+ g_isi_client_verify(isi->client, reachable_cb, om, NULL);
+ else if (st == PN_LINK_DOWN)
+ set_power_by_mce_state(om, isi, MCE_POWER_OFF);
+}
+
+static int u8500_probe(struct ofono_modem *modem)
+{
+ const char *ifname = ofono_modem_get_string(modem, "Interface");
+ unsigned address = ofono_modem_get_integer(modem, "Address");
+ GIsiModem *isimodem;
+ GIsiClient *client = NULL;
+ GIsiPhonetNetlink *link = NULL;
+ struct isi_data *isi = NULL;
+
+ if (ifname == NULL)
+ return -EINVAL;
+
+ DBG("(%p) with %s", modem, ifname);
+
+ isimodem = g_isi_modem_create_by_name(ifname);
+ if (isimodem == NULL) {
+ DBG("Interface=%s: %s", ifname, strerror(errno));
+ return -errno;
+ }
+
+ if (!g_isi_modem_set_version(isimodem, modemversion))
+ return -EINVAL;
+
+ g_isi_modem_set_userdata(isimodem, modem);
+
+ if (getenv("OFONO_ISI_DEBUG"))
+ g_isi_modem_set_debug(isimodem, ofono_debug);
+
+ if (getenv("OFONO_ISI_TRACE"))
+ g_isi_modem_set_trace(isimodem, isi_trace);
+
+ if (g_isi_pn_netlink_by_modem(isimodem)) {
+ DBG("%s: %s", ifname, strerror(EBUSY));
+ errno = EBUSY;
+ goto error;
+ }
+
+ link = g_isi_pn_netlink_start(isimodem, phonet_status_cb, modem);
+ if (link == NULL) {
+ DBG("%s: %s", ifname, strerror(errno));
+ goto error;
+ }
+
+ if (address) {
+ int error = g_isi_pn_netlink_set_address(isimodem, address);
+ if (error && error != -EEXIST) {
+ DBG("g_isi_pn_netlink_set_address(): %s\n",
+ strerror(-error));
+ errno = -error;
+ goto error;
+ }
+ }
+
+ isi = g_try_new0(struct isi_data, 1);
+ if (isi == NULL) {
+ errno = ENOMEM;
+ goto error;
+ }
+
+ client = g_isi_client_create(isimodem, PN_MODEM_MCE);
+ if (client == NULL)
+ goto error;
+
+ isi->modem = isimodem;
+ isi->ifname = ifname;
+ isi->link = link;
+ isi->reported = -1;
+ isi->client = client;
+
+ ofono_modem_set_data(modem, isi);
+ return 0;
+
+error:
+ g_isi_pn_netlink_stop(link);
+ g_isi_client_destroy(client);
+ g_isi_modem_destroy(isimodem);
+ g_free(isi);
+
+ return -errno;
+}
+
+static void u8500_remove(struct ofono_modem *modem)
+{
+ struct isi_data *isi = ofono_modem_get_data(modem);
+
+ ofono_modem_set_data(modem, NULL);
+
+ if (isi == NULL)
+ return;
+
+ g_isi_pn_netlink_stop(isi->link);
+ g_isi_client_destroy(isi->client);
+ g_isi_modem_destroy(isi->modem);
+ g_free(isi);
+}
+
+static void mce_state_cb(const GIsiMessage *msg, void *data)
+{
+ struct isi_cb_data *cbd = data;
+ struct ofono_modem *modem = cbd->user;
+ ofono_modem_online_cb_t cb = cbd->cb;
+
+ struct isi_data *isi = ofono_modem_get_data(modem);
+ uint8_t cause;
+
+ if (!check_response_status(msg, MCE_RF_STATE_RESP))
+ goto error;
+
+ if (!g_isi_msg_data_get_byte(msg, 0, &cause))
+ goto error;
+
+ DBG("MCE cause: %s (0x%02X)", mce_status_info(cause), cause);
+
+ if (cause == MCE_OK) {
+ isi->online_cbd = cbd;
+ return;
+ }
+
+ if (cause == MCE_ALREADY_ACTIVE) {
+ CALLBACK_WITH_SUCCESS(cb, cbd->data);
+ g_free(cbd);
+ return;
+ }
+
+error:
+ CALLBACK_WITH_FAILURE(cb, cbd->data);
+ g_free(cbd);
+}
+
+static void u8500_online(struct ofono_modem *modem, ofono_bool_t online,
+ ofono_modem_online_cb_t cb, void *data)
+{
+ struct isi_data *isi = ofono_modem_get_data(modem);
+ struct isi_cb_data *cbd = isi_cb_data_new(modem, cb, data);
+ const uint8_t req[] = {
+ MCE_RF_STATE_REQ,
+ online ? MCE_RF_ON : MCE_RF_OFF,
+ 0x00
+ };
+
+ DBG("(%p) with %s", modem, isi->ifname);
+
+ if (cbd == NULL || isi == NULL)
+ goto error;
+
+ if (g_isi_client_send_with_timeout(isi->client, req, sizeof(req),
+ MTC_STATE_REQ_TIMEOUT,
+ mce_state_cb, cbd, NULL)) {
+ isi->online = online;
+ return;
+ }
+
+error:
+ CALLBACK_WITH_FAILURE(cb, data);
+ g_free(cbd);
+}
+
+static void u8500_pre_sim(struct ofono_modem *modem)
+{
+ struct isi_data *isi = ofono_modem_get_data(modem);
+
+ DBG("(%p) with %s", modem, isi->ifname);
+
+ ofono_sim_create(modem, ISI_25, "isimodem", isi->modem);
+ ofono_devinfo_create(modem, ISI_25, "isimodem", isi->modem);
+ ofono_voicecall_create(modem, ISI_25, "isimodem", isi->modem);
+}
+
+static void u8500_post_sim(struct ofono_modem *modem)
+{
+ struct isi_data *isi = ofono_modem_get_data(modem);
+
+ DBG("(%p) with %s", modem, isi->ifname);
+
+ ofono_phonebook_create(modem, ISI_25, "isimodem", isi->modem);
+ ofono_call_forwarding_create(modem, ISI_25, "isimodem", isi->modem);
+ ofono_radio_settings_create(modem, ISI_25, "isimodem", isi->modem);
+}
+
+static void u8500_post_online(struct ofono_modem *modem)
+{
+ struct isi_data *isi = ofono_modem_get_data(modem);
+
+ DBG("(%p) with %s", modem, isi->ifname);
+
+ ofono_netreg_create(modem, ISI_25, "isimodem", isi->modem);
+ ofono_sms_create(modem, ISI_25, "isimodem", isi->modem);
+ ofono_cbs_create(modem, ISI_25, "isimodem", isi->modem);
+ ofono_ssn_create(modem, ISI_25, "isimodem", isi->modem);
+ ofono_ussd_create(modem, ISI_25, "isimodem", isi->modem);
+ ofono_call_settings_create(modem, ISI_25, "isimodem", isi->modem);
+ ofono_call_barring_create(modem, ISI_25, "isimodem", isi->modem);
+ ofono_call_meter_create(modem, ISI_25, "isimodem", isi->modem);
+ ofono_gprs_create(modem, ISI_25, "isimodem", isi->modem);
+}
+
+static int u8500_enable(struct ofono_modem *modem)
+{
+ return 0;
+}
+
+static int u8500_disable(struct ofono_modem *modem)
+{
+ return 0;
+}
+
+static struct ofono_modem_driver driver = {
+ .name = "u8500",
+ .probe = u8500_probe,
+ .remove = u8500_remove,
+ .set_online = u8500_online,
+ .pre_sim = u8500_pre_sim,
+ .post_sim = u8500_post_sim,
+ .post_online = u8500_post_online,
+ .enable = u8500_enable,
+ .disable = u8500_disable,
+};
+
+static int u8500_init(void)
+{
+ return ofono_modem_driver_register(&driver);
+}
+
+static void u8500_exit(void)
+{
+ ofono_modem_driver_unregister(&driver);
+}
+
+OFONO_PLUGIN_DEFINE(u8500, "Generic modem driver for isi",
+ VERSION, OFONO_PLUGIN_PRIORITY_DEFAULT,
+ u8500_init, u8500_exit)
diff --git a/plugins/udev.c b/plugins/udev.c
index ce1efe6..49b5eb8 100644
--- a/plugins/udev.c
+++ b/plugins/udev.c
@@ -185,7 +185,8 @@ static void add_hso(struct ofono_modem *modem,
devnode = udev_device_get_devnode(udev_device);
if (g_str_has_suffix(type, "Application") == TRUE)
- ofono_modem_set_string(modem, APPLICATION_PORT, devnode);
+ ofono_modem_set_string(modem, APPLICATION_PORT,
+ devnode);
else if (g_str_has_suffix(type, "Control") == TRUE)
ofono_modem_set_string(modem, CONTROL_PORT, devnode);
} else if (g_str_equal(subsystem, "net") == TRUE) {
@@ -636,6 +637,8 @@ done:
add_nokia(modem, udev_device);
else if (g_strcmp0(driver, "isiusb") == 0)
add_isi(modem, udev_device);
+ else if (g_strcmp0(driver, "u8500") == 0)
+ add_isi(modem, udev_device);
else if (g_strcmp0(driver, "n900") == 0)
add_isi(modem, udev_device);
else if (g_strcmp0(driver, "gobi") == 0)
--
1.7.3.5