aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/net/bluetooth/hci.h1
-rw-r--r--net/bluetooth/hci_conn.c51
-rw-r--r--net/bluetooth/hci_event.c7
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
608static 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
646struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst, 608struct 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: