aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2014-07-02 06:38:22 -0400
committerMarcel Holtmann <marcel@holtmann.org>2014-07-03 11:42:56 -0400
commitc8abb73fb82b30ee736ada0f1ae50c9b4382713e (patch)
tree7d55831318c92849baa5c229773e0826c1f61398
parent40cb0984150e118141a1b1a42f67f6d921ea8e09 (diff)
Bluetooth: Check for default address of Broadcom BCM20702A0 controllers
The Broadcom BCM20702A0 USB controllers might come with the default address 00:20:70:02:A0:00 when booting up. If this happens, then warn about such address being used. Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
-rw-r--r--drivers/bluetooth/btusb.c42
1 files changed, 40 insertions, 2 deletions
diff --git a/drivers/bluetooth/btusb.c b/drivers/bluetooth/btusb.c
index 32aabea731f2..3244e311ca29 100644
--- a/drivers/bluetooth/btusb.c
+++ b/drivers/bluetooth/btusb.c
@@ -1448,6 +1448,8 @@ static int btusb_set_bdaddr_intel(struct hci_dev *hdev, const bdaddr_t *bdaddr)
1448 return 0; 1448 return 0;
1449} 1449}
1450 1450
1451#define BDADDR_BCM20702A0 (&(bdaddr_t) {{0x00, 0xa0, 0x02, 0x70, 0x20, 0x00}})
1452
1451static int btusb_setup_bcm_patchram(struct hci_dev *hdev) 1453static int btusb_setup_bcm_patchram(struct hci_dev *hdev)
1452{ 1454{
1453 struct btusb_data *data = hci_get_drvdata(hdev); 1455 struct btusb_data *data = hci_get_drvdata(hdev);
@@ -1461,6 +1463,7 @@ static int btusb_setup_bcm_patchram(struct hci_dev *hdev)
1461 u16 opcode; 1463 u16 opcode;
1462 struct sk_buff *skb; 1464 struct sk_buff *skb;
1463 struct hci_rp_read_local_version *ver; 1465 struct hci_rp_read_local_version *ver;
1466 struct hci_rp_read_bd_addr *bda;
1464 long ret; 1467 long ret;
1465 1468
1466 snprintf(fw_name, sizeof(fw_name), "brcm/%s-%04x-%04x.hcd", 1469 snprintf(fw_name, sizeof(fw_name), "brcm/%s-%04x-%04x.hcd",
@@ -1470,8 +1473,7 @@ static int btusb_setup_bcm_patchram(struct hci_dev *hdev)
1470 1473
1471 ret = request_firmware(&fw, fw_name, &hdev->dev); 1474 ret = request_firmware(&fw, fw_name, &hdev->dev);
1472 if (ret < 0) { 1475 if (ret < 0) {
1473 BT_INFO("%s: BCM: patch %s not found", hdev->name, 1476 BT_INFO("%s: BCM: patch %s not found", hdev->name, fw_name);
1474 fw_name);
1475 return 0; 1477 return 0;
1476 } 1478 }
1477 1479
@@ -1590,6 +1592,42 @@ reset_fw:
1590 ver->lmp_ver, ver->lmp_subver); 1592 ver->lmp_ver, ver->lmp_subver);
1591 kfree_skb(skb); 1593 kfree_skb(skb);
1592 1594
1595 /* Read BD Address */
1596 skb = __hci_cmd_sync(hdev, HCI_OP_READ_BD_ADDR, 0, NULL,
1597 HCI_INIT_TIMEOUT);
1598 if (IS_ERR(skb)) {
1599 ret = PTR_ERR(skb);
1600 BT_ERR("%s: HCI_OP_READ_BD_ADDR failed (%ld)",
1601 hdev->name, ret);
1602 goto done;
1603 }
1604
1605 if (skb->len != sizeof(*bda)) {
1606 BT_ERR("%s: HCI_OP_READ_BD_ADDR event length mismatch",
1607 hdev->name);
1608 kfree_skb(skb);
1609 ret = -EIO;
1610 goto done;
1611 }
1612
1613 bda = (struct hci_rp_read_bd_addr *) skb->data;
1614 if (bda->status) {
1615 BT_ERR("%s: HCI_OP_READ_BD_ADDR error status (%02x)",
1616 hdev->name, bda->status);
1617 kfree_skb(skb);
1618 ret = -bt_to_errno(bda->status);
1619 goto done;
1620 }
1621
1622 /* The address 00:20:70:02:A0:00 indicates a BCM20702A0 controller
1623 * with no configured address.
1624 */
1625 if (!bacmp(&bda->bdaddr, BDADDR_BCM20702A0))
1626 BT_INFO("%s: BCM: using default device address (%pMR)",
1627 hdev->name, &bda->bdaddr);
1628
1629 kfree_skb(skb);
1630
1593done: 1631done:
1594 release_firmware(fw); 1632 release_firmware(fw);
1595 1633