struct list_head        remote_oob_data;
 
        struct list_head        adv_entries;
-       struct timer_list       adv_timer;
+       struct delayed_work     adv_work;
 
        struct hci_dev_stats    stat;
 
 
        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);
 
        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_DELAYED_WORK(&hdev->adv_work, hci_clear_adv_cache);
        INIT_WORK(&hdev->power_on, hci_power_on);
        INIT_DELAYED_WORK(&hdev->power_off, hci_power_off);
 
 
        hci_del_sysfs(hdev);
 
-       del_timer(&hdev->adv_timer);
+       cancel_delayed_work_sync(&hdev->adv_work);
 
        destroy_workqueue(hdev->workqueue);
 
 
        if (cp->enable == 0x01) {
                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_adv_entries_clear(hdev);
        } else if (cp->enable == 0x00) {
                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);
        }
 }