|
@@ -181,6 +181,27 @@ static int btbcm_reset(struct hci_dev *hdev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static struct sk_buff *btbcm_read_local_name(struct hci_dev *hdev)
|
|
|
+{
|
|
|
+ struct sk_buff *skb;
|
|
|
+
|
|
|
+ skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_NAME, 0, NULL,
|
|
|
+ HCI_INIT_TIMEOUT);
|
|
|
+ if (IS_ERR(skb)) {
|
|
|
+ BT_ERR("%s: BCM: Reading local name failed (%ld)",
|
|
|
+ hdev->name, PTR_ERR(skb));
|
|
|
+ return skb;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (skb->len != sizeof(struct hci_rp_read_local_name)) {
|
|
|
+ BT_ERR("%s: BCM: Local name length mismatch", hdev->name);
|
|
|
+ kfree_skb(skb);
|
|
|
+ return ERR_PTR(-EIO);
|
|
|
+ }
|
|
|
+
|
|
|
+ return skb;
|
|
|
+}
|
|
|
+
|
|
|
static struct sk_buff *btbcm_read_local_version(struct hci_dev *hdev)
|
|
|
{
|
|
|
struct sk_buff *skb;
|
|
@@ -393,6 +414,14 @@ int btbcm_setup_patchram(struct hci_dev *hdev)
|
|
|
BT_INFO("%s: BCM: chip id %u", hdev->name, skb->data[1]);
|
|
|
kfree_skb(skb);
|
|
|
|
|
|
+ /* Read Local Name */
|
|
|
+ skb = btbcm_read_local_name(hdev);
|
|
|
+ if (IS_ERR(skb))
|
|
|
+ return PTR_ERR(skb);
|
|
|
+
|
|
|
+ BT_INFO("%s: %s", hdev->name, (char *)(skb->data + 1));
|
|
|
+ kfree_skb(skb);
|
|
|
+
|
|
|
switch ((rev & 0xf000) >> 12) {
|
|
|
case 0:
|
|
|
case 3:
|
|
@@ -464,6 +493,14 @@ int btbcm_setup_patchram(struct hci_dev *hdev)
|
|
|
hw_name ? : "BCM", (subver & 0x7000) >> 13,
|
|
|
(subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff);
|
|
|
|
|
|
+ /* Read Local Name */
|
|
|
+ skb = btbcm_read_local_name(hdev);
|
|
|
+ if (IS_ERR(skb))
|
|
|
+ return PTR_ERR(skb);
|
|
|
+
|
|
|
+ BT_INFO("%s: %s", hdev->name, (char *)(skb->data + 1));
|
|
|
+ kfree_skb(skb);
|
|
|
+
|
|
|
btbcm_check_bdaddr(hdev);
|
|
|
|
|
|
set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
|
|
@@ -490,6 +527,13 @@ int btbcm_setup_apple(struct hci_dev *hdev)
|
|
|
kfree_skb(skb);
|
|
|
}
|
|
|
|
|
|
+ /* Read Local Name */
|
|
|
+ skb = btbcm_read_local_name(hdev);
|
|
|
+ if (!IS_ERR(skb)) {
|
|
|
+ BT_INFO("%s: %s", hdev->name, (char *)(skb->data + 1));
|
|
|
+ kfree_skb(skb);
|
|
|
+ }
|
|
|
+
|
|
|
set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
|
|
|
|
|
|
return 0;
|