diff options
Diffstat (limited to 'drivers/bluetooth/btbcm.c')
| -rw-r--r-- | drivers/bluetooth/btbcm.c | 37 | 
1 files changed, 37 insertions, 0 deletions
diff --git a/drivers/bluetooth/btbcm.c b/drivers/bluetooth/btbcm.c index ba3dd2eafc09..9ab6cfbb831d 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)  	return skb;  } +static struct sk_buff *btbcm_read_controller_features(struct hci_dev *hdev) +{ +	struct sk_buff *skb; + +	skb = __hci_cmd_sync(hdev, 0xfc6e, 0, NULL, HCI_INIT_TIMEOUT); +	if (IS_ERR(skb)) { +		BT_ERR("%s: BCM: Read controller features failed (%ld)", +		       hdev->name, PTR_ERR(skb)); +		return skb; +	} + +	if (skb->len != 9) { +		BT_ERR("%s: BCM: Controller features length mismatch", +		       hdev->name); +		kfree_skb(skb); +		return ERR_PTR(-EIO); +	} + +	return skb; +} +  static struct sk_buff *btbcm_read_usb_product(struct hci_dev *hdev)  {  	struct sk_buff *skb; @@ -274,6 +295,7 @@ static const struct {  	{ 0x410e, "BCM43341B0"	},	/* 002.001.014 */  	{ 0x4406, "BCM4324B3"	},	/* 002.004.006 */  	{ 0x610c, "BCM4354"	},	/* 003.001.012 */ +	{ 0x2209, "BCM43430A1"  },	/* 001.002.009 */  	{ }  }; @@ -417,6 +439,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 Controller Features */ +	skb = btbcm_read_controller_features(hdev); +	if (IS_ERR(skb)) +		return PTR_ERR(skb); + +	BT_INFO("%s: BCM: features 0x%2.2x", hdev->name, skb->data[1]); +	kfree_skb(skb); +  	/* Read Local Name */  	skb = btbcm_read_local_name(hdev);  	if (IS_ERR(skb)) @@ -540,6 +570,13 @@ int btbcm_setup_apple(struct hci_dev *hdev)  		kfree_skb(skb);  	} +	/* Read Controller Features */ +	skb = btbcm_read_controller_features(hdev); +	if (!IS_ERR(skb)) { +		BT_INFO("%s: BCM: features 0x%2.2x", hdev->name, skb->data[1]); +		kfree_skb(skb); +	} +  	/* Read Local Name */  	skb = btbcm_read_local_name(hdev);  	if (!IS_ERR(skb)) {  |