diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2017-06-10 08:33:16 -0400 |
---|---|---|
committer | Szymon Janc <szymon.janc@codecoup.pl> | 2017-06-12 05:46:12 -0400 |
commit | 4284ecbeda81083f4c7a3ce325b4a9d675657e61 (patch) | |
tree | ea2ffc003708f4a19e07cf9aab657010cbd8579f /drivers/bluetooth/btbcm.c | |
parent | 313f6888c8fbb1bc8b36c9012ce4e1de848df696 (diff) |
Bluetooth: btbcm: Read controller features during configuration
Read the Broadcom specific controller features during configuration and
print them for informational purposes.
< HCI Command: Broadcom Read Controller Features (0x3f|0x006e) plen 0
> HCI Event: Command Complete (0x0e) plen 12
Broadcom Read Controller Features (0x3f|0x006e) ncmd 1
Status: Success (0x00)
Features: 0x07 0x00 0x00 0x00 0x00 0x00 0x00 0x00
Multi-AV transport bandwidth reducer
WBS SBC
FW LC-PLC
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Szymon Janc <szymon.janc@codecoup.pl>
Diffstat (limited to 'drivers/bluetooth/btbcm.c')
-rw-r--r-- | drivers/bluetooth/btbcm.c | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/drivers/bluetooth/btbcm.c b/drivers/bluetooth/btbcm.c index ba3dd2eafc09..24f8c4e93f4e 100644 --- a/drivers/bluetooth/btbcm.c +++ b/drivers/bluetooth/btbcm.c | |||
@@ -246,6 +246,27 @@ static struct sk_buff *btbcm_read_verbose_config(struct hci_dev *hdev) | |||
246 | return skb; | 246 | return skb; |
247 | } | 247 | } |
248 | 248 | ||
249 | static struct sk_buff *btbcm_read_controller_features(struct hci_dev *hdev) | ||
250 | { | ||
251 | struct sk_buff *skb; | ||
252 | |||
253 | skb = __hci_cmd_sync(hdev, 0xfc6e, 0, NULL, HCI_INIT_TIMEOUT); | ||
254 | if (IS_ERR(skb)) { | ||
255 | BT_ERR("%s: BCM: Read controller features failed (%ld)", | ||
256 | hdev->name, PTR_ERR(skb)); | ||
257 | return skb; | ||
258 | } | ||
259 | |||
260 | if (skb->len != 9) { | ||
261 | BT_ERR("%s: BCM: Controller features length mismatch", | ||
262 | hdev->name); | ||
263 | kfree_skb(skb); | ||
264 | return ERR_PTR(-EIO); | ||
265 | } | ||
266 | |||
267 | return skb; | ||
268 | } | ||
269 | |||
249 | static struct sk_buff *btbcm_read_usb_product(struct hci_dev *hdev) | 270 | static struct sk_buff *btbcm_read_usb_product(struct hci_dev *hdev) |
250 | { | 271 | { |
251 | struct sk_buff *skb; | 272 | struct sk_buff *skb; |
@@ -417,6 +438,14 @@ int btbcm_setup_patchram(struct hci_dev *hdev) | |||
417 | BT_INFO("%s: BCM: chip id %u", hdev->name, skb->data[1]); | 438 | BT_INFO("%s: BCM: chip id %u", hdev->name, skb->data[1]); |
418 | kfree_skb(skb); | 439 | kfree_skb(skb); |
419 | 440 | ||
441 | /* Read Controller Features */ | ||
442 | skb = btbcm_read_controller_features(hdev); | ||
443 | if (IS_ERR(skb)) | ||
444 | return PTR_ERR(skb); | ||
445 | |||
446 | BT_INFO("%s: BCM: features 0x%2.2x", hdev->name, skb->data[1]); | ||
447 | kfree_skb(skb); | ||
448 | |||
420 | /* Read Local Name */ | 449 | /* Read Local Name */ |
421 | skb = btbcm_read_local_name(hdev); | 450 | skb = btbcm_read_local_name(hdev); |
422 | if (IS_ERR(skb)) | 451 | if (IS_ERR(skb)) |
@@ -540,6 +569,13 @@ int btbcm_setup_apple(struct hci_dev *hdev) | |||
540 | kfree_skb(skb); | 569 | kfree_skb(skb); |
541 | } | 570 | } |
542 | 571 | ||
572 | /* Read Controller Features */ | ||
573 | skb = btbcm_read_controller_features(hdev); | ||
574 | if (!IS_ERR(skb)) { | ||
575 | BT_INFO("%s: BCM: features 0x%2.2x", hdev->name, skb->data[1]); | ||
576 | kfree_skb(skb); | ||
577 | } | ||
578 | |||
543 | /* Read Local Name */ | 579 | /* Read Local Name */ |
544 | skb = btbcm_read_local_name(hdev); | 580 | skb = btbcm_read_local_name(hdev); |
545 | if (!IS_ERR(skb)) { | 581 | if (!IS_ERR(skb)) { |