Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f4001d28 authored by Mikel Astiz's avatar Mikel Astiz Committed by Gustavo Padovan
Browse files

Bluetooth: btusb: Dynamic alternate setting



The alternate setting must be dynamically set according to the number of
active SCO links, and the bit depth of the audio. The possible values
for the alternate setting are described in the Bluetooth Core
Specification, Volume 4, Part B, section 2.1.1.

Signed-off-by: default avatarMikel Astiz <mikel.astiz.oss@gmail.com>
Acked-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarGustavo Padovan <gustavo@padovan.org>
parent 2d8b3a11
Loading
Loading
Loading
Loading
+11 −2
Original line number Diff line number Diff line
@@ -855,6 +855,7 @@ static void btusb_work(struct work_struct *work)
{
	struct btusb_data *data = container_of(work, struct btusb_data, work);
	struct hci_dev *hdev = data->hdev;
	int new_alts;
	int err;

	if (hdev->conn_hash.sco_num > 0) {
@@ -868,11 +869,19 @@ static void btusb_work(struct work_struct *work)

			set_bit(BTUSB_DID_ISO_RESUME, &data->flags);
		}
		if (data->isoc_altsetting != 2) {

		if (hdev->voice_setting & 0x0020) {
			static const int alts[3] = { 2, 4, 5 };
			new_alts = alts[hdev->conn_hash.sco_num - 1];
		} else {
			new_alts = hdev->conn_hash.sco_num;
		}

		if (data->isoc_altsetting != new_alts) {
			clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
			usb_kill_anchored_urbs(&data->isoc_anchor);

			if (__set_isoc_interface(hdev, 2) < 0)
			if (__set_isoc_interface(hdev, new_alts) < 0)
				return;
		}