summaryrefslogtreecommitdiffstats
path: root/plugins/mbm.c
diff options
context:
space:
mode:
authorPekka Pessi <Pekka.Pessi@nokia.com>2010-08-25 20:13:16 +0300
committerDenis Kenzior <denkenz@gmail.com>2010-08-25 12:18:23 -0500
commit72bc1c77801eb19fdd7d48919384f04b8036016c (patch)
tree1a94bd81b7d314122f37105cabfcc577a80d3652 /plugins/mbm.c
parent3dcdcafd67bfc24d26ebc8ca6701a72adbca9db7 (diff)
downloadofono-72bc1c77801eb19fdd7d48919384f04b8036016c.tar.bz2
mbm: add quirks for Dell D5530
Dell D5530 is an OEM version of F3507g. It has an annoying habit of announcing itself to world with its own name. Another problem is some weird +CGAP messages at the same time. It also crashes upon processing received CBS messages.
Diffstat (limited to 'plugins/mbm.c')
-rw-r--r--plugins/mbm.c64
1 files changed, 62 insertions, 2 deletions
diff --git a/plugins/mbm.c b/plugins/mbm.c
index 8541aafb..cc3a0f58 100644
--- a/plugins/mbm.c
+++ b/plugins/mbm.c
@@ -52,12 +52,18 @@ static const char *cfun_prefix[] = { "+CFUN:", NULL };
static const char *cpin_prefix[] = { "+CPIN:", NULL };
static const char *none_prefix[] = { NULL };
+enum mbm_variant {
+ MBM_GENERIC,
+ MBM_DELL_D5530, /* OEM of F3507g */
+};
+
struct mbm_data {
GAtChat *modem_port;
GAtChat *data_port;
guint cpin_poll_source;
guint cpin_poll_count;
gboolean have_sim;
+ enum mbm_variant variant;
};
static int mbm_probe(struct ofono_modem *modem)
@@ -136,9 +142,54 @@ static gboolean init_simpin_check(gpointer user_data)
return FALSE;
}
+static void d5530_notify(GAtResult *result, gpointer user_data)
+{
+ DBG("D5530");
+}
+
+static void mbm_quirk_d5530(struct ofono_modem *modem)
+{
+ struct mbm_data *data = ofono_modem_get_data(modem);
+
+ data->variant = MBM_DELL_D5530;
+
+ /* This Dell modem sends some unsolicated messages when it boots. */
+ /* Try to ignore them. */
+ g_at_chat_register(data->modem_port, "D5530", d5530_notify,
+ FALSE, NULL, NULL);
+ g_at_chat_register(data->modem_port, "+CGAP:", d5530_notify,
+ FALSE, NULL, NULL);
+}
+
+static void mbm_check_model(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct ofono_modem *modem = user_data;
+ GAtResultIter iter;
+ char const *model = "";
+
+ DBG("");
+
+ if (!ok)
+ goto done;
+
+ g_at_result_iter_init(&iter, result);
+
+ while (g_at_result_iter_next(&iter, NULL)) {
+ if (!g_at_result_iter_next_unquoted_string(&iter, &model))
+ continue;
+
+ if (g_str_equal(model, "D5530"))
+ mbm_quirk_d5530(modem);
+ }
+
+done:
+ init_simpin_check(modem);
+}
+
static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
{
struct ofono_modem *modem = user_data;
+ struct mbm_data *data = ofono_modem_get_data(modem);
DBG("");
@@ -147,7 +198,8 @@ static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
return;
}
- init_simpin_check(modem);
+ g_at_chat_send(data->modem_port, "AT+CGMM", NULL,
+ mbm_check_model, modem, NULL);
}
static void cfun_query(gboolean ok, GAtResult *result, gpointer user_data)
@@ -353,7 +405,15 @@ static void mbm_post_sim(struct ofono_modem *modem)
"atmodem", data->modem_port);
ofono_sms_create(modem, 0, "atmodem", data->modem_port);
- ofono_cbs_create(modem, 0, "atmodem", data->modem_port);
+
+ switch (data->variant) {
+ case MBM_DELL_D5530:
+ /* DELL D5530 crashes when it processes CBSs */
+ break;
+ default:
+ ofono_cbs_create(modem, 0, "atmodem", data->modem_port);
+ }
+
ofono_ussd_create(modem, 0, "atmodem", data->modem_port);
gprs = ofono_gprs_create(modem, OFONO_VENDOR_MBM,