summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/hfpmodem/slc.c29
1 files changed, 29 insertions, 0 deletions
diff --git a/drivers/hfpmodem/slc.c b/drivers/hfpmodem/slc.c
index 4028479d..646befa8 100644
--- a/drivers/hfpmodem/slc.c
+++ b/drivers/hfpmodem/slc.c
@@ -67,6 +67,11 @@ void hfp_slc_info_init(struct hfp_slc_info *info, guint16 version)
info->hf_features |= HFP_HF_FEATURE_ENHANCED_CALL_STATUS;
info->hf_features |= HFP_HF_FEATURE_ENHANCED_CALL_CONTROL;
+ if (version < HFP_VERSION_1_6)
+ goto done;
+
+ info->hf_features |= HFP_HF_FEATURE_CODEC_NEGOTIATION;
+
done:
memset(info->cind_val, 0, sizeof(info->cind_val));
memset(info->cind_pos, 0, sizeof(info->cind_pos));
@@ -266,6 +271,21 @@ error:
slc_failed(sed);
}
+static void bac_cb(gboolean ok, GAtResult *result, gpointer user_data)
+{
+ struct slc_establish_data *sed = user_data;
+ struct hfp_slc_info *info = sed->info;
+
+ if (!ok) {
+ slc_failed(sed);
+ return;
+ }
+
+ slc_establish_data_ref(sed);
+ g_at_chat_send(info->chat, "AT+CIND=?", cind_prefix,
+ cind_cb, sed, slc_establish_data_unref);
+}
+
static void brsf_cb(gboolean ok, GAtResult *result, gpointer user_data)
{
struct slc_establish_data *sed = user_data;
@@ -282,6 +302,15 @@ static void brsf_cb(gboolean ok, GAtResult *result, gpointer user_data)
g_at_result_iter_next_number(&iter, (gint *)&info->ag_features);
+ if (info->ag_features & HFP_AG_FEATURE_CODEC_NEGOTIATION &&
+ info->hf_features & HFP_HF_FEATURE_CODEC_NEGOTIATION) {
+
+ slc_establish_data_ref(sed);
+ g_at_chat_send(info->chat, "AT+BAC=1", NULL, bac_cb, sed,
+ slc_establish_data_unref);
+ return;
+ }
+
slc_establish_data_ref(sed);
g_at_chat_send(info->chat, "AT+CIND=?", cind_prefix,
cind_cb, sed, slc_establish_data_unref);