diff options
-rw-r--r-- | include/net/bluetooth/hci.h | 6 | ||||
-rw-r--r-- | include/net/bluetooth/hci_core.h | 1 | ||||
-rw-r--r-- | net/bluetooth/hci_event.c | 20 |
3 files changed, 27 insertions, 0 deletions
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index f1766a6f4954..7f12c25f1fca 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h | |||
@@ -1045,6 +1045,12 @@ struct hci_rp_le_ltk_neg_reply { | |||
1045 | __le16 handle; | 1045 | __le16 handle; |
1046 | } __packed; | 1046 | } __packed; |
1047 | 1047 | ||
1048 | #define HCI_OP_LE_READ_SUPPORTED_STATES 0x201c | ||
1049 | struct hci_rp_le_read_supported_states { | ||
1050 | __u8 status; | ||
1051 | __u8 le_states[8]; | ||
1052 | } __packed; | ||
1053 | |||
1048 | /* ---- HCI Events ---- */ | 1054 | /* ---- HCI Events ---- */ |
1049 | #define HCI_EV_INQUIRY_COMPLETE 0x01 | 1055 | #define HCI_EV_INQUIRY_COMPLETE 0x01 |
1050 | 1056 | ||
diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h index d6ed4ac18d83..bcf8ffe2a843 100644 --- a/include/net/bluetooth/hci_core.h +++ b/include/net/bluetooth/hci_core.h | |||
@@ -154,6 +154,7 @@ struct hci_dev { | |||
154 | __u8 host_features[8]; | 154 | __u8 host_features[8]; |
155 | __u8 le_features[8]; | 155 | __u8 le_features[8]; |
156 | __u8 le_white_list_size; | 156 | __u8 le_white_list_size; |
157 | __u8 le_states[8]; | ||
157 | __u8 commands[64]; | 158 | __u8 commands[64]; |
158 | __u8 hci_ver; | 159 | __u8 hci_ver; |
159 | __u16 hci_rev; | 160 | __u16 hci_rev; |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index d2fee64b728c..d4fcba6ec23e 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
@@ -617,6 +617,9 @@ static void le_setup(struct hci_dev *hdev) | |||
617 | 617 | ||
618 | /* Read LE White List Size */ | 618 | /* Read LE White List Size */ |
619 | hci_send_cmd(hdev, HCI_OP_LE_READ_WHITE_LIST_SIZE, 0, NULL); | 619 | hci_send_cmd(hdev, HCI_OP_LE_READ_WHITE_LIST_SIZE, 0, NULL); |
620 | |||
621 | /* Read LE Supported States */ | ||
622 | hci_send_cmd(hdev, HCI_OP_LE_READ_SUPPORTED_STATES, 0, NULL); | ||
620 | } | 623 | } |
621 | 624 | ||
622 | static void hci_setup(struct hci_dev *hdev) | 625 | static void hci_setup(struct hci_dev *hdev) |
@@ -1346,6 +1349,19 @@ static void hci_cc_le_ltk_neg_reply(struct hci_dev *hdev, struct sk_buff *skb) | |||
1346 | hci_req_complete(hdev, HCI_OP_LE_LTK_NEG_REPLY, rp->status); | 1349 | hci_req_complete(hdev, HCI_OP_LE_LTK_NEG_REPLY, rp->status); |
1347 | } | 1350 | } |
1348 | 1351 | ||
1352 | static void hci_cc_le_read_supported_states(struct hci_dev *hdev, | ||
1353 | struct sk_buff *skb) | ||
1354 | { | ||
1355 | struct hci_rp_le_read_supported_states *rp = (void *) skb->data; | ||
1356 | |||
1357 | BT_DBG("%s status 0x%2.2x", hdev->name, rp->status); | ||
1358 | |||
1359 | if (!rp->status) | ||
1360 | memcpy(hdev->le_states, rp->le_states, 8); | ||
1361 | |||
1362 | hci_req_complete(hdev, HCI_OP_LE_READ_SUPPORTED_STATES, rp->status); | ||
1363 | } | ||
1364 | |||
1349 | static void hci_cc_write_le_host_supported(struct hci_dev *hdev, | 1365 | static void hci_cc_write_le_host_supported(struct hci_dev *hdev, |
1350 | struct sk_buff *skb) | 1366 | struct sk_buff *skb) |
1351 | { | 1367 | { |
@@ -2712,6 +2728,10 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) | |||
2712 | hci_cc_le_ltk_neg_reply(hdev, skb); | 2728 | hci_cc_le_ltk_neg_reply(hdev, skb); |
2713 | break; | 2729 | break; |
2714 | 2730 | ||
2731 | case HCI_OP_LE_READ_SUPPORTED_STATES: | ||
2732 | hci_cc_le_read_supported_states(hdev, skb); | ||
2733 | break; | ||
2734 | |||
2715 | case HCI_OP_WRITE_LE_HOST_SUPPORTED: | 2735 | case HCI_OP_WRITE_LE_HOST_SUPPORTED: |
2716 | hci_cc_write_le_host_supported(hdev, skb); | 2736 | hci_cc_write_le_host_supported(hdev, skb); |
2717 | break; | 2737 | break; |