Bluetooth: Fix updating scan mode in set_bredr()
authorJohan Hedberg <johan.hedberg@intel.com>
Mon, 14 Oct 2013 18:15:26 +0000 (21:15 +0300)
committerMarcel Holtmann <marcel@holtmann.org>
Mon, 14 Oct 2013 18:23:28 +0000 (11:23 -0700)
Now that the connectable setting is also applicable for the LE side it's
possible that the HCI_CONNECTABLE flag is already set when changing the
BR/EDR setting from false to true while the controller is powered. In
this situation we need to update the BR/EDR scan mode to reflect the
setting. Additionally, since HCI_CONNECTABLE also applies to LE we must
not clear the HCI_CONNECTABLE flag when disabling bredr.

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

index 48aa23977da340e8f5109b26bf73f12f1b8989a3..0bad451e5a90626e25ce3be1e4c4e6f5b5b273d6 100644 (file)
@@ -3640,7 +3640,6 @@ static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
 
        if (!hdev_is_powered(hdev)) {
                if (!cp->val) {
-                       clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
                        clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
                        clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
                        clear_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
@@ -3683,7 +3682,12 @@ static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
        set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
 
        hci_req_init(&req, hdev);
+
+       if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
+               set_bredr_scan(&req);
+
        hci_update_ad(&req);
+
        err = hci_req_run(&req, set_bredr_complete);
        if (err < 0)
                mgmt_pending_remove(cmd);