summaryrefslogtreecommitdiffstats
path: root/drivers/bluetooth/btbcm.c
diff options
context:
space:
mode:
authorFrederic Danis <frederic.danis@linux.intel.com>2015-05-28 05:25:02 -0400
committerMarcel Holtmann <marcel@holtmann.org>2015-06-06 01:30:12 -0400
commita8f3b9418ad2dd8f3efee0c08cdd61ac3763e739 (patch)
tree5b1da660970f22f8930907b47faa6f4986306439 /drivers/bluetooth/btbcm.c
parent18aeb4445aa00f6f402ba3a92a2e9ff3d13882b4 (diff)
Bluetooth: btbcm: Add BCM4324B3 UART device
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>
Diffstat (limited to 'drivers/bluetooth/btbcm.c')
-rw-r--r--drivers/bluetooth/btbcm.c15
1 files changed, 13 insertions, 2 deletions
diff --git a/drivers/bluetooth/btbcm.c b/drivers/bluetooth/btbcm.c
index c7aec9776620..14e4647686bd 100644
--- a/drivers/bluetooth/btbcm.c
+++ b/drivers/bluetooth/btbcm.c
@@ -33,6 +33,7 @@
33#define VERSION "0.1" 33#define VERSION "0.1"
34 34
35#define BDADDR_BCM20702A0 (&(bdaddr_t) {{0x00, 0xa0, 0x02, 0x70, 0x20, 0x00}}) 35#define BDADDR_BCM20702A0 (&(bdaddr_t) {{0x00, 0xa0, 0x02, 0x70, 0x20, 0x00}})
36#define BDADDR_BCM4324B3 (&(bdaddr_t) {{0x00, 0x00, 0x00, 0xb3, 0x24, 0x43}})
36 37
37int btbcm_check_bdaddr(struct hci_dev *hdev) 38int btbcm_check_bdaddr(struct hci_dev *hdev)
38{ 39{
@@ -56,10 +57,18 @@ int btbcm_check_bdaddr(struct hci_dev *hdev)
56 57
57 bda = (struct hci_rp_read_bd_addr *)skb->data; 58 bda = (struct hci_rp_read_bd_addr *)skb->data;
58 59
59 /* The address 00:20:70:02:A0:00 indicates a BCM20702A0 controller 60 /* Check if the address indicates a controller with either an
61 * invalid or default address. In both cases the device needs
62 * to be marked as not having a valid address.
63 *
64 * The address 00:20:70:02:A0:00 indicates a BCM20702A0 controller
60 * with no configured address. 65 * with no configured address.
66 *
67 * The address 43:24:B3:00:00:00 indicates a BCM4324B3 controller
68 * with waiting for configuration state.
61 */ 69 */
62 if (!bacmp(&bda->bdaddr, BDADDR_BCM20702A0)) { 70 if (!bacmp(&bda->bdaddr, BDADDR_BCM20702A0) ||
71 !bacmp(&bda->bdaddr, BDADDR_BCM4324B3)) {
63 BT_INFO("%s: BCM: Using default device address (%pMR)", 72 BT_INFO("%s: BCM: Using default device address (%pMR)",
64 hdev->name, &bda->bdaddr); 73 hdev->name, &bda->bdaddr);
65 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks); 74 set_bit(HCI_QUIRK_INVALID_BDADDR, &hdev->quirks);
@@ -233,6 +242,7 @@ static const struct {
233 const char *name; 242 const char *name;
234} bcm_uart_subver_table[] = { 243} bcm_uart_subver_table[] = {
235 { 0x410e, "BCM43341B0" }, /* 002.001.014 */ 244 { 0x410e, "BCM43341B0" }, /* 002.001.014 */
245 { 0x4406, "BCM4324B3" }, /* 002.004.006 */
236 { } 246 { }
237}; 247};
238 248
@@ -288,6 +298,7 @@ int btbcm_setup_patchram(struct hci_dev *hdev)
288 298
289 switch ((rev & 0xf000) >> 12) { 299 switch ((rev & 0xf000) >> 12) {
290 case 0: 300 case 0:
301 case 3:
291 for (i = 0; bcm_uart_subver_table[i].name; i++) { 302 for (i = 0; bcm_uart_subver_table[i].name; i++) {
292 if (subver == bcm_uart_subver_table[i].subver) { 303 if (subver == bcm_uart_subver_table[i].subver) {
293 hw_name = bcm_uart_subver_table[i].name; 304 hw_name = bcm_uart_subver_table[i].name;