|
@@ -1923,6 +1923,30 @@ static void discov_update(struct work_struct *work)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void discov_off(struct work_struct *work)
|
|
|
|
+{
|
|
|
|
+ struct hci_dev *hdev = container_of(work, struct hci_dev,
|
|
|
|
+ discov_off.work);
|
|
|
|
+
|
|
|
|
+ BT_DBG("%s", hdev->name);
|
|
|
|
+
|
|
|
|
+ hci_dev_lock(hdev);
|
|
|
|
+
|
|
|
|
+ /* When discoverable timeout triggers, then just make sure
|
|
|
|
+ * the limited discoverable flag is cleared. Even in the case
|
|
|
|
+ * of a timeout triggered from general discoverable, it is
|
|
|
|
+ * safe to unconditionally clear the flag.
|
|
|
|
+ */
|
|
|
|
+ hci_dev_clear_flag(hdev, HCI_LIMITED_DISCOVERABLE);
|
|
|
|
+ hci_dev_clear_flag(hdev, HCI_DISCOVERABLE);
|
|
|
|
+ hdev->discov_timeout = 0;
|
|
|
|
+
|
|
|
|
+ hci_dev_unlock(hdev);
|
|
|
|
+
|
|
|
|
+ hci_req_sync(hdev, discoverable_update, 0, HCI_CMD_TIMEOUT, NULL);
|
|
|
|
+ mgmt_new_settings(hdev);
|
|
|
|
+}
|
|
|
|
+
|
|
void hci_request_setup(struct hci_dev *hdev)
|
|
void hci_request_setup(struct hci_dev *hdev)
|
|
{
|
|
{
|
|
INIT_WORK(&hdev->discov_update, discov_update);
|
|
INIT_WORK(&hdev->discov_update, discov_update);
|
|
@@ -1930,6 +1954,7 @@ void hci_request_setup(struct hci_dev *hdev)
|
|
INIT_WORK(&hdev->scan_update, scan_update_work);
|
|
INIT_WORK(&hdev->scan_update, scan_update_work);
|
|
INIT_WORK(&hdev->connectable_update, connectable_update_work);
|
|
INIT_WORK(&hdev->connectable_update, connectable_update_work);
|
|
INIT_WORK(&hdev->discoverable_update, discoverable_update_work);
|
|
INIT_WORK(&hdev->discoverable_update, discoverable_update_work);
|
|
|
|
+ INIT_DELAYED_WORK(&hdev->discov_off, discov_off);
|
|
INIT_DELAYED_WORK(&hdev->le_scan_disable, le_scan_disable_work);
|
|
INIT_DELAYED_WORK(&hdev->le_scan_disable, le_scan_disable_work);
|
|
INIT_DELAYED_WORK(&hdev->le_scan_restart, le_scan_restart_work);
|
|
INIT_DELAYED_WORK(&hdev->le_scan_restart, le_scan_restart_work);
|
|
INIT_DELAYED_WORK(&hdev->adv_instance_expire, adv_timeout_expire);
|
|
INIT_DELAYED_WORK(&hdev->adv_instance_expire, adv_timeout_expire);
|
|
@@ -1944,6 +1969,7 @@ void hci_request_cancel_all(struct hci_dev *hdev)
|
|
cancel_work_sync(&hdev->scan_update);
|
|
cancel_work_sync(&hdev->scan_update);
|
|
cancel_work_sync(&hdev->connectable_update);
|
|
cancel_work_sync(&hdev->connectable_update);
|
|
cancel_work_sync(&hdev->discoverable_update);
|
|
cancel_work_sync(&hdev->discoverable_update);
|
|
|
|
+ cancel_delayed_work_sync(&hdev->discov_off);
|
|
cancel_delayed_work_sync(&hdev->le_scan_disable);
|
|
cancel_delayed_work_sync(&hdev->le_scan_disable);
|
|
cancel_delayed_work_sync(&hdev->le_scan_restart);
|
|
cancel_delayed_work_sync(&hdev->le_scan_restart);
|
|
|
|
|