summaryrefslogtreecommitdiffstats
path: root/drivers/bluetooth/btbcm.c
diff options
context:
space:
mode:
authorMarcel Holtmann <marcel@holtmann.org>2015-10-05 06:43:57 -0400
committerJohan Hedberg <johan.hedberg@intel.com>2015-10-07 00:41:11 -0400
commit9bc63ca0904da3f163c01087e27952dd962d548d (patch)
tree5f34f2ae4a277de12496e52aad33553287b0269a /drivers/bluetooth/btbcm.c
parent22db3cbcf9f91eef848db0986869822b4bf27193 (diff)
Bluetooth: btbcm: Read the local name in setup stage
The Broadcom Bluetooth controllers have the chip name included in the ROM firmware or later in the patchram firmware. For debugging purposes read the local name and print it out. This is only done during setup stage and only once before loading the firmware and once after loading the firmware. For the Broadcom based controllers from Apple, the name is only read once after determining the chip id. Signed-off-by: Marcel Holtmann <marcel@holtmann.org> Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Diffstat (limited to 'drivers/bluetooth/btbcm.c')
-rw-r--r--drivers/bluetooth/btbcm.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/drivers/bluetooth/btbcm.c b/drivers/bluetooth/btbcm.c
index ad7371da5aaa..2fc363a0393d 100644
--- a/drivers/bluetooth/btbcm.c
+++ b/drivers/bluetooth/btbcm.c
@@ -181,6 +181,27 @@ static int btbcm_reset(struct hci_dev *hdev)
181 return 0; 181 return 0;
182} 182}
183 183
184static struct sk_buff *btbcm_read_local_name(struct hci_dev *hdev)
185{
186 struct sk_buff *skb;
187
188 skb = __hci_cmd_sync(hdev, HCI_OP_READ_LOCAL_NAME, 0, NULL,
189 HCI_INIT_TIMEOUT);
190 if (IS_ERR(skb)) {
191 BT_ERR("%s: BCM: Reading local name failed (%ld)",
192 hdev->name, PTR_ERR(skb));
193 return skb;
194 }
195
196 if (skb->len != sizeof(struct hci_rp_read_local_name)) {
197 BT_ERR("%s: BCM: Local name length mismatch", hdev->name);
198 kfree_skb(skb);
199 return ERR_PTR(-EIO);
200 }
201
202 return skb;
203}
204
184static struct sk_buff *btbcm_read_local_version(struct hci_dev *hdev) 205static struct sk_buff *btbcm_read_local_version(struct hci_dev *hdev)
185{ 206{
186 struct sk_buff *skb; 207 struct sk_buff *skb;
@@ -393,6 +414,14 @@ int btbcm_setup_patchram(struct hci_dev *hdev)
393 BT_INFO("%s: BCM: chip id %u", hdev->name, skb->data[1]); 414 BT_INFO("%s: BCM: chip id %u", hdev->name, skb->data[1]);
394 kfree_skb(skb); 415 kfree_skb(skb);
395 416
417 /* Read Local Name */
418 skb = btbcm_read_local_name(hdev);
419 if (IS_ERR(skb))
420 return PTR_ERR(skb);
421
422 BT_INFO("%s: %s", hdev->name, (char *)(skb->data + 1));
423 kfree_skb(skb);
424
396 switch ((rev & 0xf000) >> 12) { 425 switch ((rev & 0xf000) >> 12) {
397 case 0: 426 case 0:
398 case 3: 427 case 3:
@@ -464,6 +493,14 @@ int btbcm_setup_patchram(struct hci_dev *hdev)
464 hw_name ? : "BCM", (subver & 0x7000) >> 13, 493 hw_name ? : "BCM", (subver & 0x7000) >> 13,
465 (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff); 494 (subver & 0x1f00) >> 8, (subver & 0x00ff), rev & 0x0fff);
466 495
496 /* Read Local Name */
497 skb = btbcm_read_local_name(hdev);
498 if (IS_ERR(skb))
499 return PTR_ERR(skb);
500
501 BT_INFO("%s: %s", hdev->name, (char *)(skb->data + 1));
502 kfree_skb(skb);
503
467 btbcm_check_bdaddr(hdev); 504 btbcm_check_bdaddr(hdev);
468 505
469 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); 506 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
@@ -490,6 +527,13 @@ int btbcm_setup_apple(struct hci_dev *hdev)
490 kfree_skb(skb); 527 kfree_skb(skb);
491 } 528 }
492 529
530 /* Read Local Name */
531 skb = btbcm_read_local_name(hdev);
532 if (!IS_ERR(skb)) {
533 BT_INFO("%s: %s", hdev->name, (char *)(skb->data + 1));
534 kfree_skb(skb);
535 }
536
493 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks); 537 set_bit(HCI_QUIRK_STRICT_DUPLICATE_FILTER, &hdev->quirks);
494 538
495 return 0; 539 return 0;