Commit db323f2f authored by Gustavo F. Padovan's avatar Gustavo F. Padovan

Bluetooth: Use delayed work for advertisiment cache timeout

As HCI rx path is now done in process context it makes sense to do all the
timer in process context as well.
Acked-by: default avatarMarcel Holtmann <marcel@holtmann.org>
Signed-off-by: default avatarGustavo F. Padovan <padovan@profusion.mobi>
parent 19c40e3b
...@@ -226,7 +226,7 @@ struct hci_dev { ...@@ -226,7 +226,7 @@ struct hci_dev {
struct list_head remote_oob_data; struct list_head remote_oob_data;
struct list_head adv_entries; struct list_head adv_entries;
struct timer_list adv_timer; struct delayed_work adv_work;
struct hci_dev_stats stat; struct hci_dev_stats stat;
......
...@@ -1340,9 +1340,10 @@ int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr) ...@@ -1340,9 +1340,10 @@ int hci_blacklist_del(struct hci_dev *hdev, bdaddr_t *bdaddr)
return mgmt_device_unblocked(hdev, bdaddr); return mgmt_device_unblocked(hdev, bdaddr);
} }
static void hci_clear_adv_cache(unsigned long arg) static void hci_clear_adv_cache(struct work_struct *work)
{ {
struct hci_dev *hdev = (void *) arg; struct hci_dev *hdev = container_of(work, struct hci_dev,
adv_work.work);
hci_dev_lock(hdev); hci_dev_lock(hdev);
...@@ -1488,9 +1489,8 @@ int hci_register_dev(struct hci_dev *hdev) ...@@ -1488,9 +1489,8 @@ int hci_register_dev(struct hci_dev *hdev)
INIT_LIST_HEAD(&hdev->remote_oob_data); INIT_LIST_HEAD(&hdev->remote_oob_data);
INIT_LIST_HEAD(&hdev->adv_entries); INIT_LIST_HEAD(&hdev->adv_entries);
setup_timer(&hdev->adv_timer, hci_clear_adv_cache,
(unsigned long) hdev);
INIT_DELAYED_WORK(&hdev->adv_work, hci_clear_adv_cache);
INIT_WORK(&hdev->power_on, hci_power_on); INIT_WORK(&hdev->power_on, hci_power_on);
INIT_DELAYED_WORK(&hdev->power_off, hci_power_off); INIT_DELAYED_WORK(&hdev->power_off, hci_power_off);
...@@ -1576,7 +1576,7 @@ void hci_unregister_dev(struct hci_dev *hdev) ...@@ -1576,7 +1576,7 @@ void hci_unregister_dev(struct hci_dev *hdev)
hci_del_sysfs(hdev); hci_del_sysfs(hdev);
del_timer(&hdev->adv_timer); cancel_delayed_work_sync(&hdev->adv_work);
destroy_workqueue(hdev->workqueue); destroy_workqueue(hdev->workqueue);
......
...@@ -1017,7 +1017,7 @@ static void hci_cc_le_set_scan_enable(struct hci_dev *hdev, ...@@ -1017,7 +1017,7 @@ static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
if (cp->enable == 0x01) { if (cp->enable == 0x01) {
set_bit(HCI_LE_SCAN, &hdev->dev_flags); set_bit(HCI_LE_SCAN, &hdev->dev_flags);
del_timer(&hdev->adv_timer); cancel_delayed_work_sync(&hdev->adv_work);
hci_dev_lock(hdev); hci_dev_lock(hdev);
hci_adv_entries_clear(hdev); hci_adv_entries_clear(hdev);
...@@ -1025,7 +1025,9 @@ static void hci_cc_le_set_scan_enable(struct hci_dev *hdev, ...@@ -1025,7 +1025,9 @@ static void hci_cc_le_set_scan_enable(struct hci_dev *hdev,
} else if (cp->enable == 0x00) { } else if (cp->enable == 0x00) {
clear_bit(HCI_LE_SCAN, &hdev->dev_flags); clear_bit(HCI_LE_SCAN, &hdev->dev_flags);
mod_timer(&hdev->adv_timer, jiffies + ADV_CLEAR_TIMEOUT); cancel_delayed_work_sync(&hdev->adv_work);
queue_delayed_work(hdev->workqueue, &hdev->adv_work,
jiffies + ADV_CLEAR_TIMEOUT);
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment