|
@@ -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;
|
|
|
}
|
|
|
|