[PATCH v1 3/3] bluetooth: Enable erroneous data reporting if wbs is supported

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This change will enable erroneous data reporting if wide band speech is
supported by the controller as indicated by the
HCI_QUIRK_WIDE_BAND_SPEECH_SUPPORTED quirk.

Signed-off-by: Alain Michaud <alainm@xxxxxxxxxxxx>
---

 include/net/bluetooth/hci.h |  7 +++++++
 net/bluetooth/hci_core.c    | 33 +++++++++++++++++++++++++++++++++
 2 files changed, 40 insertions(+)

diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
index b214c4358d1c..807fd40bb358 100644
--- a/include/net/bluetooth/hci.h
+++ b/include/net/bluetooth/hci.h
@@ -1095,6 +1095,13 @@ struct hci_rp_read_inq_rsp_tx_power {
 	__s8     tx_power;
 } __packed;
 
+#define HCI_OP_WRITE_DEFAULT_ERRONEOUS_DATA_REPORTING	0x0c5b
+	#define ERRONEOUS_DATA_REPORTING_DISABLED	0x00
+	#define ERRONEOUS_DATA_REPORTING_ENABLED	0x01
+struct hci_cp_write_default_erroneous_data_reporting {
+	__u8     erroneous_data_reporting;
+} __packed;
+
 #define HCI_OP_SET_EVENT_MASK_PAGE_2	0x0c63
 
 #define HCI_OP_READ_LOCATION_DATA	0x0c64
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 1ca7508b6ca7..19afb85ad399 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -1382,6 +1382,29 @@ static void hci_dev_get_bd_addr_from_property(struct hci_dev *hdev)
 	bacpy(&hdev->public_addr, &ba);
 }
 
+static int hci_write_default_erroneous_data_req(struct hci_request *req,
+						unsigned long opt)
+{
+	struct hci_cp_write_default_erroneous_data_reporting cp = {};
+
+	cp.erroneous_data_reporting = (__u8)opt;
+	hci_req_add(req, HCI_OP_WRITE_DEFAULT_ERRONEOUS_DATA_REPORTING,
+		    sizeof(cp), &cp);
+	return 0;
+}
+
+static void hci_write_default_erroneous_data(struct hci_dev *hdev,
+					     __u8 erroneous_data_reporting)
+{
+	int err = __hci_req_sync(hdev,
+				 hci_write_default_erroneous_data_req,
+				 erroneous_data_reporting, HCI_CMD_TIMEOUT,
+				 NULL);
+	if (err) {
+		BT_ERR("HCI_OP_WRITE_DEFAULT_ERRONEOUS_DATA_REPORTING failed");
+	}
+}
+
 static int hci_dev_do_open(struct hci_dev *hdev)
 {
 	int ret = 0;
@@ -1547,6 +1570,16 @@ static int hci_dev_do_open(struct hci_dev *hdev)
 		set_bit(HCI_UP, &hdev->flags);
 		hci_sock_dev_event(hdev, HCI_DEV_UP);
 		hci_leds_update_powered(hdev, true);
+
+		/* If the controller supports wide_band_speech, enable erroneous
+		 * data reporting.
+		 */
+		if (test_bit(HCI_QUIRK_WIDE_BAND_SPEECH_SUPPORTED,
+			     &hdev->quirks)) {
+			hci_write_default_erroneous_data(hdev,
+					      ERRONEOUS_DATA_REPORTING_ENABLED);
+		}
+
 		if (!hci_dev_test_flag(hdev, HCI_SETUP) &&
 		    !hci_dev_test_flag(hdev, HCI_CONFIG) &&
 		    !hci_dev_test_flag(hdev, HCI_UNCONFIGURED) &&
-- 
2.25.1.481.gfbce0eb801-goog




[Index of Archives]     [Bluez Devel]     [Linux Wireless Networking]     [Linux Wireless Personal Area Networking]     [Linux ATH6KL]     [Linux USB Devel]     [Linux Media Drivers]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Big List of Linux Books]

  Powered by Linux