diff options
| author | Andre Guedes <andre.guedes@openbossa.org> | 2011-06-30 18:20:52 -0400 |
|---|---|---|
| committer | Gustavo F. Padovan <padovan@profusion.mobi> | 2011-07-06 18:10:27 -0400 |
| commit | 971e3a4bbcbf7378315b85150853d86be59cffe0 (patch) | |
| tree | 4c93a5a8411893e4b21522eca4b28f532e9bbe41 /net/bluetooth | |
| parent | 02f1b641060486df8eecd66b060ae6551f398593 (diff) | |
Bluetooth: Add extfeatures to struct hci_dev
This new field holds the extended LMP features value. Some LE
mechanism such as discovery procedure needs to read the extended
LMP features to work properly.
Signed-off-by: Andre Guedes <andre.guedes@openbossa.org>
Signed-off-by: Gustavo F. Padovan <padovan@profusion.mobi>
Diffstat (limited to 'net/bluetooth')
| -rw-r--r-- | net/bluetooth/hci_event.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index ac2c5e89617c..93d528cddaa7 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
| @@ -542,6 +542,14 @@ static void hci_setup(struct hci_dev *hdev) | |||
| 542 | 542 | ||
| 543 | if (hdev->features[7] & LMP_INQ_TX_PWR) | 543 | if (hdev->features[7] & LMP_INQ_TX_PWR) |
| 544 | hci_send_cmd(hdev, HCI_OP_READ_INQ_RSP_TX_POWER, 0, NULL); | 544 | hci_send_cmd(hdev, HCI_OP_READ_INQ_RSP_TX_POWER, 0, NULL); |
| 545 | |||
| 546 | if (hdev->features[7] & LMP_EXTFEATURES) { | ||
| 547 | struct hci_cp_read_local_ext_features cp; | ||
| 548 | |||
| 549 | cp.page = 0x01; | ||
| 550 | hci_send_cmd(hdev, HCI_OP_READ_LOCAL_EXT_FEATURES, | ||
| 551 | sizeof(cp), &cp); | ||
| 552 | } | ||
| 545 | } | 553 | } |
| 546 | 554 | ||
| 547 | static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb) | 555 | static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb) |
| @@ -658,6 +666,21 @@ static void hci_cc_read_local_features(struct hci_dev *hdev, struct sk_buff *skb | |||
| 658 | hdev->features[6], hdev->features[7]); | 666 | hdev->features[6], hdev->features[7]); |
| 659 | } | 667 | } |
| 660 | 668 | ||
| 669 | static void hci_cc_read_local_ext_features(struct hci_dev *hdev, | ||
| 670 | struct sk_buff *skb) | ||
| 671 | { | ||
| 672 | struct hci_rp_read_local_ext_features *rp = (void *) skb->data; | ||
| 673 | |||
| 674 | BT_DBG("%s status 0x%x", hdev->name, rp->status); | ||
| 675 | |||
| 676 | if (rp->status) | ||
| 677 | return; | ||
| 678 | |||
| 679 | memcpy(hdev->extfeatures, rp->features, 8); | ||
| 680 | |||
| 681 | hci_req_complete(hdev, HCI_OP_READ_LOCAL_EXT_FEATURES, rp->status); | ||
| 682 | } | ||
| 683 | |||
| 661 | static void hci_cc_read_buffer_size(struct hci_dev *hdev, struct sk_buff *skb) | 684 | static void hci_cc_read_buffer_size(struct hci_dev *hdev, struct sk_buff *skb) |
| 662 | { | 685 | { |
| 663 | struct hci_rp_read_buffer_size *rp = (void *) skb->data; | 686 | struct hci_rp_read_buffer_size *rp = (void *) skb->data; |
| @@ -1826,6 +1849,10 @@ static inline void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *sk | |||
| 1826 | hci_cc_read_local_features(hdev, skb); | 1849 | hci_cc_read_local_features(hdev, skb); |
| 1827 | break; | 1850 | break; |
| 1828 | 1851 | ||
| 1852 | case HCI_OP_READ_LOCAL_EXT_FEATURES: | ||
| 1853 | hci_cc_read_local_ext_features(hdev, skb); | ||
| 1854 | break; | ||
| 1855 | |||
| 1829 | case HCI_OP_READ_BUFFER_SIZE: | 1856 | case HCI_OP_READ_BUFFER_SIZE: |
| 1830 | hci_cc_read_buffer_size(hdev, skb); | 1857 | hci_cc_read_buffer_size(hdev, skb); |
| 1831 | break; | 1858 | break; |
