diff options
Diffstat (limited to 'drivers/bluetooth/btusb.c')
| -rw-r--r-- | drivers/bluetooth/btusb.c | 12 | 
1 files changed, 11 insertions, 1 deletions
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c index c2de8951e3f..91d13a9e8c6 100644 --- a/drivers/bluetooth/btusb.c +++ b/drivers/bluetooth/btusb.c @@ -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;  |