diff options
Diffstat (limited to 'drivers/bluetooth/btusb.c')
-rw-r--r-- | drivers/bluetooth/btusb.c | 16 |
1 files changed, 14 insertions, 2 deletions
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index 461c68bc4dd7..c9463af8e564 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c | |||
@@ -143,6 +143,9 @@ static struct usb_device_id blacklist_table[] = { | |||
143 | /* Atheros AR5BBU12 with sflash firmware */ | 143 | /* Atheros AR5BBU12 with sflash firmware */ |
144 | { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, | 144 | { USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE }, |
145 | 145 | ||
146 | /* Atheros AR5BBU12 with sflash firmware */ | ||
147 | { USB_DEVICE(0x0489, 0xe03c), .driver_info = BTUSB_ATH3012 }, | ||
148 | |||
146 | /* Broadcom BCM2035 */ | 149 | /* Broadcom BCM2035 */ |
147 | { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU }, | 150 | { USB_DEVICE(0x0a5c, 0x2035), .driver_info = BTUSB_WRONG_SCO_MTU }, |
148 | { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU }, | 151 | { USB_DEVICE(0x0a5c, 0x200a), .driver_info = BTUSB_WRONG_SCO_MTU }, |
@@ -855,6 +858,7 @@ static void btusb_work(struct work_struct *work) | |||
855 | { | 858 | { |
856 | struct btusb_data *data = container_of(work, struct btusb_data, work); | 859 | struct btusb_data *data = container_of(work, struct btusb_data, work); |
857 | struct hci_dev *hdev = data->hdev; | 860 | struct hci_dev *hdev = data->hdev; |
861 | int new_alts; | ||
858 | int err; | 862 | int err; |
859 | 863 | ||
860 | if (hdev->conn_hash.sco_num > 0) { | 864 | if (hdev->conn_hash.sco_num > 0) { |
@@ -868,11 +872,19 @@ static void btusb_work(struct work_struct *work) | |||
868 | 872 | ||
869 | set_bit(BTUSB_DID_ISO_RESUME, &data->flags); | 873 | set_bit(BTUSB_DID_ISO_RESUME, &data->flags); |
870 | } | 874 | } |
871 | if (data->isoc_altsetting != 2) { | 875 | |
876 | if (hdev->voice_setting & 0x0020) { | ||
877 | static const int alts[3] = { 2, 4, 5 }; | ||
878 | new_alts = alts[hdev->conn_hash.sco_num - 1]; | ||
879 | } else { | ||
880 | new_alts = hdev->conn_hash.sco_num; | ||
881 | } | ||
882 | |||
883 | if (data->isoc_altsetting != new_alts) { | ||
872 | clear_bit(BTUSB_ISOC_RUNNING, &data->flags); | 884 | clear_bit(BTUSB_ISOC_RUNNING, &data->flags); |
873 | usb_kill_anchored_urbs(&data->isoc_anchor); | 885 | usb_kill_anchored_urbs(&data->isoc_anchor); |
874 | 886 | ||
875 | if (__set_isoc_interface(hdev, 2) < 0) | 887 | if (__set_isoc_interface(hdev, new_alts) < 0) |
876 | return; | 888 | return; |
877 | } | 889 | } |
878 | 890 | ||