~phablet-team/ofono/midori-support

« back to all changes in this revision

Viewing changes to drivers/rilmodem/gprs-context.c

  • Committer: Alfonso Sanchez-Beato
  • Date: 2015-09-28 08:10:59 UTC
  • mfrom: (6830.1.168)
  • mto: This revision was merged to the branch mainline in revision 6904.
  • Revision ID: alfonso.sanchez-beato@canonical.com-20150928081059-1o08e2a9pkit6ar6
* Update to upstream release 1.17
* Do not assert when the radio is unavailable (LP: #1490991)
* Fix crash when importing phonebook (LP: #1486004)
* Check only destination port when receiving push (LP: #1490673)
* Fix crash when retrying to close context (LP: #1492483)

Show diffs side-by-side

added added

removed removed

Lines of Context:
69
69
        char *apn;
70
70
        enum ofono_gprs_context_type type;
71
71
        int deact_retries;
 
72
        guint retry_ev_id;
 
73
        struct cb_data *retry_cbd;
 
74
        guint reset_ev_id;
72
75
};
73
76
 
74
77
static void ril_gprs_context_deactivate_primary(struct ofono_gprs_context *gc,
329
332
 
330
333
static gboolean reset_modem(gpointer data)
331
334
{
332
 
        mtk_reset_modem(data);
 
335
        struct gprs_context_data *gcd = data;
 
336
        struct ofono_modem *modem = gcd->modem;
 
337
 
 
338
        gcd->reset_ev_id = 0;
 
339
 
 
340
        mtk_reset_modem(modem);
333
341
 
334
342
        return FALSE;
335
343
}
344
352
        struct parcel rilp;
345
353
        struct ofono_error error;
346
354
 
 
355
        gcd->retry_ev_id = 0;
 
356
 
347
357
        /* We might have received a call list update while waiting */
348
358
        if (gcd->state == STATE_IDLE) {
349
359
                if (cb)
392
402
                set_context_disconnected(gcd);
393
403
 
394
404
                /*
395
 
                 * If the deactivate was a result of a shutdown, there won't be
396
 
                 * call back, so _deactivated() needs to be called directly.
 
405
                 * If the deactivate was a result of a data network detach or of
 
406
                 * an error in data call establishment, there won't be call
 
407
                 * back, so _deactivated() needs to be called directly.
397
408
                 */
398
409
                if (cb)
399
410
                        CALLBACK_WITH_SUCCESS(cb, cbd->data);
410
421
                 * temporarily. We do retries to handle that case.
411
422
                 */
412
423
                if (--(gcd->deact_retries) > 0) {
413
 
                        struct cb_data *cbd2;
414
 
 
415
 
                        cbd2 = cb_data_new(cb, cbd->data, gc);
416
 
                        g_timeout_add_seconds(TIME_BETWEEN_DEACT_RETRIES_S,
417
 
                                                        retry_deactivate, cbd2);
 
424
                        gcd->retry_cbd = cb_data_new(cb, cbd->data, gc);
 
425
                        gcd->retry_ev_id =
 
426
                                g_timeout_add_seconds(
 
427
                                        TIME_BETWEEN_DEACT_RETRIES_S,
 
428
                                        retry_deactivate, gcd->retry_cbd);
418
429
                } else {
419
430
                        ofono_error("%s: retry limit hit", __func__);
420
431
 
428
439
                         * internal reset nonetheless.
429
440
                         */
430
441
                        if (gcd->vendor == OFONO_RIL_VENDOR_MTK)
431
 
                                g_idle_add(reset_modem, gcd->modem);
 
442
                                gcd->reset_ev_id = g_idle_add(reset_modem, gcd);
432
443
                }
433
444
        }
434
445
}
533
544
 
534
545
        DBG("*gc: %p", gc);
535
546
 
536
 
        if (gcd->state != STATE_IDLE) {
537
 
                ril_gprs_context_detach_shutdown(gc, 0);
538
 
        }
 
547
        if (gcd->state != STATE_IDLE && gcd->state != STATE_DISABLING) {
 
548
                struct req_deactivate_data_call request;
 
549
                struct parcel rilp;
 
550
                struct ofono_error error;
 
551
 
 
552
                request.cid = gcd->active_rild_cid;
 
553
                request.reason = RIL_DEACTIVATE_DATA_CALL_NO_REASON;
 
554
                g_ril_request_deactivate_data_call(gcd->ril, &request,
 
555
                                                                &rilp, &error);
 
556
 
 
557
                g_ril_send(gcd->ril, RIL_REQUEST_DEACTIVATE_DATA_CALL,
 
558
                                                &rilp, NULL, NULL, NULL);
 
559
        }
 
560
 
 
561
        if (gcd->retry_ev_id > 0) {
 
562
                g_source_remove(gcd->retry_ev_id);
 
563
                g_free(gcd->retry_cbd);
 
564
        }
 
565
 
 
566
        if (gcd->reset_ev_id > 0)
 
567
                g_source_remove(gcd->reset_ev_id);
539
568
 
540
569
        ofono_gprs_context_set_data(gc, NULL);
541
570