|
@@ -1202,6 +1202,17 @@ int hci_add_remote_oob_data(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 *hash,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void hci_clear_adv_cache(unsigned long arg)
|
|
|
+{
|
|
|
+ struct hci_dev *hdev = (void *) arg;
|
|
|
+
|
|
|
+ hci_dev_lock(hdev);
|
|
|
+
|
|
|
+ hci_adv_entries_clear(hdev);
|
|
|
+
|
|
|
+ hci_dev_unlock(hdev);
|
|
|
+}
|
|
|
+
|
|
|
int hci_adv_entries_clear(struct hci_dev *hdev)
|
|
|
{
|
|
|
struct adv_entry *entry, *tmp;
|
|
@@ -1330,6 +1341,8 @@ int hci_register_dev(struct hci_dev *hdev)
|
|
|
INIT_LIST_HEAD(&hdev->remote_oob_data);
|
|
|
|
|
|
INIT_LIST_HEAD(&hdev->adv_entries);
|
|
|
+ setup_timer(&hdev->adv_timer, hci_clear_adv_cache,
|
|
|
+ (unsigned long) hdev);
|
|
|
|
|
|
INIT_WORK(&hdev->power_on, hci_power_on);
|
|
|
INIT_WORK(&hdev->power_off, hci_power_off);
|
|
@@ -1403,6 +1416,7 @@ int hci_unregister_dev(struct hci_dev *hdev)
|
|
|
hci_unregister_sysfs(hdev);
|
|
|
|
|
|
hci_del_off_timer(hdev);
|
|
|
+ del_timer(&hdev->adv_timer);
|
|
|
|
|
|
destroy_workqueue(hdev->workqueue);
|
|
|
|