forked from Minki/linux
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: Mikel Astiz <mikel.astiz.oss@gmail.com> Acked-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Gustavo Padovan <gustavo@padovan.org>
This commit is contained in:
parent
2d8b3a1162
commit
f4001d2846
@ -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)
|
|||||||
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user