Bluetooth: btbcm: Add BCM4324B3 UART device
authorFrederic Danis <frederic.danis@linux.intel.com>
Thu, 28 May 2015 09:25:02 +0000 (11:25 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Sat, 6 Jun 2015 05:30:12 +0000 (07:30 +0200)
Add "waiting for configuration" address.
Add lmp_subver and firmware name for BCM4324B3 controller.

Signed-off-by: Frederic Danis <frederic.danis@linux.intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
drivers/bluetooth/btbcm.c

index c7aec97..14e4647 100644 (file)
@@ -33,6 +33,7 @@
 #define VERSION "0.1"
 
 #define BDADDR_BCM20702A0 (&(bdaddr_t) {{0x00, 0xa0, 0x02, 0x70, 0x20, 0x00}})
+#define BDADDR_BCM4324B3 (&(bdaddr_t) {{0x00, 0x00, 0x00, 0xb3, 0x24, 0x43}})
 
 int btbcm_check_bdaddr(struct hci_dev *hdev)
 {
@@ -56,10 +57,18 @@ int btbcm_check_bdaddr(struct hci_dev *hdev)
 
        bda = (struct hci_rp_read_bd_addr *)skb->data;
 
-       /* The address 00:20:70:02:A0:00 indicates a BCM20702A0 controller
+       /* Check if the address indicates a controller with either an
+        * invalid or default address. In both cases the device needs
+        * to be marked as not having a valid address.
+        *
+        * The address 00:20:70:02:A0:00 indicates a BCM20702A0 controller
         * with no configured address.
+        *
+        * The address 43:24:B3:00:00:00 indicates a BCM4324B3 controller
+        * with waiting for configuration state.
         */
-       if (!bacmp(&bda->bdaddr, BDADDR_BCM20702A0)) {
+       if (!bacmp(&bda->bdaddr, BDADDR_BCM20702A0) ||
+           !bacmp(&bda->bdaddr, BDADDR_BCM4324B3)) {
                BT_INFO("%s: BCM: Using default device address (%pMR)",
                        hdev->name, &bda->bdaddr);
                set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
@@ -233,6 +242,7 @@ static const struct {
        const char *name;
 } bcm_uart_subver_table[] = {
        { 0x410e, "BCM43341B0"  },      /* 002.001.014 */
+       { 0x4406, "BCM4324B3"   },      /* 002.004.006 */
        { }
 };
 
@@ -288,6 +298,7 @@ int btbcm_setup_patchram(struct hci_dev *hdev)
 
        switch ((rev & 0xf000) >> 12) {
        case 0:
+       case 3:
                for (i = 0; bcm_uart_subver_table[i].name; i++) {
                        if (subver == bcm_uart_subver_table[i].subver) {
                                hw_name = bcm_uart_subver_table[i].name;