Hi Zhenhua,
On 07/26/2010 11:58 PM, Zhenhua Zhang wrote:
Huawei modem closes the modem port after PPP disconnect. So the
channel
of gatchat is NULL in ppp_disconnect. In such case, we resume the chat
and it causes huawei_disconnect() get called and the gprs context is
removed later.
Before removing this gprs context, we should reply the pending DBus
message to the client.
---
drivers/atmodem/gprs-context.c | 17 +++++++++++++++--
1 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/drivers/atmodem/gprs-context.c b/drivers/atmodem/gprs-context.c
index fea80b0..2f5be9b 100644
--- a/drivers/atmodem/gprs-context.c
+++ b/drivers/atmodem/gprs-context.c
@@ -88,12 +88,18 @@ static void ppp_disconnect(GAtPPPDisconnectReason reason, gpointer
user_data)
{
struct ofono_gprs_context *gc = user_data;
struct gprs_context_data *gcd = ofono_gprs_context_get_data(gc);
+ GAtIO *io = g_at_chat_get_io(gcd->chat);
DBG("");
g_at_ppp_unref(gcd->ppp);
gcd->ppp = NULL;
- g_at_chat_resume(gcd->chat);
+
+ if (g_at_io_get_channel(io) == NULL) {
+ CALLBACK_WITH_FAILURE(gcd->up_cb, NULL, FALSE, NULL,
+ NULL, NULL, NULL, gcd->cb_data);
+ goto done;
+ }
I don't believe the above addition is actually necessary, just moving
the g_at_chat_resume to the bottom should be enough.
switch (gcd->state) {
case STATE_ENABLING:
@@ -108,8 +114,15 @@ static void ppp_disconnect(GAtPPPDisconnectReason reason, gpointer
user_data)
break;
}
+done:
gcd->active_context = 0;
gcd->state = STATE_IDLE;
+ /*
+ * If the channel of gcd->chat is NULL, it might cause
+ * gprs_context_remove get called and the gprs context will be
+ * removed.
+ */
+ g_at_chat_resume(gcd->chat);
}
static gboolean setup_ppp(struct ofono_gprs_context *gc)
@@ -257,7 +270,7 @@ static void at_gprs_context_remove(struct ofono_gprs_context *gc)
DBG("");
- if (gcd->state != STATE_IDLE) {
+ if (gcd->state != STATE_IDLE && gcd->ppp) {
g_at_ppp_unref(gcd->ppp);
g_at_chat_resume(gcd->chat);
}
Regards,
-Denis