提交 f4001d28 编写于 作者: M Mikel Astiz 提交者: 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: NMikel Astiz <mikel.astiz.oss@gmail.com>
Acked-by: NMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: NGustavo Padovan <gustavo@padovan.org>
上级 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% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册