All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH] huawei: Fix SIM state logic
@ 2010-08-05 19:13 =?unknown-8bit?q?Jo=C3=A3o?= Paulo Rechi Vita
  2010-08-05 19:21 ` Denis Kenzior
  0 siblings, 1 reply; 5+ messages in thread
From: =?unknown-8bit?q?Jo=C3=A3o?= Paulo Rechi Vita @ 2010-08-05 19:13 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 6031 bytes --]

Add support for voice-only SIM cards and enable phonebook atom for
non-voice modems.
---
 plugins/huawei.c |   76 ++++++++++++++++++++++++++++++++++++-----------------
 1 files changed, 51 insertions(+), 25 deletions(-)

diff --git a/plugins/huawei.c b/plugins/huawei.c
index 47d59d0..f8ada24 100644
--- a/plugins/huawei.c
+++ b/plugins/huawei.c
@@ -57,11 +57,20 @@
 static const char *none_prefix[] = { NULL };
 static const char *sysinfo_prefix[] = { "^SYSINFO:", NULL };
 
+enum huawei_sim_state {
+	HUAWEI_SIM_STATE_INVALID_OR_LOCKED =	0,
+	HUAWEI_SIM_STATE_VALID =		1,
+	HUAWEI_SIM_STATE_INVALID_CS =		2,
+	HUAWEI_SIM_STATE_INVALID_PS =		3,
+	HUAWEI_SIM_STATE_INVALID_PS_AND_CS =	4,
+	HUAWEI_SIM_STATE_NOT_EXISTENT =		255
+};
+
 struct huawei_data {
 	GAtChat *modem;
 	GAtChat *pcui;
 	struct ofono_sim *sim;
-	gint sim_state;
+	enum huawei_sim_state sim_state;
 	struct ofono_gprs *gprs;
 	struct ofono_gprs_context *gc;
 };
@@ -100,17 +109,17 @@ static void huawei_debug(const char *str, void *user_data)
 	ofono_info("%s%s", prefix, str);
 }
 
-static void notify_sim_state(struct ofono_modem *modem, gint sim_state)
+static void notify_sim_state(struct ofono_modem *modem,
+				enum huawei_sim_state sim_state)
 {
 	struct huawei_data *data = ofono_modem_get_data(modem);
 
-	if (data->sim_state == 0 && sim_state == 1) {
-		ofono_sim_inserted_notify(data->sim, TRUE);
-		data->sim_state = sim_state;
-	} else if (data->sim_state == 1 && sim_state == 0) {
+	if (sim_state == HUAWEI_SIM_STATE_NOT_EXISTENT)
 		ofono_sim_inserted_notify(data->sim, FALSE);
-		data->sim_state = sim_state;
-	}
+	else
+		ofono_sim_inserted_notify(data->sim, TRUE);
+
+	data->sim_state = sim_state;
 }
 
 static void sysinfo_cb(gboolean ok, GAtResult *result, gpointer user_data)
@@ -142,24 +151,24 @@ static void sysinfo_cb(gboolean ok, GAtResult *result, gpointer user_data)
 	if (!g_at_result_iter_next_number(&iter, &sim_state))
 		return;
 
-	notify_sim_state(modem, sim_state);
+	notify_sim_state(modem, (enum huawei_sim_state) sim_state);
 }
 
 static void simst_notify(GAtResult *result, gpointer user_data)
 {
 	struct ofono_modem *modem = user_data;
 	GAtResultIter iter;
-	int state;
+	gint sim_state;
 
 	g_at_result_iter_init(&iter, result);
 
 	if (!g_at_result_iter_next(&iter, "^SIMST:"))
 		return;
 
-	if (!g_at_result_iter_next_number(&iter, &state))
+	if (!g_at_result_iter_next_number(&iter, &sim_state))
 		return;
 
-	notify_sim_state(modem, state);
+	notify_sim_state(modem, (enum huawei_sim_state) sim_state);
 }
 
 static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data)
@@ -235,7 +244,8 @@ static void huawei_disconnect(gpointer user_data)
 
 	DBG("");
 
-	ofono_gprs_context_remove(data->gc);
+	if (data->gc)
+		ofono_gprs_context_remove(data->gc);
 
 	g_at_chat_unref(data->modem);
 	data->modem = NULL;
@@ -247,13 +257,16 @@ static void huawei_disconnect(gpointer user_data)
 	g_at_chat_set_disconnect_function(data->modem,
 						huawei_disconnect, modem);
 
-	ofono_info("Reopened GPRS context channel");
+	if (data->sim_state == HUAWEI_SIM_STATE_VALID ||
+			data->sim_state == HUAWEI_SIM_STATE_INVALID_CS) {
+		ofono_info("Reopened GPRS context channel");
 
-	data->gc = ofono_gprs_context_create(modem, 0, "atmodem",
-							data->modem);
+		data->gc = ofono_gprs_context_create(modem, 0, "atmodem",
+								data->modem);
 
-	if (data->gprs && data->gc)
-		ofono_gprs_add_context(data->gprs, data->gc);
+		if (data->gprs && data->gc)
+			ofono_gprs_add_context(data->gprs, data->gc);
+	}
 }
 
 static int huawei_enable(struct ofono_modem *modem)
@@ -333,7 +346,9 @@ static void huawei_pre_sim(struct ofono_modem *modem)
 	ofono_devinfo_create(modem, 0, "atmodem", data->pcui);
 	data->sim = ofono_sim_create(modem, 0, "atmodem", data->pcui);
 
-	if (ofono_modem_get_boolean(modem, "HasVoice") == TRUE)
+	if ((data->sim_state == HUAWEI_SIM_STATE_VALID ||
+			data->sim_state == HUAWEI_SIM_STATE_INVALID_PS) &&
+			ofono_modem_get_boolean(modem, "HasVoice") == TRUE)
 		ofono_voicecall_create(modem, 0, "atmodem", data->pcui);
 }
 
@@ -345,6 +360,11 @@ static void huawei_post_sim(struct ofono_modem *modem)
 
 	DBG("%p", modem);
 
+	if (data->sim_state == HUAWEI_SIM_STATE_INVALID_PS_AND_CS) {
+		ofono_phonebook_create(modem, 0, "atmodem", data->pcui);
+		return;
+	}
+
 	netreg = ofono_netreg_create(modem, OFONO_VENDOR_HUAWEI, "atmodem",
 								data->pcui);
 
@@ -352,19 +372,25 @@ static void huawei_post_sim(struct ofono_modem *modem)
 	ofono_cbs_create(modem, OFONO_VENDOR_QUALCOMM_MSM, "atmodem",
 								data->pcui);
 	ofono_ussd_create(modem, 0, "atmodem", data->pcui);
+	ofono_phonebook_create(modem, 0, "atmodem", data->pcui);
 
-	data->gprs = ofono_gprs_create(modem, 0, "atmodem", data->pcui);
-	data->gc = ofono_gprs_context_create(modem, 0, "atmodem", data->modem);
+	if (data->sim_state == HUAWEI_SIM_STATE_VALID ||
+			data->sim_state == HUAWEI_SIM_STATE_INVALID_CS) {
+		data->gprs = ofono_gprs_create(modem, 0, "atmodem", data->pcui);
+		data->gc = ofono_gprs_context_create(modem, 0, "atmodem",
+								data->modem);
 
-	if (data->gprs && data->gc)
-		ofono_gprs_add_context(data->gprs, data->gc);
+		if (data->gprs && data->gc)
+			ofono_gprs_add_context(data->gprs, data->gc);
+	}
 
-	if (ofono_modem_get_boolean(modem, "HasVoice") == TRUE) {
+	if ((data->sim_state == HUAWEI_SIM_STATE_VALID ||
+			data->sim_state == HUAWEI_SIM_STATE_INVALID_PS) &&
+			ofono_modem_get_boolean(modem, "HasVoice") == TRUE) {
 		ofono_call_forwarding_create(modem, 0, "atmodem", data->pcui);
 		ofono_call_settings_create(modem, 0, "atmodem", data->pcui);
 		ofono_call_barring_create(modem, 0, "atmodem", data->pcui);
 		ofono_ssn_create(modem, 0, "atmodem", data->pcui);
-		ofono_phonebook_create(modem, 0, "atmodem", data->pcui);
 
 		mw = ofono_message_waiting_create(modem);
 		if (mw)
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread
* (no subject)
@ 2010-08-05 18:18 =?unknown-8bit?q?Jo=C3=A3o?= Paulo Rechi Vita
  2010-08-05 18:18 ` [PATCH] huawei: Fix SIM state logic =?unknown-8bit?q?Jo=C3=A3o?= Paulo Rechi Vita
  0 siblings, 1 reply; 5+ messages in thread
