Bluetooth: Remove unnecessary stop_scan_complete function
authorJohan Hedberg <johan.hedberg@intel.com>
Fri, 28 Feb 2014 18:26:13 +0000 (20:26 +0200)
committerMarcel Holtmann <marcel@holtmann.org>
Fri, 28 Feb 2014 18:28:17 +0000 (10:28 -0800)
The stop_scan_complete function was used as an intermediate step before
doing the actual connection creation. Since we're using hci_request
there's no reason to have this extra function around, i.e. we can simply
put both HCI commands into the same request.

The single task that the intermediate function had, i.e. indicating
discovery as stopped is now taken care of by a new
HCI_LE_SCAN_INTERRUPTED flag which allows us to do the discovery state
update when the stop scan command completes.

Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
include/net/bluetooth/hci.h
net/bluetooth/hci_conn.c
net/bluetooth/hci_event.c

index 0409f0119d2bb65703e7a4dd950436844ceee8fd..be150cf8cd432298d47860268a1d4566af74481d 100644 (file)
@@ -140,6 +140,7 @@ enum {
        HCI_FAST_CONNECTABLE,
        HCI_BREDR_ENABLED,
        HCI_6LOWPAN_ENABLED,
+       HCI_LE_SCAN_INTERRUPTED,
 };
 
 /* A mask for the flags that are supposed to remain when a reset happens
index 5330fcfde93dcae71c38c0131ec81f0e5cbd6b5b..7c713c4675bafa7f6da02837daa2e2ae5f57becf 100644 (file)
@@ -605,44 +605,6 @@ static void hci_req_add_le_create_conn(struct hci_request *req,
        conn->state = BT_CONNECT;
 }
 
-static void stop_scan_complete(struct hci_dev *hdev, u8 status)
-{
-       struct hci_request req;
-       struct hci_conn *conn;
-       int err;
-
-       conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
-       if (!conn)
-               return;
-
-       if (status) {
-               BT_DBG("HCI request failed to stop scanning: status 0x%2.2x",
-                      status);
-
-               hci_dev_lock(hdev);
-               hci_le_conn_failed(conn, status);
-               hci_dev_unlock(hdev);
-               return;
-       }
-
-       /* Since we may have prematurely stopped discovery procedure, we should
-        * update discovery state.
-        */
-       hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
-
-       hci_req_init(&req, hdev);
-
-       hci_req_add_le_create_conn(&req, conn);
-
-       err = hci_req_run(&req, create_le_conn_complete);
-       if (err) {
-               hci_dev_lock(hdev);
-               hci_le_conn_failed(conn, HCI_ERROR_MEMORY_EXCEEDED);
-               hci_dev_unlock(hdev);
-               return;
-       }
-}
-
 struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
                                u8 dst_type, u8 sec_level, u8 auth_type)
 {
@@ -721,16 +683,19 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
        hci_req_init(&req, hdev);
 
        /* If controller is scanning, we stop it since some controllers are
-        * not able to scan and connect at the same time.
+        * not able to scan and connect at the same time. Also set the
+        * HCI_LE_SCAN_INTERRUPTED flag so that the command complete
+        * handler for scan disabling knows to set the correct discovery
+        * state.
         */
        if (test_bit(HCI_LE_SCAN, &hdev->dev_flags)) {
                hci_req_add_le_scan_disable(&req);
-               err = hci_req_run(&req, stop_scan_complete);
-       } else {
-               hci_req_add_le_create_conn(&req, conn);
-               err = hci_req_run(&req, create_le_conn_complete);
+               set_bit(HCI_LE_SCAN_INTERRUPTED, &hdev->dev_flags);
        }
 
+       hci_req_add_le_create_conn(&req, conn);
+
+       err = hci_req_run(&req, create_le_conn_complete);
        if (err) {
                hci_conn_del(conn);
                return ERR_PTR(err);
index e3335b03c9923145a1b92216f3958bc660f07b03..c3b0a08f5ab4e8c3e21423a282877e44c89d850e 100644 (file)
@@ -1024,6 +1024,13 @@ static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
                cancel_delayed_work(&hdev->le_scan_disable);
 
                clear_bit(HCI_LE_SCAN, &hdev->dev_flags);
+               /* The HCI_LE_SCAN_INTERRUPTED flag indicates that we
+                * interrupted scanning due to a connect request. Mark
+                * therefore discovery as stopped.
+                */
+               if (test_and_clear_bit(HCI_LE_SCAN_INTERRUPTED,
+                                      &hdev->dev_flags))
+                       hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
                break;
 
        default: