Commit 00bce3fb authored by Alain Michaud's avatar Alain Michaud Committed by Marcel Holtmann
Browse files

Bluetooth: Enable erroneous data reporting if WBS is supported



This change introduces a wide band speech setting which allows higher
level clients to query the local controller support for wide band speech
as well as set the setting state when the radio is powered off.
Internally, this setting controls if erroneous data reporting is enabled
on the controller.

Signed-off-by: default avatarAlain Michaud <alainm@chromium.org>
Signed-off-by: default avatarMarcel Holtmann <marcel@holtmann.org>
parent 55cee73e
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -3868,7 +3868,7 @@ static int btusb_probe(struct usb_interface *intf,
		data->isoc = NULL;

	if (id->driver_info & BTUSB_WIDEBAND_SPEECH)
		set_bit(HCI_QUIRK_WIDE_BAND_SPEECH_SUPPORTED, &hdev->quirks);
		set_bit(HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED, &hdev->quirks);

	if (id->driver_info & BTUSB_DIGIANSWER) {
		data->cmdreq_type = USB_TYPE_VENDOR;
+15 −1
Original line number Diff line number Diff line
@@ -213,7 +213,7 @@ enum {
	 *
	 * This quirk must be set before hci_register_dev is called.
	 */
	HCI_QUIRK_WIDE_BAND_SPEECH_SUPPORTED,
	HCI_QUIRK_WIDEBAND_SPEECH_SUPPORTED,
};

/* HCI device flags */
@@ -286,6 +286,7 @@ enum {
	HCI_FAST_CONNECTABLE,
	HCI_BREDR_ENABLED,
	HCI_LE_SCAN_INTERRUPTED,
	HCI_WIDEBAND_SPEECH_ENABLED,

	HCI_DUT_MODE,
	HCI_VENDOR_DIAG,
@@ -1095,6 +1096,19 @@ struct hci_rp_read_inq_rsp_tx_power {
	__s8     tx_power;
} __packed;

#define HCI_OP_READ_DEF_ERR_DATA_REPORTING	0x0c5a
	#define ERR_DATA_REPORTING_DISABLED	0x00
	#define ERR_DATA_REPORTING_ENABLED	0x01
struct hci_rp_read_def_err_data_reporting {
	__u8     status;
	__u8     err_data_reporting;
} __packed;

#define HCI_OP_WRITE_DEF_ERR_DATA_REPORTING	0x0c5b
struct hci_cp_write_def_err_data_reporting {
	__u8     err_data_reporting;
} __packed;

#define HCI_OP_SET_EVENT_MASK_PAGE_2	0x0c63

#define HCI_OP_READ_LOCATION_DATA	0x0c64
+1 −0
Original line number Diff line number Diff line
@@ -260,6 +260,7 @@ struct hci_dev {
	__u8		stored_num_keys;
	__u8		io_capability;
	__s8		inq_tx_power;
	__u8		err_data_reporting;
	__u16		page_scan_interval;
	__u16		page_scan_window;
	__u8		page_scan_type;
+3 −1
Original line number Diff line number Diff line
@@ -102,7 +102,7 @@ struct mgmt_rp_read_index_list {
#define MGMT_SETTING_CONFIGURATION	0x00004000
#define MGMT_SETTING_STATIC_ADDRESS	0x00008000
#define MGMT_SETTING_PHY_CONFIGURATION	0x00010000
#define MGMT_SETTING_WIDE_BAND_SPEECH	0x00020000
#define MGMT_SETTING_WIDEBAND_SPEECH	0x00020000

#define MGMT_OP_READ_INFO		0x0004
#define MGMT_READ_INFO_SIZE		0
@@ -672,6 +672,8 @@ struct mgmt_cp_set_blocked_keys {
} __packed;
#define MGMT_OP_SET_BLOCKED_KEYS_SIZE 2

#define MGMT_OP_SET_WIDEBAND_SPEECH	0x0047

#define MGMT_EV_CMD_COMPLETE		0x0001
struct mgmt_ev_cmd_complete {
	__le16	opcode;
+23 −0
Original line number Diff line number Diff line
@@ -603,6 +603,9 @@ static int hci_init3_req(struct hci_request *req, unsigned long opt)
	if (hdev->commands[8] & 0x01)
		hci_req_add(req, HCI_OP_READ_PAGE_SCAN_ACTIVITY, 0, NULL);

	if (hdev->commands[18] & 0x02)
		hci_req_add(req, HCI_OP_READ_DEF_ERR_DATA_REPORTING, 0, NULL);

	/* Some older Broadcom based Bluetooth 1.2 controllers do not
	 * support the Read Page Scan Type command. Check support for
	 * this command in the bit mask of supported commands.
@@ -838,6 +841,26 @@ static int hci_init4_req(struct hci_request *req, unsigned long opt)
			    sizeof(support), &support);
	}

	/* Set erroneous data reporting if supported to the wideband speech
	 * setting value
	 */
	if (hdev->commands[18] & 0x04) {
		bool enabled = hci_dev_test_flag(hdev,
						 HCI_WIDEBAND_SPEECH_ENABLED);

		if (enabled !=
		    (hdev->err_data_reporting == ERR_DATA_REPORTING_ENABLED)) {
			struct hci_cp_write_def_err_data_reporting cp;

			cp.err_data_reporting = enabled ?
						ERR_DATA_REPORTING_ENABLED :
						ERR_DATA_REPORTING_DISABLED;

			hci_req_add(req, HCI_OP_WRITE_DEF_ERR_DATA_REPORTING,
				    sizeof(cp), &cp);
		}
	}

	/* Set Suggested Default Data Length to maximum if supported */
	if (hdev->le_features[0] & HCI_LE_DATA_LEN_EXT) {
		struct hci_cp_le_write_def_data_len cp;
Loading