|
15 | 15 |
|
16 | 16 | #define VERSION "0.1"
|
17 | 17 |
|
| 18 | +#define QCA_BDADDR_DEFAULT (&(bdaddr_t) {{ 0xad, 0x5a, 0x00, 0x00, 0x00, 0x00 }}) |
| 19 | + |
18 | 20 | int qca_read_soc_version(struct hci_dev *hdev, struct qca_btsoc_version *ver,
|
19 | 21 | enum qca_btsoc_type soc_type)
|
20 | 22 | {
|
@@ -612,6 +614,38 @@ int qca_set_bdaddr_rome(struct hci_dev *hdev, const bdaddr_t *bdaddr)
|
612 | 614 | }
|
613 | 615 | EXPORT_SYMBOL_GPL(qca_set_bdaddr_rome);
|
614 | 616 |
|
| 617 | +static int qca_check_bdaddr(struct hci_dev *hdev) |
| 618 | +{ |
| 619 | + struct hci_rp_read_bd_addr *bda; |
| 620 | + struct sk_buff *skb; |
| 621 | + int err; |
| 622 | + |
| 623 | + if (bacmp(&hdev->public_addr, BDADDR_ANY)) |
| 624 | + return 0; |
| 625 | + |
| 626 | + skb = __hci_cmd_sync(hdev, HCI_OP_READ_BD_ADDR, 0, NULL, |
| 627 | + HCI_INIT_TIMEOUT); |
| 628 | + if (IS_ERR(skb)) { |
| 629 | + err = PTR_ERR(skb); |
| 630 | + bt_dev_err(hdev, "Failed to read device address (%d)", err); |
| 631 | + return err; |
| 632 | + } |
| 633 | + |
| 634 | + if (skb->len != sizeof(*bda)) { |
| 635 | + bt_dev_err(hdev, "Device address length mismatch"); |
| 636 | + kfree_skb(skb); |
| 637 | + return -EIO; |
| 638 | + } |
| 639 | + |
| 640 | + bda = (struct hci_rp_read_bd_addr *)skb->data; |
| 641 | + if (!bacmp(&bda->bdaddr, QCA_BDADDR_DEFAULT)) |
| 642 | + set_bit(HCI_QUIRK_USE_BDADDR_PROPERTY, &hdev->quirks); |
| 643 | + |
| 644 | + kfree_skb(skb); |
| 645 | + |
| 646 | + return 0; |
| 647 | +} |
| 648 | + |
615 | 649 | static void qca_generate_hsp_nvm_name(char *fwname, size_t max_size,
|
616 | 650 | struct qca_btsoc_version ver, u8 rom_ver, u16 bid)
|
617 | 651 | {
|
@@ -818,6 +852,10 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate,
|
818 | 852 | break;
|
819 | 853 | }
|
820 | 854 |
|
| 855 | + err = qca_check_bdaddr(hdev); |
| 856 | + if (err) |
| 857 | + return err; |
| 858 | + |
821 | 859 | bt_dev_info(hdev, "QCA setup on UART is completed");
|
822 | 860 |
|
823 | 861 | return 0;
|
|
0 commit comments