diff options
-rw-r--r-- | include/net/bluetooth/hci.h | 1 | ||||
-rw-r--r-- | net/bluetooth/hci_conn.c | 51 | ||||
-rw-r--r-- | net/bluetooth/hci_event.c | 7 |
3 files changed, 16 insertions, 43 deletions
diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h index 0409f0119d2b..be150cf8cd43 100644 --- a/include/net/bluetooth/hci.h +++ b/include/net/bluetooth/hci.h | |||
@@ -140,6 +140,7 @@ enum { | |||
140 | HCI_FAST_CONNECTABLE, | 140 | HCI_FAST_CONNECTABLE, |
141 | HCI_BREDR_ENABLED, | 141 | HCI_BREDR_ENABLED, |
142 | HCI_6LOWPAN_ENABLED, | 142 | HCI_6LOWPAN_ENABLED, |
143 | HCI_LE_SCAN_INTERRUPTED, | ||
143 | }; | 144 | }; |
144 | 145 | ||
145 | /* A mask for the flags that are supposed to remain when a reset happens | 146 | /* A mask for the flags that are supposed to remain when a reset happens |
diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c index 5330fcfde93d..7c713c4675ba 100644 --- a/net/bluetooth/hci_conn.c +++ b/net/bluetooth/hci_conn.c | |||
@@ -605,44 +605,6 @@ static void hci_req_add_le_create_conn(struct hci_request *req, | |||
605 | conn->state = BT_CONNECT; | 605 | conn->state = BT_CONNECT; |
606 | } | 606 | } |
607 | 607 | ||
608 | static void stop_scan_complete(struct hci_dev *hdev, u8 status) | ||
609 | { | ||
610 | struct hci_request req; | ||
611 | struct hci_conn *conn; | ||
612 | int err; | ||
613 | |||
614 | conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT); | ||
615 | if (!conn) | ||
616 | return; | ||
617 | |||
618 | if (status) { | ||
619 | BT_DBG("HCI request failed to stop scanning: status 0x%2.2x", | ||
620 | status); | ||
621 | |||
622 | hci_dev_lock(hdev); | ||
623 | hci_le_conn_failed(conn, status); | ||
624 | hci_dev_unlock(hdev); | ||
625 | return; | ||
626 | } | ||
627 | |||
628 | /* Since we may have prematurely stopped discovery procedure, we should | ||
629 | * update discovery state. | ||
630 | */ | ||
631 | hci_discovery_set_state(hdev, DISCOVERY_STOPPED); | ||
632 | |||
633 | hci_req_init(&req, hdev); | ||
634 | |||
635 | hci_req_add_le_create_conn(&req, conn); | ||
636 | |||
637 | err = hci_req_run(&req, create_le_conn_complete); | ||
638 | if (err) { | ||
639 | hci_dev_lock(hdev); | ||
640 | hci_le_conn_failed(conn, HCI_ERROR_MEMORY_EXCEEDED); | ||
641 | hci_dev_unlock(hdev); | ||
642 | return; | ||
643 | } | ||
644 | } | ||
645 | |||
646 | struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, | 608 | struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, |
647 | u8 dst_type, u8 sec_level, u8 auth_type) | 609 | u8 dst_type, u8 sec_level, u8 auth_type) |
648 | { | 610 | { |
@@ -721,16 +683,19 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, | |||
721 | hci_req_init(&req, hdev); | 683 | hci_req_init(&req, hdev); |
722 | 684 | ||
723 | /* If controller is scanning, we stop it since some controllers are | 685 | /* If controller is scanning, we stop it since some controllers are |
724 | * not able to scan and connect at the same time. | 686 | * not able to scan and connect at the same time. Also set the |
687 | * HCI_LE_SCAN_INTERRUPTED flag so that the command complete | ||
688 | * handler for scan disabling knows to set the correct discovery | ||
689 | * state. | ||
725 | */ | 690 | */ |
726 | if (test_bit(HCI_LE_SCAN, &hdev->dev_flags)) { | 691 | if (test_bit(HCI_LE_SCAN, &hdev->dev_flags)) { |
727 | hci_req_add_le_scan_disable(&req); | 692 | hci_req_add_le_scan_disable(&req); |
728 | err = hci_req_run(&req, stop_scan_complete); | 693 | set_bit(HCI_LE_SCAN_INTERRUPTED, &hdev->dev_flags); |
729 | } else { | ||
730 | hci_req_add_le_create_conn(&req, conn); | ||
731 | err = hci_req_run(&req, create_le_conn_complete); | ||
732 | } | 694 | } |
733 | 695 | ||
696 | hci_req_add_le_create_conn(&req, conn); | ||
697 | |||
698 | err = hci_req_run(&req, create_le_conn_complete); | ||
734 | if (err) { | 699 | if (err) { |
735 | hci_conn_del(conn); | 700 | hci_conn_del(conn); |
736 | return ERR_PTR(err); | 701 | return ERR_PTR(err); |
diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c index e3335b03c992..c3b0a08f5ab4 100644 --- a/net/bluetooth/hci_event.c +++ b/net/bluetooth/hci_event.c | |||
@@ -1024,6 +1024,13 @@ static void hci_cc_le_set_scan_enable(struct hci_dev *hdev, | |||
1024 | cancel_delayed_work(&hdev->le_scan_disable); | 1024 | cancel_delayed_work(&hdev->le_scan_disable); |
1025 | 1025 | ||
1026 | clear_bit(HCI_LE_SCAN, &hdev->dev_flags); | 1026 | clear_bit(HCI_LE_SCAN, &hdev->dev_flags); |
1027 | /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we | ||
1028 | * interrupted scanning due to a connect request. Mark | ||
1029 | * therefore discovery as stopped. | ||
1030 | */ | ||
1031 | if (test_and_clear_bit(HCI_LE_SCAN_INTERRUPTED, | ||
1032 | &hdev->dev_flags)) | ||
1033 | hci_discovery_set_state(hdev, DISCOVERY_STOPPED); | ||
1027 | break; | 1034 | break; |
1028 | 1035 | ||
1029 | default: | 1036 | default: |