2022-02-09 13:55:47

by Joseph Hwang

[permalink] [raw]
Subject: [BlueZ PATCH v3 1/9] doc: Add Bluetooth quality report event

Add the Bluetooth quality report event in doc/mgmt-api.txt.

Signed-off-by: Joseph Hwang <[email protected]>
---

Changes in v3:
- Swap AOSP Bluetooth Quality Report Event and Intel Telemetry Event.
- Add 5 new patches (5/9 - 9/9) to enable the quality report
feature via MGMT_OP_SET_QUALITY_REPORT instead of through the
experimental features.

Changes in v2:
- This is a new patch for adding the event in doc/mgmt-api.txt

doc/mgmt-api.txt | 19 +++++++++++++++++++
1 file changed, 19 insertions(+)

diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt
index ebe56afa4..5a32091fa 100644
--- a/doc/mgmt-api.txt
+++ b/doc/mgmt-api.txt
@@ -4978,3 +4978,22 @@ Advertisement Monitor Device Lost Event
2 LE Random

This event will be sent to all management sockets.
+
+
+Bluetooth Quality Report Event
+==============================
+
+ Event code: 0x0031
+ Controller Index: <controller_id>
+ Event Parameters: Quality_Spec (1 Octet)
+ Report_Len (2 Octets)
+ Report (0-65535 Octets)
+
+ This event carries the Bluetooth quality report sent by the
+ controller.
+
+ Possible values for the Quality_Spec parameter:
+ 0 AOSP Bluetooth Quality Report Event
+ 1 Intel Telemetry Event
+
+ This event will be sent to all management sockets.
--
2.35.0.263.gb82422642f-goog



2022-02-09 13:55:57

by Joseph Hwang

[permalink] [raw]
Subject: [BlueZ PATCH v3 3/9] adapter: support AOSP MGMT_EV_QUALITY_REPORT

This patch supports a new MGMT event of AOSP bluetooth quality report.

Reviewed-by: Archie Pusaka <[email protected]>
Signed-off-by: Joseph Hwang <[email protected]>
---

(no changes since v2)

Changes in v2:
- The new structs and constants are moved to separate patches:
* doc: Add Bluetooth quality report event
* lib: Add structures and constants for quality report
- The btmon decoding patches, about 500 lines of code, are ready
and will be submitted immediately after these patches are accepted.
- Use util_debug instead of defining a new debug function.
- Remove the event printing function.
- The plan about the BQR events is to further expose them to other
daemons, e.g., an audio daemon to make some smart control, or
to an UI daemon to display alerts to users.

Makefile.am | 3 +-
src/adapter.c | 56 +++++++++++++++++++++++++++++
src/adapter.h | 2 ++
src/shared/aosp.c | 90 +++++++++++++++++++++++++++++++++++++++++++++++
src/shared/aosp.h | 58 ++++++++++++++++++++++++++++++
5 files changed, 208 insertions(+), 1 deletion(-)
create mode 100644 src/shared/aosp.c
create mode 100644 src/shared/aosp.h

diff --git a/Makefile.am b/Makefile.am
index e391d7ae8..baab40369 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -230,7 +230,8 @@ shared_sources = src/shared/io.h src/shared/timeout.h \
src/shared/gatt-db.h src/shared/gatt-db.c \
src/shared/gap.h src/shared/gap.c \
src/shared/log.h src/shared/log.c \
- src/shared/tty.h
+ src/shared/tty.h \
+ src/shared/aosp.h src/shared/aosp.c

if READLINE
shared_sources += src/shared/shell.c src/shared/shell.h
diff --git a/src/adapter.c b/src/adapter.c
index 9772e843a..58f8c0298 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -47,6 +47,7 @@
#include "src/shared/att.h"
#include "src/shared/gatt-db.h"
#include "src/shared/timeout.h"
+#include "src/shared/aosp.h"

#include "btio/btio.h"
#include "btd.h"
@@ -9312,6 +9313,28 @@ static void controller_resume_callback(uint16_t index, uint16_t length,
controller_resume_notify(adapter);
}

