diff options
author | John W. Linville <linville@tuxdriver.com> | 2013-01-30 14:21:04 -0500 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2013-01-30 14:21:04 -0500 |
commit | 0f496df2d9ba48faa808b5fa330de0da1a2d29d7 (patch) | |
tree | c1c85a625cff3f2ca6d95a5d5020a0157baa7521 /net/bluetooth/hci_event.c | |
parent | 56e1bd770614da94f35e88c150cf9edf8d0b57a2 (diff) | |
parent | 9b008c0457e583e10e62d1215bed6ab26ee54906 (diff) |
Merge branch 'for-upstream' of git://git.kernel.org/pub/scm/linux/kernel/git/bluetooth/bluetooth-next
Diffstat (limited to 'net/bluetooth/hci_event.c')
-rw-r--r-- | net/bluetooth/hci_event.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 81b44481d0d9..0a4fd642d4b9 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
@@ -609,8 +609,17 @@ static void le_setup(struct hci_dev *hdev) | |||
609 | /* Read LE Buffer Size */ | 609 | /* Read LE Buffer Size */ |
610 | hci_send_cmd(hdev, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL); | 610 | hci_send_cmd(hdev, HCI_OP_LE_READ_BUFFER_SIZE, 0, NULL); |
611 | 611 | ||
612 | /* Read LE Local Supported Features */ | ||
613 | hci_send_cmd(hdev, HCI_OP_LE_READ_LOCAL_FEATURES, 0, NULL); | ||
614 | |||
612 | /* Read LE Advertising Channel TX Power */ | 615 | /* Read LE Advertising Channel TX Power */ |
613 | hci_send_cmd(hdev, HCI_OP_LE_READ_ADV_TX_POWER, 0, NULL); | 616 | hci_send_cmd(hdev, HCI_OP_LE_READ_ADV_TX_POWER, 0, NULL); |
617 | |||
618 | /* Read LE White List Size */ | ||
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); | ||
614 | } | 623 | } |
615 | 624 | ||
616 | static void hci_setup(struct hci_dev *hdev) | 625 | static void hci_setup(struct hci_dev *hdev) |
@@ -1090,6 +1099,19 @@ static void hci_cc_le_read_buffer_size(struct hci_dev *hdev, | |||
1090 | hci_req_complete(hdev, HCI_OP_LE_READ_BUFFER_SIZE, rp->status); | 1099 | hci_req_complete(hdev, HCI_OP_LE_READ_BUFFER_SIZE, rp->status); |
1091 | } | 1100 | } |
1092 | 1101 | ||
1102 | static void hci_cc_le_read_local_features(struct hci_dev *hdev, | ||
1103 | struct sk_buff *skb) | ||
1104 | { | ||
1105 | struct hci_rp_le_read_local_features *rp = (void *) skb->data; | ||
1106 | |||
1107 | BT_DBG("%s status 0x%2.2x", hdev->name, rp->status); | ||
1108 | |||
1109 | if (!rp->status) | ||
1110 | memcpy(hdev->le_features, rp->features, 8); | ||
1111 | |||
1112 | hci_req_complete(hdev, HCI_OP_LE_READ_LOCAL_FEATURES, rp->status); | ||
1113 | } | ||
1114 | |||
1093 | static void hci_cc_le_read_adv_tx_power(struct hci_dev *hdev, | 1115 | static void hci_cc_le_read_adv_tx_power(struct hci_dev *hdev, |
1094 | struct sk_buff *skb) | 1116 | struct sk_buff *skb) |
1095 | { | 1117 | { |
@@ -1290,6 +1312,19 @@ static void hci_cc_le_set_scan_enable(struct hci_dev *hdev, | |||
1290 | } | 1312 | } |
1291 | } | 1313 | } |
1292 | 1314 | ||
1315 | static void hci_cc_le_read_white_list_size(struct hci_dev *hdev, | ||
1316 | struct sk_buff *skb) | ||
1317 | { | ||
1318 | struct hci_rp_le_read_white_list_size *rp = (void *) skb->data; | ||
1319 | |||
1320 | BT_DBG("%s status 0x%2.2x size %u", hdev->name, rp->status, rp->size); | ||
1321 | |||
1322 | if (!rp->status) | ||
1323 | hdev->le_white_list_size = rp->size; | ||
1324 | |||
1325 | hci_req_complete(hdev, HCI_OP_LE_READ_WHITE_LIST_SIZE, rp->status); | ||
1326 | } | ||
1327 | |||
1293 | static void hci_cc_le_ltk_reply(struct hci_dev *hdev, struct sk_buff *skb) | 1328 | static void hci_cc_le_ltk_reply(struct hci_dev *hdev, struct sk_buff *skb) |
1294 | { | 1329 | { |
1295 | struct hci_rp_le_ltk_reply *rp = (void *) skb->data; | 1330 | struct hci_rp_le_ltk_reply *rp = (void *) skb->data; |
@@ -1314,6 +1349,19 @@ static void hci_cc_le_ltk_neg_reply(struct hci_dev *hdev, struct sk_buff *skb) | |||
1314 | 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); |
1315 | } | 1350 | } |
1316 | 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 | |||
1317 | 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, |
1318 | struct sk_buff *skb) | 1366 | struct sk_buff *skb) |
1319 | { | 1367 | { |
@@ -2628,6 +2676,10 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) | |||
2628 | hci_cc_le_read_buffer_size(hdev, skb); | 2676 | hci_cc_le_read_buffer_size(hdev, skb); |
2629 | break; | 2677 | break; |
2630 | 2678 | ||
2679 | case HCI_OP_LE_READ_LOCAL_FEATURES: | ||
2680 | hci_cc_le_read_local_features(hdev, skb); | ||
2681 | break; | ||
2682 | |||
2631 | case HCI_OP_LE_READ_ADV_TX_POWER: | 2683 | case HCI_OP_LE_READ_ADV_TX_POWER: |
2632 | hci_cc_le_read_adv_tx_power(hdev, skb); | 2684 | hci_cc_le_read_adv_tx_power(hdev, skb); |
2633 | break; | 2685 | break; |
@@ -2664,6 +2716,10 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) | |||
2664 | hci_cc_le_set_scan_enable(hdev, skb); | 2716 | hci_cc_le_set_scan_enable(hdev, skb); |
2665 | break; | 2717 | break; |
2666 | 2718 | ||
2719 | case HCI_OP_LE_READ_WHITE_LIST_SIZE: | ||
2720 | hci_cc_le_read_white_list_size(hdev, skb); | ||
2721 | break; | ||
2722 | |||
2667 | case HCI_OP_LE_LTK_REPLY: | 2723 | case HCI_OP_LE_LTK_REPLY: |
2668 | hci_cc_le_ltk_reply(hdev, skb); | 2724 | hci_cc_le_ltk_reply(hdev, skb); |
2669 | break; | 2725 | break; |
@@ -2672,6 +2728,10 @@ static void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *skb) | |||
2672 | hci_cc_le_ltk_neg_reply(hdev, skb); | 2728 | hci_cc_le_ltk_neg_reply(hdev, skb); |
2673 | break; | 2729 | break; |
2674 | 2730 | ||
2731 | case HCI_OP_LE_READ_SUPPORTED_STATES: | ||
2732 | hci_cc_le_read_supported_states(hdev, skb); | ||
2733 | break; | ||
2734 | |||
2675 | case HCI_OP_WRITE_LE_HOST_SUPPORTED: | 2735 | case HCI_OP_WRITE_LE_HOST_SUPPORTED: |
2676 | hci_cc_write_le_host_supported(hdev, skb); | 2736 | hci_cc_write_le_host_supported(hdev, skb); |
2677 | break; | 2737 | break; |