|
@@ -54,6 +54,7 @@ static struct usb_driver btusb_driver;
|
|
|
#define BTUSB_BCM92035 0x10
|
|
|
#define BTUSB_BROKEN_ISOC 0x20
|
|
|
#define BTUSB_WRONG_SCO_MTU 0x40
|
|
|
+#define BTUSB_ATH3012 0x80
|
|
|
|
|
|
static struct usb_device_id btusb_table[] = {
|
|
|
/* Generic Bluetooth USB device */
|
|
@@ -110,7 +111,7 @@ static struct usb_device_id blacklist_table[] = {
|
|
|
{ USB_DEVICE(0x03f0, 0x311d), .driver_info = BTUSB_IGNORE },
|
|
|
|
|
|
/* Atheros 3012 with sflash firmware */
|
|
|
- { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_IGNORE },
|
|
|
+ { USB_DEVICE(0x0cf3, 0x3004), .driver_info = BTUSB_ATH3012 },
|
|
|
|
|
|
/* Atheros AR5BBU12 with sflash firmware */
|
|
|
{ USB_DEVICE(0x0489, 0xe02c), .driver_info = BTUSB_IGNORE },
|
|
@@ -914,6 +915,15 @@ static int btusb_probe(struct usb_interface *intf,
|
|
|
if (ignore_sniffer && id->driver_info & BTUSB_SNIFFER)
|
|
|
return -ENODEV;
|
|
|
|
|
|
+ if (id->driver_info & BTUSB_ATH3012) {
|
|
|
+ struct usb_device *udev = interface_to_usbdev(intf);
|
|
|
+
|
|
|
+ /* Old firmware would otherwise let ath3k driver load
|
|
|
+ * patch and sysconfig files */
|
|
|
+ if (le16_to_cpu(udev->descriptor.bcdDevice) <= 0x0001)
|
|
|
+ return -ENODEV;
|
|
|
+ }
|
|
|
+
|
|
|
data = kzalloc(sizeof(*data), GFP_KERNEL);
|
|
|
if (!data)
|
|
|
return -ENOMEM;
|