summaryrefslogtreecommitdiffstats
path: root/net/bluetooth/hci_core.c
diff options
context:
space:
mode:
authorJohan Hedberg <johan.hedberg@intel.com>2014-07-10 12:09:08 +0300
committerMarcel Holtmann <marcel@holtmann.org>2014-07-10 11:14:20 +0200
commitbc6d2d04182877b198c1a945b7c401decbbb8c02 (patch)
tree45eb37701152bc89d506ab639112e3ac14ef12ee /net/bluetooth/hci_core.c
parent123abc0833181aec4796c628d9ffd608b2b41d5c (diff)
downloadop-kernel-dev-bc6d2d04182877b198c1a945b7c401decbbb8c02.zip
op-kernel-dev-bc6d2d04182877b198c1a945b7c401decbbb8c02.tar.gz
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 27c40e4..3321c65 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);
OpenPOWER on IntegriCloud