diff options
-rw-r--r-- | include/net/bluetooth/hci.h | 4 | ||||
-rw-r--r-- | include/net/bluetooth/hci_core.h | 1 | ||||
-rw-r--r-- | net/bluetooth/hci_event.c | 27 |
3 files changed, 32 insertions, 0 deletions
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 65345cd215b..741a2d658ad 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h | |||
@@ -216,6 +216,7 @@ enum { | |||
216 | 216 | ||
217 | #define LMP_LSTO 0x01 | 217 | #define LMP_LSTO 0x01 |
218 | #define LMP_INQ_TX_PWR 0x02 | 218 | #define LMP_INQ_TX_PWR 0x02 |
219 | #define LMP_EXTFEATURES 0x80 | ||
219 | 220 | ||
220 | /* Connection modes */ | 221 | /* Connection modes */ |
221 | #define HCI_CM_ACTIVE 0x0000 | 222 | #define HCI_CM_ACTIVE 0x0000 |
@@ -676,6 +677,9 @@ struct hci_rp_read_local_features { | |||
676 | } __packed; | 677 | } __packed; |
677 | 678 | ||
678 | #define HCI_OP_READ_LOCAL_EXT_FEATURES 0x1004 | 679 | #define HCI_OP_READ_LOCAL_EXT_FEATURES 0x1004 |
680 | struct hci_cp_read_local_ext_features { | ||
681 | __u8 page; | ||
682 | } __packed; | ||
679 | struct hci_rp_read_local_ext_features { | 683 | struct hci_rp_read_local_ext_features { |
680 | __u8 status; | 684 | __u8 status; |
681 | __u8 page; | 685 | __u8 page; |
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index 90d81f9b19a..eb7fe99979e 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
@@ -113,6 +113,7 @@ struct hci_dev { | |||
113 | __u8 major_class; | 113 | __u8 major_class; |
114 | __u8 minor_class; | 114 | __u8 minor_class; |
115 | __u8 features[8]; | 115 | __u8 features[8]; |
116 | __u8 extfeatures[8]; | ||
116 | __u8 commands[64]; | 117 | __u8 commands[64]; |
117 | __u8 ssp_mode; | 118 | __u8 ssp_mode; |
118 | __u8 hci_ver; | 119 | __u8 hci_ver; |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index ac2c5e89617..93d528cddaa 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; |