Hi tony,

Thanks for your reply. 

In fact I have ever considered the way you mentioned. But l found in most 
plugins, atoms (gprs, gprs_context, sms, 
call_forwarding ...) are created at post_sim phrase. It seems post_online 
phrase is more reasonable. There should
be some reason that the atom creation is brought forward. Does anyone know the 
reason?

Thanks,
Caiwen

> -----Original Message-----
> From: ofono [mailto:[email protected]] On Behalf Of Tony Espy
> Sent: Thursday, January 14, 2016 5:11 AM
> To: [email protected]
> Subject: Re: [PATCH] rilmodem: Fix GPRS feature inavailable issue
> 
> On 01/11/2016 10:42 PM, [email protected] wrote:
> > From: Caiwen Zhang <[email protected]>
> >
> > When query max cid if rild radio status isn't RADIO_STATUS_ON, it may
> > fail, gprs atom will be removed, gprs feature will always be inavailable.
> > ---
> >   drivers/rilmodem/gprs.c | 43
> ++++++++++++++++++++++++++++++++++++++++++-
> >   1 file changed, 42 insertions(+), 1 deletion(-)
> 
> Thanks for the patch Caiwen!
> 
> That said instead of extending the gprs atom to listen to radio state
> changes ( which may not reliably work on all rild-based devices ), it
> probably makes more sense to defer the creation of the gprs atom in the
> ril device plugin till the post_online phase ( vs. post_sim ).
> 
> Regards,
> /tony
> 
> 
> > diff --git a/drivers/rilmodem/gprs.c b/drivers/rilmodem/gprs.c index
> > 0ec9d5f..f3bdc86 100644
> > --- a/drivers/rilmodem/gprs.c
> > +++ b/drivers/rilmodem/gprs.c
> > @@ -54,8 +54,11 @@ struct ril_gprs_data {
> >     gboolean ofono_attached;
> >     int rild_status;
> >     int pending_deact_req;
> > +   gboolean registered;
> >   };
> >
> > +static void query_max_cids(struct ofono_gprs *gprs);
> > +
> >   /*
> >    * This module is the ofono_gprs_driver implementation for
> rilmodem.
> >    *
> > @@ -300,6 +303,34 @@ static void ril_gprs_registration_status(struct
> ofono_gprs *gprs,
> >     }
> >   }
> >
> > +static void ril_radio_state_changed(struct ril_msg *message,
> > +                                                   gpointer user_data)
> > +{
> > +   struct ofono_gprs *gprs = user_data;
> > +   struct ril_gprs_data *gd = ofono_gprs_get_data(gprs);
> > +   struct parcel rilp;
> > +   int radio_state;
> > +
> > +   if (gd->registered)
> > +           return;
> > +
> > +   g_ril_init_parcel(message, &rilp);
> > +   radio_state = parcel_r_int32(&rilp);
> > +
> > +   if (rilp.malformed) {
> > +           ofono_error("%s: malformed parcel received", __func__);
> > +           return;
> > +   }
> > +
> > +   g_ril_append_print_buf(gd->ril, "(state: %s)",
> > +                           ril_radio_state_to_string(radio_state));
> > +   g_ril_print_unsol(gd->ril, message);
> > +
> > +   if (radio_state == RADIO_STATE_ON) {
> > +           query_max_cids(gprs);
> > +   }
> > +}
> > +
> >   static void query_max_cids_cb(struct ril_msg *message, gpointer
> user_data)
> >   {
> >     struct ofono_gprs *gprs = user_data; @@ -315,7 +346,14 @@
> static
> > void query_max_cids_cb(struct ril_msg *message, gpointer user_data)
> >             ofono_error("%s: DATA_REGISTRATION_STATE reply
> failure: %s",
> >                             __func__,
> >                             ril_error_to_string(message->error));
> > -           goto error;
> > +
> > +           if (message->error != RIL_E_RADIO_NOT_AVAILABLE)
> > +                   goto error;
> > +           else {
> > +             g_ril_register(gd->ril,
> RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED,
> > +                                   ril_radio_state_changed, gprs);
> > +                   return;
> > +           }
> >     }
> >
> >     g_ril_init_parcel(message, &rilp);
> > @@ -341,6 +379,7 @@ reg_atom:
> >     g_strfreev(strv);
> >     ofono_gprs_set_cid_range(gprs, 1, max_calls);
> >     ofono_gprs_register(gprs);
> > +   gd->registered = TRUE;
> >     return;
> >
> >   error_free:
> > @@ -380,6 +419,7 @@ static void query_max_cids(struct ofono_gprs
> *gprs)
> >     if (g_ril_vendor(gd->ril) == OFONO_RIL_VENDOR_MTK) {
> >             ofono_gprs_set_cid_range(gprs, 1, 3);
> >             ofono_gprs_register(gprs);
> > +           gd->registered = TRUE;
> >             return;
> >     }
> >
> > @@ -495,6 +535,7 @@ static int ril_gprs_probe(struct ofono_gprs
> *gprs, unsigned int vendor,
> >     gd->ril = g_ril_clone(ril);
> >     gd->ofono_attached = FALSE;
> >     gd->rild_status = -1;
> > +   gd->registered = FALSE;
> >
> >     ofono_gprs_set_data(gprs, gd);
> >
> >
> 
> _______________________________________________
> ofono mailing list
> [email protected]
> https://lists.ofono.org/mailman/listinfo/ofono
_______________________________________________
ofono mailing list
[email protected]
https://lists.ofono.org/mailman/listinfo/ofono

Reply via email to