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

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
...@@ -855,6 +855,7 @@ static void btusb_work(struct work_struct *work) ...@@ -855,6 +855,7 @@ static void btusb_work(struct work_struct *work)
{ {
struct btusb_data *data = container_of(work, struct btusb_data, work); struct btusb_data *data = container_of(work, struct btusb_data, work);
struct hci_dev *hdev = data->hdev; struct hci_dev *hdev = data->hdev;
int new_alts;
int err; int err;
if (hdev->conn_hash.sco_num > 0) { if (hdev->conn_hash.sco_num > 0) {
...@@ -868,11 +869,19 @@ static void btusb_work(struct work_struct *work) ...@@ -868,11 +869,19 @@ static void btusb_work(struct work_struct *work)
set_bit(BTUSB_DID_ISO_RESUME, &data->flags); 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); clear_bit(BTUSB_ISOC_RUNNING, &data->flags);
usb_kill_anchored_urbs(&data->isoc_anchor); usb_kill_anchored_urbs(&data->isoc_anchor);
if (__set_isoc_interface(hdev, 2) < 0) if (__set_isoc_interface(hdev, new_alts) < 0)
return; return;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment