Bluetooth: Use an async request for mgmt_set_connectable
authorJohan Hedberg <johan.hedberg@intel.com>
Fri, 15 Mar 2013 22:07:04 +0000 (17:07 -0500)
committerGustavo Padovan <gustavo.padovan@collabora.co.uk>
Mon, 18 Mar 2013 17:02:06 +0000 (14:02 -0300)
This patch changes the mgmt_set_connectable handler to use an async
request for sending the required HCI command. This is necessary
preparation for handling the fast connectable change that needs to be
associated with disabling the connectable setting.

Signed-off-by: Johan Hedberg <johan.hedberg@intel.com>
Acked-by: Marcel Holtmann <marcel@holtmann.org>
Signed-off-by: Gustavo Padovan <gustavo.padovan@collabora.co.uk>
net/bluetooth/mgmt.c

index 15305fa5506713ea1a0a9086c06da0ff26a6f9af..a4f928ddc28a2d3a386dec3d4da1ff3bb32ef8f1 100644 (file)
@@ -996,11 +996,32 @@ failed:
        return err;
 }
 
+static void set_connectable_complete(struct hci_dev *hdev, u8 status)
+{
+       struct pending_cmd *cmd;
+
+       BT_DBG("status 0x%02x", status);
+
+       hci_dev_lock(hdev);
+
+       cmd = mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
+       if (!cmd)
+               goto unlock;
+
+       send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev);
+
+       mgmt_pending_remove(cmd);
+
+unlock:
+       hci_dev_unlock(hdev);
+}
+
 static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
                           u16 len)
 {
        struct mgmt_mode *cp = data;
        struct pending_cmd *cmd;
+       struct hci_request req;
        u8 scan;
        int err;
 
@@ -1067,7 +1088,11 @@ static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
                        cancel_delayed_work(&hdev->discov_off);
        }
 
-       err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
+       hci_req_init(&req, hdev);
+
+       hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
+
+       err = hci_req_run(&req, set_connectable_complete);
        if (err < 0)
                mgmt_pending_remove(cmd);
 
@@ -3328,7 +3353,7 @@ int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
 
 int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
 {
-       struct cmd_lookup match = { NULL, hdev };
+       struct pending_cmd *cmd;
        bool changed = false;
        int err = 0;
 
@@ -3340,14 +3365,10 @@ int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
                        changed = true;
        }
 
-       mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev, settings_rsp,
-                            &match);
+       cmd = mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
 
        if (changed)
-               err = new_settings(hdev, match.sk);
-
-       if (match.sk)
-               sock_put(match.sk);
+               err = new_settings(hdev, cmd ? cmd->sk : NULL);
 
        return err;
 }