diff options
Diffstat (limited to 'net/bluetooth/hci_event.c')
-rw-r--r-- | net/bluetooth/hci_event.c | 59 |
1 files changed, 34 insertions, 25 deletions
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index 5391469ff1a5..5935f748c0f9 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
@@ -195,6 +195,11 @@ static void hci_cc_reset(struct hci_dev *hdev, struct sk_buff *skb) | |||
195 | 195 | ||
196 | memset(hdev->adv_data, 0, sizeof(hdev->adv_data)); | 196 | memset(hdev->adv_data, 0, sizeof(hdev->adv_data)); |
197 | hdev->adv_data_len = 0; | 197 | hdev->adv_data_len = 0; |
198 | |||
199 | memset(hdev->scan_rsp_data, 0, sizeof(hdev->scan_rsp_data)); | ||
200 | hdev->scan_rsp_data_len = 0; | ||
201 | |||
202 | hdev->ssp_debug_mode = 0; | ||
198 | } | 203 | } |
199 | 204 | ||
200 | static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb) | 205 | static void hci_cc_write_local_name(struct hci_dev *hdev, struct sk_buff *skb) |
@@ -310,11 +315,6 @@ static void hci_cc_write_scan_enable(struct hci_dev *hdev, struct sk_buff *skb) | |||
310 | set_bit(HCI_ISCAN, &hdev->flags); | 315 | set_bit(HCI_ISCAN, &hdev->flags); |
311 | if (!old_iscan) | 316 | if (!old_iscan) |
312 | mgmt_discoverable(hdev, 1); | 317 | mgmt_discoverable(hdev, 1); |
313 | if (hdev->discov_timeout > 0) { | ||
314 | int to = msecs_to_jiffies(hdev->discov_timeout * 1000); | ||
315 | queue_delayed_work(hdev->workqueue, &hdev->discov_off, | ||
316 | to); | ||
317 | } | ||
318 | } else if (old_iscan) | 318 | } else if (old_iscan) |
319 | mgmt_discoverable(hdev, 0); | 319 | mgmt_discoverable(hdev, 0); |
320 | 320 | ||
@@ -470,14 +470,13 @@ static void hci_cc_read_local_version(struct hci_dev *hdev, struct sk_buff *skb) | |||
470 | if (rp->status) | 470 | if (rp->status) |
471 | return; | 471 | return; |
472 | 472 | ||
473 | hdev->hci_ver = rp->hci_ver; | 473 | if (test_bit(HCI_SETUP, &hdev->dev_flags)) { |
474 | hdev->hci_rev = __le16_to_cpu(rp->hci_rev); | 474 | hdev->hci_ver = rp->hci_ver; |
475 | hdev->lmp_ver = rp->lmp_ver; | 475 | hdev->hci_rev = __le16_to_cpu(rp->hci_rev); |
476 | hdev->manufacturer = __le16_to_cpu(rp->manufacturer); | 476 | hdev->lmp_ver = rp->lmp_ver; |
477 | hdev->lmp_subver = __le16_to_cpu(rp->lmp_subver); | 477 | hdev->manufacturer = __le16_to_cpu(rp->manufacturer); |
478 | 478 | hdev->lmp_subver = __le16_to_cpu(rp->lmp_subver); | |
479 | BT_DBG("%s manufacturer 0x%4.4x hci ver %d:%d", hdev->name, | 479 | } |
480 | hdev->manufacturer, hdev->hci_ver, hdev->hci_rev); | ||
481 | } | 480 | } |
482 | 481 | ||
483 | static void hci_cc_read_local_commands(struct hci_dev *hdev, | 482 | static void hci_cc_read_local_commands(struct hci_dev *hdev, |
@@ -557,7 +556,8 @@ static void hci_cc_read_local_ext_features(struct hci_dev *hdev, | |||
557 | if (rp->status) | 556 | if (rp->status) |
558 | return; | 557 | return; |
559 | 558 | ||
560 | hdev->max_page = rp->max_page; | 559 | if (hdev->max_page < rp->max_page) |
560 | hdev->max_page = rp->max_page; | ||
561 | 561 | ||
562 | if (rp->page < HCI_MAX_PAGES) | 562 | if (rp->page < HCI_MAX_PAGES) |
563 | memcpy(hdev->features[rp->page], rp->features, 8); | 563 | memcpy(hdev->features[rp->page], rp->features, 8); |
@@ -939,14 +939,6 @@ static void hci_cc_le_set_adv_enable(struct hci_dev *hdev, struct sk_buff *skb) | |||
939 | clear_bit(HCI_ADVERTISING, &hdev->dev_flags); | 939 | clear_bit(HCI_ADVERTISING, &hdev->dev_flags); |
940 | } | 940 | } |
941 | 941 | ||
942 | if (*sent && !test_bit(HCI_INIT, &hdev->flags)) { | ||
943 | struct hci_request req; | ||
944 | |||
945 | hci_req_init(&req, hdev); | ||
946 | hci_update_ad(&req); | ||
947 | hci_req_run(&req, NULL); | ||
948 | } | ||
949 | |||
950 | hci_dev_unlock(hdev); | 942 | hci_dev_unlock(hdev); |
951 | } | 943 | } |
952 | 944 | ||
@@ -1702,7 +1694,7 @@ static void hci_conn_request_evt(struct hci_dev *hdev, struct sk_buff *skb) | |||
1702 | &flags); | 1694 | &flags); |
1703 | 1695 | ||
1704 | if ((mask & HCI_LM_ACCEPT) && | 1696 | if ((mask & HCI_LM_ACCEPT) && |
1705 | !hci_blacklist_lookup(hdev, &ev->bdaddr)) { | 1697 | !hci_blacklist_lookup(hdev, &ev->bdaddr, BDADDR_BREDR)) { |
1706 | /* Connection accepted */ | 1698 | /* Connection accepted */ |
1707 | struct inquiry_entry *ie; | 1699 | struct inquiry_entry *ie; |
1708 | struct hci_conn *conn; | 1700 | struct hci_conn *conn; |
@@ -2559,7 +2551,6 @@ static void hci_mode_change_evt(struct hci_dev *hdev, struct sk_buff *skb) | |||
2559 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); | 2551 | conn = hci_conn_hash_lookup_handle(hdev, __le16_to_cpu(ev->handle)); |
2560 | if (conn) { | 2552 | if (conn) { |
2561 | conn->mode = ev->mode; | 2553 | conn->mode = ev->mode; |
2562 | conn->interval = __le16_to_cpu(ev->interval); | ||
2563 | 2554 | ||
2564 | if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND, | 2555 | if (!test_and_clear_bit(HCI_CONN_MODE_CHANGE_PEND, |
2565 | &conn->flags)) { | 2556 | &conn->flags)) { |
@@ -2941,6 +2932,23 @@ unlock: | |||
2941 | hci_dev_unlock(hdev); | 2932 | hci_dev_unlock(hdev); |
2942 | } | 2933 | } |
2943 | 2934 | ||
2935 | static inline size_t eir_get_length(u8 *eir, size_t eir_len) | ||
2936 | { | ||
2937 | size_t parsed = 0; | ||
2938 | |||
2939 | while (parsed < eir_len) { | ||
2940 | u8 field_len = eir[0]; | ||
2941 | |||
2942 | if (field_len == 0) | ||
2943 | return parsed; | ||
2944 | |||
2945 | parsed += field_len + 1; | ||
2946 | eir += field_len + 1; | ||
2947 | } | ||
2948 | |||
2949 | return eir_len; | ||
2950 | } | ||
2951 | |||
2944 | static void hci_extended_inquiry_result_evt(struct hci_dev *hdev, | 2952 | static void hci_extended_inquiry_result_evt(struct hci_dev *hdev, |
2945 | struct sk_buff *skb) | 2953 | struct sk_buff *skb) |
2946 | { | 2954 | { |
@@ -3181,7 +3189,8 @@ static void hci_user_confirm_request_evt(struct hci_dev *hdev, | |||
3181 | 3189 | ||
3182 | if (hdev->auto_accept_delay > 0) { | 3190 | if (hdev->auto_accept_delay > 0) { |
3183 | int delay = msecs_to_jiffies(hdev->auto_accept_delay); | 3191 | int delay = msecs_to_jiffies(hdev->auto_accept_delay); |
3184 | mod_timer(&conn->auto_accept_timer, jiffies + delay); | 3192 | queue_delayed_work(conn->hdev->workqueue, |
3193 | &conn->auto_accept_work, delay); | ||
3185 | goto unlock; | 3194 | goto unlock; |
3186 | } | 3195 | } |
3187 | 3196 | ||