95
95
struct ril_sim_data sim_data;
96
96
struct ofono_devinfo *devinfo;
97
struct ofono_voicecall *voicecall;
98
struct ofono_call_volume *callvolume;
97
99
struct cb_data *pending_online_cbd;
98
100
ofono_bool_t pending_online;
99
101
ofono_bool_t gprs_attach;
100
102
int rild_connect_retries;
103
struct ofono_sms *sms;
104
struct ofono_netreg *netreg;
105
struct ofono_ussd *ussd;
106
struct ofono_call_settings *call_settings;
107
struct ofono_call_forwarding *call_forwarding;
108
struct ofono_call_barring *call_barring;
109
struct ofono_gprs *gprs;
110
struct ofono_message_waiting *message_waiting;
377
387
DBG("slot %d", ril->slot);
391
* sim_state_watch listens to SIM state changes and creates/removes atoms
392
* accordingly. This is needed because we cannot rely on the modem core code,
393
* which handles modem state transitions, to do this due to the SIM not being
394
* accessible in the offline state for mtk modems. This causes a mismatch
395
* between what the core thinks it can do in some states and what the mtk modem
396
* can really do in those. This is a workaround to solve that.
380
398
static void sim_state_watch(enum ofono_sim_state new_state, void *data)
400
struct ofono_modem *modem = data;
401
struct mtk_data *ril = ofono_modem_get_data(modem);
382
403
if (new_state == OFONO_SIM_STATE_READY) {
383
struct ofono_modem *modem = data;
384
struct mtk_data *ril = ofono_modem_get_data(modem);
385
struct ofono_gprs *gprs;
386
404
struct ofono_gprs_context *gc;
387
struct ofono_message_waiting *mw;
388
405
struct mtk_gprs_data gprs_data = { ril->modem, modem };
389
406
struct ril_gprs_context_data inet_ctx =
390
407
{ ril->modem, OFONO_GPRS_CONTEXT_TYPE_INTERNET };
399
416
* - stk ( SIM toolkit )
400
417
* - radio_settings
402
ofono_sms_create(modem, OFONO_RIL_VENDOR_MTK,
403
RILMODEM, ril->modem);
419
ril->sms = ofono_sms_create(modem, OFONO_RIL_VENDOR_MTK,
420
RILMODEM, ril->modem);
405
422
/* netreg needs access to the SIM (SPN, SPDI) */
406
ofono_netreg_create(modem, OFONO_RIL_VENDOR_MTK,
407
RILMODEM, ril->modem);
408
ofono_ussd_create(modem, OFONO_RIL_VENDOR_MTK,
409
RILMODEM, ril->modem);
410
ofono_call_settings_create(modem, OFONO_RIL_VENDOR_MTK,
411
RILMODEM, ril->modem);
412
ofono_call_forwarding_create(modem, OFONO_RIL_VENDOR_MTK,
413
RILMODEM, ril->modem);
414
ofono_call_barring_create(modem, OFONO_RIL_VENDOR_MTK,
415
RILMODEM, ril->modem);
423
ril->netreg = ofono_netreg_create(modem, OFONO_RIL_VENDOR_MTK,
424
RILMODEM, ril->modem);
425
ril->ussd = ofono_ussd_create(modem, OFONO_RIL_VENDOR_MTK,
426
RILMODEM, ril->modem);
428
ofono_call_settings_create(modem, OFONO_RIL_VENDOR_MTK,
429
RILMODEM, ril->modem);
430
ril->call_forwarding =
431
ofono_call_forwarding_create(modem,
432
OFONO_RIL_VENDOR_MTK,
433
RILMODEM, ril->modem);
435
ofono_call_barring_create(modem, OFONO_RIL_VENDOR_MTK,
436
RILMODEM, ril->modem);
417
gprs = ofono_gprs_create(modem, OFONO_RIL_VENDOR_MTK,
438
ril->gprs = ofono_gprs_create(modem, OFONO_RIL_VENDOR_MTK,
418
439
MTKMODEM, &gprs_data);
420
441
gc = ofono_gprs_context_create(modem, OFONO_RIL_VENDOR_MTK,
423
444
ofono_gprs_context_set_type(gc,
424
445
OFONO_GPRS_CONTEXT_TYPE_INTERNET);
425
ofono_gprs_add_context(gprs, gc);
446
ofono_gprs_add_context(ril->gprs, gc);
428
449
gc = ofono_gprs_context_create(modem, OFONO_RIL_VENDOR_MTK,
431
452
ofono_gprs_context_set_type(gc,
432
453
OFONO_GPRS_CONTEXT_TYPE_MMS);
433
ofono_gprs_add_context(gprs, gc);
436
mw = ofono_message_waiting_create(modem);
438
ofono_message_waiting_register(mw);
454
ofono_gprs_add_context(ril->gprs, gc);
457
ril->message_waiting = ofono_message_waiting_create(modem);
458
if (ril->message_waiting)
459
ofono_message_waiting_register(ril->message_waiting);
461
} else if (new_state == OFONO_SIM_STATE_LOCKED_OUT) {
463
DBG("SIM locked, removing atoms");
465
if (ril->message_waiting) {
466
ofono_message_waiting_remove(ril->message_waiting);
467
ril->message_waiting = NULL;
470
ofono_gprs_remove(ril->gprs);
473
if (ril->call_barring) {
474
ofono_call_barring_remove(ril->call_barring);
475
ril->call_barring = NULL;
477
if (ril->call_forwarding) {
478
ofono_call_forwarding_remove(ril->call_forwarding);
479
ril->call_forwarding = NULL;
481
if (ril->call_settings) {
482
ofono_call_settings_remove(ril->call_settings);
483
ril->call_settings = NULL;
486
ofono_ussd_remove(ril->ussd);
490
ofono_netreg_remove(ril->netreg);
494
ofono_sms_remove(ril->sms);
453
511
RILMODEM, &ril->sim_data);
454
512
g_assert(ril->sim != NULL);
456
/* Create interfaces useful for emergency calls */
457
ofono_voicecall_create(modem, OFONO_RIL_VENDOR_MTK,
458
MTKMODEM, ril->modem);
459
ofono_call_volume_create(modem, OFONO_RIL_VENDOR_MTK,
460
RILMODEM, ril->modem);
462
514
/* Radio settings does not depend on the SIM */
463
515
ofono_radio_settings_create(modem, OFONO_RIL_VENDOR_MTK,
464
516
MTKMODEM, ril->modem);
713
static void create_atoms_on_connection(struct ofono_modem *modem)
715
struct mtk_data *ril = ofono_modem_get_data(modem);
717
ril->devinfo = ofono_devinfo_create(modem, OFONO_RIL_VENDOR_MTK,
718
RILMODEM, ril->modem);
720
/* Create interfaces useful for emergency calls */
721
ril->voicecall = ofono_voicecall_create(modem, OFONO_RIL_VENDOR_MTK,
722
MTKMODEM, ril->modem);
723
ril->callvolume = ofono_call_volume_create(modem, OFONO_RIL_VENDOR_MTK,
724
RILMODEM, ril->modem);
727
static void remove_atoms_on_disconnection(struct ofono_modem *modem)
729
struct mtk_data *ril = ofono_modem_get_data(modem);
731
ofono_call_volume_remove(ril->callvolume);
732
ril->callvolume = NULL;
733
ofono_voicecall_remove(ril->voicecall);
734
ril->voicecall = NULL;
735
ofono_devinfo_remove(ril->devinfo);
661
739
static gboolean mtk_connected(gpointer user_data)
663
741
struct ofono_modem *modem = (struct ofono_modem *) user_data;
670
748
ofono_modem_set_powered(modem, TRUE);
672
ril->devinfo = ofono_devinfo_create(modem, OFONO_RIL_VENDOR_MTK,
673
RILMODEM, ril->modem);
750
create_atoms_on_connection(modem);
675
752
/* Call the function just once */
686
763
if (create_gril(modem) < 0)
689
ril->devinfo = ofono_devinfo_create(modem, OFONO_RIL_VENDOR_MTK,
690
RILMODEM, ril->modem);
766
create_atoms_on_connection(modem);
692
768
if (ril->pending_cb)
693
769
ril->pending_cb(ril->pending_cbd);
706
782
DBG("slot %d", ril->slot);
708
/* Uses old gril object, remove and recreate later */
709
ofono_devinfo_remove(ril->devinfo);
784
/* Atoms use old gril object, remove and recreate later */
785
remove_atoms_on_disconnection(modem);
711
787
g_ril_unref(ril->modem);
712
788
ril->modem = NULL;
804
880
g_timeout_add_seconds(RILD_CONNECT_RETRY_TIME_S,
805
881
connect_rild, modem);
883
/* We handle SIM states due to MTK peculiarities */
884
ofono_modem_set_driver_watches_sim(modem, TRUE);
808
887
* We will mark the modem as powered when we receive an event that
809
888
* confirms that the radio is in a state different from unavailable