+static void quality_report_callback(uint16_t index, uint16_t length,
+ const void *param, void *user_data)
+{
+ const struct mgmt_ev_quality_report *ev = param;
+
+ if (!ev)
+ return;
+
+ if (length < sizeof(*ev)) {
+ error("MGMT_EV_QUALITY_REPORT event too small");
+ return;
+ }
+
+ if (ev->quality_spec == QUALITY_SPEC_AOSP_BQR) {
+ if (!process_aosp_quality_report(ev))
+ error("processing aosp quality report");
+ } else {
+ error("quality report spec %u not supported.",
+ ev->quality_spec);
+ }
+}
+
static void device_blocked_callback(uint16_t index, uint16_t length,
const void *param, void *user_data)
{
@@ -9727,6 +9750,19 @@ static void le_simult_central_peripheral_func(struct btd_adapter *adapter,
(void *)le_simult_central_peripheral_uuid.val);
}

+static bool is_exp_feature_uuid_the_same(const void *data,
+ const void *match_data)
+{
+ return memcmp(data, match_data,
+ sizeof(((struct mgmt_exp_uuid *)NULL)->val)) == 0;
+}
+
+bool is_quality_report_supported(struct btd_adapter *adapter)
+{
+ return queue_find(adapter->exps, is_exp_feature_uuid_the_same,
+ (void *)quality_report_uuid.val) != NULL;
+}
+
static void quality_report_func(struct btd_adapter *adapter, uint8_t action)
{
if (action)
@@ -9882,6 +9918,18 @@ static void read_exp_features(struct btd_adapter *adapter)
btd_error(adapter->dev_id, "Failed to read exp features info");
}

