summaryrefslogtreecommitdiffstats
path: root/net/bluetooth/hci_core.c
diff options
context:
space:
mode:
authorJohan Hedberg2014-07-10 11:09:08 +0200
committerMarcel Holtmann2014-07-10 11:14:20 +0200
commitbc6d2d04182877b198c1a945b7c401decbbb8c02 (patch)
tree45eb37701152bc89d506ab639112e3ac14ef12ee /net/bluetooth/hci_core.c
parentBluetooth: Refactor ioctl scan state update to its own function (diff)
downloadkernel-qcow2-linux-bc6d2d04182877b198c1a945b7c401decbbb8c02.tar.gz
kernel-qcow2-linux-bc6d2d04182877b198c1a945b7c401decbbb8c02.tar.xz
kernel-qcow2-linux-bc6d2d04182877b198c1a945b7c401decbbb8c02.zip
Bluetooth: Remove unneeded mgmt_discoverable function
Since the HCISETSCAN ioctl is the only non-mgmt user we care about for setting the right discoverable state we can simply do the necessary updates in the ioctl handler function instead. This then allows the removal of the mgmt_discoverable function and should simplify that state handling considerably. Signed-off-by: Johan Hedberg <johan.hedberg@intel.com> Signed-off-by: Marcel Holtmann <marcel@holtmann.org>
Diffstat (limited to 'net/bluetooth/hci_core.c')
-rw-r--r--net/bluetooth/hci_core.c24
1 files changed, 20 insertions, 4 deletions
diff --git a/net/bluetooth/hci_core.c b/net/bluetooth/hci_core.c
index 27c40e4901a3..3321c65c73ac 100644
--- a/net/bluetooth/hci_core.c
+++ b/net/bluetooth/hci_core.c
@@ -2657,7 +2657,7 @@ done:
static void hci_update_scan_state(struct hci_dev *hdev, u8 scan)
{
- bool conn_changed;
+ bool conn_changed, discov_changed;
BT_DBG("%s scan 0x%02x", hdev->name, scan);
@@ -2668,11 +2668,27 @@ static void hci_update_scan_state(struct hci_dev *hdev, u8 scan)
conn_changed = test_and_clear_bit(HCI_CONNECTABLE,
&hdev->dev_flags);
+ if ((scan & SCAN_INQUIRY)) {
+ discov_changed = !test_and_set_bit(HCI_DISCOVERABLE,
+ &hdev->dev_flags);
+ } else {
+ clear_bit(HCI_LIMITED_DISCOVERABLE, &hdev->dev_flags);
+ discov_changed = test_and_clear_bit(HCI_DISCOVERABLE,
+ &hdev->dev_flags);
+ }
+
if (!test_bit(HCI_MGMT, &hdev->dev_flags))
return;
- if (conn_changed)
+ if (conn_changed || discov_changed) {
+ /* In case this was disabled through mgmt */
+ set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);
+
+ if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
+ mgmt_update_adv_data(hdev);
+
mgmt_new_settings(hdev);
+ }
}
int hci_dev_cmd(unsigned int cmd, void __user *arg)
@@ -2736,8 +2752,8 @@ int hci_dev_cmd(unsigned int cmd, void __user *arg)
err = hci_req_sync(hdev, hci_scan_req, dr.dev_opt,
HCI_INIT_TIMEOUT);
- /* Ensure that the connectable state gets correctly
- * modified as this was a non-mgmt change.
+ /* Ensure that the connectable and discoverable states
+ * get correctly modified as this was a non-mgmt change.
*/
if (!err)
hci_update_scan_state(hdev, dr.dev_opt);