diff options
Diffstat (limited to 'net/bluetooth/hci_event.c')
-rw-r--r-- | net/bluetooth/hci_event.c | 221 |
1 files changed, 138 insertions, 83 deletions
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index d7d96b6b1f0d..a89cf1f24e47 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
@@ -58,9 +58,11 @@ static void hci_cc_inquiry_cancel(struct hci_dev *hdev, struct sk_buff *skb) | |||
58 | if (status) | 58 | if (status) |
59 | return; | 59 | return; |
60 | 60 | ||
61 | if (test_and_clear_bit(HCI_INQUIRY, &hdev->flags) && | 61 | clear_bit(HCI_INQUIRY, &hdev->flags); |
62 | test_bit(HCI_MGMT, &hdev->flags)) | 62 | |
63 | mgmt_discovering(hdev->id, 0); | 63 | hci_dev_lock(hdev); |
64 | mgmt_discovering(hdev, 0); | ||
65 | hci_dev_unlock(hdev); | ||
64 | 66 | ||
65 | hci_req_complete(hdev, HCI_OP_INQUIRY_CANCEL, status); | 67 | hci_req_complete(hdev, HCI_OP_INQUIRY_CANCEL, status); |
66 | 68 | ||
@@ -76,10 +78,6 @@ static void hci_cc_exit_periodic_inq(struct hci_dev *hdev, struct sk_buff *skb) | |||
76 | if (status) | 78 | if (status) |
77 | return; | 79 | return; |
78 | 80 | ||
79 | if (test_and_clear_bit(HCI_INQUIRY, &hdev->flags) && | ||
80 | test_bit(HCI_MGMT, &hdev->flags)) | ||
81 | mgmt_discovering(hdev->id, 0); | ||
82 | |||
83 | hci_conn_check_pending(hdev); | 81 | hci_conn_check_pending(hdev); |
84 | } | 82 | } |
85 | 83 | ||
@@ -205,13 +203,15 @@ static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb) | |||
205 | if (!sent) | 203 | if (!sent) |
206 | return; | 204 | return; |
207 | 205 | ||
206 | hci_dev_lock(hdev); | ||
207 | |||
208 | if (test_bit(HCI_MGMT, &hdev->flags)) | 208 | if (test_bit(HCI_MGMT, &hdev->flags)) |
209 | mgmt_set_local_name_complete(hdev->id, sent, status); | 209 | mgmt_set_local_name_complete(hdev, sent, status); |
210 | 210 | ||
211 | if (status) | 211 | if (status == 0) |
212 | return; | 212 | memcpy(hdev->dev_name, sent, HCI_MAX_NAME_LENGTH); |
213 | 213 | ||
214 | memcpy(hdev->dev_name, sent, HCI_MAX_NAME_LENGTH); | 214 | hci_dev_unlock(hdev); |
215 | } | 215 | } |
216 | 216 | ||
217 | static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb) | 217 | static void hci_cc_read_local_name(struct hci_dev *hdev, struct sk_buff *skb) |
@@ -274,7 +274,8 @@ static void hci_cc_write_encrypt_mode(struct hci_dev *hdev, struct sk_buff *skb) | |||
274 | 274 | ||
275 | static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb) | 275 | static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb) |
276 | { | 276 | { |
277 | __u8 status = *((__u8 *) skb->data); | 277 | __u8 param, status = *((__u8 *) skb->data); |
278 | int old_pscan, old_iscan; | ||
278 | void *sent; | 279 | void *sent; |
279 | 280 | ||
280 | BT_DBG("%s status 0x%x", hdev->name, status); | 281 | BT_DBG("%s status 0x%x", hdev->name, status); |
@@ -283,28 +284,40 @@ static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb) | |||
283 | if (!sent) | 284 | if (!sent) |
284 | return; | 285 | return; |
285 | 286 | ||
286 | if (!status) { | 287 | param = *((__u8 *) sent); |
287 | __u8 param = *((__u8 *) sent); | ||
288 | int old_pscan, old_iscan; | ||
289 | |||
290 | old_pscan = test_and_clear_bit(HCI_PSCAN, &hdev->flags); | ||
291 | old_iscan = test_and_clear_bit(HCI_ISCAN, &hdev->flags); | ||
292 | 288 | ||
293 | if (param & SCAN_INQUIRY) { | 289 | hci_dev_lock(hdev); |
294 | set_bit(HCI_ISCAN, &hdev->flags); | ||
295 | if (!old_iscan) | ||
296 | mgmt_discoverable(hdev->id, 1); | ||
297 | } else if (old_iscan) | ||
298 | mgmt_discoverable(hdev->id, 0); | ||
299 | 290 | ||
300 | if (param & SCAN_PAGE) { | 291 | if (status != 0) { |
301 | set_bit(HCI_PSCAN, &hdev->flags); | 292 | mgmt_write_scan_failed(hdev, param, status); |
302 | if (!old_pscan) | 293 | hdev->discov_timeout = 0; |
303 | mgmt_connectable(hdev->id, 1); | 294 | goto done; |
304 | } else if (old_pscan) | ||
305 | mgmt_connectable(hdev->id, 0); | ||
306 | } | 295 | } |
307 | 296 | ||
297 | old_pscan = test_and_clear_bit(HCI_PSCAN, &hdev->flags); | ||
298 | old_iscan = test_and_clear_bit(HCI_ISCAN, &hdev->flags); | ||
299 | |||
300 | if (param & SCAN_INQUIRY) { | ||
301 | set_bit(HCI_ISCAN, &hdev->flags); | ||
302 | if (!old_iscan) | ||
303 | mgmt_discoverable(hdev, 1); | ||
304 | if (hdev->discov_timeout > 0) { | ||
305 | int to = msecs_to_jiffies(hdev->discov_timeout * 1000); | ||
306 | queue_delayed_work(hdev->workqueue, &hdev->discov_off, | ||
307 | to); | ||
308 | } | ||
309 | } else if (old_iscan) | ||
310 | mgmt_discoverable(hdev, 0); | ||
311 | |||
312 | if (param & SCAN_PAGE) { | ||
313 | set_bit(HCI_PSCAN, &hdev->flags); | ||
314 | if (!old_pscan) | ||
315 | mgmt_connectable(hdev, 1); | ||
316 | } else if (old_pscan) | ||
317 | mgmt_connectable(hdev, 0); | ||
318 | |||
319 | done: | ||
320 | hci_dev_unlock(hdev); | ||
308 | hci_req_complete(hdev, HCI_OP_WRITE_SCAN_ENABLE, status); | 321 | hci_req_complete(hdev, HCI_OP_WRITE_SCAN_ENABLE, status); |
309 | } | 322 | } |
310 | 323 | ||
@@ -748,6 +761,30 @@ static void hci_cc_write_ca_timeout(struct hci_dev *hdev, struct sk_buff *skb) | |||
748 | hci_req_complete(hdev, HCI_OP_WRITE_CA_TIMEOUT, status); | 761 | hci_req_complete(hdev, HCI_OP_WRITE_CA_TIMEOUT, status); |
749 | } | 762 | } |
750 | 763 | ||
764 | static void hci_cc_read_local_amp_info(struct hci_dev *hdev, | ||
765 | struct sk_buff *skb) | ||
766 | { | ||
767 | struct hci_rp_read_local_amp_info *rp = (void *) skb->data; | ||
768 | |||
769 | BT_DBG("%s status 0x%x", hdev->name, rp->status); | ||
770 | |||
771 | if (rp->status) | ||
772 | return; | ||
773 | |||
774 | hdev->amp_status = rp->amp_status; | ||
775 | hdev->amp_total_bw = __le32_to_cpu(rp->total_bw); | ||
776 | hdev->amp_max_bw = __le32_to_cpu(rp->max_bw); | ||
777 | hdev->amp_min_latency = __le32_to_cpu(rp->min_latency); | ||
778 | hdev->amp_max_pdu = __le32_to_cpu(rp->max_pdu); | ||
779 | hdev->amp_type = rp->amp_type; | ||
780 | hdev->amp_pal_cap = __le16_to_cpu(rp->pal_cap); | ||
781 | hdev->amp_assoc_size = __le16_to_cpu(rp->max_assoc_size); | ||
782 | hdev->amp_be_flush_to = __le32_to_cpu(rp->be_flush_to); | ||
783 | hdev->amp_max_flush_to = __le32_to_cpu(rp->max_flush_to); | ||
784 | |||
785 | hci_req_complete(hdev, HCI_OP_READ_LOCAL_AMP_INFO, rp->status); | ||
786 | } | ||
787 | |||
751 | static void hci_cc_delete_stored_link_key(struct hci_dev *hdev, | 788 | static void hci_cc_delete_stored_link_key(struct hci_dev *hdev, |
752 | struct sk_buff *skb) | 789 | struct sk_buff *skb) |
753 | { | 790 | { |
@@ -804,19 +841,24 @@ static void hci_cc_pin_code_reply(struct hci_dev *hdev, struct sk_buff *skb) | |||
804 | 841 | ||
805 | BT_DBG("%s status 0x%x", hdev->name, rp->status); | 842 | BT_DBG("%s status 0x%x", hdev->name, rp->status); |
806 | 843 | ||
844 | hci_dev_lock(hdev); | ||
845 | |||
807 | if (test_bit(HCI_MGMT, &hdev->flags)) | 846 | if (test_bit(HCI_MGMT, &hdev->flags)) |
808 | mgmt_pin_code_reply_complete(hdev->id, &rp->bdaddr, rp->status); | 847 | mgmt_pin_code_reply_complete(hdev, &rp->bdaddr, rp->status); |
809 | 848 | ||
810 | if (rp->status != 0) | 849 | if (rp->status != 0) |
811 | return; | 850 | goto unlock; |
812 | 851 | ||
813 | cp = hci_sent_cmd_data(hdev, HCI_OP_PIN_CODE_REPLY); | 852 | cp = hci_sent_cmd_data(hdev, HCI_OP_PIN_CODE_REPLY); |
814 | if (!cp) | 853 | if (!cp) |
815 | return; | 854 | goto unlock; |
816 | 855 | ||
817 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr); | 856 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->bdaddr); |
818 | if (conn) | 857 | if (conn) |
819 | conn->pin_length = cp->pin_len; | 858 | conn->pin_length = cp->pin_len; |
859 | |||
860 | unlock: | ||
861 | hci_dev_unlock(hdev); | ||
820 | } | 862 | } |
821 | 863 | ||
822 | static void hci_cc_pin_code_neg_reply(struct hci_dev *hdev, struct sk_buff *skb) | 864 | static void hci_cc_pin_code_neg_reply(struct hci_dev *hdev, struct sk_buff *skb) |
@@ -825,10 +867,15 @@ static void hci_cc_pin_code_neg_reply(struct hci_dev *hdev, struct sk_buff *skb) | |||
825 | 867 | ||
826 | BT_DBG("%s status 0x%x", hdev->name, rp->status); | 868 | BT_DBG("%s status 0x%x", hdev->name, rp->status); |
827 | 869 | ||
870 | hci_dev_lock(hdev); | ||
871 | |||
828 | if (test_bit(HCI_MGMT, &hdev->flags)) | 872 | if (test_bit(HCI_MGMT, &hdev->flags)) |
829 | mgmt_pin_code_neg_reply_complete(hdev->id, &rp->bdaddr, | 873 | mgmt_pin_code_neg_reply_complete(hdev, &rp->bdaddr, |
830 | rp->status); | 874 | rp->status); |
875 | |||
876 | hci_dev_unlock(hdev); | ||
831 | } | 877 | } |
878 | |||
832 | static void hci_cc_le_read_buffer_size(struct hci_dev *hdev, | 879 | static void hci_cc_le_read_buffer_size(struct hci_dev *hdev, |
833 | struct sk_buff *skb) | 880 | struct sk_buff *skb) |
834 | { | 881 | { |
@@ -855,9 +902,13 @@ static void hci_cc_user_confirm_reply(struct hci_dev *hdev, struct sk_buff *skb) | |||
855 | 902 | ||
856 | BT_DBG("%s status 0x%x", hdev->name, rp->status); | 903 | BT_DBG("%s status 0x%x", hdev->name, rp->status); |
857 | 904 | ||
905 | hci_dev_lock(hdev); | ||
906 | |||
858 | if (test_bit(HCI_MGMT, &hdev->flags)) | 907 | if (test_bit(HCI_MGMT, &hdev->flags)) |
859 | mgmt_user_confirm_reply_complete(hdev->id, &rp->bdaddr, | 908 | mgmt_user_confirm_reply_complete(hdev, &rp->bdaddr, |
860 | rp->status); | 909 | rp->status); |
910 | |||
911 | hci_dev_unlock(hdev); | ||
861 | } | 912 | } |
862 | 913 | ||
863 | static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev, | 914 | static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev, |
@@ -867,9 +918,13 @@ static void hci_cc_user_confirm_neg_reply(struct hci_dev *hdev, | |||
867 | 918 | ||
868 | BT_DBG("%s status 0x%x", hdev->name, rp->status); | 919 | BT_DBG("%s status 0x%x", hdev->name, rp->status); |
869 | 920 | ||
921 | hci_dev_lock(hdev); | ||
922 | |||
870 | if (test_bit(HCI_MGMT, &hdev->flags)) | 923 | if (test_bit(HCI_MGMT, &hdev->flags)) |
871 | mgmt_user_confirm_neg_reply_complete(hdev->id, &rp->bdaddr, | 924 | mgmt_user_confirm_neg_reply_complete(hdev, &rp->bdaddr, |
872 | rp->status); | 925 | rp->status); |
926 | |||
927 | hci_dev_unlock(hdev); | ||
873 | } | 928 | } |
874 | 929 | ||
875 | static void hci_cc_read_local_oob_data_reply(struct hci_dev *hdev, | 930 | static void hci_cc_read_local_oob_data_reply(struct hci_dev *hdev, |
@@ -879,8 +934,10 @@ static void hci_cc_read_local_oob_data_reply(struct hci_dev *hdev, | |||
879 | 934 | ||
880 | BT_DBG("%s status 0x%x", hdev->name, rp->status); | 935 | BT_DBG("%s status 0x%x", hdev->name, rp->status); |
881 | 936 | ||
882 | mgmt_read_local_oob_data_reply_complete(hdev->id, rp->hash, | 937 | hci_dev_lock(hdev); |
938 | mgmt_read_local_oob_data_reply_complete(hdev, rp->hash, | ||
883 | rp->randomizer, rp->status); | 939 | rp->randomizer, rp->status); |
940 | hci_dev_unlock(hdev); | ||
884 | } | 941 | } |
885 | 942 | ||
886 | static void hci_cc_le_set_scan_enable(struct hci_dev *hdev, | 943 | static void hci_cc_le_set_scan_enable(struct hci_dev *hdev, |
@@ -955,12 +1012,18 @@ static inline void hci_cs_inquiry(struct hci_dev *hdev, __u8 status) | |||
955 | if (status) { | 1012 | if (status) { |
956 | hci_req_complete(hdev, HCI_OP_INQUIRY, status); | 1013 | hci_req_complete(hdev, HCI_OP_INQUIRY, status); |
957 | hci_conn_check_pending(hdev); | 1014 | hci_conn_check_pending(hdev); |
1015 | hci_dev_lock(hdev); | ||
1016 | if (test_bit(HCI_MGMT, &hdev->flags)) | ||
1017 | mgmt_inquiry_failed(hdev, status); | ||
1018 | hci_dev_unlock(hdev); | ||
958 | return; | 1019 | return; |
959 | } | 1020 | } |
960 | 1021 | ||
961 | if (!test_and_set_bit(HCI_INQUIRY, &hdev->flags) && | 1022 | set_bit(HCI_INQUIRY, &hdev->flags); |
962 | test_bit(HCI_MGMT, &hdev->flags)) | 1023 | |
963 | mgmt_discovering(hdev->id, 1); | 1024 | hci_dev_lock(hdev); |
1025 | mgmt_discovering(hdev, 1); | ||
1026 | hci_dev_unlock(hdev); | ||
964 | } | 1027 | } |
965 | 1028 | ||
966 | static inline void hci_cs_create_conn(struct hci_dev *hdev, __u8 status) | 1029 | static inline void hci_cs_create_conn(struct hci_dev *hdev, __u8 status) |
@@ -1339,13 +1402,16 @@ static inline void hci_inquiry_complete_evt(struct hci_dev *hdev, struct sk_buff | |||
1339 | 1402 | ||
1340 | BT_DBG("%s status %d", hdev->name, status); | 1403 | BT_DBG("%s status %d", hdev->name, status); |
1341 | 1404 | ||
1342 | if (test_and_clear_bit(HCI_INQUIRY, &hdev->flags) && | ||
1343 | test_bit(HCI_MGMT, &hdev->flags)) | ||
1344 | mgmt_discovering(hdev->id, 0); | ||
1345 | |||
1346 | hci_req_complete(hdev, HCI_OP_INQUIRY, status); | 1405 | hci_req_complete(hdev, HCI_OP_INQUIRY, status); |
1347 | 1406 | ||
1348 | hci_conn_check_pending(hdev); | 1407 | hci_conn_check_pending(hdev); |
1408 | |||
1409 | if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags)) | ||
1410 | return; | ||
1411 | |||
1412 | hci_dev_lock(hdev); | ||
1413 | mgmt_discovering(hdev, 0); | ||
1414 | hci_dev_unlock(hdev); | ||
1349 | } | 1415 | } |
1350 | 1416 | ||
1351 | static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb) | 1417 | static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff *skb) |
@@ -1361,12 +1427,6 @@ static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff * | |||
1361 | 1427 | ||
1362 | hci_dev_lock(hdev); | 1428 | hci_dev_lock(hdev); |
1363 | 1429 | ||
1364 | if (!test_and_set_bit(HCI_INQUIRY, &hdev->flags)) { | ||
1365 | |||
1366 | if (test_bit(HCI_MGMT, &hdev->flags)) | ||
1367 | mgmt_discovering(hdev->id, 1); | ||
1368 | } | ||
1369 | |||
1370 | for (; num_rsp; num_rsp--, info++) { | 1430 | for (; num_rsp; num_rsp--, info++) { |
1371 | bacpy(&data.bdaddr, &info->bdaddr); | 1431 | bacpy(&data.bdaddr, &info->bdaddr); |
1372 | data.pscan_rep_mode = info->pscan_rep_mode; | 1432 | data.pscan_rep_mode = info->pscan_rep_mode; |
@@ -1377,8 +1437,8 @@ static inline void hci_inquiry_result_evt(struct hci_dev *hdev, struct sk_buff * | |||
1377 | data.rssi = 0x00; | 1437 | data.rssi = 0x00; |
1378 | data.ssp_mode = 0x00; | 1438 | data.ssp_mode = 0x00; |
1379 | hci_inquiry_cache_update(hdev, &data); | 1439 | hci_inquiry_cache_update(hdev, &data); |
1380 | mgmt_device_found(hdev->id, &info->bdaddr, info->dev_class, 0, | 1440 | mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, |
1381 | NULL); | 1441 | info->dev_class, 0, NULL); |
1382 | } | 1442 | } |
1383 | 1443 | ||
1384 | hci_dev_unlock(hdev); | 1444 | hci_dev_unlock(hdev); |
@@ -1412,7 +1472,7 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
1412 | conn->state = BT_CONFIG; | 1472 | conn->state = BT_CONFIG; |
1413 | hci_conn_hold(conn); | 1473 | hci_conn_hold(conn); |
1414 | conn->disc_timeout = HCI_DISCONN_TIMEOUT; | 1474 | conn->disc_timeout = HCI_DISCONN_TIMEOUT; |
1415 | mgmt_connected(hdev->id, &ev->bdaddr, conn->type); | 1475 | mgmt_connected(hdev, &ev->bdaddr, conn->type); |
1416 | } else | 1476 | } else |
1417 | conn->state = BT_CONNECTED; | 1477 | conn->state = BT_CONNECTED; |
1418 | 1478 | ||
@@ -1444,7 +1504,8 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
1444 | } else { | 1504 | } else { |
1445 | conn->state = BT_CLOSED; | 1505 | conn->state = BT_CLOSED; |
1446 | if (conn->type == ACL_LINK) | 1506 | if (conn->type == ACL_LINK) |
1447 | mgmt_connect_failed(hdev->id, &ev->bdaddr, ev->status); | 1507 | mgmt_connect_failed(hdev, &ev->bdaddr, conn->type, |
1508 | ev->status); | ||
1448 | } | 1509 | } |
1449 | 1510 | ||
1450 | if (conn->type == ACL_LINK) | 1511 | if (conn->type == ACL_LINK) |
@@ -1531,7 +1592,7 @@ static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *sk | |||
1531 | struct hci_cp_reject_conn_req cp; | 1592 | struct hci_cp_reject_conn_req cp; |
1532 | 1593 | ||
1533 | bacpy(&cp.bdaddr, &ev->bdaddr); | 1594 | bacpy(&cp.bdaddr, &ev->bdaddr); |
1534 | cp.reason = 0x0f; | 1595 | cp.reason = HCI_ERROR_REJ_BAD_ADDR; |
1535 | hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp); | 1596 | hci_send_cmd(hdev, HCI_OP_REJECT_CONN_REQ, sizeof(cp), &cp); |
1536 | } | 1597 | } |
1537 | } | 1598 | } |
@@ -1544,7 +1605,9 @@ static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff | |||
1544 | BT_DBG("%s status %d", hdev->name, ev->status); | 1605 | BT_DBG("%s status %d", hdev->name, ev->status); |
1545 | 1606 | ||
1546 | if (ev->status) { | 1607 | if (ev->status) { |
1547 | mgmt_disconnect_failed(hdev->id); | 1608 | hci_dev_lock(hdev); |
1609 | mgmt_disconnect_failed(hdev); | ||
1610 | hci_dev_unlock(hdev); | ||
1548 | return; | 1611 | return; |
1549 | } | 1612 | } |
1550 | 1613 | ||
@@ -1557,7 +1620,7 @@ static inline void hci_disconn_complete_evt(struct hci_dev *hdev, struct sk_buff | |||
1557 | conn->state = BT_CLOSED; | 1620 | conn->state = BT_CLOSED; |
1558 | 1621 | ||
1559 | if (conn->type == ACL_LINK || conn->type == LE_LINK) | 1622 | if (conn->type == ACL_LINK || conn->type == LE_LINK) |
1560 | mgmt_disconnected(hdev->id, &conn->dst); | 1623 | mgmt_disconnected(hdev, &conn->dst, conn->type); |
1561 | 1624 | ||
1562 | hci_proto_disconn_cfm(conn, ev->reason); | 1625 | hci_proto_disconn_cfm(conn, ev->reason); |
1563 | hci_conn_del(conn); | 1626 | hci_conn_del(conn); |
@@ -1588,7 +1651,7 @@ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
1588 | conn->sec_level = conn->pending_sec_level; | 1651 | conn->sec_level = conn->pending_sec_level; |
1589 | } | 1652 | } |
1590 | } else { | 1653 | } else { |
1591 | mgmt_auth_failed(hdev->id, &conn->dst, ev->status); | 1654 | mgmt_auth_failed(hdev, &conn->dst, ev->status); |
1592 | } | 1655 | } |
1593 | 1656 | ||
1594 | clear_bit(HCI_CONN_AUTH_PEND, &conn->pend); | 1657 | clear_bit(HCI_CONN_AUTH_PEND, &conn->pend); |
@@ -1643,7 +1706,7 @@ static inline void hci_remote_name_evt(struct hci_dev *hdev, struct sk_buff *skb | |||
1643 | hci_dev_lock(hdev); | 1706 | hci_dev_lock(hdev); |
1644 | 1707 | ||
1645 | if (ev->status == 0 && test_bit(HCI_MGMT, &hdev->flags)) | 1708 | if (ev->status == 0 && test_bit(HCI_MGMT, &hdev->flags)) |
1646 | mgmt_remote_name(hdev->id, &ev->bdaddr, ev->name); | 1709 | mgmt_remote_name(hdev, &ev->bdaddr, ev->name); |
1647 | 1710 | ||
1648 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr); | 1711 | conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &ev->bdaddr); |
1649 | if (!conn) | 1712 | if (!conn) |
@@ -1898,6 +1961,10 @@ static inline void hci_cmd_complete_evt(struct hci_dev *hdev, struct sk_buff *sk | |||
1898 | hci_cc_write_ca_timeout(hdev, skb); | 1961 | hci_cc_write_ca_timeout(hdev, skb); |
1899 | break; | 1962 | break; |
1900 | 1963 | ||
1964 | case HCI_OP_READ_LOCAL_AMP_INFO: | ||
1965 | hci_cc_read_local_amp_info(hdev, skb); | ||
1966 | break; | ||
1967 | |||
1901 | case HCI_OP_DELETE_STORED_LINK_KEY: | 1968 | case HCI_OP_DELETE_STORED_LINK_KEY: |
1902 | hci_cc_delete_stored_link_key(hdev, skb); | 1969 | hci_cc_delete_stored_link_key(hdev, skb); |
1903 | break; | 1970 | break; |
@@ -2029,7 +2096,7 @@ static inline void hci_cmd_status_evt(struct hci_dev *hdev, struct sk_buff *skb) | |||
2029 | 2096 | ||
2030 | case HCI_OP_DISCONNECT: | 2097 | case HCI_OP_DISCONNECT: |
2031 | if (ev->status != 0) | 2098 | if (ev->status != 0) |
2032 | mgmt_disconnect_failed(hdev->id); | 2099 | mgmt_disconnect_failed(hdev); |
2033 | break; | 2100 | break; |
2034 | 2101 | ||
2035 | case HCI_OP_LE_CREATE_CONN: | 2102 | case HCI_OP_LE_CREATE_CONN: |
@@ -2194,7 +2261,7 @@ static inline void hci_pin_code_request_evt(struct hci_dev *hdev, struct sk_buff | |||
2194 | else | 2261 | else |
2195 | secure = 0; | 2262 | secure = 0; |
2196 | 2263 | ||
2197 | mgmt_pin_code_request(hdev->id, &ev->bdaddr, secure); | 2264 | mgmt_pin_code_request(hdev, &ev->bdaddr, secure); |
2198 | } | 2265 | } |
2199 | 2266 | ||
2200 | unlock: | 2267 | unlock: |
@@ -2363,12 +2430,6 @@ static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct | |||
2363 | 2430 | ||
2364 | hci_dev_lock(hdev); | 2431 | hci_dev_lock(hdev); |
2365 | 2432 | ||
2366 | if (!test_and_set_bit(HCI_INQUIRY, &hdev->flags)) { | ||
2367 | |||
2368 | if (test_bit(HCI_MGMT, &hdev->flags)) | ||
2369 | mgmt_discovering(hdev->id, 1); | ||
2370 | } | ||
2371 | |||
2372 | if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) { | 2433 | if ((skb->len - 1) / num_rsp != sizeof(struct inquiry_info_with_rssi)) { |
2373 | struct inquiry_info_with_rssi_and_pscan_mode *info; | 2434 | struct inquiry_info_with_rssi_and_pscan_mode *info; |
2374 | info = (void *) (skb->data + 1); | 2435 | info = (void *) (skb->data + 1); |
@@ -2383,7 +2444,7 @@ static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct | |||
2383 | data.rssi = info->rssi; | 2444 | data.rssi = info->rssi; |
2384 | data.ssp_mode = 0x00; | 2445 | data.ssp_mode = 0x00; |
2385 | hci_inquiry_cache_update(hdev, &data); | 2446 | hci_inquiry_cache_update(hdev, &data); |
2386 | mgmt_device_found(hdev->id, &info->bdaddr, | 2447 | mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, |
2387 | info->dev_class, info->rssi, | 2448 | info->dev_class, info->rssi, |
2388 | NULL); | 2449 | NULL); |
2389 | } | 2450 | } |
@@ -2400,7 +2461,7 @@ static inline void hci_inquiry_result_with_rssi_evt(struct hci_dev *hdev, struct | |||
2400 | data.rssi = info->rssi; | 2461 | data.rssi = info->rssi; |
2401 | data.ssp_mode = 0x00; | 2462 | data.ssp_mode = 0x00; |
2402 | hci_inquiry_cache_update(hdev, &data); | 2463 | hci_inquiry_cache_update(hdev, &data); |
2403 | mgmt_device_found(hdev->id, &info->bdaddr, | 2464 | mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, |
2404 | info->dev_class, info->rssi, | 2465 | info->dev_class, info->rssi, |
2405 | NULL); | 2466 | NULL); |
2406 | } | 2467 | } |
@@ -2531,12 +2592,6 @@ static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct | |||
2531 | if (!num_rsp) | 2592 | if (!num_rsp) |
2532 | return; | 2593 | return; |
2533 | 2594 | ||
2534 | if (!test_and_set_bit(HCI_INQUIRY, &hdev->flags)) { | ||
2535 | |||
2536 | if (test_bit(HCI_MGMT, &hdev->flags)) | ||
2537 | mgmt_discovering(hdev->id, 1); | ||
2538 | } | ||
2539 | |||
2540 | hci_dev_lock(hdev); | 2595 | hci_dev_lock(hdev); |
2541 | 2596 | ||
2542 | for (; num_rsp; num_rsp--, info++) { | 2597 | for (; num_rsp; num_rsp--, info++) { |
@@ -2549,8 +2604,8 @@ static inline void hci_extended_inquiry_result_evt(struct hci_dev *hdev, struct | |||
2549 | data.rssi = info->rssi; | 2604 | data.rssi = info->rssi; |
2550 | data.ssp_mode = 0x01; | 2605 | data.ssp_mode = 0x01; |
2551 | hci_inquiry_cache_update(hdev, &data); | 2606 | hci_inquiry_cache_update(hdev, &data); |
2552 | mgmt_device_found(hdev->id, &info->bdaddr, info->dev_class, | 2607 | mgmt_device_found(hdev, &info->bdaddr, ACL_LINK, |
2553 | info->rssi, info->data); | 2608 | info->dev_class, info->rssi, info->data); |
2554 | } | 2609 | } |
2555 | 2610 | ||
2556 | hci_dev_unlock(hdev); | 2611 | hci_dev_unlock(hdev); |
@@ -2614,7 +2669,7 @@ static inline void hci_io_capa_request_evt(struct hci_dev *hdev, struct sk_buff | |||
2614 | struct hci_cp_io_capability_neg_reply cp; | 2669 | struct hci_cp_io_capability_neg_reply cp; |
2615 | 2670 | ||
2616 | bacpy(&cp.bdaddr, &ev->bdaddr); | 2671 | bacpy(&cp.bdaddr, &ev->bdaddr); |
2617 | cp.reason = 0x18; /* Pairing not allowed */ | 2672 | cp.reason = HCI_ERROR_PAIRING_NOT_ALLOWED; |
2618 | 2673 | ||
2619 | hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY, | 2674 | hci_send_cmd(hdev, HCI_OP_IO_CAPABILITY_NEG_REPLY, |
2620 | sizeof(cp), &cp); | 2675 | sizeof(cp), &cp); |
@@ -2706,7 +2761,7 @@ static inline void hci_user_confirm_request_evt(struct hci_dev *hdev, | |||
2706 | } | 2761 | } |
2707 | 2762 | ||
2708 | confirm: | 2763 | confirm: |
2709 | mgmt_user_confirm_request(hdev->id, &ev->bdaddr, ev->passkey, | 2764 | mgmt_user_confirm_request(hdev, &ev->bdaddr, ev->passkey, |
2710 | confirm_hint); | 2765 | confirm_hint); |
2711 | 2766 | ||
2712 | unlock: | 2767 | unlock: |
@@ -2732,7 +2787,7 @@ static inline void hci_simple_pair_complete_evt(struct hci_dev *hdev, struct sk_ | |||
2732 | * event gets always produced as initiator and is also mapped to | 2787 | * event gets always produced as initiator and is also mapped to |
2733 | * the mgmt_auth_failed event */ | 2788 | * the mgmt_auth_failed event */ |
2734 | if (!test_bit(HCI_CONN_AUTH_PEND, &conn->pend) && ev->status != 0) | 2789 | if (!test_bit(HCI_CONN_AUTH_PEND, &conn->pend) && ev->status != 0) |
2735 | mgmt_auth_failed(hdev->id, &conn->dst, ev->status); | 2790 | mgmt_auth_failed(hdev, &conn->dst, ev->status); |
2736 | 2791 | ||
2737 | hci_conn_put(conn); | 2792 | hci_conn_put(conn); |
2738 | 2793 | ||
@@ -2813,14 +2868,14 @@ static inline void hci_le_conn_complete_evt(struct hci_dev *hdev, struct sk_buff | |||
2813 | } | 2868 | } |
2814 | 2869 | ||
2815 | if (ev->status) { | 2870 | if (ev->status) { |
2816 | mgmt_connect_failed(hdev->id, &ev->bdaddr, ev->status); | 2871 | mgmt_connect_failed(hdev, &ev->bdaddr, conn->type, ev->status); |
2817 | hci_proto_connect_cfm(conn, ev->status); | 2872 | hci_proto_connect_cfm(conn, ev->status); |
2818 | conn->state = BT_CLOSED; | 2873 | conn->state = BT_CLOSED; |
2819 | hci_conn_del(conn); | 2874 | hci_conn_del(conn); |
2820 | goto unlock; | 2875 | goto unlock; |
2821 | } | 2876 | } |
2822 | 2877 | ||
2823 | mgmt_connected(hdev->id, &ev->bdaddr, conn->type); | 2878 | mgmt_connected(hdev, &ev->bdaddr, conn->type); |
2824 | 2879 | ||
2825 | conn->sec_level = BT_SECURITY_LOW; | 2880 | conn->sec_level = BT_SECURITY_LOW; |
2826 | conn->handle = __le16_to_cpu(ev->handle); | 2881 | conn->handle = __le16_to_cpu(ev->handle); |
@@ -3104,5 +3159,5 @@ void hci_si_event(struct hci_dev *hdev, int type, int dlen, void *data) | |||
3104 | kfree_skb(skb); | 3159 | kfree_skb(skb); |
3105 | } | 3160 | } |
3106 | 3161 | ||
3107 | module_param(enable_le, bool, 0444); | 3162 | module_param(enable_le, bool, 0644); |
3108 | MODULE_PARM_DESC(enable_le, "Enable LE support"); | 3163 | MODULE_PARM_DESC(enable_le, "Enable LE support"); |