diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/ste.c | 144 |
1 files changed, 92 insertions, 52 deletions
diff --git a/plugins/ste.c b/plugins/ste.c index 597cc89f..efae5737 100644 --- a/plugins/ste.c +++ b/plugins/ste.c @@ -65,13 +65,20 @@ #include <drivers/stemodem/caif_socket.h> #include <drivers/stemodem/if_caif.h> -#define NUM_CHAT 1 +#define NUM_CHAT 5 +#define AT_DEFAULT 0 +#define AT_NET 1 +#define AT_VOICE 2 +#define AT_GPRS 3 +#define AT_SIM 4 + #define MAX_PDP_CONTEXTS 4 -static char *chat_prefixes[NUM_CHAT] = { "Default: " }; +static char *chat_prefixes[NUM_CHAT] = { "Default: ", "Net: ", "Voice: ", + "GPRS: ", "SIM: " }; struct ste_data { - GAtChat *chat; + GAtChat *chat[NUM_CHAT]; gboolean have_sim; struct ofono_sim *sim; }; @@ -105,12 +112,14 @@ static int ste_probe(struct ofono_modem *modem) static void ste_remove(struct ofono_modem *modem) { struct ste_data *data = ofono_modem_get_data(modem); + int i; DBG("%p", modem); ofono_modem_set_data(modem, NULL); - g_at_chat_unref(data->chat); + for (i = 0; i < NUM_CHAT; i++) + g_at_chat_unref(data->chat[i]); g_free(data); } @@ -187,7 +196,7 @@ static gboolean init_sim_reporting(gpointer user_data) data->have_sim = FALSE; - g_at_chat_send(data->chat, "AT*ESIMSR=1;*ESIMSR?", NULL, + g_at_chat_send(data->chat[AT_SIM], "AT*ESIMSR=1;*ESIMSR?", NULL, handle_sim_state, modem, NULL); return FALSE; @@ -196,11 +205,21 @@ static gboolean init_sim_reporting(gpointer user_data) static void cfun_enable(gboolean ok, GAtResult *result, gpointer user_data) { struct ofono_modem *modem = user_data; + struct ste_data *data = ofono_modem_get_data(modem); + int i; DBG(""); if (!ok) { ofono_modem_set_powered(modem, FALSE); + + for (i = 0; i < NUM_CHAT; i++) { + g_at_chat_cancel_all(data->chat[i]); + g_at_chat_unregister_all(data->chat[i]); + g_at_chat_unref(data->chat[i]); + data->chat[i] = NULL; + } + return; } @@ -298,47 +317,65 @@ static int ste_enable(struct ofono_modem *modem) struct ste_data *data = ofono_modem_get_data(modem); GIOChannel *channel; GAtSyntax *syntax; + int i; - syntax = g_at_syntax_new_gsm_permissive(); - - channel = ste_create_channel(modem); - if (!channel) - return -EIO; + for (i = 0; i < NUM_CHAT; i++) { + channel = ste_create_channel(modem); + syntax = g_at_syntax_new_gsm_permissive(); + data->chat[i] = g_at_chat_new_blocking(channel, syntax); - data->chat = g_at_chat_new_blocking(channel, syntax); - g_at_chat_send(data->chat, "AT&F E0 V1 X4 &C1 +CMEE=1", - NULL, NULL, NULL, NULL); + if (data->chat[i] == NULL) { + g_io_channel_unref(channel); + g_at_syntax_unref(syntax); + DBG("Failed to create AT chat %s", chat_prefixes[i]); + goto error; + } - /* All STE modems support UTF-8 */ - g_at_chat_send(data->chat, "AT+CSCS=\"UTF-8\"", - NULL, NULL, NULL, NULL); + if (getenv("OFONO_AT_DEBUG")) + g_at_chat_set_debug(data->chat[i], ste_debug, + chat_prefixes[i]); - g_io_channel_unref(channel); - g_at_syntax_unref(syntax); + g_at_chat_send(data->chat[i], "AT&F E0 V1 X4 &C1 +CMEE=1", + NULL, NULL, NULL, NULL); - if (data->chat == NULL) - return -ENOMEM; + /* All STE modems support UTF-8 */ + g_at_chat_send(data->chat[i], "AT+CSCS=\"UTF-8\"", + NULL, NULL, NULL, NULL); - if (getenv("OFONO_AT_DEBUG")) - g_at_chat_set_debug(data->chat, ste_debug, chat_prefixes[0]); + g_io_channel_unref(channel); + g_at_syntax_unref(syntax); + } - g_at_chat_send(data->chat, "AT+CFUN=4", NULL, cfun_enable, modem, NULL); + g_at_chat_send(data->chat[AT_DEFAULT], "AT+CFUN=4", NULL, cfun_enable, + modem, NULL); - g_at_chat_register(data->chat, "*ESIMSR:", esimsr_notify, + g_at_chat_register(data->chat[AT_SIM], "*ESIMSR:", esimsr_notify, FALSE, modem, NULL); return -EINPROGRESS; + +error: + /* Unref open chats if any */ + while (i--) { + g_at_chat_unref(data->chat[i]); + data->chat[i] = NULL; + } + + return -EIO; } static void cfun_disable(gboolean ok, GAtResult *result, gpointer user_data) { struct ofono_modem *modem = user_data; struct ste_data *data = ofono_modem_get_data(modem); + int i; DBG(""); - g_at_chat_unref(data->chat); - data->chat = NULL; + for (i = 0; i < NUM_CHAT; i++) { + g_at_chat_unref(data->chat[i]); + data->chat[i] = NULL; + } if (ok) ofono_modem_set_powered(modem, FALSE); @@ -347,15 +384,15 @@ static void cfun_disable(gboolean ok, GAtResult *result, gpointer user_data) static int ste_disable(struct ofono_modem *modem) { struct ste_data *data = ofono_modem_get_data(modem); + int i; DBG("%p", modem); - if (data->chat == NULL) - return 0; - - g_at_chat_cancel_all(data->chat); - g_at_chat_unregister_all(data->chat); - g_at_chat_send(data->chat, "AT+CFUN=4", NULL, + for (i = 0; i < NUM_CHAT; i++) { + g_at_chat_cancel_all(data->chat[i]); + g_at_chat_unregister_all(data->chat[i]); + } + g_at_chat_send(data->chat[AT_DEFAULT], "AT+CFUN=4", NULL, cfun_disable, modem, NULL); return -EINPROGRESS; @@ -376,7 +413,7 @@ static void ste_set_online(struct ofono_modem *modem, ofono_bool_t online, ofono_modem_online_cb_t cb, void *user_data) { struct ste_data *data = ofono_modem_get_data(modem); - GAtChat *chat = data->chat; + GAtChat *chat = data->chat[AT_DEFAULT]; struct cb_data *cbd = cb_data_new(cb, user_data); char const *command = online ? "AT+CFUN=1" : "AT+CFUN=4"; @@ -396,10 +433,10 @@ static void ste_pre_sim(struct ofono_modem *modem) DBG("%p", modem); - ofono_devinfo_create(modem, 0, "atmodem", data->chat); + ofono_devinfo_create(modem, 0, "atmodem", data->chat[AT_DEFAULT]); data->sim = ofono_sim_create(modem, OFONO_VENDOR_MBM, "atmodem", - data->chat); - ofono_voicecall_create(modem, 0, "stemodem", data->chat); + data->chat[AT_SIM]); + ofono_voicecall_create(modem, 0, "stemodem", data->chat[AT_VOICE]); } static void ste_post_sim(struct ofono_modem *modem) @@ -408,11 +445,11 @@ static void ste_post_sim(struct ofono_modem *modem) DBG("%p", modem); - ofono_stk_create(modem, 0, "mbmmodem", data->chat); - ofono_phonebook_create(modem, 0, "atmodem", data->chat); - ofono_radio_settings_create(modem, 0, "stemodem", data->chat); + ofono_stk_create(modem, 0, "mbmmodem", data->chat[AT_SIM]); + ofono_phonebook_create(modem, 0, "atmodem", data->chat[AT_SIM]); + ofono_radio_settings_create(modem, 0, "stemodem", data->chat[AT_NET]); - ofono_sms_create(modem, 0, "atmodem", data->chat); + ofono_sms_create(modem, 0, "atmodem", data->chat[AT_DEFAULT]); } static void ste_post_online(struct ofono_modem *modem) @@ -425,22 +462,25 @@ static void ste_post_online(struct ofono_modem *modem) DBG("%p", modem); - ofono_ussd_create(modem, 0, "atmodem", data->chat); - ofono_call_forwarding_create(modem, 0, "atmodem", data->chat); - ofono_call_settings_create(modem, 0, "atmodem", data->chat); - ofono_netreg_create(modem, OFONO_VENDOR_MBM, "atmodem", data->chat); - ofono_call_meter_create(modem, 0, "atmodem", data->chat); - ofono_call_barring_create(modem, 0, "atmodem", data->chat); - ofono_ssn_create(modem, 0, "atmodem", data->chat); - ofono_call_volume_create(modem, 0, "atmodem", data->chat); - ofono_cbs_create(modem, 0, "atmodem", data->chat); + ofono_ussd_create(modem, 0, "atmodem", data->chat[AT_DEFAULT]); + ofono_call_forwarding_create(modem, 0, + "atmodem", data->chat[AT_DEFAULT]); + ofono_call_settings_create(modem, 0, "atmodem", data->chat[AT_DEFAULT]); + ofono_netreg_create(modem, OFONO_VENDOR_MBM, + "atmodem", data->chat[AT_NET]); + ofono_call_meter_create(modem, 0, "atmodem", data->chat[AT_DEFAULT]); + ofono_call_barring_create(modem, 0, "atmodem", data->chat[AT_DEFAULT]); + ofono_ssn_create(modem, 0, "atmodem", data->chat[AT_DEFAULT]); + ofono_call_volume_create(modem, 0, "atmodem", data->chat[AT_DEFAULT]); + ofono_cbs_create(modem, 0, "atmodem", data->chat[AT_DEFAULT]); gprs = ofono_gprs_create(modem, OFONO_VENDOR_MBM, - "atmodem", data->chat); + "atmodem", data->chat[AT_GPRS]); + if (gprs) { for (i = 0; i < MAX_PDP_CONTEXTS; i++) { - gc = ofono_gprs_context_create( - modem, 0, "stemodem", data->chat); + gc = ofono_gprs_context_create(modem, 0, "stemodem", + data->chat[AT_GPRS]); if (gc == NULL) break; |