From: =?unknown-8bit?q?Jo=C3=A3o?= Paulo Rechi Vita @ 2010-08-05 18:18 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 117 bytes --]


Changed sim_state to an enum type and removed an extra check which was causing
issues with pin-locked sim cards.

^ permalink raw reply	[flat|nested] 5+ messages in thread
* [PATCH] huawei: Fix SIM state logic
@ 2010-08-03 21:22 =?unknown-8bit?q?Jo=C3=A3o?= Paulo Rechi Vita
  0 siblings, 0 replies; 5+ messages in thread
From: =?unknown-8bit?q?Jo=C3=A3o?= Paulo Rechi Vita @ 2010-08-03 21:22 UTC (permalink / raw)
  To: ofono

[-- Attachment #1: Type: text/plain, Size: 4187 bytes --]

Add support for voice-only SIM cards and enable phonebook atom for
non-voice modems.
---
 plugins/huawei.c |   56 +++++++++++++++++++++++++++++++++++------------------
 1 files changed, 37 insertions(+), 19 deletions(-)

diff --git a/plugins/huawei.c b/plugins/huawei.c
index 47d59d0..fd31d2c 100644
--- a/plugins/huawei.c
+++ b/plugins/huawei.c
@@ -104,13 +104,15 @@ static void notify_sim_state(struct ofono_modem *modem, gint sim_state)
 {
 	struct huawei_data *data = ofono_modem_get_data(modem);
 
-	if (data->sim_state == 0 && sim_state == 1) {
-		ofono_sim_inserted_notify(data->sim, TRUE);
-		data->sim_state = sim_state;
-	} else if (data->sim_state == 1 && sim_state == 0) {
+	if (data->sim_state == sim_state)
+		return;
+
+	if (sim_state == 255)
 		ofono_sim_inserted_notify(data->sim, FALSE);
-		data->sim_state = sim_state;
-	}
+	else
+		ofono_sim_inserted_notify(data->sim, TRUE);
+
+	data->sim_state = sim_state;
 }
 
 static void sysinfo_cb(gboolean ok, GAtResult *result, gpointer user_data)
@@ -235,7 +237,8 @@ static void huawei_disconnect(gpointer user_data)
 
 	DBG("");
 
-	ofono_gprs_context_remove(data->gc);
+	if (data->gc)
+		ofono_gprs_context_remove(data->gc);
 
 	g_at_chat_unref(data->modem);
 	data->modem = NULL;
@@ -247,13 +250,15 @@ static void huawei_disconnect(gpointer user_data)
 	g_at_chat_set_disconnect_function(data->modem,
 						huawei_disconnect, modem);
 
-	ofono_info("Reopened GPRS context channel");
+	if (data->sim_state == 1 || data->sim_state == 2) {
+		ofono_info("Reopened GPRS context channel");
 
-	data->gc = ofono_gprs_context_create(modem, 0, "atmodem",
-							data->modem);
+		data->gc = ofono_gprs_context_create(modem, 0, "atmodem",
+								data->modem);
 
-	if (data->gprs && data->gc)
-		ofono_gprs_add_context(data->gprs, data->gc);
+		if (data->gprs && data->gc)
+			ofono_gprs_add_context(data->gprs, data->gc);
+	}
 }
 
 static int huawei_enable(struct ofono_modem *modem)