+static void quality_report_debug(const char *str, void *user_data)
+{
+ const char *prefix = user_data;
+
+ info("%s%s", prefix, str);
+}
+
+static void quality_set_debug(struct btd_adapter *adapter)
+{
+ aosp_set_debug(quality_report_debug, "quality: ");
+}
+
static void read_info_complete(uint8_t status, uint16_t length,
const void *param, void *user_data)
{
@@ -10110,6 +10158,11 @@ static void read_info_complete(uint8_t status, uint16_t length,
controller_resume_callback,
adapter, NULL);

+ mgmt_register(adapter->mgmt, MGMT_EV_QUALITY_REPORT,
+ adapter->dev_id,
+ quality_report_callback,
+ adapter, NULL);
+
set_dev_class(adapter);

set_name(adapter, btd_adapter_get_name(adapter));
@@ -10137,6 +10190,9 @@ static void read_info_complete(uint8_t status, uint16_t length,
if (btd_adapter_get_powered(adapter))
adapter_start(adapter);

+ if (is_quality_report_supported(adapter) && getenv("QUALITY_DEBUG"))
+ quality_set_debug(adapter);
+
return;

failed:
diff --git a/src/adapter.h b/src/adapter.h
index 35deb1d11..c199e358a 100644
--- a/src/adapter.h
+++ b/src/adapter.h
@@ -266,6 +266,8 @@ enum kernel_features {

bool btd_has_kernel_features(uint32_t feature);

+bool is_quality_report_supported(struct btd_adapter *adapter);
+
bool btd_adapter_set_allowed_uuids(struct btd_adapter *adapter,
struct queue *uuids);
bool btd_adapter_is_uuid_allowed(struct btd_adapter *adapter,
diff --git a/src/shared/aosp.c b/src/shared/aosp.c
new file mode 100644
index 000000000..838babea4
--- /dev/null
+++ b/src/shared/aosp.c
@@ -0,0 +1,90 @@
+// SPDX-License-Identifier: LGPL-2.1-or-later
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2021 Google LLC
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ */
+
+#include <stddef.h>
+#include <stdio.h>
+#include <stdint.h>
+#include <string.h>
+
+#include "lib/bluetooth.h"
+#include "lib/mgmt.h"
+
+#include "src/shared/aosp.h"
+#include "src/shared/util.h"
+
+static struct {
+ aosp_debug_func_t callback;
+ void *data;
+} aosp_debug;
+
+void aosp_set_debug(aosp_debug_func_t callback, void *user_data)
+{
+ aosp_debug.callback = callback;
+ aosp_debug.data = user_data;
+}
+
+bool process_aosp_quality_report(const struct mgmt_ev_quality_report *ev)
+{
+ const struct aosp_bqr *edata = (struct aosp_bqr *)ev->data;
+ struct aosp_bqr bqr;
+
+ if (edata->subevent_code != 0x58) {
+ util_debug(aosp_debug.callback, aosp_debug.data,
+ "error: %u not AOSP Bluetooth quality report subevent",
+ edata->subevent_code);
+ return false;
+ }
+
+ if (ev->data_len < sizeof(struct aosp_bqr)) {
+ util_debug(aosp_debug.callback, aosp_debug.data,
+ "error: AOSP report size %u too small (expect >= %lu).",
+ ev->data_len, sizeof(struct aosp_bqr));
+ return false;
+ }
+
+ /* Ignore the Vendor Specific Parameter (VSP) field for now
+ * due to the lack of standard way of reading it.
+ */
+ bqr.quality_report_id = edata->quality_report_id;
+ bqr.packet_type = edata->packet_type;
+ bqr.conn_handle = btohs(edata->conn_handle);
+ bqr.conn_role = edata->conn_role;
+ bqr.tx_power_level = edata->tx_power_level;
+ bqr.rssi = edata->rssi;
+ bqr.snr = edata->snr;
+ bqr.unused_afh_channel_count = edata->unused_afh_channel_count;
+ bqr.afh_select_unideal_channel_count =
+ edata->afh_select_unideal_channel_count;
+ bqr.lsto = btohs(edata->lsto);
+ bqr.conn_piconet_clock = btohl(edata->conn_piconet_clock);
+ bqr.retransmission_count = btohl(edata->retransmission_count);
+ bqr.no_rx_count = btohl(edata->no_rx_count);
+ bqr.nak_count = btohl(edata->nak_count);
+ bqr.last_tx_ack_timestamp = btohl(edata->last_tx_ack_timestamp);
+ bqr.flow_off_count = btohl(edata->flow_off_count);
+ bqr.last_flow_on_timestamp = btohl(edata->last_flow_on_timestamp);
+ bqr.buffer_overflow_bytes = btohl(edata->buffer_overflow_bytes);
+ bqr.buffer_underflow_bytes = btohl(edata->buffer_underflow_bytes);
+
+ util_debug(aosp_debug.callback, aosp_debug.data,
+ "AOSP report of connection hanle %u received", bqr.conn_handle);
+
+ return true;
+}
diff --git a/src/shared/aosp.h b/src/shared/aosp.h
new file mode 100644
index 000000000..b58aa5e3a
--- /dev/null
+++ b/src/shared/aosp.h
@@ -0,0 +1,58 @@
+/* SPDX-License-Identifier: LGPL-2.1-or-later */
+/*
+ *
+ * BlueZ - Bluetooth protocol stack for Linux
+ *
+ * Copyright (C) 2021 Google LLC
+ *
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ */
+
+#ifndef __AOSP_H
+#define __AOSP_H
+
+#include <stdbool.h>
+
+struct mgmt_ev_quality_report;
+
+struct aosp_bqr {
+ uint8_t subevent_code;
+ uint8_t quality_report_id;
+ uint8_t packet_type;
+ uint16_t conn_handle;
+ uint8_t conn_role;
+ int8_t tx_power_level; /* -30 to 20 dbm */
+ int8_t rssi; /* -127 to 20 dbm */
+ uint8_t snr; /* db */
+ uint8_t unused_afh_channel_count;
+ uint8_t afh_select_unideal_channel_count;
+ uint16_t lsto;
+ uint32_t conn_piconet_clock;
+ uint32_t retransmission_count;
+ uint32_t no_rx_count;
+ uint32_t nak_count;
+ uint32_t last_tx_ack_timestamp;
+ uint32_t flow_off_count;
+ uint32_t last_flow_on_timestamp;
+ uint32_t buffer_overflow_bytes;
+ uint32_t buffer_underflow_bytes;
+
+ uint8_t vsp[0]; /* Vendor Specific Parameter */
+} __packed;
+
+typedef void (*aosp_debug_func_t)(const char *str, void *user_data);
+void aosp_set_debug(aosp_debug_func_t callback, void *user_data);
+
+bool process_aosp_quality_report(const struct mgmt_ev_quality_report *ev);
+
+#endif /* __AOSP_H */
--
2.35.0.263.gb82422642f-goog


2022-02-09 13:55:58

by Joseph Hwang

[permalink] [raw]
Subject: [BlueZ PATCH v3 5/9] doc: Introduce the Set Quality Report Command

Add the Set Quality Report Command in doc/mgmt-api.txt.

Signed-off-by: Joseph Hwang <[email protected]>
---

Changes in v3:
- This is a new patch that introduces the Set Quality Report
Command.

doc/mgmt-api.txt | 33 +++++++++++++++++++++++++++++++++
1 file changed, 33 insertions(+)

diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt
index 5a32091fa..4ac84d41b 100644
--- a/doc/mgmt-api.txt
+++ b/doc/mgmt-api.txt
@@ -332,6 +332,7 @@ Read Controller Information Command
15 Static Address
16 PHY Configuration
17 Wideband Speech
+ 18 Quality Report

This command generates a Command Complete event on success or
a Command Status event on failure.
@@ -2924,6 +2925,7 @@ Read Extended Controller Information Command
15 Static Address
16 PHY Configuration
17 Wideband Speech
+ 18 Quality Report

The EIR_Data field contains information about class of device,
local name and other values. Not all of them might be present. For
@@ -3858,6 +3860,37 @@ Add Advertisement Patterns Monitor With RSSI Threshold Command
Invalid Parameters


+Set Quality Report Command
+==========================
+
+ Command Code: 0x0057
+ Controller Index: <controller id>
+ Command Parameters: Action (1 Octet)
+ Return Parameters:
+
+ This command is used to enable and disable the controller's quality
+ report feature.
+
+ This command requires to use a valid controller index. Otherwise,
+ an "invalid index" status will be returned.
+
+ The parameter "action" can be either 0 to disable the feature or
+ 1 to enable the feature. For any values other than 0 and 1, an
+ "invalid parameters" status will be returned.
+
+ If the driver does not indicate that the controller supports the
+ quality report feature, a "not supported" status will be returned.
+
+ The command is sent to the controller to enable/disable the quality
+ report feature. If the controller failed to execute the action, a
+ "failed" status will be returned.
+
+ Possible errors: Failed
+ Invalid Index
+ Invalid Parameters
+ Not Supported
+
+
Command Complete Event
======================

--
2.35.0.263.gb82422642f-goog


2022-02-09 13:56:02

by Joseph Hwang

[permalink] [raw]
Subject: [BlueZ PATCH v3 7/9] adapter: enable quality report via MGMT_OP_SET_QUALITY_REPORT

The quality report feature is now enabled through
MGMT_OP_SET_QUALITY_REPORT instead of through the experimental
features.

Signed-off-by: Joseph Hwang <[email protected]>
---

Changes in v3:
- This is a new patch that enables the quality report feature via
MGMT_OP_SET_QUALITY_REPORT.

src/adapter.c | 32 +++++---------------------------
1 file changed, 5 insertions(+), 27 deletions(-)

diff --git a/src/adapter.c b/src/adapter.c
index 9816235ec..9cb684345 100644
--- a/src/adapter.c
+++ b/src/adapter.c
@@ -122,13 +122,6 @@ static const struct mgmt_exp_uuid le_simult_central_peripheral_uuid = {
.str = "671b10b5-42c0-4696-9227-eb28d1b049d6"
};

-/* 330859bc-7506-492d-9370-9a6f0614037f */
-static const struct mgmt_exp_uuid quality_report_uuid = {
- .val = { 0x7f, 0x03, 0x14, 0x06, 0x6f, 0x9a, 0x70, 0x93,
- 0x2d, 0x49, 0x06, 0x75, 0xbc, 0x59, 0x08, 0x33 },
- .str = "330859bc-7506-492d-9370-9a6f0614037f"
-};
-
/* 15c0a148-c273-11ea-b3de-0242ac130004 */
static const struct mgmt_exp_uuid rpa_resolution_uuid = {
.val = { 0x04, 0x00, 0x13, 0xac, 0x42, 0x02, 0xde, 0xb3,
@@ -9754,25 +9747,6 @@ static void le_simult_central_peripheral_func(struct btd_adapter *adapter,
(void *)le_simult_central_peripheral_uuid.val);
}

-static bool is_exp_feature_uuid_the_same(const void *data,
- const void *match_data)
-{
- return memcmp(data, match_data,
- sizeof(((struct mgmt_exp_uuid *)NULL)->val)) == 0;
-}
-
-bool is_quality_report_supported(struct btd_adapter *adapter)
-{
- return queue_find(adapter->exps, is_exp_feature_uuid_the_same,
- (void *)quality_report_uuid.val) != NULL;
-}
-
-static void quality_report_func(struct btd_adapter *adapter, uint8_t action)
-{
- if (action)
- queue_push_tail(adapter->exps, (void *)quality_report_uuid.val);
-}
-
static void set_rpa_resolution_complete(uint8_t status, uint16_t len,
const void *param, void *user_data)
{
@@ -9848,7 +9822,6 @@ static const struct exp_feat {
EXP_FEAT(&debug_uuid, exp_debug_func),
EXP_FEAT(&le_simult_central_peripheral_uuid,
le_simult_central_peripheral_func),
- EXP_FEAT(&quality_report_uuid, quality_report_func),
EXP_FEAT(&rpa_resolution_uuid, rpa_resolution_func),
EXP_FEAT(&codec_offload_uuid, codec_offload_func),
};
@@ -9922,6 +9895,11 @@ static void read_exp_features(struct btd_adapter *adapter)
btd_error(adapter->dev_id, "Failed to read exp features info");
}

+bool is_quality_report_supported(struct btd_adapter *adapter)
+{
+ return !!(adapter->supported_settings & MGMT_SETTING_QUALITY_REPORT);
+}
+
static void quality_report_debug(const char *str, void *user_data)
{
const char *prefix = user_data;
--
2.35.0.263.gb82422642f-goog


2022-02-09 17:08:42

by bluez.test.bot

[permalink] [raw]
Subject: RE: [BlueZ,v3,1/9] doc: Add Bluetooth quality report event

This is automated email and please do not reply to this email!

Dear submitter,

Thank you for submitting the patches to the linux bluetooth mailing list.
This is a CI test results with your patch series:
PW Link:https://patchwork.kernel.org/project/bluetooth/list/?series=612544

---Test result---

Test Summary:
CheckPatch PASS 13.81 seconds
GitLint PASS 9.23 seconds
Prep - Setup ELL PASS 48.47 seconds
Build - Prep PASS 0.90 seconds
Build - Configure PASS 9.31 seconds
Build - Make PASS 1511.45 seconds
Make Check PASS 11.25 seconds
Make Check w/Valgrind PASS 447.60 seconds
Make Distcheck PASS 231.77 seconds
Build w/ext ELL - Configure PASS 8.17 seconds
Build w/ext ELL - Make PASS 1430.29 seconds
Incremental Build with patchesPASS 13382.32 seconds



---
Regards,
Linux Bluetooth

2022-02-09 23:24:11

by Marcel Holtmann

[permalink] [raw]
Subject: Re: [BlueZ PATCH v3 1/9] doc: Add Bluetooth quality report event

Hi Joseph,

> Add the Bluetooth quality report event in doc/mgmt-api.txt.
>
> Signed-off-by: Joseph Hwang <[email protected]>
> ---
>
> Changes in v3:
> - Swap AOSP Bluetooth Quality Report Event and Intel Telemetry Event.
> - Add 5 new patches (5/9 - 9/9) to enable the quality report
> feature via MGMT_OP_SET_QUALITY_REPORT instead of through the
> experimental features.
>
> Changes in v2:
> - This is a new patch for adding the event in doc/mgmt-api.txt
>
> doc/mgmt-api.txt | 19 +++++++++++++++++++
> 1 file changed, 19 insertions(+)
>
> diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt
> index ebe56afa4..5a32091fa 100644
> --- a/doc/mgmt-api.txt
> +++ b/doc/mgmt-api.txt
> @@ -4978,3 +4978,22 @@ Advertisement Monitor Device Lost Event
> 2 LE Random
>
> This event will be sent to all management sockets.
> +
> +
> +Bluetooth Quality Report Event
> +==============================

so this is on me since I never realized this. You stuck the Bluetooth word in front of the event name since that is also what AOSP calls it. However in mgmt-api.txt we have never added Bluetooth to command or event naming since that is obvious. So lets shorten this and just use “Quality Report Event”.

> +
> + Event code: 0x0031
> + Controller Index: <controller_id>
> + Event Parameters: Quality_Spec (1 Octet)
> + Report_Len (2 Octets)
> + Report (0-65535 Octets)
> +
> + This event carries the Bluetooth quality report sent by the
> + controller.
> +
> + Possible values for the Quality_Spec parameter:
> + 0 AOSP Bluetooth Quality Report Event
> + 1 Intel Telemetry Event
> +
> + This event will be sent to all management sockets.
> —

In addition, I prefer to have both command and event changes in a single patch.

Regards

Marcel




2022-02-09 23:34:54

by Marcel Holtmann

[permalink] [raw]
Subject: Re: [BlueZ PATCH v3 5/9] doc: Introduce the Set Quality Report Command

Hi Joseph,

> Add the Set Quality Report Command in doc/mgmt-api.txt.
>
> Signed-off-by: Joseph Hwang <[email protected]>
> ---
>
> Changes in v3:
> - This is a new patch that introduces the Set Quality Report
> Command.
>
> doc/mgmt-api.txt | 33 +++++++++++++++++++++++++++++++++
> 1 file changed, 33 insertions(+)
>
> diff --git a/doc/mgmt-api.txt b/doc/mgmt-api.txt
> index 5a32091fa..4ac84d41b 100644
> --- a/doc/mgmt-api.txt
> +++ b/doc/mgmt-api.txt
> @@ -332,6 +332,7 @@ Read Controller Information Command
> 15 Static Address
> 16 PHY Configuration
> 17 Wideband Speech
> + 18 Quality Report
>
> This command generates a Command Complete event on success or
> a Command Status event on failure.
> @@ -2924,6 +2925,7 @@ Read Extended Controller Information Command
> 15 Static Address
> 16 PHY Configuration
> 17 Wideband Speech
> + 18 Quality Report
>
> The EIR_Data field contains information about class of device,
> local name and other values. Not all of them might be present. For
> @@ -3858,6 +3860,37 @@ Add Advertisement Patterns Monitor With RSSI Threshold Command
> Invalid Parameters
>
>
> +Set Quality Report Command
> +==========================
> +
> + Command Code: 0x0057
> + Controller Index: <controller id>
> + Command Parameters: Action (1 Octet)

Quality_Report (1 Octet)

> + Return Parameters:

Current_Settings (4 Octets)

> +
> + This command is used to enable and disable the controller's quality
> + report feature.
> +
> + This command requires to use a valid controller index. Otherwise,
> + an "invalid index" status will be returned.
> +
> + The parameter "action" can be either 0 to disable the feature or
> + 1 to enable the feature. For any values other than 0 and 1, an
> + "invalid parameters" status will be returned.
> +
> + If the driver does not indicate that the controller supports the
> + quality report feature, a "not supported" status will be returned.
> +
> + The command is sent to the controller to enable/disable the quality
> + report feature. If the controller failed to execute the action, a
> + "failed" status will be returned.
> +
> + Possible errors: Failed
> + Invalid Index
> + Invalid Parameters
> + Not Supported
> +
> +

You might want to have the description a bit more in line with the others like Set Wideband Speech etc.

Regards

Marcel