]> git.kernelconcepts.de Git - karo-tx-linux.git/commitdiff
Bluetooth: Add Atheros AR3012 one PID/VID supported
authorSteven.Li <Steven.Li@Atheros.com>
Fri, 1 Jul 2011 06:02:36 +0000 (14:02 +0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Fri, 11 Nov 2011 17:36:40 +0000 (09:36 -0800)
commit 2d25f8b462f3b849d8913d02978657ef06e67dd8 upstream.

The new Ath3k needs to download patch and radio table,
and it keeps same PID/VID even after downloading the patch and radio
table. This patch is to use the bcdDevice (Device Release Number) to
judge whether the chip has been patched or not. The init bcdDevice
value of the chip is 0x0001, this value increases after patch and
radio table downloading.

Signed-off-by: Steven.Li <yongli@qca.qualcomm.com>
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/bluetooth/ath3k.c
drivers/bluetooth/btusb.c

index 1631fd05510bde8b0d4f8492adb7167dc0a0d718..db7cb8111fbe58a89f21ee6ccea50467356bd38a 100644 (file)
@@ -376,6 +376,11 @@ static int ath3k_probe(struct usb_interface *intf,
 
        /* load patch and sysconfig files for AR3012 */
        if (id->driver_info & BTUSB_ATH3012) {
+
+               /* New firmware with patch and sysconfig files already loaded */
+               if (le16_to_cpu(udev->descriptor.bcdDevice) > 0x0001)
+                       return -ENODEV;
+
                ret = ath3k_load_patch(udev);
                if (ret < 0) {
                        BT_ERR("Loading patch file failed");
index b8483ac0c74df9ee383c377421ea58377f6eff38..97f155e6c4411f0239d98593a6bccfa3a7e0e41f 100644 (file)
@@ -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 */
@@ -114,7 +115,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 },
@@ -918,6 +919,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;