Hi Denis,

Denis Kenzior wrote:
> Hi Zhenhua,
> 
> On 07/26/2010 09:39 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 should not
>> resume 
>> the chat and call disconnect function when removing the context.
> 
> Please reword the last sentence, we should resume the chat, but the
> question is of timing...

It should be something like 'not resume the chat twice'. One is in
ppp_disconnect and the second is in at_gprs_context_remove.

>> Secondly, before removing the gprs context, we should reply the
>> pending 
>> DBus message to the client.
>> ---
>>  drivers/atmodem/gprs-context.c |   13 ++++++++++++-
>>  1 files changed, 12 insertions(+), 1 deletions(-)
>> 
>> diff --git a/drivers/atmodem/gprs-context.c
>> b/drivers/atmodem/gprs-context.c 
>> index fea80b0..e2f291a 100644
>> --- a/drivers/atmodem/gprs-context.c
>> +++ b/drivers/atmodem/gprs-context.c
>> @@ -88,11 +88,22 @@ 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;
>> +
>> +    if (g_at_io_get_channel(io) == NULL) {
>> +            CALLBACK_WITH_FAILURE(gcd->up_cb, NULL, FALSE, NULL,
>> +                                    NULL, NULL, NULL, gcd->cb_data);
>> +            gcd->active_context = 0;
>> +            gcd->state = STATE_IDLE;
>> +            g_at_chat_resume(gcd->chat);
>> +            return;
>> +    }
>> +
> 
> Instead of doing that, can't we simply move g_at_chat_resume to the
> bottom of the function and put in a comment this might cause
> gprs_context_remove to get called?

It's better than my current way. The updated patch will send out soon. Please 
review it.

>>      g_at_chat_resume(gcd->chat);
>> 
>>      switch (gcd->state) {
>> @@ -257,7 +268,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) {
> 
> This along with the funny g_at_chat_resume logic is what seems to be
> causing the infinite loop.
> 
>>              g_at_ppp_unref(gcd->ppp);
>>              g_at_chat_resume(gcd->chat);
>>      }
> 
> Thanks,
> -Denis



Regards,
Zhenhua
_______________________________________________
ofono mailing list
ofono@ofono.org
http://lists.ofono.org/listinfo/ofono

Reply via email to