@@ -333,7 +338,8 @@ static void huawei_pre_sim(struct ofono_modem *modem)
 	ofono_devinfo_create(modem, 0, "atmodem", data->pcui);
 	data->sim = ofono_sim_create(modem, 0, "atmodem", data->pcui);
 
-	if (ofono_modem_get_boolean(modem, "HasVoice") == TRUE)
+	if ((data->sim_state == 1 || data->sim_state == 3) &&
+			ofono_modem_get_boolean(modem, "HasVoice") == TRUE)
 		ofono_voicecall_create(modem, 0, "atmodem", data->pcui);
 }
 
@@ -345,6 +351,14 @@ static void huawei_post_sim(struct ofono_modem *modem)
 
 	DBG("%p", modem);
 
+	if (data->sim_state == 255)
+		return;
+
+	if (data->sim_state == 4) {
+		ofono_phonebook_create(modem, 0, "atmodem", data->pcui);
+		return;
+	}
+
 	netreg = ofono_netreg_create(modem, OFONO_VENDOR_HUAWEI, "atmodem",
 								data->pcui);
 
@@ -352,19 +366,23 @@ static void huawei_post_sim(struct ofono_modem *modem)
 	ofono_cbs_create(modem, OFONO_VENDOR_QUALCOMM_MSM, "atmodem",
 								data->pcui);
 	ofono_ussd_create(modem, 0, "atmodem", data->pcui);
