diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2014-07-02 06:38:22 -0400 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2014-07-03 11:42:56 -0400 |
commit | c8abb73fb82b30ee736ada0f1ae50c9b4382713e (patch) | |
tree | 7d55831318c92849baa5c229773e0826c1f61398 | |
parent | 40cb0984150e118141a1b1a42f67f6d921ea8e09 (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.c | 42 |
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 | |||
1451 | static int btusb_setup_bcm_patchram(struct hci_dev *hdev) | 1453 | static 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 | |||
1593 | done: | 1631 | done: |
1594 | release_firmware(fw); | 1632 | release_firmware(fw); |
1595 | 1633 | ||