From f3904a8f1c2cae24bb19099143b2ea8e7511a7dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20Danis?= Date: Tue, 4 Nov 2025 10:28:07 +0100 Subject: [PATCH] shared/hfp: Add NREC disable command --- src/shared/hfp.c | 42 +++++++++++++++++++++++++++++++++++++++--- unit/test-hfp.c | 1 + 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/shared/hfp.c b/src/shared/hfp.c index 2342c24df..c2028ac2b 100644 --- a/src/shared/hfp.c +++ b/src/shared/hfp.c @@ -30,7 +30,11 @@ hfp_debug(_hfp->debug_callback, _hfp->debug_data, "%s:%s() " fmt, \ __FILE__, __func__, ## arg) -#define HFP_HF_FEATURES (HFP_HF_FEAT_CLIP | HFP_HF_FEAT_ESCO_S4_T2) +#define HFP_HF_FEATURES ( \ + HFP_HF_FEAT_ECNR | \ + HFP_HF_FEAT_CLIP | \ + HFP_HF_FEAT_ESCO_S4_T2 \ +) struct hfp_gw { int ref_count; @@ -1996,7 +2000,7 @@ static void clip_cb(struct hfp_context *context, void *user_data) hfp->callbacks_data); } -static void cmee_resp(enum hfp_result result, enum hfp_error cme_err, +static void nrec_resp(enum hfp_result result, enum hfp_error cme_err, void *user_data) { struct hfp_hf *hfp = user_data; @@ -2004,7 +2008,7 @@ static void cmee_resp(enum hfp_result result, enum hfp_error cme_err, DBG(hfp, ""); if (result != HFP_RESULT_OK) { - DBG(hfp, "hf: CMEE error: %d", result); + DBG(hfp, "hf: NREC error: %d", result); goto failed; } @@ -2020,6 +2024,38 @@ failed: hfp->callbacks_data); } +static void cmee_resp(enum hfp_result result, enum hfp_error cme_err, + void *user_data) +{ + struct hfp_hf *hfp = user_data; + + DBG(hfp, ""); + + if (result != HFP_RESULT_OK) { + DBG(hfp, "hf: CMEE error: %d", result); + goto failed; + } + + if (!(hfp->features & HFP_AG_FEAT_ECNR)) { + /* Jump to next setup state */ + nrec_resp(HFP_RESULT_OK, cme_err, user_data); + return; + } + + if (!hfp_hf_send_command(hfp, nrec_resp, hfp, "AT+NREC=0")) { + DBG(hfp, "hf: Could not send AT+NREC=0"); + result = HFP_RESULT_ERROR; + goto failed; + } + + return; + +failed: + if (hfp->callbacks->session_ready) + hfp->callbacks->session_ready(result, cme_err, + hfp->callbacks_data); +} + static void clip_resp(enum hfp_result result, enum hfp_error cme_err, void *user_data) { diff --git a/unit/test-hfp.c b/unit/test-hfp.c index fc9fb1865..94553d62c 100644 --- a/unit/test-hfp.c +++ b/unit/test-hfp.c @@ -763,6 +763,7 @@ static void test_hf_robustness(gconstpointer data) '0', ',', '\"', 'T', 'E', 'S', 'T', '\"', '\r', '\n'), \ frg_pdu('\r', '\n', 'O', 'K', '\r', '\n'), \ raw_pdu('\r', '\n', 'O', 'K', '\r', '\n'), \ + raw_pdu('\r', '\n', 'O', 'K', '\r', '\n'), \ raw_pdu('\r', '\n', 'O', 'K', '\r', '\n') static void hf_cmd_complete(enum hfp_result res, enum hfp_error cme_err, -- 2.47.3