diff options
Diffstat (limited to 'net/bluetooth/hci_event.c')
| -rw-r--r-- | net/bluetooth/hci_event.c | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 28517bad796c..bfef5bae0b3a 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | BlueZ - Bluetooth protocol stack for Linux | 2 | BlueZ - Bluetooth protocol stack for Linux |
| 3 | Copyright (C) 2000-2001 Qualcomm Incorporated | 3 | Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved. |
| 4 | 4 | ||
| 5 | Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com> | 5 | Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com> |
| 6 | 6 | ||
| @@ -584,7 +584,7 @@ static inline void hci_cs_create_conn(struct hci_dev *hdev, __u8 status) | |||
| 584 | conn->out = 1; | 584 | conn->out = 1; |
| 585 | conn->link_mode |= HCI_LM_MASTER; | 585 | conn->link_mode |= HCI_LM_MASTER; |
| 586 | } else | 586 | } else |
| 587 | BT_ERR("No memmory for new connection"); | 587 | BT_ERR("No memory for new connection"); |
| 588 | } | 588 | } |
| 589 | } | 589 | } |
| 590 | 590 | ||
| @@ -785,9 +785,13 @@ static void hci_cs_sniff_mode(struct hci_dev *hdev, __u8 status) | |||
| 785 | hci_dev_lock(hdev); | 785 | hci_dev_lock(hdev); |
| 786 | 786 | ||
| 787 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle)); | 787 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle)); |
| 788 | if (conn) | 788 | if (conn) { |
| 789 | clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend); | 789 | clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend); |
| 790 | 790 | ||
| 791 | if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->pend)) | ||
| 792 | hci_sco_setup(conn, status); | ||
| 793 | } | ||
| 794 | |||
| 791 | hci_dev_unlock(hdev); | 795 | hci_dev_unlock(hdev); |
| 792 | } | 796 | } |
| 793 | 797 | ||
| @@ -808,9 +812,13 @@ static void hci_cs_exit_sniff_mode(struct hci_dev *hdev, __u8 status) | |||
| 808 | hci_dev_lock(hdev); | 812 | hci_dev_lock(hdev); |
| 809 | 813 | ||
| 810 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle)); | 814 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(cp->handle)); |
| 811 | if (conn) | 815 | if (conn) { |
| 812 | clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend); | 816 | clear_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend); |
| 813 | 817 | ||
| 818 | if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->pend)) | ||
| 819 | hci_sco_setup(conn, status); | ||
| 820 | } | ||
| 821 | |||
| 814 | hci_dev_unlock(hdev); | 822 | hci_dev_unlock(hdev); |
| 815 | } | 823 | } |
| 816 | 824 | ||
| @@ -915,20 +923,8 @@ static inline void hci_conn_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
| 915 | } else | 923 | } else |
| 916 | conn->state = BT_CLOSED; | 924 | conn->state = BT_CLOSED; |
| 917 | 925 | ||
| 918 | if (conn->type == ACL_LINK) { | 926 | if (conn->type == ACL_LINK) |
| 919 | struct hci_conn *sco = conn->link; | 927 | hci_sco_setup(conn, ev->status); |
| 920 | if (sco) { | ||
| 921 | if (!ev->status) { | ||
| 922 | if (lmp_esco_capable(hdev)) | ||
| 923 | hci_setup_sync(sco, conn->handle); | ||
| 924 | else | ||
| 925 | hci_add_sco(sco, conn->handle); | ||
| 926 | } else { | ||
| 927 | hci_proto_connect_cfm(sco, ev->status); | ||
| 928 | hci_conn_del(sco); | ||
| 929 | } | ||
| 930 | } | ||
| 931 | } | ||
| 932 | 928 | ||
| 933 | if (ev->status) { | 929 | if (ev->status) { |
| 934 | hci_proto_connect_cfm(conn, ev->status); | 930 | hci_proto_connect_cfm(conn, ev->status); |
| @@ -952,7 +948,7 @@ static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *sk | |||
| 952 | 948 | ||
| 953 | mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type); | 949 | mask |= hci_proto_connect_ind(hdev, &ev->bdaddr, ev->link_type); |
| 954 | 950 | ||
| 955 | if (mask & HCI_LM_ACCEPT) { | 951 | if ((mask & HCI_LM_ACCEPT) && !hci_blacklist_lookup(hdev, &ev->bdaddr)) { |
| 956 | /* Connection accepted */ | 952 | /* Connection accepted */ |
| 957 | struct inquiry_entry *ie; | 953 | struct inquiry_entry *ie; |
| 958 | struct hci_conn *conn; | 954 | struct hci_conn *conn; |
| @@ -965,7 +961,7 @@ static inline void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *sk | |||
| 965 | conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr); | 961 | conn = hci_conn_hash_lookup_ba(hdev, ev->link_type, &ev->bdaddr); |
| 966 | if (!conn) { | 962 | if (!conn) { |
| 967 | if (!(conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr))) { | 963 | if (!(conn = hci_conn_add(hdev, ev->link_type, &ev->bdaddr))) { |
| 968 | BT_ERR("No memmory for new connection"); | 964 | BT_ERR("No memory for new connection"); |
| 969 | hci_dev_unlock(hdev); | 965 | hci_dev_unlock(hdev); |
| 970 | return; | 966 | return; |
| 971 | } | 967 | } |
| @@ -1049,6 +1045,8 @@ static inline void hci_auth_complete_evt(struct hci_dev *hdev, struct sk_buff *s | |||
| 1049 | if (conn) { | 1045 | if (conn) { |
| 1050 | if (!ev->status) | 1046 | if (!ev->status) |
| 1051 | conn->link_mode |= HCI_LM_AUTH; | 1047 | conn->link_mode |= HCI_LM_AUTH; |
| 1048 | else | ||
| 1049 | conn->sec_level = BT_SECURITY_LOW; | ||
| 1052 | 1050 | ||
| 1053 | clear_bit(HCI_CONN_AUTH_PEND, &conn->pend); | 1051 | clear_bit(HCI_CONN_AUTH_PEND, &conn->pend); |
| 1054 | 1052 | ||
| @@ -1479,6 +1477,9 @@ static inline void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb | |||
| 1479 | else | 1477 | else |
| 1480 | conn->power_save = 0; | 1478 | conn->power_save = 0; |
| 1481 | } | 1479 | } |
| 1480 | |||
| 1481 | if (test_and_clear_bit(HCI_CONN_SCO_SETUP_PEND, &conn->pend)) | ||
| 1482 | hci_sco_setup(conn, ev->status); | ||
| 1482 | } | 1483 | } |
| 1483 | 1484 | ||
| 1484 | hci_dev_unlock(hdev); | 1485 | hci_dev_unlock(hdev); |
| @@ -1698,7 +1699,9 @@ static inline void hci_sync_conn_complete_evt(struct hci_dev *hdev, struct sk_bu | |||
| 1698 | hci_conn_add_sysfs(conn); | 1699 | hci_conn_add_sysfs(conn); |
| 1699 | break; | 1700 | break; |
| 1700 | 1701 | ||
| 1702 | case 0x11: /* Unsupported Feature or Parameter Value */ | ||
| 1701 | case 0x1c: /* SCO interval rejected */ | 1703 | case 0x1c: /* SCO interval rejected */ |
| 1704 | case 0x1a: /* Unsupported Remote Feature */ | ||
| 1702 | case 0x1f: /* Unspecified error */ | 1705 | case 0x1f: /* Unspecified error */ |
| 1703 | if (conn->out && conn->attempt < 2) { | 1706 | if (conn->out && conn->attempt < 2) { |
| 1704 | conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) | | 1707 | conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) | |