+	ofono_phonebook_create(modem, 0, "atmodem", data->pcui);
 
-	data->gprs = ofono_gprs_create(modem, 0, "atmodem", data->pcui);
-	data->gc = ofono_gprs_context_create(modem, 0, "atmodem", data->modem);
+	if (data->sim_state == 1 || data->sim_state == 2) {
+		data->gprs = ofono_gprs_create(modem, 0, "atmodem", data->pcui);
+		data->gc = ofono_gprs_context_create(modem, 0, "atmodem",
+								data->modem);
 
-	if (data->gprs && data->gc)
-		ofono_gprs_add_context(data->gprs, data->gc);
+		if (data->gprs && data->gc)
+			ofono_gprs_add_context(data->gprs, data->gc);
+	}
 
-	if (ofono_modem_get_boolean(modem, "HasVoice") == TRUE) {
+	if ((data->sim_state == 1 || data->sim_state == 3) &&
+			ofono_modem_get_boolean(modem, "HasVoice") == TRUE) {
 		ofono_call_forwarding_create(modem, 0, "atmodem", data->pcui);
 		ofono_call_settings_create(modem, 0, "atmodem", data->pcui);
 		ofono_call_barring_create(modem, 0, "atmodem", data->pcui);
 		ofono_ssn_create(modem, 0, "atmodem", data->pcui);
-		ofono_phonebook_create(modem, 0, "atmodem", data->pcui);
 
 		mw = ofono_message_waiting_create(modem);
 		if (mw)
-- 
1.7.0.4


^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2010-08-06  6:20 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-08-05 19:13 [PATCH] huawei: Fix SIM state logic =?unknown-8bit?q?Jo=C3=A3o?= Paulo Rechi Vita
2010-08-05 19:21 ` Denis Kenzior
  -- strict thread matches above, loose matches on Subject: below --
2010-08-05 18:18 =?unknown-8bit?q?Jo=C3=A3o?= Paulo Rechi Vita
2010-08-05 18:18 ` [PATCH] huawei: Fix SIM state logic =?unknown-8bit?q?Jo=C3=A3o?= Paulo Rechi Vita
2010-08-06  6:20   ` Kalle Valo
2010-08-03 21:22 =?unknown-8bit?q?Jo=C3=A3o?= Paulo Rechi Vita

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.