}
 
 static void
-srmcons_receive_chars(unsigned long data)
+srmcons_receive_chars(struct timer_list *t)
 {
-       struct srmcons_private *srmconsp = (struct srmcons_private *)data;
+       struct srmcons_private *srmconsp = from_timer(srmconsp, t, timer);
        struct tty_port *port = &srmconsp->port;
        unsigned long flags;
        int incr = 10;
 static int __init
 srmcons_init(void)
 {
-       setup_timer(&srmcons_singleton.timer, srmcons_receive_chars,
-                       (unsigned long)&srmcons_singleton);
+       timer_setup(&srmcons_singleton.timer, srmcons_receive_chars, 0);
        if (srm_is_registered_console) {
                struct tty_driver *driver;
                int err;
 
 
 static struct timer_list power_button_poll_timer;
 
-static void power_button_poll(unsigned long dummy)
+static void power_button_poll(struct timer_list *unused)
 {
        if (gpio_get_value(N2100_POWER_BUTTON) == 0) {
                ctrl_alt_del();
                        pr_err("could not set power GPIO as input\n");
        }
        /* Set up power button poll timer */
-       setup_timer(&power_button_poll_timer, power_button_poll, 0UL);
+       timer_setup(&power_button_poll_timer, power_button_poll, 0);
        power_button_poll_timer.expires = jiffies + (HZ / 10);
        add_timer(&power_button_poll_timer);
        return 0;
 
 static void __iomem *db88f5281_7seg;
 static struct timer_list db88f5281_timer;
 
-static void db88f5281_7seg_event(unsigned long data)
+static void db88f5281_7seg_event(struct timer_list *unused)
 {
        static int count = 0;
        writel(0, db88f5281_7seg + (count << 4));
                        printk(KERN_ERR "Failed to ioremap db88f5281_7seg\n");
                        return -EIO;
                }
-               setup_timer(&db88f5281_timer, db88f5281_7seg_event, 0);
+               timer_setup(&db88f5281_timer, db88f5281_7seg_event, 0);
                mod_timer(&db88f5281_timer, jiffies + 2 * HZ);
        }
 
 
        return 1;
 }
 
-static void nmi_wdt_timer(unsigned long data)
+static void nmi_wdt_timer(struct timer_list *unused)
 {
        if (check_nmi_wdt_touched())
                nmi_wdt_keepalive();
        nmi_wdt_start();
        nmi_active = true;
 
-       setup_timer(&ntimer, nmi_wdt_timer, 0UL);
+       timer_setup(&ntimer, nmi_wdt_timer, 0);
        ntimer.expires = jiffies + NMI_CHECK_TIMEOUT;
        add_timer(&ntimer);
 
 
        .write          = pvc_scroll_proc_write,
 };
 
-void pvc_proc_timerfunc(unsigned long data)
+void pvc_proc_timerfunc(struct timer_list *unused)
 {
        if (scroll_dir < 0)
                pvc_move(DISPLAY|RIGHT);
        if (proc_entry == NULL)
                goto error;
 
-       setup_timer(&timer, pvc_proc_timerfunc, 0UL);
+       timer_setup(&timer, pvc_proc_timerfunc, 0);
 
        return 0;
 error:
 
        local_irq_restore(flags);
 }
 
-static void tau_timeout_smp(unsigned long unused)
+static void tau_timeout_smp(struct timer_list *unused)
 {
 
        /* schedule ourselves to be run again */
 
 
        /* first, set up the window shrinking timer */
-       setup_timer(&tau_timer, tau_timeout_smp, 0UL);
+       timer_setup(&tau_timer, tau_timeout_smp, 0);
        tau_timer.expires = jiffies + shrink_timer;
        add_timer(&tau_timer);
 
 
  * This routine will alternate loading the virtual counters for
  * virtual CPUs
  */
-static void cell_virtual_cntr(unsigned long data)
+static void cell_virtual_cntr(struct timer_list *unused)
 {
        int i, prev_hdw_thread, next_hdw_thread;
        u32 cpu;
 
 static void start_virt_cntrs(void)
 {
-       setup_timer(&timer_virt_cntr, cell_virtual_cntr, 0UL);
+       timer_setup(&timer_virt_cntr, cell_virtual_cntr, 0);
        timer_virt_cntr.expires = jiffies + HZ / 10;
        add_timer(&timer_virt_cntr);
 }
  * periodically based on kernel timer to switch which SPU is
  * being monitored in a round robbin fashion.
  */
-static void spu_evnt_swap(unsigned long data)
+static void spu_evnt_swap(struct timer_list *unused)
 {
        int node;
        int cur_phys_spu, nxt_phys_spu, cur_spu_evnt_phys_spu_indx;
 
 static void start_spu_event_swap(void)
 {
-       setup_timer(&timer_spu_event_swap, spu_evnt_swap, 0UL);
+       timer_setup(&timer_spu_event_swap, spu_evnt_swap, 0);
        timer_spu_event_swap.expires = jiffies + HZ / 25;
        add_timer(&timer_spu_event_swap);
 }
 
        CALC_LOAD(spu_avenrun[2], EXP_15, active_tasks);
 }
 
-static void spusched_wake(unsigned long data)
+static void spusched_wake(struct timer_list *unused)
 {
        mod_timer(&spusched_timer, jiffies + SPUSCHED_TICK);
        wake_up_process(spusched_task);
 }
 
-static void spuloadavg_wake(unsigned long data)
+static void spuloadavg_wake(struct timer_list *unused)
 {
        mod_timer(&spuloadavg_timer, jiffies + LOAD_FREQ);
        spu_calc_load();
        }
        spin_lock_init(&spu_prio->runq_lock);
 
-       setup_timer(&spusched_timer, spusched_wake, 0);
-       setup_timer(&spuloadavg_timer, spuloadavg_wake, 0);
+       timer_setup(&spusched_timer, spusched_wake, 0);
+       timer_setup(&spuloadavg_timer, spuloadavg_wake, 0);
 
        spusched_task = kthread_run(spusched_thread, NULL, "spusched");
        if (IS_ERR(spusched_task)) {
 
        return IRQ_HANDLED;
 }
 
-static void kw_i2c_timeout(unsigned long data)
+static void kw_i2c_timeout(struct timer_list *t)
 {
-       struct pmac_i2c_host_kw *host = (struct pmac_i2c_host_kw *)data;
+       struct pmac_i2c_host_kw *host = from_timer(host, t, timeout_timer);
        unsigned long flags;
 
        spin_lock_irqsave(&host->lock, flags);
        mutex_init(&host->mutex);
        init_completion(&host->complete);
        spin_lock_init(&host->lock);
-       setup_timer(&host->timeout_timer, kw_i2c_timeout, (unsigned long)host);
+       timer_setup(&host->timeout_timer, kw_i2c_timeout, 0);
 
        psteps = of_get_property(np, "AAPL,address-step", NULL);
        steps = psteps ? (*psteps) : 0x10;
 
        }
 }
 
-static void stp_timeout(unsigned long dummy)
+static void stp_timeout(struct timer_list *unused)
 {
        queue_work(time_sync_wq, &stp_work);
 }
 {
        if (!test_bit(CLOCK_SYNC_HAS_STP, &clock_sync_flags))
                return 0;
-       setup_timer(&stp_timer, stp_timeout, 0UL);
+       timer_setup(&stp_timer, stp_timeout, 0);
        time_init_wq();
        if (!stp_online)
                return 0;
 
        }
 }
 
-static void heartbeat_timer(unsigned long data)
+static void heartbeat_timer(struct timer_list *t)
 {
-       struct heartbeat_data *hd = (struct heartbeat_data *)data;
+       struct heartbeat_data *hd = from_timer(hd, t, timer);
        static unsigned bit = 0, up = 1;
 
        heartbeat_toggle_bit(hd, bit, hd->flags & HEARTBEAT_INVERTED);
                }
        }
 
-       setup_timer(&hd->timer, heartbeat_timer, (unsigned long)hd);
+       timer_setup(&hd->timer, heartbeat_timer, 0);
        platform_set_drvdata(pdev, hd);
 
        return mod_timer(&hd->timer, jiffies + 1);
 
        return cap66 > 0;
 }
 
-static void pcibios_enable_err(unsigned long __data)
+static void pcibios_enable_err(struct timer_list *t)
 {
-       struct pci_channel *hose = (struct pci_channel *)__data;
+       struct pci_channel *hose = from_timer(hose, t, err_timer);
 
        del_timer(&hose->err_timer);
        printk(KERN_DEBUG "PCI: re-enabling error IRQ.\n");
        enable_irq(hose->err_irq);
 }
 
-static void pcibios_enable_serr(unsigned long __data)
+static void pcibios_enable_serr(struct timer_list *t)
 {
-       struct pci_channel *hose = (struct pci_channel *)__data;
+       struct pci_channel *hose = from_timer(hose, t, serr_timer);
 
        del_timer(&hose->serr_timer);
        printk(KERN_DEBUG "PCI: re-enabling system error IRQ.\n");
 void pcibios_enable_timers(struct pci_channel *hose)
 {
        if (hose->err_irq) {
-               setup_timer(&hose->err_timer, pcibios_enable_err,
-                           (unsigned long)hose);
+               timer_setup(&hose->err_timer, pcibios_enable_err, 0);
        }
 
        if (hose->serr_irq) {
-               setup_timer(&hose->serr_timer, pcibios_enable_serr,
-                           (unsigned long)hose);
+               timer_setup(&hose->serr_timer, pcibios_enable_serr, 0);
        }
 }
 
 
 }
 static DEVICE_ATTR(switch, S_IRUGO, switch_show, NULL);
 
-static void switch_timer(unsigned long data)
+static void switch_timer(struct timer_list *t)
 {
-       struct push_switch *psw = (struct push_switch *)data;
+       struct push_switch *psw = from_timer(psw, t, debounce);
 
        schedule_work(&psw->work);
 }
        }
 
        INIT_WORK(&psw->work, switch_work_handler);
-       setup_timer(&psw->debounce, switch_timer, (unsigned long)psw);
+       timer_setup(&psw->debounce, switch_timer, 0);
 
        /* Workqueue API brain-damage */
        psw->pdev = pdev;
 
        rcu_read_unlock();
 }
 
-static void blk_stat_timer_fn(unsigned long data)
+static void blk_stat_timer_fn(struct timer_list *t)
 {
-       struct blk_stat_callback *cb = (void *)data;
+       struct blk_stat_callback *cb = from_timer(cb, t, timer);
        unsigned int bucket;
        int cpu;
 
        cb->bucket_fn = bucket_fn;
        cb->data = data;
        cb->buckets = buckets;
-       setup_timer(&cb->timer, blk_stat_timer_fn, (unsigned long)cb);
+       timer_setup(&cb->timer, blk_stat_timer_fn, 0);
 
        return cb;
 }
 
        bool track_bio_latency;
 };
 
-static void throtl_pending_timer_fn(unsigned long arg);
+static void throtl_pending_timer_fn(struct timer_list *t);
 
 static inline struct throtl_grp *pd_to_tg(struct blkg_policy_data *pd)
 {
        INIT_LIST_HEAD(&sq->queued[0]);
        INIT_LIST_HEAD(&sq->queued[1]);
        sq->pending_tree = RB_ROOT;
-       setup_timer(&sq->pending_timer, throtl_pending_timer_fn,
-                   (unsigned long)sq);
+       timer_setup(&sq->pending_timer, throtl_pending_timer_fn, 0);
 }
 
 static struct blkg_policy_data *throtl_pd_alloc(gfp_t gfp, int node)
  * the top-level service_tree is reached, throtl_data->dispatch_work is
  * kicked so that the ready bio's are issued.
  */
-static void throtl_pending_timer_fn(unsigned long arg)
+static void throtl_pending_timer_fn(struct timer_list *t)
 {
-       struct throtl_service_queue *sq = (void *)arg;
+       struct throtl_service_queue *sq = from_timer(sq, t, pending_timer);
        struct throtl_grp *tg = sq_to_tg(sq);
        struct throtl_data *td = sq_to_td(sq);
        struct request_queue *q = td->queue;
 
   
 */
 
-static void do_housekeeping (unsigned long arg);
+static void do_housekeeping (struct timer_list *t);
 /********** globals **********/
 
 static unsigned short debug = 0;
 };
 
 /********** housekeeping **********/
-static void do_housekeeping (unsigned long arg) {
-  amb_dev * dev = (amb_dev *) arg;
+static void do_housekeeping (struct timer_list *t) {
+  amb_dev * dev = from_timer(dev, t, housekeeping);
   
   // could collect device-specific (not driver/atm-linux) stats here
       
        dev->atm_dev->ci_range.vpi_bits = NUM_VPI_BITS;
        dev->atm_dev->ci_range.vci_bits = NUM_VCI_BITS;
 
-       setup_timer(&dev->housekeeping, do_housekeeping,
-                   (unsigned long)dev);
+       timer_setup(&dev->housekeeping, do_housekeeping, 0);
        mod_timer(&dev->housekeeping, jiffies);
 
        // enable host interrupts
 
 
 
 #ifdef FS_POLL_FREQ
-static void fs_poll (unsigned long data)
+static void fs_poll (struct timer_list *t)
 {
-       struct fs_dev *dev = (struct fs_dev *) data;
+       struct fs_dev *dev = from_timer(dev, t, timer);
   
        fs_irq (0, dev);
        dev->timer.expires = jiffies + FS_POLL_FREQ;
        }
 
 #ifdef FS_POLL_FREQ
-       setup_timer (&dev->timer, fs_poll, (unsigned long)dev);
+       timer_setup(&dev->timer, fs_poll, 0);
        dev->timer.expires = jiffies + FS_POLL_FREQ;
        add_timer (&dev->timer);
 #endif
 
 
 /********** globals **********/
 
-static void do_housekeeping (unsigned long arg);
+static void do_housekeeping (struct timer_list *t);
 
 static unsigned short debug = 0;
 static unsigned short vpi_bits = 0;
 
 /********** housekeeping **********/
 
-static void do_housekeeping (unsigned long arg) {
+static void do_housekeeping (struct timer_list *t) {
   // just stats at the moment
-  hrz_dev * dev = (hrz_dev *) arg;
+  hrz_dev * dev = from_timer(dev, t, housekeeping);
 
   // collect device-specific (not driver/atm-linux) stats here
   dev->tx_cell_count += rd_regw (dev, TX_CELL_COUNT_OFF);
        dev->atm_dev->ci_range.vpi_bits = vpi_bits;
        dev->atm_dev->ci_range.vci_bits = 10-vpi_bits;
 
-       setup_timer(&dev->housekeeping, do_housekeeping, (unsigned long) dev);
+       timer_setup(&dev->housekeeping, do_housekeeping, 0);
        mod_timer(&dev->housekeeping, jiffies);
 
 out:
 
 
 
 static void
-tst_timer(unsigned long data)
+tst_timer(struct timer_list *t)
 {
-       struct idt77252_dev *card = (struct idt77252_dev *)data;
+       struct idt77252_dev *card = from_timer(card, t, tst_timer);
        unsigned long base, idle, jump;
        unsigned long flags;
        u32 pc;
        spin_lock_init(&card->cmd_lock);
        spin_lock_init(&card->tst_lock);
 
-       setup_timer(&card->tst_timer, tst_timer, (unsigned long)card);
+       timer_setup(&card->tst_timer, tst_timer, 0);
 
        /* Do the I/O remapping... */
        card->membase = ioremap(membase, 1024);
 
 }
 #endif /* !DEBUG_RW */
 
-static void lanai_timed_poll(unsigned long arg)
+static void lanai_timed_poll(struct timer_list *t)
 {
-       struct lanai_dev *lanai = (struct lanai_dev *) arg;
+       struct lanai_dev *lanai = from_timer(lanai, t, timer);
 #ifndef DEBUG_RW
        unsigned long flags;
 #ifdef USE_POWERDOWN
 
 static inline void lanai_timed_poll_start(struct lanai_dev *lanai)
 {
-       setup_timer(&lanai->timer, lanai_timed_poll, (unsigned long)lanai);
+       timer_setup(&lanai->timer, lanai_timed_poll, 0);
        lanai->timer.expires = jiffies + LANAI_POLL_PERIOD;
        add_timer(&lanai->timer);
 }
 
 #ifdef EXTRA_DEBUG
 static void which_list(ns_dev * card, struct sk_buff *skb);
 #endif
-static void ns_poll(unsigned long arg);
+static void ns_poll(struct timer_list *unused);
 static void ns_phy_put(struct atm_dev *dev, unsigned char value,
                       unsigned long addr);
 static unsigned char ns_phy_get(struct atm_dev *dev, unsigned long addr);
        XPRINTK("nicstar: nicstar_init() returned.\n");
 
        if (!error) {
-               setup_timer(&ns_timer, ns_poll, 0UL);
+               timer_setup(&ns_timer, ns_poll, 0);
                ns_timer.expires = jiffies + NS_POLL_PERIOD;
                add_timer(&ns_timer);
        }
 }
 #endif /* EXTRA_DEBUG */
 
-static void ns_poll(unsigned long arg)
+static void ns_poll(struct timer_list *unused)
 {
        int i;
        ns_dev *card;
 
       /*
        Initialize the Monitoring Timer.
       */
-      setup_timer(&Controller->MonitoringTimer,
-                  DAC960_MonitoringTimerFunction, (unsigned long)Controller);
+      timer_setup(&Controller->MonitoringTimer,
+                  DAC960_MonitoringTimerFunction, 0);
       Controller->MonitoringTimer.expires =
        jiffies + DAC960_MonitoringTimerInterval;
       add_timer(&Controller->MonitoringTimer);
   the status of DAC960 Controllers.
 */
 
-static void DAC960_MonitoringTimerFunction(unsigned long TimerData)
+static void DAC960_MonitoringTimerFunction(struct timer_list *t)
 {
-  DAC960_Controller_T *Controller = (DAC960_Controller_T *) TimerData;
+  DAC960_Controller_T *Controller = from_timer(Controller, t, MonitoringTimer);
   DAC960_Command_T *Command;
   unsigned long flags;
 
 
 static irqreturn_t DAC960_P_InterruptHandler(int, void *);
 static void DAC960_V1_QueueMonitoringCommand(DAC960_Command_T *);
 static void DAC960_V2_QueueMonitoringCommand(DAC960_Command_T *);
-static void DAC960_MonitoringTimerFunction(unsigned long);
+static void DAC960_MonitoringTimerFunction(struct timer_list *);
 static void DAC960_Message(DAC960_MessageLevel_T, unsigned char *,
                           DAC960_Controller_T *, ...);
 static void DAC960_CreateProcEntries(DAC960_Controller_T *);
 
                rsxx_complete_dma(ctrl, dma, status);
 }
 
-static void dma_engine_stalled(unsigned long data)
+static void dma_engine_stalled(struct timer_list *t)
 {
-       struct rsxx_dma_ctrl *ctrl = (struct rsxx_dma_ctrl *)data;
+       struct rsxx_dma_ctrl *ctrl = from_timer(ctrl, t, activity_timer);
        int cnt;
 
        if (atomic_read(&ctrl->stats.hw_q_depth) == 0 ||
        mutex_init(&ctrl->work_lock);
        INIT_LIST_HEAD(&ctrl->queue);
 
-       setup_timer(&ctrl->activity_timer, dma_engine_stalled,
-                                       (unsigned long)ctrl);
+       timer_setup(&ctrl->activity_timer, dma_engine_stalled, 0);
 
        ctrl->issue_wq = alloc_ordered_workqueue(DRIVER_NAME"_issue", 0);
        if (!ctrl->issue_wq)
 
        blk_mq_start_hw_queues(skdev->queue);
 }
 
-static void skd_timer_tick(ulong arg)
+static void skd_timer_tick(struct timer_list *t)
 {
-       struct skd_device *skdev = (struct skd_device *)arg;
+       struct skd_device *skdev = from_timer(skdev, t, timer);
        unsigned long reqflags;
        u32 state;
 
 {
        int rc;
 
-       setup_timer(&skdev->timer, skd_timer_tick, (ulong)skdev);
+       timer_setup(&skdev->timer, skd_timer_tick, 0);
 
        rc = mod_timer(&skdev->timer, (jiffies + HZ));
        if (rc)
 
 
 static void vdc_ldc_reset(struct vdc_port *port);
 static void vdc_ldc_reset_work(struct work_struct *work);
-static void vdc_ldc_reset_timer(unsigned long _arg);
+static void vdc_ldc_reset_timer(struct timer_list *t);
 
 static inline struct vdc_port *to_vdc_port(struct vio_driver_state *vio)
 {
         */
        ldc_timeout = mdesc_get_property(hp, vdev->mp, "vdc-timeout", NULL);
        port->ldc_timeout = ldc_timeout ? *ldc_timeout : 0;
-       setup_timer(&port->ldc_reset_timer, vdc_ldc_reset_timer,
-                   (unsigned long)port);
+       timer_setup(&port->ldc_reset_timer, vdc_ldc_reset_timer, 0);
        INIT_WORK(&port->ldc_reset_work, vdc_ldc_reset_work);
 
        err = vio_driver_init(&port->vio, vdev, VDEV_DISK,
                __blk_end_request_all(req, BLK_STS_IOERR);
 }
 
-static void vdc_ldc_reset_timer(unsigned long _arg)
+static void vdc_ldc_reset_timer(struct timer_list *t)
 {
-       struct vdc_port *port = (struct vdc_port *) _arg;
+       struct vdc_port *port = from_timer(port, t, ldc_reset_timer);
        struct vio_driver_state *vio = &port->vio;
        unsigned long flags;
 
 
                set_fault_to_battery_status(card);
 }
 
-static void check_all_batteries(unsigned long ptr)
+static void check_all_batteries(struct timer_list *unused)
 {
        int i;
 
 
 static void init_battery_timer(void)
 {
-       setup_timer(&battery_timer, check_all_batteries, 0UL);
+       timer_setup(&battery_timer, check_all_batteries, 0);
        battery_timer.expires = jiffies + (HZ * 60);
        add_timer(&battery_timer);
 }
 
        spin_unlock_irqrestore(&ace->lock, flags);
 }
 
-static void ace_stall_timer(unsigned long data)
+static void ace_stall_timer(struct timer_list *t)
 {
-       struct ace_device *ace = (void *)data;
+       struct ace_device *ace = from_timer(ace, t, stall_timer);
        unsigned long flags;
 
        dev_warn(ace->dev,
         * Initialize the state machine tasklet and stall timer
         */
        tasklet_init(&ace->fsm_tasklet, ace_fsm_tasklet, (unsigned long)ace);
-       setup_timer(&ace->stall_timer, ace_stall_timer, (unsigned long)ace);
+       timer_setup(&ace->stall_timer, ace_stall_timer, 0);
 
        /*
         * Initialize the request queue
 
        .unlocked_ioctl = bt_bmc_ioctl,
 };
 
-static void poll_timer(unsigned long data)
+static void poll_timer(struct timer_list *t)
 {
-       struct bt_bmc *bt_bmc = (void *)data;
+       struct bt_bmc *bt_bmc = from_timer(bt_bmc, t, poll_timer);
 
        bt_bmc->poll_timer.expires += msecs_to_jiffies(500);
        wake_up(&bt_bmc->queue);
                dev_info(dev, "Using IRQ %d\n", bt_bmc->irq);
        } else {
                dev_info(dev, "No IRQ; using timer\n");
-               setup_timer(&bt_bmc->poll_timer, poll_timer,
-                           (unsigned long)bt_bmc);
+               timer_setup(&bt_bmc->poll_timer, poll_timer, 0);
                bt_bmc->poll_timer.expires = jiffies + msecs_to_jiffies(10);
                add_timer(&bt_bmc->poll_timer);
        }
 
 
 static atomic_t stop_operation;
 
-static void ipmi_timeout(unsigned long data)
+static void ipmi_timeout(struct timer_list *unused)
 {
        ipmi_smi_t intf;
        int nt = 0;
 
 #endif /* CONFIG_IPMI_PROC_INTERFACE */
 
-       setup_timer(&ipmi_timer, ipmi_timeout, 0);
+       timer_setup(&ipmi_timer, ipmi_timeout, 0);
        mod_timer(&ipmi_timer, jiffies + IPMI_TIMEOUT_JIFFIES);
 
        atomic_notifier_chain_register(&panic_notifier_list, &panic_block);
 
        spin_unlock_irqrestore(&smi_info->si_lock, flags);
 }
 
-static void smi_timeout(unsigned long data)
+static void smi_timeout(struct timer_list *t)
 {
-       struct smi_info   *smi_info = (struct smi_info *) data;
+       struct smi_info   *smi_info = from_timer(smi_info, t, si_timer);
        enum si_sm_result smi_result;
        unsigned long     flags;
        unsigned long     jiffies_now;
        new_smi->intf = intf;
 
        /* Set up the timer that drives the interface. */
-       setup_timer(&new_smi->si_timer, smi_timeout, (long)new_smi);
+       timer_setup(&new_smi->si_timer, smi_timeout, 0);
        smi_mod_timer(new_smi, jiffies + SI_TIMEOUT_JIFFIES);
 
        /* Try to claim any interrupts. */
 
        }
 }
 
-static void retry_timeout(unsigned long data)
+static void retry_timeout(struct timer_list *t)
 {
-       struct ssif_info *ssif_info = (void *) data;
+       struct ssif_info *ssif_info = from_timer(ssif_info, t, retry_timer);
        unsigned long oflags, *flags;
        bool waiting;
 
 
        spin_lock_init(&ssif_info->lock);
        ssif_info->ssif_state = SSIF_NORMAL;
-       setup_timer(&ssif_info->retry_timer, retry_timeout,
-                   (unsigned long)ssif_info);
+       timer_setup(&ssif_info->retry_timer, retry_timeout, 0);
 
        for (i = 0; i < SSIF_NUM_STATS; i++)
                atomic_set(&ssif_info->stats[i], 0);
 
 #include "tpm.h"
 #include "tpm-dev.h"
 
-static void user_reader_timeout(unsigned long ptr)
+static void user_reader_timeout(struct timer_list *t)
 {
-       struct file_priv *priv = (struct file_priv *)ptr;
+       struct file_priv *priv = from_timer(priv, t, user_read_timer);
 
        pr_warn("TPM user space timeout is deprecated (pid=%d)\n",
                task_tgid_nr(current));
        priv->chip = chip;
        atomic_set(&priv->data_pending, 0);
        mutex_init(&priv->buffer_mutex);
-       setup_timer(&priv->user_read_timer, user_reader_timeout,
-                       (unsigned long)priv);
+       timer_setup(&priv->user_read_timer, user_reader_timeout, 0);
        INIT_WORK(&priv->work, timeout_work);
 
        file->private_data = priv;
 
        spin_unlock_irqrestore(&dev->vblank_time_lock, irqflags);
 }
 
-static void vblank_disable_fn(unsigned long arg)
+static void vblank_disable_fn(struct timer_list *t)
 {
-       struct drm_vblank_crtc *vblank = (void *)arg;
+       struct drm_vblank_crtc *vblank = from_timer(vblank, t, disable_timer);
        struct drm_device *dev = vblank->dev;
        unsigned int pipe = vblank->pipe;
        unsigned long irqflags;
                vblank->dev = dev;
                vblank->pipe = i;
                init_waitqueue_head(&vblank->queue);
-               setup_timer(&vblank->disable_timer, vblank_disable_fn,
-                           (unsigned long)vblank);
+               timer_setup(&vblank->disable_timer, vblank_disable_fn, 0);
                seqlock_init(&vblank->seqlock);
        }
 
                if (drm_vblank_offdelay == 0)
                        return;
                else if (drm_vblank_offdelay < 0)
-                       vblank_disable_fn((unsigned long)vblank);
+                       vblank_disable_fn(&vblank->disable_timer);
                else if (!dev->vblank_disable_immediate)
                        mod_timer(&vblank->disable_timer,
                                  jiffies + ((drm_vblank_offdelay * HZ)/1000));
        spin_unlock_irqrestore(&dev->event_lock, irqflags);
 
        if (disable_irq)
-               vblank_disable_fn((unsigned long)vblank);
+               vblank_disable_fn(&vblank->disable_timer);
 
        return true;
 }
 
        .atomic_flush = exynos_crtc_handle_event,
 };
 
-static void vidi_fake_vblank_timer(unsigned long arg)
+static void vidi_fake_vblank_timer(struct timer_list *t)
 {
-       struct vidi_context *ctx = (void *)arg;
+       struct vidi_context *ctx = from_timer(ctx, t, timer);
 
        if (drm_crtc_handle_vblank(&ctx->crtc->base))
                mod_timer(&ctx->timer,
 
        ctx->pdev = pdev;
 
-       setup_timer(&ctx->timer, vidi_fake_vblank_timer, (unsigned long)ctx);
+       timer_setup(&ctx->timer, vidi_fake_vblank_timer, 0);
 
        mutex_init(&ctx->lock);
 
 
  * we have seen a HPD inactive->active transition.  This code implements
  * that delay.
  */
-static void tda998x_edid_delay_done(unsigned long data)
+static void tda998x_edid_delay_done(struct timer_list *t)
 {
-       struct tda998x_priv *priv = (struct tda998x_priv *)data;
+       struct tda998x_priv *priv = from_timer(priv, t, edid_delay_timer);
 
        priv->edid_delay_active = false;
        wake_up(&priv->edid_delay_waitq);
 
        mutex_init(&priv->mutex);       /* protect the page access */
        init_waitqueue_head(&priv->edid_delay_waitq);
-       setup_timer(&priv->edid_delay_timer, tda998x_edid_delay_done,
-                   (unsigned long)priv);
+       timer_setup(&priv->edid_delay_timer, tda998x_edid_delay_done, 0);
        INIT_WORK(&priv->detect_work, tda998x_detect_work);
 
        /* wake up the device: */
 
        return NULL;
 }
 
-static void a5xx_preempt_timer(unsigned long data)
+static void a5xx_preempt_timer(struct timer_list *t)
 {
-       struct a5xx_gpu *a5xx_gpu = (struct a5xx_gpu *) data;
+       struct a5xx_gpu *a5xx_gpu = from_timer(a5xx_gpu, t, preempt_timer);
        struct msm_gpu *gpu = &a5xx_gpu->base.base;
        struct drm_device *dev = gpu->dev;
        struct msm_drm_private *priv = dev->dev_private;
                }
        }
 
-       setup_timer(&a5xx_gpu->preempt_timer, a5xx_preempt_timer,
-               (unsigned long) a5xx_gpu);
+       timer_setup(&a5xx_gpu->preempt_timer, a5xx_preempt_timer, 0);
 }
 
                        round_jiffies_up(jiffies + DRM_MSM_HANGCHECK_JIFFIES));
 }
 
-static void hangcheck_handler(unsigned long data)
+static void hangcheck_handler(struct timer_list *t)
 {
-       struct msm_gpu *gpu = (struct msm_gpu *)data;
+       struct msm_gpu *gpu = from_timer(gpu, t, hangcheck_timer);
        struct drm_device *dev = gpu->dev;
        struct msm_drm_private *priv = dev->dev_private;
        struct msm_ringbuffer *ring = gpu->funcs->active_ring(gpu);
        INIT_WORK(&gpu->recover_work, recover_worker);
 
 
-       setup_timer(&gpu->hangcheck_timer, hangcheck_handler,
-                       (unsigned long)gpu);
+       timer_setup(&gpu->hangcheck_timer, hangcheck_handler, 0);
 
        spin_lock_init(&gpu->perf_lock);
 
 
 }
 
 #ifdef DSI_CATCH_MISSING_TE
-static void dsi_te_timeout(unsigned long arg)
+static void dsi_te_timeout(struct timer_list *unused)
 {
        DSSERR("TE not received for 250ms!\n");
 }
                             dsi_framedone_timeout_work_callback);
 
 #ifdef DSI_CATCH_MISSING_TE
-       setup_timer(&dsi->te_timer, dsi_te_timeout, 0);
+       timer_setup(&dsi->te_timer, dsi_te_timeout, 0);
 #endif
 
        dsi_mem = platform_get_resource_byname(dsidev, IORESOURCE_MEM, "proto");
 
        spin_unlock_irqrestore(&psr->lock, flags);
 }
 
-static void psr_flush_handler(unsigned long data)
+static void psr_flush_handler(struct timer_list *t)
 {
-       struct psr_drv *psr = (struct psr_drv *)data;
+       struct psr_drv *psr = from_timer(psr, t, flush_timer);
        unsigned long flags;
 
        /* If the state has changed since we initiated the flush, do nothing */
        if (!psr)
                return -ENOMEM;
 
-       setup_timer(&psr->flush_timer, psr_flush_handler, (unsigned long)psr);
+       timer_setup(&psr->flush_timer, psr_flush_handler, 0);
        spin_lock_init(&psr->lock);
 
        psr->active = true;
 
        .timeline_value_str = vgem_fence_timeline_value_str,
 };
 
-static void vgem_fence_timeout(unsigned long data)
+static void vgem_fence_timeout(struct timer_list *t)
 {
-       struct vgem_fence *fence = (struct vgem_fence *)data;
+       struct vgem_fence *fence = from_timer(fence, t, timer);
 
        dma_fence_signal(&fence->base);
 }
        dma_fence_init(&fence->base, &vgem_fence_ops, &fence->lock,
                       dma_fence_context_alloc(1), 1);
 
-       setup_timer(&fence->timer, vgem_fence_timeout, (unsigned long)fence);
+       timer_setup(&fence->timer, vgem_fence_timeout, 0);
 
        /* We force the fence to expire within 10s to prevent driver hangs */
        mod_timer(&fence->timer, jiffies + VGEM_FENCE_TIMEOUT);
 
 
 
 static void
-via_dmablit_timer(unsigned long data)
+via_dmablit_timer(struct timer_list *t)
 {
-       drm_via_blitq_t *blitq = (drm_via_blitq_t *) data;
+       drm_via_blitq_t *blitq = from_timer(blitq, t, poll_timer);
        struct drm_device *dev = blitq->dev;
        int engine = (int)
                (blitq - ((drm_via_private_t *)dev->dev_private)->blit_queues);
                        init_waitqueue_head(blitq->blit_queue + j);
                init_waitqueue_head(&blitq->busy_queue);
                INIT_WORK(&blitq->wq, via_dmablit_workqueue);
-               setup_timer(&blitq->poll_timer, via_dmablit_timer,
-                               (unsigned long)blitq);
+               timer_setup(&blitq->poll_timer, via_dmablit_timer, 0);
        }
 }
 
 
        dev_err(&appleir->input_dev->dev, "possible flat battery?\n");
 }
 
-static void key_up_tick(unsigned long data)
+static void key_up_tick(struct timer_list *t)
 {
-       struct appleir *appleir = (struct appleir *)data;
+       struct appleir *appleir = from_timer(appleir, t, key_up_timer);
        struct hid_device *hid = appleir->hid;
        unsigned long flags;
 
        hid->quirks |= HID_QUIRK_HIDINPUT_FORCE;
 
        spin_lock_init(&appleir->lock);
-       setup_timer(&appleir->key_up_timer,
-                   key_up_tick, (unsigned long) appleir);
+       timer_setup(&appleir->key_up_timer, key_up_tick, 0);
 
        hid_set_drvdata(hid, appleir);
 
 
        return;
 }
 
-static void pcmidi_sustained_note_release(unsigned long data)
+static void pcmidi_sustained_note_release(struct timer_list *t)
 {
-       struct pcmidi_sustain *pms = (struct pcmidi_sustain *)data;
+       struct pcmidi_sustain *pms = from_timer(pms, t, timer);
 
        pcmidi_send_note(pms->pm, pms->status, pms->note, pms->velocity);
        pms->in_use = 0;
                pms = &pm->sustained_notes[i];
                pms->in_use = 0;
                pms->pm = pm;
-               setup_timer(&pms->timer, pcmidi_sustained_note_release,
-                       (unsigned long)pms);
+               timer_setup(&pms->timer, pcmidi_sustained_note_release, 0);
        }
 }
 
 
        spin_unlock_irqrestore(&wdata->state.lock, flags);
 }
 
-static void wiimote_init_timeout(unsigned long arg)
+static void wiimote_init_timeout(struct timer_list *t)
 {
-       struct wiimote_data *wdata = (void*)arg;
+       struct wiimote_data *wdata = from_timer(wdata, t, timer);
 
        wiimote_schedule(wdata);
 }
        wdata->state.cmd_battery = 0xff;
 
        INIT_WORK(&wdata->init_worker, wiimote_init_worker);
-       setup_timer(&wdata->timer, wiimote_init_timeout, (long)wdata);
+       timer_setup(&wdata->timer, wiimote_init_timeout, 0);
 
        return wdata;
 }
 
        data->timeout_cnt = 0;
 }
 
-static void ssp_wdt_timer_func(unsigned long ptr)
+static void ssp_wdt_timer_func(struct timer_list *t)
 {
-       struct ssp_data *data = (struct ssp_data *)ptr;
+       struct ssp_data *data = from_timer(data, t, wdt_timer);
 
        switch (data->fw_dl_state) {
        case SSP_FW_DL_STATE_FAIL:
        INIT_WORK(&data->work_wdt, ssp_wdt_work_func);
        INIT_DELAYED_WORK(&data->work_refresh, ssp_refresh_task);
 
-       setup_timer(&data->wdt_timer, ssp_wdt_timer_func, (unsigned long)data);
+       timer_setup(&data->wdt_timer, ssp_wdt_timer_func, 0);
 
        ret = request_threaded_irq(data->spi->irq, NULL,
                                   ssp_irq_thread_fn,
 
        return -ENOMEM;
 }
 
-static void delay_time_func(unsigned long ctx)
+static void delay_time_func(struct timer_list *t)
 {
-       struct mlx5_ib_dev *dev = (struct mlx5_ib_dev *)ctx;
+       struct mlx5_ib_dev *dev = from_timer(dev, t, delay_timer);
 
        dev->fill_delay = 0;
 }
                return -ENOMEM;
        }
 
-       setup_timer(&dev->delay_timer, delay_time_func, (unsigned long)dev);
+       timer_setup(&dev->delay_timer, delay_time_func, 0);
        for (i = 0; i < MAX_MR_CACHE_ENTRIES; i++) {
                ent = &cache->ent[i];
                INIT_LIST_HEAD(&ent->head);
 
 }
 EXPORT_SYMBOL(gameport_stop_polling);
 
-static void gameport_run_poll_handler(unsigned long d)
+static void gameport_run_poll_handler(struct timer_list *t)
 {
-       struct gameport *gameport = (struct gameport *)d;
+       struct gameport *gameport = from_timer(gameport, t, poll_timer);
 
        gameport->poll_handler(gameport);
        if (gameport->poll_cnt)
 
        INIT_LIST_HEAD(&gameport->node);
        spin_lock_init(&gameport->timer_lock);
-       setup_timer(&gameport->poll_timer, gameport_run_poll_handler,
-                   (unsigned long)gameport);
+       timer_setup(&gameport->poll_timer, gameport_run_poll_handler, 0);
 }
 
 /*
 
        return 0;
 }
 
-static void db9_timer(unsigned long private)
+static void db9_timer(struct timer_list *t)
 {
-       struct db9 *db9 = (void *) private;
+       struct db9 *db9 = from_timer(db9, t, timer);
        struct parport *port = db9->pd->port;
        struct input_dev *dev = db9->dev[0];
        struct input_dev *dev2 = db9->dev[1];
        db9->pd = pd;
        db9->mode = mode;
        db9->parportno = pp->number;
-       setup_timer(&db9->timer, db9_timer, (long)db9);
+       timer_setup(&db9->timer, db9_timer, 0);
 
        for (i = 0; i < (min(db9_mode->n_pads, DB9_MAX_DEVICES)); i++) {
 
 
  * gc_timer() initiates reads of console pads data.
  */
 
-static void gc_timer(unsigned long private)
+static void gc_timer(struct timer_list *t)
 {
-       struct gc *gc = (void *) private;
+       struct gc *gc = from_timer(gc, t, timer);
 
 /*
  * N64 pads - must be read first, any read confuses them for 200 us
        mutex_init(&gc->mutex);
        gc->pd = pd;
        gc->parportno = pp->number;
-       setup_timer(&gc->timer, gc_timer, (long) gc);
+       timer_setup(&gc->timer, gc_timer, 0);
 
        for (i = 0; i < n_pads && i < GC_MAX_DEVICES; i++) {
                if (!pads[i])
 
  * tgfx_timer() reads and analyzes TurboGraFX joystick data.
  */
 
-static void tgfx_timer(unsigned long private)
+static void tgfx_timer(struct timer_list *t)
 {
-       struct tgfx *tgfx = (void *) private;
+       struct tgfx *tgfx = from_timer(tgfx, t, timer);
        struct input_dev *dev;
        int data1, data2, i;
 
        mutex_init(&tgfx->sem);
        tgfx->pd = pd;
        tgfx->parportno = pp->number;
-       setup_timer(&tgfx->timer, tgfx_timer, (long)tgfx);
+       timer_setup(&tgfx->timer, tgfx_timer, 0);
 
        for (i = 0; i < n_devs; i++) {
                if (n_buttons[i] < 1)
 
 static void init_iova_rcaches(struct iova_domain *iovad);
 static void free_iova_rcaches(struct iova_domain *iovad);
 static void fq_destroy_all_entries(struct iova_domain *iovad);
-static void fq_flush_timeout(unsigned long data);
+static void fq_flush_timeout(struct timer_list *t);
 
 void
 init_iova_domain(struct iova_domain *iovad, unsigned long granule,
                spin_lock_init(&fq->lock);
        }
 
-       setup_timer(&iovad->fq_timer, fq_flush_timeout, (unsigned long)iovad);
+       timer_setup(&iovad->fq_timer, fq_flush_timeout, 0);
        atomic_set(&iovad->fq_timer_on, 0);
 
        return 0;
        }
 }
 
-static void fq_flush_timeout(unsigned long data)
+static void fq_flush_timeout(struct timer_list *t)
 {
-       struct iova_domain *iovad = (struct iova_domain *)data;
+       struct iova_domain *iovad = from_timer(iovad, t, fq_timer);
        int cpu;
 
        atomic_set(&iovad->fq_timer_on, 0);
 
        send_message(card, &cmdcmsg);
 }
 
-static void listentimerfunc(unsigned long x)
+static void listentimerfunc(struct timer_list *t)
 {
-       capidrv_contr *card = (capidrv_contr *)x;
+       capidrv_contr *card = from_timer(card, t, listentimer);
        if (card->state != ST_LISTEN_NONE && card->state != ST_LISTEN_ACTIVE)
                printk(KERN_ERR "%s: controller dead ??\n", card->name);
        send_listen(card);
                return -1;
        }
        card->owner = THIS_MODULE;
-       setup_timer(&card->listentimer, listentimerfunc, (unsigned long)card);
+       timer_setup(&card->listentimer, listentimerfunc, 0);
        strcpy(card->name, id);
        card->contrnr = contr;
        card->nbchan = profp->nbchannel;
 
 /***************************/
 /* timer callback function */
 /***************************/
-static void deflect_timer_expire(ulong arg)
+static void deflect_timer_expire(struct timer_list *t)
 {
        unsigned long flags;
-       struct call_struc *cs = (struct call_struc *) arg;
+       struct call_struc *cs = from_timer(cs, t, timer);
 
        spin_lock_irqsave(&divert_lock, flags);
        del_timer(&cs->timer); /* delete active timer */
        /* allocate mem for information struct */
        if (!(cs = kmalloc(sizeof(struct call_struc), GFP_ATOMIC)))
                return (-ENOMEM); /* no memory */
-       setup_timer(&cs->timer, deflect_timer_expire, (ulong)cs);
+       timer_setup(&cs->timer, deflect_timer_expire, 0);
        cs->info[0] = '\0';
        cs->ics.driver = drvid;
        cs->ics.command = ISDN_CMD_PROT_IO; /* protocol specific io */
                                        return (0); /* no external deflection needed */
                        if (!(cs = kmalloc(sizeof(struct call_struc), GFP_ATOMIC)))
                                return (0); /* no memory */
-                       setup_timer(&cs->timer, deflect_timer_expire,
-                                   (ulong)cs);
+                       timer_setup(&cs->timer, deflect_timer_expire, 0);
                        cs->info[0] = '\0';
 
                        cs->ics = *ic; /* copy incoming data */
 
 static int um_idi_open(struct inode *inode, struct file *file);
 static int um_idi_release(struct inode *inode, struct file *file);
 static int remove_entity(void *entity);
-static void diva_um_timer_function(unsigned long data);
+static void diva_um_timer_function(struct timer_list *t);
 
 /*
  * proc entry
        p_os = (diva_um_idi_os_context_t *) diva_um_id_get_os_context(e);
        init_waitqueue_head(&p_os->read_wait);
        init_waitqueue_head(&p_os->close_wait);
-       setup_timer(&p_os->diva_timer_id, (void *)diva_um_timer_function,
-                   (unsigned long)p_os);
+       timer_setup(&p_os->diva_timer_id, diva_um_timer_function, 0);
        p_os->aborted = 0;
        p_os->adapter_nr = adapter_nr;
        return (1);
 }
 
 static
-void diva_um_timer_function(unsigned long data)
+void diva_um_timer_function(struct timer_list *t)
 {
-       diva_um_idi_os_context_t *p_os = (diva_um_idi_os_context_t *) data;
+       diva_um_idi_os_context_t *p_os = from_timer(p_os, t, diva_timer_id);
 
        p_os->aborted = 1;
        wake_up_interruptible(&p_os->read_wait);
 
  */
 
 static void
-hfcmulti_dbusy_timer(struct hfc_multi *hc)
+hfcmulti_dbusy_timer(struct timer_list *t)
 {
 }
 
                if (hc->dnum[pt]) {
                        mode_hfcmulti(hc, dch->slot, dch->dev.D.protocol,
                                      -1, 0, -1, 0);
-                       setup_timer(&dch->timer, (void *)hfcmulti_dbusy_timer,
-                                   (long)dch);
+                       timer_setup(&dch->timer, hfcmulti_dbusy_timer, 0);
                }
                for (i = 1; i <= 31; i++) {
                        if (!((1 << i) & hc->bmask[pt])) /* skip unused chan */
                hc->chan[i].slot_rx = -1;
                hc->chan[i].conf = -1;
                mode_hfcmulti(hc, i, dch->dev.D.protocol, -1, 0, -1, 0);
-               setup_timer(&dch->timer, (void *)hfcmulti_dbusy_timer,
-                           (long)dch);
+               timer_setup(&dch->timer, hfcmulti_dbusy_timer, 0);
                hc->chan[i - 2].slot_tx = -1;
                hc->chan[i - 2].slot_rx = -1;
                hc->chan[i - 2].conf = -1;
 
  * timer callback for D-chan busy resolution. Currently no function
  */
 static void
-hfcpci_dbusy_timer(struct hfc_pci *hc)
+hfcpci_dbusy_timer(struct timer_list *t)
 {
 }
 
 inithfcpci(struct hfc_pci *hc)
 {
        printk(KERN_DEBUG "inithfcpci: entered\n");
-       setup_timer(&hc->dch.timer, (void *)hfcpci_dbusy_timer,
-                   (long)&hc->dch);
+       timer_setup(&hc->dch.timer, hfcpci_dbusy_timer, 0);
        hc->chanlimit = 2;
        mode_hfcpci(&hc->bch[0], 1, -1);
        mode_hfcpci(&hc->bch[1], 2, -1);
 
 EXPORT_SYMBOL(mISDNisar_irq);
 
 static void
-ftimer_handler(unsigned long data)
+ftimer_handler(struct timer_list *t)
 {
-       struct isar_ch *ch = (struct isar_ch *)data;
+       struct isar_ch *ch = from_timer(ch, t, ftimer);
 
        pr_debug("%s: ftimer flags %lx\n", ch->is->name, ch->bch.Flags);
        test_and_clear_bit(FLG_FTI_RUN, &ch->bch.Flags);
        }
        if (isar->version != 1)
                return -EINVAL;
-       setup_timer(&isar->ch[0].ftimer, &ftimer_handler,
-                   (long)&isar->ch[0]);
+       timer_setup(&isar->ch[0].ftimer, ftimer_handler, 0);
        test_and_set_bit(FLG_INITIALIZED, &isar->ch[0].bch.Flags);
-       setup_timer(&isar->ch[1].ftimer, &ftimer_handler,
-                   (long)&isar->ch[1]);
+       timer_setup(&isar->ch[1].ftimer, ftimer_handler, 0);
        test_and_set_bit(FLG_INITIALIZED, &isar->ch[1].bch.Flags);
        return 0;
 }
 
 static int isdn_timer_cnt3 = 0;
 
 static void
-isdn_timer_funct(ulong dummy)
+isdn_timer_funct(struct timer_list *unused)
 {
        int tf = dev->tflags;
        if (tf & ISDN_TIMER_FAST) {
                printk(KERN_WARNING "isdn: Could not allocate device-struct.\n");
                return -EIO;
        }
-       setup_timer(&dev->timer, isdn_timer_funct, 0UL);
+       timer_setup(&dev->timer, isdn_timer_funct, 0);
        spin_lock_init(&dev->lock);
        spin_lock_init(&dev->timerlock);
 #ifdef MODULE
 
 
 /* called via cisco_timer.function */
 static void
-isdn_net_ciscohdlck_slarp_send_keepalive(unsigned long data)
+isdn_net_ciscohdlck_slarp_send_keepalive(struct timer_list *t)
 {
-       isdn_net_local *lp = (isdn_net_local *) data;
+       isdn_net_local *lp = from_timer(lp, t, cisco_timer);
        struct sk_buff *skb;
        unsigned char *p;
        unsigned long last_cisco_myseq = lp->cisco_myseq;
        /* send slarp request because interface/seq.no.s reset */
        isdn_net_ciscohdlck_slarp_send_request(lp);
 
-       setup_timer(&lp->cisco_timer,
-                   isdn_net_ciscohdlck_slarp_send_keepalive,
-                   (unsigned long)lp);
+       timer_setup(&lp->cisco_timer,
+                   isdn_net_ciscohdlck_slarp_send_keepalive, 0);
        lp->cisco_timer.expires = jiffies + lp->cisco_keepalive_period * HZ;
        add_timer(&lp->cisco_timer);
 }
 
 static void isdn_ppp_ccp_reset_free(struct ippp_struct *is);
 static void isdn_ppp_ccp_reset_free_state(struct ippp_struct *is,
                                          unsigned char id);
-static void isdn_ppp_ccp_timer_callback(unsigned long closure);
+static void isdn_ppp_ccp_timer_callback(struct timer_list *t);
 static struct ippp_ccp_reset_state *isdn_ppp_ccp_reset_alloc_state(struct ippp_struct *is,
                                                                   unsigned char id);
 static void isdn_ppp_ccp_reset_trans(struct ippp_struct *is,
 
 /* The timer callback function which is called when a ResetReq has timed out,
    aka has never been answered by a ResetAck */
-static void isdn_ppp_ccp_timer_callback(unsigned long closure)
+static void isdn_ppp_ccp_timer_callback(struct timer_list *t)
 {
        struct ippp_ccp_reset_state *rs =
-               (struct ippp_ccp_reset_state *)closure;
+               from_timer(rs, t, timer);
 
        if (!rs) {
                printk(KERN_ERR "ippp_ccp: timer cb with zero closure.\n");
                rs->state = CCPResetIdle;
                rs->is = is;
                rs->id = id;
-               setup_timer(&rs->timer, isdn_ppp_ccp_timer_callback,
-                           (unsigned long)rs);
+               timer_setup(&rs->timer, isdn_ppp_ccp_timer_callback, 0);
                is->reset->rs[id] = rs;
        }
        return rs;
 
  * into the tty's buffer.
  */
 static void
-isdn_tty_modem_do_ncarrier(unsigned long data)
+isdn_tty_modem_do_ncarrier(struct timer_list *t)
 {
-       modem_info *info = (modem_info *) data;
+       modem_info *info = from_timer(info, t, nc_timer);
        isdn_tty_modem_result(RESULT_NO_CARRIER, info);
 }
 
                info->isdn_channel = -1;
                info->drv_index = -1;
                info->xmit_size = ISDN_SERIAL_XMIT_SIZE;
-               setup_timer(&info->nc_timer, isdn_tty_modem_do_ncarrier,
-                           (unsigned long)info);
+               timer_setup(&info->nc_timer, isdn_tty_modem_do_ncarrier, 0);
                skb_queue_head_init(&info->xmit_queue);
 #ifdef CONFIG_ISDN_AUDIO
                skb_queue_head_init(&info->dtmf_queue);
 
        }
 }
 
-static void s5p_mfc_watchdog(unsigned long arg)
+static void s5p_mfc_watchdog(struct timer_list *t)
 {
-       struct s5p_mfc_dev *dev = (struct s5p_mfc_dev *)arg;
+       struct s5p_mfc_dev *dev = from_timer(dev, t, watchdog_timer);
 
        if (test_bit(0, &dev->hw_lock))
                atomic_inc(&dev->watchdog_cnt);
        dev->hw_lock = 0;
        INIT_WORK(&dev->watchdog_work, s5p_mfc_watchdog_worker);
        atomic_set(&dev->watchdog_cnt, 0);
-       setup_timer(&dev->watchdog_timer, s5p_mfc_watchdog,
-                   (unsigned long)dev);
+       timer_setup(&dev->watchdog_timer, s5p_mfc_watchdog, 0);
 
        ret = v4l2_device_register(&pdev->dev, &dev->v4l2_dev);
        if (ret)
 
 
 #define FIFO_LEN 1024
 
-static void c8sectpfe_timer_interrupt(unsigned long ac8sectpfei)
+static void c8sectpfe_timer_interrupt(struct timer_list *t)
 {
-       struct c8sectpfei *fei = (struct c8sectpfei *)ac8sectpfei;
+       struct c8sectpfei *fei = from_timer(fei, t, timer);
        struct channel_info *channel;
        int chan_num;
 
        }
 
        /* Setup timer interrupt */
-       setup_timer(&fei->timer, c8sectpfe_timer_interrupt,
-                   (unsigned long)fei);
+       timer_setup(&fei->timer, c8sectpfe_timer_interrupt, 0);
 
        mutex_init(&fei->lock);
 
 
        schedule_irq(dev, ctx->transtime);
 }
 
-static void device_isr(unsigned long priv)
+static void device_isr(struct timer_list *t)
 {
-       struct vim2m_dev *vim2m_dev = (struct vim2m_dev *)priv;
+       struct vim2m_dev *vim2m_dev = from_timer(vim2m_dev, t, timer);
        struct vim2m_ctx *curr_ctx;
        struct vb2_v4l2_buffer *src_vb, *dst_vb;
        unsigned long flags;
        v4l2_info(&dev->v4l2_dev,
                        "Device registered as /dev/video%d\n", vfd->num);
 
-       setup_timer(&dev->timer, device_isr, (long)dev);
+       timer_setup(&dev->timer, device_isr, 0);
        platform_set_drvdata(pdev, dev);
 
        dev->m2m_dev = v4l2_m2m_init(&m2m_ops);
 
 
 static void au0828_restart_dvb_streaming(struct work_struct *work);
 
-static void au0828_bulk_timeout(unsigned long data)
+static void au0828_bulk_timeout(struct timer_list *t)
 {
-       struct au0828_dev *dev = (struct au0828_dev *) data;
+       struct au0828_dev *dev = from_timer(dev, t, bulk_timeout);
 
        dprintk(1, "%s called\n", __func__);
        dev->bulk_timeout_running = 0;
                return ret;
        }
 
-       setup_timer(&dev->bulk_timeout, au0828_bulk_timeout,
-                   (unsigned long)dev);
+       timer_setup(&dev->bulk_timeout, au0828_bulk_timeout, 0);
 
        return 0;
 }
 
 /* This function ensures that video frames continue to be delivered even if
    the ITU-656 input isn't receiving any data (thereby preventing applications
    such as tvtime from hanging) */
-static void au0828_vid_buffer_timeout(unsigned long data)
+static void au0828_vid_buffer_timeout(struct timer_list *t)
 {
-       struct au0828_dev *dev = (struct au0828_dev *) data;
+       struct au0828_dev *dev = from_timer(dev, t, vid_timeout);
        struct au0828_dmaqueue *dma_q = &dev->vidq;
        struct au0828_buffer *buf;
        unsigned char *vid_data;
        spin_unlock_irqrestore(&dev->slock, flags);
 }
 
-static void au0828_vbi_buffer_timeout(unsigned long data)
+static void au0828_vbi_buffer_timeout(struct timer_list *t)
 {
-       struct au0828_dev *dev = (struct au0828_dev *) data;
+       struct au0828_dev *dev = from_timer(dev, t, vbi_timeout);
        struct au0828_dmaqueue *dma_q = &dev->vbiq;
        struct au0828_buffer *buf;
        unsigned char *vbi_data;
        INIT_LIST_HEAD(&dev->vidq.active);
        INIT_LIST_HEAD(&dev->vbiq.active);
 
-       setup_timer(&dev->vid_timeout, au0828_vid_buffer_timeout,
-                   (unsigned long)dev);
-       setup_timer(&dev->vbi_timeout, au0828_vbi_buffer_timeout,
-                   (unsigned long)dev);
+       timer_setup(&dev->vid_timeout, au0828_vid_buffer_timeout, 0);
+       timer_setup(&dev->vbi_timeout, au0828_vbi_buffer_timeout, 0);
 
        dev->width = NTSC_STD_W;
        dev->height = NTSC_STD_H;
 
        return 0;
 }
 
-static void msb_cache_flush_timer(unsigned long data)
+static void msb_cache_flush_timer(struct timer_list *t)
 {
-       struct msb_data *msb = (struct msb_data *)data;
+       struct msb_data *msb = from_timer(msb, t, cache_flush_timer);
        msb->need_flush_cache = true;
        queue_work(msb->io_queue, &msb->io_work);
 }
 
 static int msb_cache_init(struct msb_data *msb)
 {
-       setup_timer(&msb->cache_flush_timer, msb_cache_flush_timer,
-               (unsigned long)msb);
+       timer_setup(&msb->cache_flush_timer, msb_cache_flush_timer, 0);
 
        if (!msb->cache)
                msb->cache = kzalloc(msb->block_size, GFP_KERNEL);
 
        },
 };
 
-static void rtsx_usb_sg_timed_out(unsigned long data)
+static void rtsx_usb_sg_timed_out(struct timer_list *t)
 {
-       struct rtsx_ucr *ucr = (struct rtsx_ucr *)data;
+       struct rtsx_ucr *ucr = from_timer(ucr, t, sg_timer);
 
        dev_dbg(&ucr->pusb_intf->dev, "%s: sg transfer timed out", __func__);
        usb_sg_cancel(&ucr->current_sg);
                goto out_init_fail;
 
        /* initialize USB SG transfer timer */
-       setup_timer(&ucr->sg_timer, rtsx_usb_sg_timed_out, (unsigned long) ucr);
+       timer_setup(&ucr->sg_timer, rtsx_usb_sg_timed_out, 0);
 
        ret = mfd_add_hotplug_devices(&intf->dev, rtsx_usb_cells,
                                      ARRAY_SIZE(rtsx_usb_cells));
 
        return err;
 }
 
-static void mmc_retune_timer(unsigned long data)
+static void mmc_retune_timer(struct timer_list *t)
 {
-       struct mmc_host *host = (struct mmc_host *)data;
+       struct mmc_host *host = from_timer(host, t, retune_timer);
 
        mmc_retune_needed(host);
 }
        init_waitqueue_head(&host->wq);
        INIT_DELAYED_WORK(&host->detect, mmc_rescan);
        INIT_DELAYED_WORK(&host->sdio_irq_work, sdio_irq_work);
-       setup_timer(&host->retune_timer, mmc_retune_timer, (unsigned long)host);
+       timer_setup(&host->retune_timer, mmc_retune_timer, 0);
 
        /*
         * By default, hosts do not support SGIO or large requests.
 
 
 
 /* flush timer, runs a second after last write */
-static void sm_cache_flush_timer(unsigned long data)
+static void sm_cache_flush_timer(struct timer_list *t)
 {
-       struct sm_ftl *ftl = (struct sm_ftl *)data;
+       struct sm_ftl *ftl = from_timer(ftl, t, timer);
        queue_work(cache_flush_workqueue, &ftl->flush_work);
 }
 
 
 
        mutex_init(&ftl->mutex);
-       setup_timer(&ftl->timer, sm_cache_flush_timer, (unsigned long)ftl);
+       timer_setup(&ftl->timer, sm_cache_flush_timer, 0);
        INIT_WORK(&ftl->flush_work, sm_cache_flush_work);
        init_completion(&ftl->erase_completion);
 
 
 
 static LIST_HEAD(cfhsi_list);
 
-static void cfhsi_inactivity_tout(unsigned long arg)
+static void cfhsi_inactivity_tout(struct timer_list *t)
 {
-       struct cfhsi *cfhsi = (struct cfhsi *)arg;
+       struct cfhsi *cfhsi = from_timer(cfhsi, t, inactivity_timer);
 
        netdev_dbg(cfhsi->ndev, "%s.\n",
                __func__);
        schedule_work(&cfhsi->out_of_sync_work);
 }
 
-static void cfhsi_rx_slowpath(unsigned long arg)
+static void cfhsi_rx_slowpath(struct timer_list *t)
 {
-       struct cfhsi *cfhsi = (struct cfhsi *)arg;
+       struct cfhsi *cfhsi = from_timer(cfhsi, t, rx_slowpath_timer);
 
        netdev_dbg(cfhsi->ndev, "%s.\n",
                __func__);
        wake_up_interruptible(&cfhsi->wake_down_wait);
 }
 
-static void cfhsi_aggregation_tout(unsigned long arg)
+static void cfhsi_aggregation_tout(struct timer_list *t)
 {
-       struct cfhsi *cfhsi = (struct cfhsi *)arg;
+       struct cfhsi *cfhsi = from_timer(cfhsi, t, aggregation_timer);
 
        netdev_dbg(cfhsi->ndev, "%s.\n",
                __func__);
        init_waitqueue_head(&cfhsi->flush_fifo_wait);
 
        /* Setup the inactivity timer. */
-       setup_timer(&cfhsi->inactivity_timer, cfhsi_inactivity_tout,
-                   (unsigned long)cfhsi);
+       timer_setup(&cfhsi->inactivity_timer, cfhsi_inactivity_tout, 0);
        /* Setup the slowpath RX timer. */
-       setup_timer(&cfhsi->rx_slowpath_timer, cfhsi_rx_slowpath,
-                   (unsigned long)cfhsi);
+       timer_setup(&cfhsi->rx_slowpath_timer, cfhsi_rx_slowpath, 0);
        /* Setup the aggregation timer. */
-       setup_timer(&cfhsi->aggregation_timer, cfhsi_aggregation_tout,
-                   (unsigned long)cfhsi);
+       timer_setup(&cfhsi->aggregation_timer, cfhsi_aggregation_tout, 0);
 
        /* Activate HSI interface. */
        res = cfhsi->ops->cfhsi_up(cfhsi->ops);
 
        mutex_unlock(&chip->reg_lock);
 }
 
-static void mv88e6xxx_phy_ppu_reenable_timer(unsigned long _ps)
+static void mv88e6xxx_phy_ppu_reenable_timer(struct timer_list *t)
 {
-       struct mv88e6xxx_chip *chip = (void *)_ps;
+       struct mv88e6xxx_chip *chip = from_timer(chip, t, ppu_timer);
 
        schedule_work(&chip->ppu_work);
 }
 {
        mutex_init(&chip->ppu_mutex);
        INIT_WORK(&chip->ppu_work, mv88e6xxx_phy_ppu_reenable_work);
-       setup_timer(&chip->ppu_timer, mv88e6xxx_phy_ppu_reenable_timer,
-                   (unsigned long)chip);
+       timer_setup(&chip->ppu_timer, mv88e6xxx_phy_ppu_reenable_timer, 0);
 }
 
 static void mv88e6xxx_phy_ppu_state_destroy(struct mv88e6xxx_chip *chip)
 
 
 static void eql_kill_one_slave(slave_queue_t *queue, slave_t *slave);
 
-static void eql_timer(unsigned long param)
+static void eql_timer(struct timer_list *t)
 {
-       equalizer_t *eql = (equalizer_t *) param;
+       equalizer_t *eql = from_timer(eql, t, timer);
        struct list_head *this, *tmp, *head;
 
        spin_lock(&eql->queue.lock);
 {
        equalizer_t *eql = netdev_priv(dev);
 
-       setup_timer(&eql->timer, eql_timer, (unsigned long)eql);
+       timer_setup(&eql->timer, eql_timer, 0);
        eql->timer.expires      = jiffies + EQL_DEFAULT_RESCHED_IVAL;
 
        spin_lock_init(&eql->queue.lock);
 
        return;
 }
 
-static void tx_reclaim_skb_timeout(unsigned long lp)
+static void tx_reclaim_skb_timeout(struct timer_list *t)
 {
-       tx_reclaim_skb((struct bfin_mac_local *)lp);
+       struct bfin_mac_local *lp = from_timer(lp, t, tx_reclaim_timer);
+
+       tx_reclaim_skb(lp);
 }
 
 static int bfin_mac_hard_start_xmit(struct sk_buff *skb,
        ndev->netdev_ops = &bfin_mac_netdev_ops;
        ndev->ethtool_ops = &bfin_mac_ethtool_ops;
 
-       setup_timer(&lp->tx_reclaim_timer, tx_reclaim_skb_timeout,
-                   (unsigned long)lp);
+       timer_setup(&lp->tx_reclaim_timer, tx_reclaim_skb_timeout, 0);
 
        lp->flags = 0;
        netif_napi_add(ndev, &lp->napi, bfin_mac_poll, CONFIG_BFIN_RX_DESC_NUM);
 
  * The routine called when the error timer expires, to track the number of
  * recurring errors.
  */
-static void et131x_error_timer_handler(unsigned long data)
+static void et131x_error_timer_handler(struct timer_list *t)
 {
-       struct et131x_adapter *adapter = (struct et131x_adapter *)data;
+       struct et131x_adapter *adapter = from_timer(adapter, t, error_timer);
        struct phy_device *phydev = adapter->netdev->phydev;
 
        if (et1310_in_phy_coma(adapter)) {
        int result;
 
        /* Start the timer to track NIC errors */
-       setup_timer(&adapter->error_timer, et131x_error_timer_handler,
-                   (unsigned long)adapter);
+       timer_setup(&adapter->error_timer, et131x_error_timer_handler, 0);
        adapter->error_timer.expires = jiffies +
                msecs_to_jiffies(TX_ERROR_PERIOD);
        add_timer(&adapter->error_timer);
 
                (netdev->features & GENMASK_ULL(63, 32)) >> 32;
 }
 
-static void ena_timer_service(unsigned long data)
+static void ena_timer_service(struct timer_list *t)
 {
-       struct ena_adapter *adapter = (struct ena_adapter *)data;
+       struct ena_adapter *adapter = from_timer(adapter, t, timer_service);
        u8 *debug_area = adapter->ena_dev->host_attr.debug_area_virt_addr;
        struct ena_admin_host_info *host_info =
                adapter->ena_dev->host_attr.host_info;
 
        ena_update_hints(adapter, &get_feat_ctx.hw_hints);
 
-       setup_timer(&adapter->timer_service, ena_timer_service,
-                   (unsigned long)adapter);
+       timer_setup(&adapter->timer_service, ena_timer_service, 0);
        mod_timer(&adapter->timer_service, round_jiffies(jiffies + HZ));
 
        dev_info(&pdev->dev, "%s found at mem %lx, mac addr %pM Queues %d\n",
 
        return 0;
 }
 
-static void aq_nic_service_timer_cb(unsigned long param)
+static void aq_nic_service_timer_cb(struct timer_list *t)
 {
-       struct aq_nic_s *self = (struct aq_nic_s *)param;
+       struct aq_nic_s *self = from_timer(self, t, service_timer);
        struct net_device *ndev = aq_nic_get_ndev(self);
        int err = 0;
        unsigned int i = 0U;
                  jiffies + AQ_CFG_SERVICE_TIMER_INTERVAL);
 }
 
-static void aq_nic_polling_timer_cb(unsigned long param)
+static void aq_nic_polling_timer_cb(struct timer_list *t)
 {
-       struct aq_nic_s *self = (struct aq_nic_s *)param;
+       struct aq_nic_s *self = from_timer(self, t, polling_timer);
        struct aq_vec_s *aq_vec = NULL;
        unsigned int i = 0U;
 
        err = aq_nic_update_interrupt_moderation_settings(self);
        if (err)
                goto err_exit;
-       setup_timer(&self->service_timer, &aq_nic_service_timer_cb,
-                   (unsigned long)self);
+       timer_setup(&self->service_timer, aq_nic_service_timer_cb, 0);
        mod_timer(&self->service_timer, jiffies +
                        AQ_CFG_SERVICE_TIMER_INTERVAL);
 
        if (self->aq_nic_cfg.is_polling) {
-               setup_timer(&self->polling_timer, &aq_nic_polling_timer_cb,
-                           (unsigned long)self);
+               timer_setup(&self->polling_timer, aq_nic_polling_timer_cb, 0);
                mod_timer(&self->polling_timer, jiffies +
                          AQ_CFG_POLLING_TIMER_INTERVAL);
        } else {
 
  * atl1c_phy_config - Timer Call-back
  * @data: pointer to netdev cast into an unsigned long
  */
-static void atl1c_phy_config(unsigned long data)
+static void atl1c_phy_config(struct timer_list *t)
 {
-       struct atl1c_adapter *adapter = (struct atl1c_adapter *) data;
+       struct atl1c_adapter *adapter = from_timer(adapter, t,
+                                                  phy_config_timer);
        struct atl1c_hw *hw = &adapter->hw;
        unsigned long flags;
 
        adapter->mii.phy_id_mask = 0x1f;
        adapter->mii.reg_num_mask = MDIO_CTRL_REG_MASK;
        netif_napi_add(netdev, &adapter->napi, atl1c_clean, 64);
-       setup_timer(&adapter->phy_config_timer, atl1c_phy_config,
-                       (unsigned long)adapter);
+       timer_setup(&adapter->phy_config_timer, atl1c_phy_config, 0);
        /* setup the private structure */
        err = atl1c_sw_init(adapter);
        if (err) {
 
  * atl1e_phy_config - Timer Call-back
  * @data: pointer to netdev cast into an unsigned long
  */
-static void atl1e_phy_config(unsigned long data)
+static void atl1e_phy_config(struct timer_list *t)
 {
-       struct atl1e_adapter *adapter = (struct atl1e_adapter *) data;
+       struct atl1e_adapter *adapter = from_timer(adapter, t,
+                                                  phy_config_timer);
        struct atl1e_hw *hw = &adapter->hw;
        unsigned long flags;
 
 
        netif_napi_add(netdev, &adapter->napi, atl1e_clean, 64);
 
-       setup_timer(&adapter->phy_config_timer, atl1e_phy_config,
-                   (unsigned long)adapter);
+       timer_setup(&adapter->phy_config_timer, atl1e_phy_config, 0);
 
        /* get user settings */
        atl1e_check_options(adapter);
 
  * atl1_phy_config - Timer Call-back
  * @data: pointer to netdev cast into an unsigned long
  */
-static void atl1_phy_config(unsigned long data)
+static void atl1_phy_config(struct timer_list *t)
 {
-       struct atl1_adapter *adapter = (struct atl1_adapter *)data;
+       struct atl1_adapter *adapter = from_timer(adapter, t,
+                                                 phy_config_timer);
        struct atl1_hw *hw = &adapter->hw;
        unsigned long flags;
 
        /* assume we have no link for now */
        netif_carrier_off(netdev);
 
-       setup_timer(&adapter->phy_config_timer, atl1_phy_config,
-                   (unsigned long)adapter);
+       timer_setup(&adapter->phy_config_timer, atl1_phy_config, 0);
        adapter->phy_timer_pending = false;
 
        INIT_WORK(&adapter->reset_dev_task, atl1_reset_dev_task);
 
  * atl2_watchdog - Timer Call-back
  * @data: pointer to netdev cast into an unsigned long
  */
-static void atl2_watchdog(unsigned long data)
+static void atl2_watchdog(struct timer_list *t)
 {
-       struct atl2_adapter *adapter = (struct atl2_adapter *) data;
+       struct atl2_adapter *adapter = from_timer(adapter, t, watchdog_timer);
 
        if (!test_bit(__ATL2_DOWN, &adapter->flags)) {
                u32 drop_rxd, drop_rxs;
  * atl2_phy_config - Timer Call-back
  * @data: pointer to netdev cast into an unsigned long
  */
-static void atl2_phy_config(unsigned long data)
+static void atl2_phy_config(struct timer_list *t)
 {
-       struct atl2_adapter *adapter = (struct atl2_adapter *) data;
+       struct atl2_adapter *adapter = from_timer(adapter, t,
+                                                 phy_config_timer);
        struct atl2_hw *hw = &adapter->hw;
        unsigned long flags;
 
 
        atl2_check_options(adapter);
 
-       setup_timer(&adapter->watchdog_timer, atl2_watchdog,
-                   (unsigned long)adapter);
+       timer_setup(&adapter->watchdog_timer, atl2_watchdog, 0);
 
-       setup_timer(&adapter->phy_config_timer, atl2_phy_config,
-                   (unsigned long)adapter);
+       timer_setup(&adapter->phy_config_timer, atl2_phy_config, 0);
 
        INIT_WORK(&adapter->reset_task, atl2_reset_task);
        INIT_WORK(&adapter->link_chg_task, atl2_link_chg_task);
 
        }
 }
 
-static void b44_timer(unsigned long __opaque)
+static void b44_timer(struct timer_list *t)
 {
-       struct b44 *bp = (struct b44 *) __opaque;
+       struct b44 *bp = from_timer(bp, t, timer);
 
        spin_lock_irq(&bp->lock);
 
                goto out;
        }
 
-       setup_timer(&bp->timer, b44_timer, (unsigned long)bp);
+       timer_setup(&bp->timer, b44_timer, 0);
        bp->timer.expires = jiffies + HZ;
        add_timer(&bp->timer);
 
 
 }
 
 static void
-bnx2_timer(unsigned long data)
+bnx2_timer(struct timer_list *t)
 {
-       struct bnx2 *bp = (struct bnx2 *) data;
+       struct bnx2 *bp = from_timer(bp, t, timer);
 
        if (!netif_running(bp->dev))
                return;
        bnx2_set_default_link(bp);
        bp->req_flow_ctrl = FLOW_CTRL_RX | FLOW_CTRL_TX;
 
-       setup_timer(&bp->timer, bnx2_timer, (unsigned long)bp);
+       timer_setup(&bp->timer, bnx2_timer, 0);
        bp->timer.expires = RUN_AT(BNX2_TIMER_INTERVAL);
 
 #ifdef BCM_CNIC
 
                 bp->fw_drv_pulse_wr_seq);
 }
 
-static void bnx2x_timer(unsigned long data)
+static void bnx2x_timer(struct timer_list *t)
 {
-       struct bnx2x *bp = (struct bnx2x *) data;
+       struct bnx2x *bp = from_timer(bp, t, timer);
 
        if (!netif_running(bp->dev))
                return;
 
        bp->current_interval = CHIP_REV_IS_SLOW(bp) ? 5*HZ : HZ;
 
-       setup_timer(&bp->timer, bnx2x_timer, (unsigned long)bp);
+       timer_setup(&bp->timer, bnx2x_timer, 0);
        bp->timer.expires = jiffies + bp->current_interval;
 
        if (SHMEM2_HAS(bp, dcbx_lldp_params_offset) &&
 
 }
 #endif
 
-static void bnxt_timer(unsigned long data)
+static void bnxt_timer(struct timer_list *t)
 {
-       struct bnxt *bp = (struct bnxt *)data;
+       struct bnxt *bp = from_timer(bp, t, timer);
        struct net_device *dev = bp->dev;
 
        if (!netif_running(dev))
 
        bnxt_init_dflt_coal(bp);
 
-       setup_timer(&bp->timer, bnxt_timer, (unsigned long)bp);
+       timer_setup(&bp->timer, bnxt_timer, 0);
        bp->current_interval = BNXT_TIMER_INTERVAL;
 
        clear_bit(BNXT_STATE_OPEN, &bp->state);
 
        }
 }
 
-static void tg3_timer(unsigned long __opaque)
+static void tg3_timer(struct timer_list *t)
 {
-       struct tg3 *tp = (struct tg3 *) __opaque;
+       struct tg3 *tp = from_timer(tp, t, timer);
 
        spin_lock(&tp->lock);
 
        tp->asf_multiplier = (HZ / tp->timer_offset) *
                             TG3_FW_UPDATE_FREQ_SEC;
 
-       setup_timer(&tp->timer, tg3_timer, (unsigned long)tp);
+       timer_setup(&tp->timer, tg3_timer, 0);
 }
 
 static void tg3_timer_start(struct tg3 *tp)
 
        return work_done;
 }
 
-static void enic_notify_timer(unsigned long data)
+static void enic_notify_timer(struct timer_list *t)
 {
-       struct enic *enic = (struct enic *)data;
+       struct enic *enic = from_timer(enic, t, notify_timer);
 
        enic_notify_check(enic);
 
        /* Setup notification timer, HW reset task, and wq locks
         */
 
-       setup_timer(&enic->notify_timer, enic_notify_timer,
-                   (unsigned long)enic);
+       timer_setup(&enic->notify_timer, enic_notify_timer, 0);
 
        enic_set_rx_coal_setting(enic);
        INIT_WORK(&enic->reset, enic_reset);
 
        spin_unlock_bh(&mp->mib_counters_lock);
 }
 
-static void mib_counters_timer_wrapper(unsigned long _mp)
+static void mib_counters_timer_wrapper(struct timer_list *t)
 {
-       struct mv643xx_eth_private *mp = (void *)_mp;
+       struct mv643xx_eth_private *mp = from_timer(mp, t, mib_counters_timer);
        mib_counters_update(mp);
        mod_timer(&mp->mib_counters_timer, jiffies + 30 * HZ);
 }
        return work_done;
 }
 
-static inline void oom_timer_wrapper(unsigned long data)
+static inline void oom_timer_wrapper(struct timer_list *t)
 {
-       struct mv643xx_eth_private *mp = (void *)data;
+       struct mv643xx_eth_private *mp = from_timer(mp, t, rx_oom);
 
        napi_schedule(&mp->napi);
 }
 
        mib_counters_clear(mp);
 
-       setup_timer(&mp->mib_counters_timer, mib_counters_timer_wrapper,
-                   (unsigned long)mp);
+       timer_setup(&mp->mib_counters_timer, mib_counters_timer_wrapper, 0);
        mp->mib_counters_timer.expires = jiffies + 30 * HZ;
 
        spin_lock_init(&mp->mib_counters_lock);
 
        netif_napi_add(dev, &mp->napi, mv643xx_eth_poll, NAPI_POLL_WEIGHT);
 
-       setup_timer(&mp->rx_oom, oom_timer_wrapper, (unsigned long)mp);
+       timer_setup(&mp->rx_oom, oom_timer_wrapper, 0);
 
 
        res = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
 
        }
 }
 
-static inline void rxq_refill_timer_wrapper(unsigned long data)
+static inline void rxq_refill_timer_wrapper(struct timer_list *t)
 {
-       struct pxa168_eth_private *pep = (void *)data;
+       struct pxa168_eth_private *pep = from_timer(pep, t, timeout);
        napi_schedule(&pep->napi);
 }
 
        netif_napi_add(dev, &pep->napi, pxa168_rx_poll, pep->rx_ring_size);
 
        memset(&pep->timeout, 0, sizeof(struct timer_list));
-       setup_timer(&pep->timeout, rxq_refill_timer_wrapper,
-                   (unsigned long)pep);
+       timer_setup(&pep->timeout, rxq_refill_timer_wrapper, 0);
 
        pep->smi_bus = mdiobus_alloc();
        if (!pep->smi_bus) {
 
  * get an interrupt when carrier is detected, need to poll for
  * link coming up.
  */
-static void xm_link_timer(unsigned long arg)
+static void xm_link_timer(struct timer_list *t)
 {
-       struct skge_port *skge = (struct skge_port *) arg;
+       struct skge_port *skge = from_timer(skge, t, link_timer);
        struct net_device *dev = skge->netdev;
        struct skge_hw *hw = skge->hw;
        int port = skge->port;
 
        /* Only used for Genesis XMAC */
        if (is_genesis(hw))
-           setup_timer(&skge->link_timer, xm_link_timer, (unsigned long) skge);
+           timer_setup(&skge->link_timer, xm_link_timer, 0);
        else {
                dev->hw_features = NETIF_F_IP_CSUM | NETIF_F_SG |
                                   NETIF_F_RXCSUM;
 
        }
 }
 
-static void sky2_watchdog(unsigned long arg)
+static void sky2_watchdog(struct timer_list *t)
 {
-       struct sky2_hw *hw = (struct sky2_hw *) arg;
+       struct sky2_hw *hw = from_timer(hw, t, watchdog_timer);
 
        /* Check for lost IRQ once a second */
        if (sky2_read32(hw, B0_ISRC)) {
                sky2_show_addr(dev1);
        }
 
-       setup_timer(&hw->watchdog_timer, sky2_watchdog, (unsigned long) hw);
+       timer_setup(&hw->watchdog_timer, sky2_watchdog, 0);
        INIT_WORK(&hw->restart_work, sky2_restart);
 
        pci_set_drvdata(pdev, hw);
 
  * cannot detect a NIC with a parity error in a timely fashion if the
  * NIC is lightly loaded.
  */
-static void myri10ge_watchdog_timer(unsigned long arg)
+static void myri10ge_watchdog_timer(struct timer_list *t)
 {
        struct myri10ge_priv *mgp;
        struct myri10ge_slice_state *ss;
        u32 rx_pause_cnt;
        u16 cmd;
 
-       mgp = (struct myri10ge_priv *)arg;
+       mgp = from_timer(mgp, t, watchdog_timer);
 
        rx_pause_cnt = ntohl(mgp->ss[0].fw_stats->dropped_pause);
        busy_slice_cnt = 0;
        pci_save_state(pdev);
 
        /* Setup the watchdog timer */
-       setup_timer(&mgp->watchdog_timer, myri10ge_watchdog_timer,
-                   (unsigned long)mgp);
+       timer_setup(&mgp->watchdog_timer, myri10ge_watchdog_timer, 0);
 
        netdev->ethtool_ops = &myri10ge_ethtool_ops;
        INIT_WORK(&mgp->watchdog_work, myri10ge_watchdog);
 
  * pch_gbe_watchdog - Watchdog process
  * @data:  Board private structure
  */
-static void pch_gbe_watchdog(unsigned long data)
+static void pch_gbe_watchdog(struct timer_list *t)
 {
-       struct pch_gbe_adapter *adapter = (struct pch_gbe_adapter *)data;
+       struct pch_gbe_adapter *adapter = from_timer(adapter, t,
+                                                    watchdog_timer);
        struct net_device *netdev = adapter->netdev;
        struct pch_gbe_hw *hw = &adapter->hw;
 
                dev_err(&pdev->dev, "Invalid MAC address, "
                                    "interface disabled.\n");
        }
-       setup_timer(&adapter->watchdog_timer, pch_gbe_watchdog,
-                   (unsigned long)adapter);
+       timer_setup(&adapter->watchdog_timer, pch_gbe_watchdog, 0);
 
        INIT_WORK(&adapter->reset_task, pch_gbe_reset_task);
 
 
 
 #define TX_CLEAN_INTERVAL HZ
 
-static void pasemi_mac_tx_timer(unsigned long data)
+static void pasemi_mac_tx_timer(struct timer_list *t)
 {
-       struct pasemi_mac_txring *txring = (struct pasemi_mac_txring *)data;
+       struct pasemi_mac_txring *txring = from_timer(txring, t, clean_timer);
        struct pasemi_mac *mac = txring->mac;
 
        pasemi_mac_clean_tx(txring);
        if (dev->phydev)
                phy_start(dev->phydev);
 
-       setup_timer(&mac->tx->clean_timer, pasemi_mac_tx_timer,
-                   (unsigned long)mac->tx);
+       timer_setup(&mac->tx->clean_timer, pasemi_mac_tx_timer, 0);
        mod_timer(&mac->tx->clean_timer, jiffies + HZ);
 
        return 0;
 
        qdev->pci_slot = (u8) PCI_SLOT(qdev->pdev->devfn);
 }
 
-static void ql3xxx_timer(unsigned long ptr)
+static void ql3xxx_timer(struct timer_list *t)
 {
-       struct ql3_adapter *qdev = (struct ql3_adapter *)ptr;
+       struct ql3_adapter *qdev = from_timer(qdev, t, adapter_timer);
        queue_delayed_work(qdev->workqueue, &qdev->link_state_work, 0);
 }
 
        INIT_DELAYED_WORK(&qdev->tx_timeout_work, ql_tx_timeout_work);
        INIT_DELAYED_WORK(&qdev->link_state_work, ql_link_state_machine_work);
 
-       setup_timer(&qdev->adapter_timer, ql3xxx_timer, (unsigned long)qdev);
+       timer_setup(&qdev->adapter_timer, ql3xxx_timer, 0);
        qdev->adapter_timer.expires = jiffies + HZ * 2; /* two second delay */
 
        if (!cards_found) {
 
        return err;
 }
 
-static void ofdpa_fdb_cleanup(unsigned long data)
+static void ofdpa_fdb_cleanup(struct timer_list *t)
 {
-       struct ofdpa *ofdpa = (struct ofdpa *)data;
+       struct ofdpa *ofdpa = from_timer(ofdpa, t, fdb_cleanup_timer);
        struct ofdpa_port *ofdpa_port;
        struct ofdpa_fdb_tbl_entry *entry;
        struct hlist_node *tmp;
        hash_init(ofdpa->neigh_tbl);
        spin_lock_init(&ofdpa->neigh_tbl_lock);
 
-       setup_timer(&ofdpa->fdb_cleanup_timer, ofdpa_fdb_cleanup,
-                   (unsigned long) ofdpa);
+       timer_setup(&ofdpa->fdb_cleanup_timer, ofdpa_fdb_cleanup, 0);
        mod_timer(&ofdpa->fdb_cleanup_timer, jiffies);
 
        ofdpa->ageing_time = BR_DEFAULT_AGEING_TIME;
 
  *  if there is no data transfer and if we are not in LPI state,
  *  then MAC Transmitter can be moved to LPI state.
  */
-static void stmmac_eee_ctrl_timer(unsigned long arg)
+static void stmmac_eee_ctrl_timer(struct timer_list *t)
 {
-       struct stmmac_priv *priv = (struct stmmac_priv *)arg;
+       struct stmmac_priv *priv = from_timer(priv, t, eee_ctrl_timer);
 
        stmmac_enable_eee_mode(priv);
        mod_timer(&priv->eee_ctrl_timer, STMMAC_LPI_T(eee_timer));
                spin_lock_irqsave(&priv->lock, flags);
                if (!priv->eee_active) {
                        priv->eee_active = 1;
-                       setup_timer(&priv->eee_ctrl_timer,
-                                   stmmac_eee_ctrl_timer,
-                                   (unsigned long)priv);
+                       timer_setup(&priv->eee_ctrl_timer,
+                                   stmmac_eee_ctrl_timer, 0);
                        mod_timer(&priv->eee_ctrl_timer,
                                  STMMAC_LPI_T(eee_timer));
 
  * Description:
  * This is the timer handler to directly invoke the stmmac_tx_clean.
  */
-static void stmmac_tx_timer(unsigned long data)
+static void stmmac_tx_timer(struct timer_list *t)
 {
-       struct stmmac_priv *priv = (struct stmmac_priv *)data;
+       struct stmmac_priv *priv = from_timer(priv, t, txtimer);
        u32 tx_queues_count = priv->plat->tx_queues_to_use;
        u32 queue;
 
 {
        priv->tx_coal_frames = STMMAC_TX_FRAMES;
        priv->tx_coal_timer = STMMAC_COAL_TX_TIMER;
-       setup_timer(&priv->txtimer, stmmac_tx_timer, (unsigned long)priv);
+       timer_setup(&priv->txtimer, stmmac_tx_timer, 0);
        priv->txtimer.expires = STMMAC_COAL_TIMER(priv->tx_coal_timer);
        add_timer(&priv->txtimer);
 }
 
        return IRQ_HANDLED;
 }
 
-static void xlgmac_tx_timer(unsigned long data)
+static void xlgmac_tx_timer(struct timer_list *t)
 {
-       struct xlgmac_channel *channel = (struct xlgmac_channel *)data;
+       struct xlgmac_channel *channel = from_timer(channel, t, tx_timer);
        struct xlgmac_pdata *pdata = channel->pdata;
        struct napi_struct *napi;
 
                if (!channel->tx_ring)
                        break;
 
-               setup_timer(&channel->tx_timer, xlgmac_tx_timer,
-                           (unsigned long)channel);
+               timer_setup(&channel->tx_timer, xlgmac_tx_timer, 0);
        }
 }
 
 
 }
 EXPORT_SYMBOL_GPL(cpsw_ale_control_get);
 
-static void cpsw_ale_timer(unsigned long arg)
+static void cpsw_ale_timer(struct timer_list *t)
 {
-       struct cpsw_ale *ale = (struct cpsw_ale *)arg;
+       struct cpsw_ale *ale = from_timer(ale, t, timer);
 
        cpsw_ale_control_set(ale, 0, ALE_AGEOUT, 1);
 
        cpsw_ale_control_set(ale, 0, ALE_ENABLE, 1);
        cpsw_ale_control_set(ale, 0, ALE_CLEAR, 1);
 
-       setup_timer(&ale->timer, cpsw_ale_timer, (unsigned long)ale);
+       timer_setup(&ale->timer, cpsw_ale_timer, 0);
        if (ale->ageout) {
                ale->timer.expires = jiffies + ale->ageout;
                add_timer(&ale->timer);
 
        return -EOPNOTSUPP;
 }
 
-static void netcp_ethss_timer(unsigned long arg)
+static void netcp_ethss_timer(struct timer_list *t)
 {
-       struct gbe_priv *gbe_dev = (struct gbe_priv *)arg;
+       struct gbe_priv *gbe_dev = from_timer(gbe_dev, t, timer);
        struct gbe_intf *gbe_intf;
        struct gbe_slave *slave;
 
        }
        spin_unlock_bh(&gbe_dev->hw_stats_lock);
 
-       setup_timer(&gbe_dev->timer, netcp_ethss_timer,
-                   (unsigned long)gbe_dev);
+       timer_setup(&gbe_dev->timer, netcp_ethss_timer, 0);
        gbe_dev->timer.expires   = jiffies + GBE_TIMER_INTERVAL;
        add_timer(&gbe_dev->timer);
        *inst_priv = gbe_dev;
 
  * packets, including updating the queue tail pointer.
  */
 static void
-spider_net_cleanup_tx_ring(struct spider_net_card *card)
+spider_net_cleanup_tx_ring(struct timer_list *t)
 {
+       struct spider_net_card *card = from_timer(card, t, tx_timer);
        if ((spider_net_release_tx_chain(card, 0) != 0) &&
            (card->netdev->flags & IFF_UP)) {
                spider_net_kick_tx_dma(card);
        spider_net_refill_rx_chain(card);
        spider_net_enable_rxdmac(card);
 
-       spider_net_cleanup_tx_ring(card);
+       spider_net_cleanup_tx_ring(&card->tx_timer);
 
        /* if all packets are in the stack, enable interrupts and return 0 */
        /* if not, return 1 */
  * @data: used for pointer to card structure
  *
  */
-static void spider_net_link_phy(unsigned long data)
+static void spider_net_link_phy(struct timer_list *t)
 {
-       struct spider_net_card *card = (struct spider_net_card *)data;
+       struct spider_net_card *card = from_timer(card, t, aneg_timer);
        struct mii_phy *phy = &card->phy;
 
        /* if link didn't come up after SPIDER_NET_ANEG_TIMEOUT tries, setup phy again */
 
        pci_set_drvdata(card->pdev, netdev);
 
-       setup_timer(&card->tx_timer,
-                   (void(*)(unsigned long))spider_net_cleanup_tx_ring,
-                   (unsigned long)card);
+       timer_setup(&card->tx_timer, spider_net_cleanup_tx_ring, 0);
        netdev->irq = card->pdev->irq;
 
        card->aneg_count = 0;
-       setup_timer(&card->aneg_timer, spider_net_link_phy,
-                   (unsigned long)card);
+       timer_setup(&card->aneg_timer, spider_net_link_phy, 0);
 
        netif_napi_add(netdev, &card->napi,
                       spider_net_poll, SPIDER_NET_NAPI_WEIGHT);
 
 static void slip_unesc6(struct slip *sl, unsigned char c);
 #endif
 #ifdef CONFIG_SLIP_SMART
-static void sl_keepalive(unsigned long sls);
-static void sl_outfill(unsigned long sls);
+static void sl_keepalive(struct timer_list *t);
+static void sl_outfill(struct timer_list *t);
 static int sl_ioctl(struct net_device *dev, struct ifreq *rq, int cmd);
 #endif
 
        sl->mode        = SL_MODE_DEFAULT;
 #ifdef CONFIG_SLIP_SMART
        /* initialize timer_list struct */
-       setup_timer(&sl->keepalive_timer, sl_keepalive, (unsigned long)sl);
-       setup_timer(&sl->outfill_timer, sl_outfill, (unsigned long)sl);
+       timer_setup(&sl->keepalive_timer, sl_keepalive, 0);
+       timer_setup(&sl->outfill_timer, sl_outfill, 0);
 #endif
        slip_devs[i] = dev;
        return sl;
  * added by Stanislav Voronyi. All changes before marked VSV
  */
 
-static void sl_outfill(unsigned long sls)
+static void sl_outfill(struct timer_list *t)
 {
-       struct slip *sl = (struct slip *)sls;
+       struct slip *sl = from_timer(sl, t, outfill_timer);
 
        spin_lock(&sl->lock);
 
        spin_unlock(&sl->lock);
 }
 
-static void sl_keepalive(unsigned long sls)
+static void sl_keepalive(struct timer_list *t)
 {
-       struct slip *sl = (struct slip *)sls;
+       struct slip *sl = from_timer(sl, t, keepalive_timer);
 
        spin_lock(&sl->lock);
 
 
        spin_unlock_bh(&tun->lock);
 }
 
-static void tun_flow_cleanup(unsigned long data)
+static void tun_flow_cleanup(struct timer_list *t)
 {
-       struct tun_struct *tun = (struct tun_struct *)data;
+       struct tun_struct *tun = from_timer(tun, t, flow_gc_timer);
        unsigned long delay = tun->ageing_time;
        unsigned long next_timer = jiffies + delay;
        unsigned long count = 0;
                INIT_HLIST_HEAD(&tun->flows[i]);
 
        tun->ageing_time = TUN_FLOW_EXPIRE;
-       setup_timer(&tun->flow_gc_timer, tun_flow_cleanup, (unsigned long)tun);
+       timer_setup(&tun->flow_gc_timer, tun_flow_cleanup, 0);
+       mod_timer(&tun->flow_gc_timer,
+                 round_jiffies_up(jiffies + tun->ageing_time));
 }
 
 static void tun_flow_uninit(struct tun_struct *tun)
 
        return NET_RX_DROP;
 }
 
-static void ppp_timer(unsigned long arg)
+static void ppp_timer(struct timer_list *t)
 {
-       struct proto *proto = (struct proto *)arg;
+       struct proto *proto = from_timer(proto, t, timer);
        struct ppp *ppp = get_ppp(proto->dev);
        unsigned long flags;
 
        for (i = 0; i < IDX_COUNT; i++) {
                struct proto *proto = &ppp->protos[i];
                proto->dev = dev;
-               setup_timer(&proto->timer, ppp_timer, (unsigned long)proto);
+               timer_setup(&proto->timer, ppp_timer, 0);
                proto->state = CLOSED;
        }
        ppp->protos[IDX_LCP].pid = PID_LCP;
 
 /**
  * brcmf_btcoex_timerfunc() - BT coex timer callback
  */
-static void brcmf_btcoex_timerfunc(ulong data)
+static void brcmf_btcoex_timerfunc(struct timer_list *t)
 {
-       struct brcmf_btcoex_info *bt_local = (struct brcmf_btcoex_info *)data;
+       struct brcmf_btcoex_info *bt_local = from_timer(bt_local, t, timer);
        brcmf_dbg(TRACE, "enter\n");
 
        bt_local->timer_on = false;
        /* Set up timer for BT  */
        btci->timer_on = false;
        btci->timeout = BRCMF_BTCOEX_OPPR_WIN_TIME;
-       setup_timer(&btci->timer, brcmf_btcoex_timerfunc, (ulong)btci);
+       timer_setup(&btci->timer, brcmf_btcoex_timerfunc, 0);
        btci->cfg = cfg;
        btci->saved_regs_part1 = false;
        btci->saved_regs_part2 = false;
 
        brcmf_notify_escan_complete(cfg, cfg->escan_info.ifp, true, true);
 }
 
-static void brcmf_escan_timeout(unsigned long data)
+static void brcmf_escan_timeout(struct timer_list *t)
 {
        struct brcmf_cfg80211_info *cfg =
-                       (struct brcmf_cfg80211_info *)data;
+                       from_timer(cfg, t, escan_timeout);
 
        if (cfg->int_escan_map || cfg->scan_request) {
                brcmf_err("timer expired\n");
                            brcmf_cfg80211_escan_handler);
        cfg->escan_info.escan_state = WL_ESCAN_STATE_IDLE;
        /* Init scan_timeout timer */
-       setup_timer(&cfg->escan_timeout, brcmf_escan_timeout,
-                   (unsigned long)cfg);
+       timer_setup(&cfg->escan_timeout, brcmf_escan_timeout, 0);
        INIT_WORK(&cfg->escan_timeout_work,
                  brcmf_cfg80211_escan_timeout_worker);
 }
 
 }
 
 static void
-brcmf_sdio_watchdog(unsigned long data)
+brcmf_sdio_watchdog(struct timer_list *t)
 {
-       struct brcmf_sdio *bus = (struct brcmf_sdio *)data;
+       struct brcmf_sdio *bus = from_timer(bus, t, timer);
 
        if (bus->watchdog_tsk) {
                complete(&bus->watchdog_wait);
        init_waitqueue_head(&bus->dcmd_resp_wait);
 
        /* Set up the watchdog timer */
-       setup_timer(&bus->timer, brcmf_sdio_watchdog,
-                   (unsigned long)bus);
+       timer_setup(&bus->timer, brcmf_sdio_watchdog, 0);
        /* Initialize watchdog thread */
        init_completion(&bus->watchdog_wait);
        bus->watchdog_tsk = kthread_run(brcmf_sdio_watchdog_thread,
 
  * was received.  We need to ensure we receive the statistics in order
  * to update the temperature used for calibrating the TXPOWER.
  */
-static void iwl_bg_statistics_periodic(unsigned long data)
+static void iwl_bg_statistics_periodic(struct timer_list *t)
 {
-       struct iwl_priv *priv = (struct iwl_priv *)data;
+       struct iwl_priv *priv = from_timer(priv, t, statistics_periodic);
 
        if (test_bit(STATUS_EXIT_PENDING, &priv->status))
                return;
  * this function is to perform continuous uCode event logging operation
  * if enabled
  */
-static void iwl_bg_ucode_trace(unsigned long data)
+static void iwl_bg_ucode_trace(struct timer_list *t)
 {
-       struct iwl_priv *priv = (struct iwl_priv *)data;
+       struct iwl_priv *priv = from_timer(priv, t, ucode_trace);
 
        if (test_bit(STATUS_EXIT_PENDING, &priv->status))
                return;
        if (priv->lib->bt_params)
                iwlagn_bt_setup_deferred_work(priv);
 
-       setup_timer(&priv->statistics_periodic, iwl_bg_statistics_periodic,
-                   (unsigned long)priv);
+       timer_setup(&priv->statistics_periodic, iwl_bg_statistics_periodic, 0);
 
-       setup_timer(&priv->ucode_trace, iwl_bg_ucode_trace,
-                   (unsigned long)priv);
+       timer_setup(&priv->ucode_trace, iwl_bg_ucode_trace, 0);
 }
 
 void iwl_cancel_deferred_work(struct iwl_priv *priv)
 
        memset(ptr, 0, sizeof(*ptr));
 }
 
-static void iwl_pcie_txq_stuck_timer(unsigned long data)
+static void iwl_pcie_txq_stuck_timer(struct timer_list *t)
 {
-       struct iwl_txq *txq = (void *)data;
+       struct iwl_txq *txq = from_timer(txq, t, stuck_timer);
        struct iwl_trans_pcie *trans_pcie = txq->trans_pcie;
        struct iwl_trans *trans = iwl_trans_pcie_get_trans(trans_pcie);
 
        if (WARN_ON(txq->entries || txq->tfds))
                return -EINVAL;
 
-       setup_timer(&txq->stuck_timer, iwl_pcie_txq_stuck_timer,
-                   (unsigned long)txq);
+       timer_setup(&txq->stuck_timer, iwl_pcie_txq_stuck_timer, 0);
        txq->trans_pcie = trans_pcie;
 
        txq->n_window = slots_num;
 
 
 #ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT
 
-static void ap_handle_timer(unsigned long data)
+static void ap_handle_timer(struct timer_list *t)
 {
-       struct sta_info *sta = (struct sta_info *) data;
+       struct sta_info *sta = from_timer(sta, t, timer);
        local_info_t *local;
        struct ap_data *ap;
        unsigned long next_time = 0;
        }
 
 #ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT
-       setup_timer(&sta->timer, ap_handle_timer, (unsigned long)sta);
+       timer_setup(&sta->timer, ap_handle_timer, 0);
        sta->timer.expires = jiffies + ap->max_inactivity;
        if (!ap->local->hostapd)
                add_timer(&sta->timer);
 
 }
 
 
-static void hostap_passive_scan(unsigned long data)
+static void hostap_passive_scan(struct timer_list *t)
 {
-       local_info_t *local = (local_info_t *) data;
+       local_info_t *local = from_timer(local, t, passive_scan_timer);
        struct net_device *dev = local->dev;
        u16 chan;
 
  * used to monitor that local->last_tick_timer is being updated. If not,
  * interrupt busy-loop is assumed and driver tries to recover by masking out
  * some events. */
-static void hostap_tick_timer(unsigned long data)
+static void hostap_tick_timer(struct timer_list *t)
 {
        static unsigned long last_inquire = 0;
-       local_info_t *local = (local_info_t *) data;
+       local_info_t *local = from_timer(local, t, tick_timer);
        local->last_tick_timer = jiffies;
 
        /* Inquire CommTallies every 10 seconds to keep the statistics updated
 
        lib80211_crypt_info_init(&local->crypt_info, dev->name, &local->lock);
 
-       setup_timer(&local->passive_scan_timer, hostap_passive_scan,
-                   (unsigned long)local);
-       setup_timer(&local->tick_timer, hostap_tick_timer,
-                   (unsigned long)local);
+       timer_setup(&local->passive_scan_timer, hostap_passive_scan, 0);
+       timer_setup(&local->tick_timer, hostap_tick_timer, 0);
        local->tick_timer.expires = jiffies + 2 * HZ;
        add_timer(&local->tick_timer);
 
 
        mod_timer(timer, expire);
 }
 
-static void ezusb_request_timerfn(u_long _ctx)
+static void ezusb_request_timerfn(struct timer_list *t)
 {
-       struct request_context *ctx = (void *) _ctx;
+       struct request_context *ctx = from_timer(ctx, t, timer);
 
        ctx->outurb->transfer_flags |= URB_ASYNC_UNLINK;
        if (usb_unlink_urb(ctx->outurb) == -EINPROGRESS) {
        refcount_set(&ctx->refcount, 1);
        init_completion(&ctx->done);
 
-       setup_timer(&ctx->timer, ezusb_request_timerfn, (u_long)ctx);
+       timer_setup(&ctx->timer, ezusb_request_timerfn, 0);
        return ctx;
 }
 
 
                mac->iflist[i].vifid = i;
                qtnf_sta_list_init(&mac->iflist[i].sta_list);
                mutex_init(&mac->mac_lock);
-               setup_timer(&mac->scan_timeout, NULL, 0);
+               timer_setup(&mac->scan_timeout, NULL, 0);
        }
 
        qtnf_mac_init_primary_intf(mac);
 
        mutex_unlock(&wl->mutex);
 }
 
-static void wl1271_rx_streaming_timer(unsigned long data)
+static void wl1271_rx_streaming_timer(struct timer_list *t)
 {
-       struct wl12xx_vif *wlvif = (struct wl12xx_vif *)data;
+       struct wl12xx_vif *wlvif = from_timer(wlvif, t, rx_streaming_timer);
        struct wl1271 *wl = wlvif->wl;
        ieee80211_queue_work(wl->hw, &wlvif->rx_streaming_disable_work);
 }
                          wlcore_pending_auth_complete_work);
        INIT_LIST_HEAD(&wlvif->list);
 
-       setup_timer(&wlvif->rx_streaming_timer, wl1271_rx_streaming_timer,
-                   (unsigned long) wlvif);
+       timer_setup(&wlvif->rx_streaming_timer, wl1271_rx_streaming_timer, 0);
        return 0;
 }
 
 
 }
 
 
-static void rx_refill_timeout(unsigned long data)
+static void rx_refill_timeout(struct timer_list *t)
 {
-       struct netfront_queue *queue = (struct netfront_queue *)data;
+       struct netfront_queue *queue = from_timer(queue, t, rx_refill_timer);
        napi_schedule(&queue->napi);
 }
 
        spin_lock_init(&queue->tx_lock);
        spin_lock_init(&queue->rx_lock);
 
-       setup_timer(&queue->rx_refill_timer, rx_refill_timeout,
-                   (unsigned long)queue);
+       timer_setup(&queue->rx_refill_timer, rx_refill_timeout, 0);
 
        snprintf(queue->name, sizeof(queue->name), "%s-q%u",
                 queue->info->netdev->name, queue->id);
 
        return 0;
 }
 
-static void pn533_listen_mode_timer(unsigned long data)
+static void pn533_listen_mode_timer(struct timer_list *t)
 {
-       struct pn533 *dev = (struct pn533 *)data;
+       struct pn533 *dev = from_timer(dev, t, listen_timer);
 
        dev_dbg(dev->dev, "Listen mode timeout\n");
 
        if (priv->wq == NULL)
                goto error;
 
-       setup_timer(&priv->listen_timer, pn533_listen_mode_timer,
-                   (unsigned long)priv);
+       timer_setup(&priv->listen_timer, pn533_listen_mode_timer, 0);
 
        skb_queue_head_init(&priv->resp_q);
        skb_queue_head_init(&priv->fragment_skb);
 
 }
 EXPORT_SYMBOL(ndlc_recv);
 
-static void ndlc_t1_timeout(unsigned long data)
+static void ndlc_t1_timeout(struct timer_list *t)
 {
-       struct llt_ndlc *ndlc = (struct llt_ndlc *)data;
+       struct llt_ndlc *ndlc = from_timer(ndlc, t, t1_timer);
 
        pr_debug("\n");
 
        schedule_work(&ndlc->sm_work);
 }
 
-static void ndlc_t2_timeout(unsigned long data)
+static void ndlc_t2_timeout(struct timer_list *t)
 {
-       struct llt_ndlc *ndlc = (struct llt_ndlc *)data;
+       struct llt_ndlc *ndlc = from_timer(ndlc, t, t2_timer);
 
        pr_debug("\n");
 
        *ndlc_id = ndlc;
 
        /* initialize timers */
-       setup_timer(&ndlc->t1_timer, ndlc_t1_timeout, (unsigned long)ndlc);
-       setup_timer(&ndlc->t2_timer, ndlc_t2_timeout, (unsigned long)ndlc);
+       timer_setup(&ndlc->t1_timer, ndlc_t1_timeout, 0);
+       timer_setup(&ndlc->t2_timer, ndlc_t2_timeout, 0);
 
        skb_queue_head_init(&ndlc->rcv_q);
        skb_queue_head_init(&ndlc->send_q);
 
 
 static struct dentry *pp_debugfs_dir;
 
-static void pp_ping(unsigned long ctx)
+static void pp_ping(struct timer_list *t)
 {
-       struct pp_ctx *pp = (void *)ctx;
+       struct pp_ctx *pp = from_timer(pp, t, db_timer);
        unsigned long irqflags;
        u64 db_bits, db_mask;
        u32 spad_rd, spad_wr;
 
        if (ntb_link_is_up(pp->ntb, NULL, NULL) == 1) {
                dev_dbg(&pp->ntb->dev, "link is up\n");
-               pp_ping((unsigned long)pp);
+               pp_ping(&pp->db_timer);
        } else {
                dev_dbg(&pp->ntb->dev, "link is down\n");
                del_timer(&pp->db_timer);
        pp->db_bits = 0;
        atomic_set(&pp->count, 0);
        spin_lock_init(&pp->db_lock);
-       setup_timer(&pp->db_timer, pp_ping, (unsigned long)pp);
+       timer_setup(&pp->db_timer, pp_ping, 0);
        pp->db_delay = msecs_to_jiffies(delay_ms);
 
        rc = ntb_set_ctx(ntb, pp, &pp_ops);
 
 };
 
 /* release buttons after a short delay if pressed */
-static void do_sony_laptop_release_key(unsigned long unused)
+static void do_sony_laptop_release_key(struct timer_list *unused)
 {
        struct sony_laptop_keypress kp;
        unsigned long flags;
                goto err_dec_users;
        }
 
-       setup_timer(&sony_laptop_input.release_key_timer,
+       timer_setup(&sony_laptop_input.release_key_timer,
                    do_sony_laptop_release_key, 0);
 
        /* input keys */
 
  * The kernel timer
  */
 
-static void pps_ktimer_event(unsigned long ptr)
+static void pps_ktimer_event(struct timer_list *unused)
 {
        struct pps_event_time ts;
 
                return -ENOMEM;
        }
 
-       setup_timer(&ktimer, pps_ktimer_event, 0);
+       timer_setup(&ktimer, pps_ktimer_event, 0);
        mod_timer(&ktimer, jiffies + HZ);
 
        dev_info(pps->dev, "ktimer PPS source registered\n");
 
        if (num)
                rtc_handle_legacy_irq(rtc, num, RTC_UF);
 }
-static void rtc_uie_timer(unsigned long data)
+static void rtc_uie_timer(struct timer_list *t)
 {
-       struct rtc_device *rtc = (struct rtc_device *)data;
+       struct rtc_device *rtc = from_timer(rtc, t, uie_timer);
        unsigned long flags;
 
        spin_lock_irqsave(&rtc->irq_lock, flags);
 
 #ifdef CONFIG_RTC_INTF_DEV_UIE_EMUL
        INIT_WORK(&rtc->uie_task, rtc_uie_task);
-       setup_timer(&rtc->uie_timer, rtc_uie_timer, (unsigned long)rtc);
+       timer_setup(&rtc->uie_timer, rtc_uie_timer, 0);
 #endif
 
        cdev_init(&rtc->char_dev, &rtc_dev_fops);
 
 static void do_reload_device(struct work_struct *);
 static void do_requeue_requests(struct work_struct *);
 static void dasd_return_cqr_cb(struct dasd_ccw_req *, void *);
-static void dasd_device_timeout(unsigned long);
-static void dasd_block_timeout(unsigned long);
+static void dasd_device_timeout(struct timer_list *);
+static void dasd_block_timeout(struct timer_list *);
 static void __dasd_process_erp(struct dasd_device *, struct dasd_ccw_req *);
 static void dasd_profile_init(struct dasd_profile *, struct dentry *);
 static void dasd_profile_exit(struct dasd_profile *);
                     (void (*)(unsigned long)) dasd_device_tasklet,
                     (unsigned long) device);
        INIT_LIST_HEAD(&device->ccw_queue);
-       setup_timer(&device->timer, dasd_device_timeout,
-                   (unsigned long)device);
+       timer_setup(&device->timer, dasd_device_timeout, 0);
        INIT_WORK(&device->kick_work, do_kick_device);
        INIT_WORK(&device->restore_device, do_restore_device);
        INIT_WORK(&device->reload_device, do_reload_device);
                     (unsigned long) block);
        INIT_LIST_HEAD(&block->ccw_queue);
        spin_lock_init(&block->queue_lock);
-       setup_timer(&block->timer, dasd_block_timeout, (unsigned long)block);
+       timer_setup(&block->timer, dasd_block_timeout, 0);
        spin_lock_init(&block->profile.lock);
 
        return block;
  * The head of the ccw queue will have status DASD_CQR_IN_IO for 1),
  * DASD_CQR_QUEUED for 2) and 3).
  */
-static void dasd_device_timeout(unsigned long ptr)
+static void dasd_device_timeout(struct timer_list *t)
 {
        unsigned long flags;
        struct dasd_device *device;
 
-       device = (struct dasd_device *) ptr;
+       device = from_timer(device, t, timer);
        spin_lock_irqsave(get_ccwdev_lock(device->cdev), flags);
        /* re-activate request queue */
        dasd_device_remove_stop_bits(device, DASD_STOPPED_PENDING);
  * is waiting for something that may not come reliably, (e.g. a state
  * change interrupt)
  */
-static void dasd_block_timeout(unsigned long ptr)
+static void dasd_block_timeout(struct timer_list *t)
 {
        unsigned long flags;
        struct dasd_block *block;
 
-       block = (struct dasd_block *) ptr;
+       block = from_timer(block, t, timer);
        spin_lock_irqsave(get_ccwdev_lock(block->base->cdev), flags);
        /* re-activate request queue */
        dasd_device_remove_stop_bits(block->base, DASD_STOPPED_PENDING);
 
 }
 
 static void
-fsm_expire_timer(fsm_timer *this)
+fsm_expire_timer(struct timer_list *t)
 {
+       fsm_timer *this = from_timer(this, t, tl);
 #if FSM_TIMER_DEBUG
        printk(KERN_DEBUG "fsm(%s): Timer %p expired\n",
               this->fi->name, this);
        printk(KERN_DEBUG "fsm(%s): Create timer %p\n", fi->name,
               this);
 #endif
-       setup_timer(&this->tl, (void *)fsm_expire_timer, (long)this);
+       timer_setup(&this->tl, fsm_expire_timer, 0);
 }
 
 void
               this->fi->name, this, millisec);
 #endif
 
-       setup_timer(&this->tl, (void *)fsm_expire_timer, (long)this);
+       timer_setup(&this->tl, fsm_expire_timer, 0);
        this->expire_event = event;
        this->event_arg = arg;
        this->tl.expires = jiffies + (millisec * HZ) / 1000;
 #endif
 
        del_timer(&this->tl);
-       setup_timer(&this->tl, (void *)fsm_expire_timer, (long)this);
+       timer_setup(&this->tl, fsm_expire_timer, 0);
        this->expire_event = event;
        this->event_arg = arg;
        this->tl.expires = jiffies + (millisec * HZ) / 1000;
 
 static void arcmsr_stop_adapter_bgrb(struct AdapterControlBlock *acb);
 static void arcmsr_hbaA_flush_cache(struct AdapterControlBlock *acb);
 static void arcmsr_hbaB_flush_cache(struct AdapterControlBlock *acb);
-static void arcmsr_request_device_map(unsigned long pacb);
+static void arcmsr_request_device_map(struct timer_list *t);
 static void arcmsr_hbaA_request_device_map(struct AdapterControlBlock *acb);
 static void arcmsr_hbaB_request_device_map(struct AdapterControlBlock *acb);
 static void arcmsr_hbaC_request_device_map(struct AdapterControlBlock *acb);
        atomic_set(&acb->rq_map_token, 16);
        atomic_set(&acb->ante_token_value, 16);
        acb->fw_flag = FW_NORMAL;
-       setup_timer(&acb->eternal_timer, &arcmsr_request_device_map,
-                   (unsigned long)acb);
+       timer_setup(&acb->eternal_timer, arcmsr_request_device_map, 0);
        acb->eternal_timer.expires = jiffies + msecs_to_jiffies(6 * HZ);
        add_timer(&acb->eternal_timer);
        if(arcmsr_alloc_sysfs_attr(acb))
        atomic_set(&acb->rq_map_token, 16);
        atomic_set(&acb->ante_token_value, 16);
        acb->fw_flag = FW_NORMAL;
-       setup_timer(&acb->eternal_timer, &arcmsr_request_device_map,
-                   (unsigned long)acb);
+       timer_setup(&acb->eternal_timer, arcmsr_request_device_map, 0);
        acb->eternal_timer.expires = jiffies + msecs_to_jiffies(6 * HZ);
        add_timer(&acb->eternal_timer);
        return 0;
        }
 }
 
-static void arcmsr_request_device_map(unsigned long pacb)
+static void arcmsr_request_device_map(struct timer_list *t)
 {
-       struct AdapterControlBlock *acb = (struct AdapterControlBlock *)pacb;
+       struct AdapterControlBlock *acb = from_timer(acb, t, eternal_timer);
        switch (acb->adapter_type) {
                case ACB_ADAPTER_TYPE_A: {
                        arcmsr_hbaA_request_device_map(acb);
 
  * Error handler timeout function.  Indicate that we timed out,
  * and wake up any error handler process so it can continue.
  */
-static void fas216_eh_timer(unsigned long data)
+static void fas216_eh_timer(struct timer_list *t)
 {
-       FAS216_Info *info = (FAS216_Info *)data;
+       FAS216_Info *info = from_timer(info, t, eh_timer);
 
        fas216_log(info, LOG_ERROR, "error handling timed out\n");
 
        info->rst_dev_status = -1;
        info->rst_bus_status = -1;
        init_waitqueue_head(&info->eh_wait);
-       setup_timer(&info->eh_timer, fas216_eh_timer, (unsigned long)info);
+       timer_setup(&info->eh_timer, fas216_eh_timer, 0);
        
        spin_lock_init(&info->host_lock);
 
 
 }
 
 void
-bfad_bfa_tmo(unsigned long data)
+bfad_bfa_tmo(struct timer_list *t)
 {
-       struct bfad_s         *bfad = (struct bfad_s *) data;
+       struct bfad_s         *bfad = from_timer(bfad, t, hal_tmo);
        unsigned long   flags;
        struct list_head               doneq;
 
 void
 bfad_init_timer(struct bfad_s *bfad)
 {
-       setup_timer(&bfad->hal_tmo, bfad_bfa_tmo, (unsigned long)bfad);
+       timer_setup(&bfad->hal_tmo, bfad_bfa_tmo, 0);
 
        mod_timer(&bfad->hal_tmo,
                  jiffies + msecs_to_jiffies(BFA_TIMER_FREQ));
 
 void           bfad_remove_intr(struct bfad_s *bfad);
 void           bfad_update_hal_cfg(struct bfa_iocfc_cfg_s *bfa_cfg);
 bfa_status_t   bfad_hal_mem_alloc(struct bfad_s *bfad);
-void           bfad_bfa_tmo(unsigned long data);
+void           bfad_bfa_tmo(struct timer_list *t);
 void           bfad_init_timer(struct bfad_s *bfad);
 int            bfad_pci_init(struct pci_dev *pdev, struct bfad_s *bfad);
 void           bfad_pci_uninit(struct pci_dev *pdev, struct bfad_s *bfad);
 
  */
 
 #include "bnx2fc.h"
-static void bnx2fc_upld_timer(unsigned long data);
-static void bnx2fc_ofld_timer(unsigned long data);
+static void bnx2fc_upld_timer(struct timer_list *t);
+static void bnx2fc_ofld_timer(struct timer_list *t);
 static int bnx2fc_init_tgt(struct bnx2fc_rport *tgt,
                           struct fcoe_port *port,
                           struct fc_rport_priv *rdata);
                              struct bnx2fc_rport *tgt);
 static void bnx2fc_free_conn_id(struct bnx2fc_hba *hba, u32 conn_id);
 
-static void bnx2fc_upld_timer(unsigned long data)
+static void bnx2fc_upld_timer(struct timer_list *t)
 {
 
-       struct bnx2fc_rport *tgt = (struct bnx2fc_rport *)data;
+       struct bnx2fc_rport *tgt = from_timer(tgt, t, upld_timer);
 
        BNX2FC_TGT_DBG(tgt, "upld_timer - Upload compl not received!!\n");
        /* fake upload completion */
        wake_up_interruptible(&tgt->upld_wait);
 }
 
-static void bnx2fc_ofld_timer(unsigned long data)
+static void bnx2fc_ofld_timer(struct timer_list *t)
 {
 
-       struct bnx2fc_rport *tgt = (struct bnx2fc_rport *)data;
+       struct bnx2fc_rport *tgt = from_timer(tgt, t, ofld_timer);
 
        BNX2FC_TGT_DBG(tgt, "entered bnx2fc_ofld_timer\n");
        /* NOTE: This function should never be called, as
 
 static void bnx2fc_ofld_wait(struct bnx2fc_rport *tgt)
 {
-       setup_timer(&tgt->ofld_timer, bnx2fc_ofld_timer, (unsigned long)tgt);
+       timer_setup(&tgt->ofld_timer, bnx2fc_ofld_timer, 0);
        mod_timer(&tgt->ofld_timer, jiffies + BNX2FC_FW_TIMEOUT);
 
        wait_event_interruptible(tgt->ofld_wait,
 
 static void bnx2fc_upld_wait(struct bnx2fc_rport *tgt)
 {
-       setup_timer(&tgt->upld_timer, bnx2fc_upld_timer, (unsigned long)tgt);
+       timer_setup(&tgt->upld_timer, bnx2fc_upld_timer, 0);
        mod_timer(&tgt->upld_timer, jiffies + BNX2FC_FW_TIMEOUT);
        wait_event_interruptible(tgt->upld_wait,
                                 (test_bit(
 
        }
 }
 
-static void esas2r_timer_callback(unsigned long context);
+static void esas2r_timer_callback(struct timer_list *t);
 
 void esas2r_kickoff_timer(struct esas2r_adapter *a)
 {
-       setup_timer(&a->timer, esas2r_timer_callback, (unsigned long)a);
+       timer_setup(&a->timer, esas2r_timer_callback, 0);
 
        a->timer.expires = jiffies +
                           msecs_to_jiffies(100);
        add_timer(&a->timer);
 }
 
-static void esas2r_timer_callback(unsigned long context)
+static void esas2r_timer_callback(struct timer_list *t)
 {
-       struct esas2r_adapter *a = (struct esas2r_adapter *)context;
+       struct esas2r_adapter *a = from_timer(a, t, timer);
 
        set_bit(AF2_TIMER_TICK, &a->flags2);
 
 
 #define        FCOE_CTLR_MIN_FKA       500             /* min keep alive (mS) */
 #define        FCOE_CTLR_DEF_FKA       FIP_DEF_FKA     /* default keep alive (mS) */
 
-static void fcoe_ctlr_timeout(unsigned long);
+static void fcoe_ctlr_timeout(struct timer_list *);
 static void fcoe_ctlr_timer_work(struct work_struct *);
 static void fcoe_ctlr_recv_work(struct work_struct *);
 static int fcoe_ctlr_flogi_retry(struct fcoe_ctlr *);
        mutex_init(&fip->ctlr_mutex);
        spin_lock_init(&fip->ctlr_lock);
        fip->flogi_oxid = FC_XID_UNKNOWN;
-       setup_timer(&fip->timer, fcoe_ctlr_timeout, (unsigned long)fip);
+       timer_setup(&fip->timer, fcoe_ctlr_timeout, 0);
        INIT_WORK(&fip->timer_work, fcoe_ctlr_timer_work);
        INIT_WORK(&fip->recv_work, fcoe_ctlr_recv_work);
        skb_queue_head_init(&fip->fip_recv_list);
  * fcoe_ctlr_timeout() - FIP timeout handler
  * @arg: The FCoE controller that timed out
  */
-static void fcoe_ctlr_timeout(unsigned long arg)
+static void fcoe_ctlr_timeout(struct timer_list *t)
 {
-       struct fcoe_ctlr *fip = (struct fcoe_ctlr *)arg;
+       struct fcoe_ctlr *fip = from_timer(fip, t, timer);
 
        schedule_work(&fip->timer_work);
 }
 
        return err;
 }
 
-static void fnic_notify_timer(unsigned long data)
+static void fnic_notify_timer(struct timer_list *t)
 {
-       struct fnic *fnic = (struct fnic *)data;
+       struct fnic *fnic = from_timer(fnic, t, notify_timer);
 
        fnic_handle_link_event(fnic);
        mod_timer(&fnic->notify_timer,
                  round_jiffies(jiffies + FNIC_NOTIFY_TIMER_PERIOD));
 }
 
-static void fnic_fip_notify_timer(unsigned long data)
+static void fnic_fip_notify_timer(struct timer_list *t)
 {
-       struct fnic *fnic = (struct fnic *)data;
+       struct fnic *fnic = from_timer(fnic, t, fip_timer);
 
        fnic_handle_fip_timer(fnic);
 }
                vnic_dev_add_addr(fnic->vdev, fnic->ctlr.ctl_src_addr);
                fnic->set_vlan = fnic_set_vlan;
                fcoe_ctlr_init(&fnic->ctlr, FIP_MODE_AUTO);
-               setup_timer(&fnic->fip_timer, fnic_fip_notify_timer,
-                                                       (unsigned long)fnic);
+               timer_setup(&fnic->fip_timer, fnic_fip_notify_timer, 0);
                spin_lock_init(&fnic->vlans_lock);
                INIT_WORK(&fnic->fip_frame_work, fnic_handle_fip_frame);
                INIT_WORK(&fnic->event_work, fnic_handle_event);
 
        /* Setup notify timer when using MSI interrupts */
        if (vnic_dev_get_intr_mode(fnic->vdev) == VNIC_DEV_INTR_MODE_MSI)
-               setup_timer(&fnic->notify_timer,
-                           fnic_notify_timer, (unsigned long)fnic);
+               timer_setup(&fnic->notify_timer, fnic_notify_timer, 0);
 
        /* allocate RQ buffers and post them to RQ*/
        for (i = 0; i < fnic->rq_count; i++) {
 
      return IRQ_HANDLED;
 }
 
-static void ncr53c8xx_timeout(unsigned long npref)
+static void ncr53c8xx_timeout(struct timer_list *t)
 {
-       struct ncb *np = (struct ncb *) npref;
+       struct ncb *np = from_timer(np, t, timer);
        unsigned long flags;
        struct scsi_cmnd *done_list;
 
        if (!np->scripth0)
                goto attach_error;
 
-       setup_timer(&np->timer, ncr53c8xx_timeout, (unsigned long)np);
+       timer_setup(&np->timer, ncr53c8xx_timeout, 0);
 
        /* Try to map the controller chip to virtual and physical memory. */
 
 
        gb_operation_put(operation);
 }
 
-static void gb_operation_timeout(unsigned long arg)
+static void gb_operation_timeout(struct timer_list *t)
 {
-       struct gb_operation *operation = (void *)arg;
+       struct gb_operation *operation = from_timer(operation, t, timer);
 
        if (gb_operation_result_set(operation, -ETIMEDOUT)) {
                /*
                        goto err_request;
                }
 
-               setup_timer(&operation->timer, gb_operation_timeout,
-                           (unsigned long)operation);
+               timer_setup(&operation->timer, gb_operation_timeout, 0);
        }
 
        operation->flags = op_flags;
 
 }
 
 static void
-delay_timer_cb(unsigned long arg)
+delay_timer_cb(struct timer_list *t)
 {
-       struct lnet_delay_rule *rule = (struct lnet_delay_rule *)arg;
+       struct lnet_delay_rule *rule = from_timer(rule, t, dl_timer);
 
        spin_lock_bh(&delay_dd.dd_lock);
        if (list_empty(&rule->dl_sched_link) && delay_dd.dd_running) {
                wait_event(delay_dd.dd_ctl_waitq, delay_dd.dd_running);
        }
 
-       setup_timer(&rule->dl_timer, delay_timer_cb, (unsigned long)rule);
+       timer_setup(&rule->dl_timer, delay_timer_cb, 0);
 
        spin_lock_init(&rule->dl_lock);
        INIT_LIST_HEAD(&rule->dl_msg_list);
 
        return -1;
 }
 
-static void ptlrpc_at_timer(unsigned long castmeharder)
+static void ptlrpc_at_timer(struct timer_list *t)
 {
        struct ptlrpc_service_part *svcpt;
 
-       svcpt = (struct ptlrpc_service_part *)castmeharder;
+       svcpt = from_timer(svcpt, t, scp_at_timer);
 
        svcpt->scp_at_check = 1;
        svcpt->scp_at_checktime = cfs_time_current();
        if (!array->paa_reqs_count)
                goto free_reqs_array;
 
-       setup_timer(&svcpt->scp_at_timer, ptlrpc_at_timer,
-                   (unsigned long)svcpt);
+       timer_setup(&svcpt->scp_at_timer, ptlrpc_at_timer, 0);
 
        /* At SOW, service time should be quick; 10s seems generous. If client
         * timeout is less than this, we'll be sending an early reply.
        next = (__s32)(array->paa_deadline - ktime_get_real_seconds() -
                       at_early_margin);
        if (next <= 0) {
-               ptlrpc_at_timer((unsigned long)svcpt);
+               ptlrpc_at_timer(&svcpt->scp_at_timer);
        } else {
                mod_timer(&svcpt->scp_at_timer, cfs_time_shift(next));
                CDEBUG(D_INFO, "armed %s at %+ds\n",
 
  * EOF timeout timer function. This is an unrecoverable condition
  * without a stream restart.
  */
-static void prp_eof_timeout(unsigned long data)
+static void prp_eof_timeout(struct timer_list *t)
 {
-       struct prp_priv *priv = (struct prp_priv *)data;
+       struct prp_priv *priv = from_timer(priv, t, eof_timeout_timer);
        struct imx_media_video_dev *vdev = priv->vdev;
        struct imx_ic_priv *ic_priv = priv->ic_priv;
 
        priv->ic_priv = ic_priv;
 
        spin_lock_init(&priv->irqlock);
-       setup_timer(&priv->eof_timeout_timer, prp_eof_timeout,
-                   (unsigned long)priv);
+       timer_setup(&priv->eof_timeout_timer, prp_eof_timeout, 0);
 
        priv->vdev = imx_media_capture_device_init(&ic_priv->sd,
                                                   PRPENCVF_SRC_PAD);
 
  * EOF timeout timer function. This is an unrecoverable condition
  * without a stream restart.
  */
-static void csi_idmac_eof_timeout(unsigned long data)
+static void csi_idmac_eof_timeout(struct timer_list *t)
 {
-       struct csi_priv *priv = (struct csi_priv *)data;
+       struct csi_priv *priv = from_timer(priv, t, eof_timeout_timer);
        struct imx_media_video_dev *vdev = priv->vdev;
 
        v4l2_err(&priv->sd, "EOF timeout\n");
        priv->csi_id = pdata->csi;
        priv->smfc_id = (priv->csi_id == 0) ? 0 : 2;
 
-       setup_timer(&priv->eof_timeout_timer, csi_idmac_eof_timeout,
-                   (unsigned long)priv);
+       timer_setup(&priv->eof_timeout_timer, csi_idmac_eof_timeout, 0);
        spin_lock_init(&priv->irqlock);
 
        v4l2_subdev_init(&priv->sd, &csi_subdev_ops);
 
  * The handler runs in interrupt context. That's why we need to defer the
  * tasks to a work queue.
  */
-static void link_stat_timer_handler(unsigned long data)
+static void link_stat_timer_handler(struct timer_list *t)
 {
-       struct most_dev *mdev = (struct most_dev *)data;
+       struct most_dev *mdev = from_timer(mdev, t, link_stat_timer);
 
        schedule_work(&mdev->poll_work_obj);
        mdev->link_stat_timer.expires = jiffies + (2 * HZ);
        num_endpoints = usb_iface_desc->desc.bNumEndpoints;
        mutex_init(&mdev->io_mutex);
        INIT_WORK(&mdev->poll_work_obj, wq_netinfo);
-       setup_timer(&mdev->link_stat_timer, link_stat_timer_handler,
-                   (unsigned long)mdev);
+       timer_setup(&mdev->link_stat_timer, link_stat_timer_handler, 0);
 
        mdev->usb_device = usb_dev;
        mdev->link_stat_timer.expires = jiffies + (2 * HZ);
 
 }
 
 
-static void ieee80211_send_beacon_cb(unsigned long _ieee)
+static void ieee80211_send_beacon_cb(struct timer_list *t)
 {
        struct ieee80211_device *ieee =
-               (struct ieee80211_device *) _ieee;
+               from_timer(ieee, t, beacon_timer);
        unsigned long flags;
 
        spin_lock_irqsave(&ieee->beacon_lock, flags);
        spin_unlock_irqrestore(&ieee->lock, flags);
 }
 
-static void ieee80211_associate_abort_cb(unsigned long dev)
+static void ieee80211_associate_abort_cb(struct timer_list *t)
 {
-       ieee80211_associate_abort((struct ieee80211_device *) dev);
+       struct ieee80211_device *dev = from_timer(dev, t, associate_timer);
+
+       ieee80211_associate_abort(dev);
 }
 
 
        ieee->enable_rx_imm_BA = true;
        ieee->tx_pending.txb = NULL;
 
-       setup_timer(&ieee->associate_timer, ieee80211_associate_abort_cb,
-                   (unsigned long)ieee);
+       timer_setup(&ieee->associate_timer, ieee80211_associate_abort_cb, 0);
 
-       setup_timer(&ieee->beacon_timer, ieee80211_send_beacon_cb,
-                   (unsigned long)ieee);
+       timer_setup(&ieee->beacon_timer, ieee80211_send_beacon_cb, 0);
 
 
        INIT_DELAYED_WORK(&ieee->start_ibss_wq, ieee80211_start_ibss_wq);
 
        precvpriv->rx_drop++;
 }
 
-static void _r8712_reordering_ctrl_timeout_handler (unsigned long data)
+static void _r8712_reordering_ctrl_timeout_handler (struct timer_list *t)
 {
        struct recv_reorder_ctrl *preorder_ctrl =
-                        (struct recv_reorder_ctrl *)data;
+                        from_timer(preorder_ctrl, t, reordering_ctrl_timer);
 
        r8712_reordering_ctrl_timeout_handler(preorder_ctrl);
 }
 
 void r8712_init_recv_timer(struct recv_reorder_ctrl *preorder_ctrl)
 {
-       setup_timer(&preorder_ctrl->reordering_ctrl_timer,
-                    _r8712_reordering_ctrl_timeout_handler,
-                    (unsigned long)preorder_ctrl);
+       timer_setup(&preorder_ctrl->reordering_ctrl_timer,
+                   _r8712_reordering_ctrl_timeout_handler, 0);
 }
 
  *     Prototype of protected function.
  *===========================================================================
  */
-static void BlinkTimerCallback(unsigned long data);
+static void BlinkTimerCallback(struct timer_list *t);
 
 static void BlinkWorkItemCallback(struct work_struct *work);
 /*===========================================================================
        pLed->bLedBlinkInProgress = false;
        pLed->BlinkTimes = 0;
        pLed->BlinkingLedState = LED_UNKNOWN;
-       setup_timer(&pLed->BlinkTimer, BlinkTimerCallback,
-                   (unsigned long)pLed);
+       timer_setup(&pLed->BlinkTimer, BlinkTimerCallback, 0);
        INIT_WORK(&pLed->BlinkWorkItem, BlinkWorkItemCallback);
 }
 
  *             Callback function of LED BlinkTimer,
  *             it just schedules to corresponding BlinkWorkItem.
  */
-static void BlinkTimerCallback(unsigned long data)
+static void BlinkTimerCallback(struct timer_list *t)
 {
-       struct LED_871x  *pLed = (struct LED_871x *)data;
+       struct LED_871x  *pLed = from_timer(pLed, t, BlinkTimer);
 
        /* This fixed the crash problem on Fedora 12 when trying to do the
         * insmod;ifconfig up;rmmod commands.
 
        .release = single_release,
 };
 
-static void dev_periodic_work(unsigned long __opaque)
+static void dev_periodic_work(struct timer_list *t)
 {
-       struct visor_device *dev = (struct visor_device *)__opaque;
+       struct visor_device *dev = from_timer(dev, t, timer);
        struct visor_driver *drv = to_visor_driver(dev->device.driver);
 
        drv->channel_interrupt(dev);
        dev->device.release = visorbus_release_device;
        /* keep a reference just for us (now 2) */
        get_device(&dev->device);
-       setup_timer(&dev->timer, dev_periodic_work, (unsigned long)dev);
+       timer_setup(&dev->timer, dev_periodic_work, 0);
        /*
         * bus_id must be a unique name with respect to this bus TYPE (NOT bus
         * instance).  That's why we need to include the bus number within the
 
  * Main function of the vnic_incoming thread. Periodically check the response
  * queue and drain it if needed.
  */
-static void poll_for_irq(unsigned long v)
+static void poll_for_irq(struct timer_list *t)
 {
-       struct visornic_devdata *devdata = (struct visornic_devdata *)v;
+       struct visornic_devdata *devdata = from_timer(devdata, t,
+                                                     irq_poll_timer);
 
        if (!visorchannel_signalempty(
                                   devdata->dev->visorchannel,
        /* Let's start our threads to get responses */
        netif_napi_add(netdev, &devdata->napi, visornic_poll, NAPI_WEIGHT);
 
-       setup_timer(&devdata->irq_poll_timer, poll_for_irq,
-                   (unsigned long)devdata);
+       timer_setup(&devdata->irq_poll_timer, poll_for_irq, 0);
        /* Note: This time has to start running before the while
         * loop below because the napi routine is responsible for
         * setting enab_dis_acked
 
                last_scanned_shadow[i].time_scan = jiffies;
 }
 
-static void remove_network_from_shadow(unsigned long unused)
+static void remove_network_from_shadow(struct timer_list *unused)
 {
        unsigned long now = jiffies;
        int i, j;
        }
 }
 
-static void clear_duringIP(unsigned long arg)
+static void clear_duringIP(struct timer_list *unused)
 {
        wilc_optaining_ip = false;
 }
 
        priv = wdev_priv(net->ieee80211_ptr);
        if (op_ifcs == 0) {
-               setup_timer(&hAgingTimer, remove_network_from_shadow, 0);
-               setup_timer(&wilc_during_ip_timer, clear_duringIP, 0);
+               timer_setup(&hAgingTimer, remove_network_from_shadow, 0);
+               timer_setup(&wilc_during_ip_timer, clear_duringIP, 0);
        }
        op_ifcs++;
 
 
        return 0;
 }
 
-static void tcmu_device_timedout(unsigned long data)
+static void tcmu_device_timedout(struct timer_list *t)
 {
-       struct tcmu_dev *udev = (struct tcmu_dev *)data;
+       struct tcmu_dev *udev = from_timer(udev, t, timeout);
        unsigned long flags;
 
        spin_lock_irqsave(&udev->commands_lock, flags);
        idr_init(&udev->commands);
        spin_lock_init(&udev->commands_lock);
 
-       setup_timer(&udev->timeout, tcmu_device_timedout,
-               (unsigned long)udev);
+       timer_setup(&udev->timeout, tcmu_device_timedout, 0);
 
        init_waitqueue_head(&udev->nl_cmd_wq);
        spin_lock_init(&udev->nl_cmd_lock);
 
                                         unsigned int address,
                                         const unsigned char *data, int len,
                                         int is_last);
-static void ipwireless_setup_timer(unsigned long data);
+static void ipwireless_setup_timer(struct timer_list *t);
 static void handle_received_CTRL_packet(struct ipw_hardware *hw,
                unsigned int channel_idx, const unsigned char *data, int len);
 
        spin_lock_init(&hw->lock);
        tasklet_init(&hw->tasklet, ipwireless_do_tasklet, (unsigned long) hw);
        INIT_WORK(&hw->work_rx, ipw_receive_data_work);
-       setup_timer(&hw->setup_timer, ipwireless_setup_timer,
-                       (unsigned long) hw);
+       timer_setup(&hw->setup_timer, ipwireless_setup_timer, 0);
 
        return hw;
 }
        hw->init_loops = 0;
        printk(KERN_INFO IPWIRELESS_PCCARD_NAME
               ": waiting for card to start up...\n");
-       ipwireless_setup_timer((unsigned long) hw);
+       ipwireless_setup_timer(&hw->setup_timer);
 }
 
-static void ipwireless_setup_timer(unsigned long data)
+static void ipwireless_setup_timer(struct timer_list *t)
 {
-       struct ipw_hardware *hw = (struct ipw_hardware *) data;
+       struct ipw_hardware *hw = from_timer(hw, t, setup_timer);
 
        hw->init_loops++;
 
 
  *     gsm->pending_cmd will be NULL and we just let the timer expire.
  */
 
-static void gsm_control_retransmit(unsigned long data)
+static void gsm_control_retransmit(struct timer_list *t)
 {
-       struct gsm_mux *gsm = (struct gsm_mux *)data;
+       struct gsm_mux *gsm = from_timer(gsm, t, t2_timer);
        struct gsm_control *ctrl;
        unsigned long flags;
        spin_lock_irqsave(&gsm->control_lock, flags);
  *     end will get a DM response)
  */
 
-static void gsm_dlci_t1(unsigned long data)
+static void gsm_dlci_t1(struct timer_list *t)
 {
-       struct gsm_dlci *dlci = (struct gsm_dlci *)data;
+       struct gsm_dlci *dlci = from_timer(dlci, t, t1);
        struct gsm_mux *gsm = dlci->gsm;
 
        switch (dlci->state) {
        }
 
        skb_queue_head_init(&dlci->skb_list);
-       setup_timer(&dlci->t1, gsm_dlci_t1, (unsigned long)dlci);
+       timer_setup(&dlci->t1, gsm_dlci_t1, 0);
        tty_port_init(&dlci->port);
        dlci->port.ops = &gsm_port_ops;
        dlci->gsm = gsm;
        struct gsm_dlci *dlci;
        int i = 0;
 
-       setup_timer(&gsm->t2_timer, gsm_control_retransmit, (unsigned long)gsm);
+       timer_setup(&gsm->t2_timer, gsm_control_retransmit, 0);
        init_waitqueue_head(&gsm->event);
        spin_lock_init(&gsm->control_lock);
        spin_lock_init(&gsm->tx_lock);
 
 static void transmit_block(struct r3964_info *pInfo);
 static void receive_char(struct r3964_info *pInfo, const unsigned char c);
 static void receive_error(struct r3964_info *pInfo, const char flag);
-static void on_timeout(unsigned long priv);
+static void on_timeout(struct timer_list *t);
 static int enable_signals(struct r3964_info *pInfo, struct pid *pid, int arg);
 static int read_telegram(struct r3964_info *pInfo, struct pid *pid,
                unsigned char __user * buf);
        }
 }
 
-static void on_timeout(unsigned long priv)
+static void on_timeout(struct timer_list *t)
 {
-       struct r3964_info *pInfo = (void *)priv;
+       struct r3964_info *pInfo = from_timer(pInfo, t, tmr);
 
        switch (pInfo->state) {
        case R3964_TX_REQUEST:
        tty->disc_data = pInfo;
        tty->receive_room = 65536;
 
-       setup_timer(&pInfo->tmr, on_timeout, (unsigned long)pInfo);
+       timer_setup(&pInfo->tmr, on_timeout, 0);
 
        return 0;
 }
 
 static struct timer_list flush_timer;
 
 static void
-timed_flush_handler(unsigned long ptr)
+timed_flush_handler(struct timer_list *unused)
 {
        struct e100_serial *info;
        int i;
        /* Setup the timed flush handler system */
 
 #if !defined(CONFIG_ETRAX_SERIAL_FAST_TIMER)
-       setup_timer(&flush_timer, timed_flush_handler, 0);
+       timer_setup(&flush_timer, timed_flush_handler, 0);
        mod_timer(&flush_timer, jiffies + 5);
 #endif
 
 
        lpuart_copy_rx_to_tty(sport);
 }
 
-static void lpuart_timer_func(unsigned long data)
+static void lpuart_timer_func(struct timer_list *t)
 {
-       struct lpuart_port *sport = (struct lpuart_port *)data;
+       struct lpuart_port *sport = from_timer(sport, t, lpuart_timer);
 
        lpuart_copy_rx_to_tty(sport);
 }
 
 static void rx_dma_timer_init(struct lpuart_port *sport)
 {
-               setup_timer(&sport->lpuart_timer, lpuart_timer_func,
-                               (unsigned long)sport);
+               timer_setup(&sport->lpuart_timer, lpuart_timer_func, 0);
                sport->lpuart_timer.expires = jiffies + sport->dma_rx_timeout;
                add_timer(&sport->lpuart_timer);
 }
 
  *     The SPI has timed out: hang up the tty. Users will then see a hangup
  *     and error events.
  */
-static void ifx_spi_timeout(unsigned long arg)
+static void ifx_spi_timeout(struct timer_list *t)
 {
-       struct ifx_spi_device *ifx_dev = (struct ifx_spi_device *)arg;
+       struct ifx_spi_device *ifx_dev = from_timer(ifx_dev, t, spi_timer);
 
        dev_warn(&ifx_dev->spi_dev->dev, "*** SPI Timeout ***");
        tty_port_tty_hangup(&ifx_dev->tty_port, false);
        spin_lock_init(&ifx_dev->write_lock);
        spin_lock_init(&ifx_dev->power_lock);
        ifx_dev->power_status = 0;
-       setup_timer(&ifx_dev->spi_timer, ifx_spi_timeout,
-                   (unsigned long)ifx_dev);
+       timer_setup(&ifx_dev->spi_timer, ifx_spi_timeout, 0);
        ifx_dev->modem = pl_data->modem_type;
        ifx_dev->use_dma = pl_data->use_dma;
        ifx_dev->max_hz = pl_data->max_hz;
 
  * This is our per-port timeout handler, for checking the
  * modem status signals.
  */
-static void imx_timeout(unsigned long data)
+static void imx_timeout(struct timer_list *t)
 {
-       struct imx_port *sport = (struct imx_port *)data;
+       struct imx_port *sport = from_timer(sport, t, timer);
        unsigned long flags;
 
        if (sport->port.state) {
        sport->port.rs485_config = imx_rs485_config;
        sport->port.rs485.flags |= SER_RS485_RTS_ON_SEND;
        sport->port.flags = UPF_BOOT_AUTOCONF;
-       setup_timer(&sport->timer, imx_timeout, (unsigned long)sport);
+       timer_setup(&sport->timer, imx_timeout, 0);
 
        sport->gpios = mctrl_gpio_init(&sport->port, 0);
        if (IS_ERR(sport->gpios))
 
  * The tasklet is cheap, it does not cause wakeups when reschedules itself,
  * instead it waits for the next tick.
  */
-static void kgdb_nmi_tty_receiver(unsigned long data)
+static void kgdb_nmi_tty_receiver(struct timer_list *t)
 {
-       struct kgdb_nmi_tty_priv *priv = (void *)data;
+       struct kgdb_nmi_tty_priv *priv = from_timer(priv, t, timer);
        char ch;
 
        priv->timer.expires = jiffies + (HZ/100);
                return -ENOMEM;
 
        INIT_KFIFO(priv->fifo);
-       setup_timer(&priv->timer, kgdb_nmi_tty_receiver, (unsigned long)priv);
+       timer_setup(&priv->timer, kgdb_nmi_tty_receiver, 0);
        tty_port_init(&priv->port);
        priv->port.ops = &kgdb_nmi_tty_port_ops;
        tty->driver_data = priv;
 
                queue_work(s->workqueue, &s->work);
 }
 
-static void max3100_timeout(unsigned long data)
+static void max3100_timeout(struct timer_list *t)
 {
-       struct max3100_port *s = (struct max3100_port *)data;
+       struct max3100_port *s = from_timer(s, t, timer);
 
        if (s->port.state) {
                max3100_dowork(s);
                max3100s[i]->poll_time = 1;
        max3100s[i]->max3100_hw_suspend = pdata->max3100_hw_suspend;
        max3100s[i]->minor = i;
-       setup_timer(&max3100s[i]->timer, max3100_timeout,
-                   (unsigned long)max3100s[i]);
+       timer_setup(&max3100s[i]->timer, max3100_timeout, 0);
 
        dev_dbg(&spi->dev, "%s: adding port %d\n", __func__, i);
        max3100s[i]->port.irq = max3100s[i]->irq;
 
  *
  * This function periodically polls the Serial MUX to check for new data.
  */
-static void mux_poll(unsigned long unused)
+static void mux_poll(struct timer_list *unused)
 {  
        int i;
 
 
        if(port_cnt > 0) {
                /* Start the Mux timer */
-               setup_timer(&mux_timer, mux_poll, 0UL);
+               timer_setup(&mux_timer, mux_poll, 0);
                mod_timer(&mux_timer, jiffies + MUX_POLL_DELAY);
 
 #ifdef CONFIG_SERIAL_MUX_CONSOLE
 
  * This is our per-port timeout handler, for checking the
  * modem status signals.
  */
-static void pnx8xxx_timeout(unsigned long data)
+static void pnx8xxx_timeout(struct timer_list *t)
 {
-       struct pnx8xxx_port *sport = (struct pnx8xxx_port *)data;
+       struct pnx8xxx_port *sport = from_timer(sport, t, timer);
        unsigned long flags;
 
        if (sport->port.state) {
        first = 0;
 
        for (i = 0; i < NR_PORTS; i++) {
-               setup_timer(&pnx8xxx_ports[i].timer, pnx8xxx_timeout,
-                           (unsigned long)&pnx8xxx_ports[i]);
+               timer_setup(&pnx8xxx_ports[i].timer, pnx8xxx_timeout, 0);
                pnx8xxx_ports[i].port.ops = &pnx8xxx_pops;
        }
 }
 
  * This is our per-port timeout handler, for checking the
  * modem status signals.
  */
-static void sa1100_timeout(unsigned long data)
+static void sa1100_timeout(struct timer_list *t)
 {
-       struct sa1100_port *sport = (struct sa1100_port *)data;
+       struct sa1100_port *sport = from_timer(sport, t, timer);
        unsigned long flags;
 
        if (sport->port.state) {
                sa1100_ports[i].port.fifosize  = 8;
                sa1100_ports[i].port.line      = i;
                sa1100_ports[i].port.iotype    = UPIO_MEM;
-               setup_timer(&sa1100_ports[i].timer, sa1100_timeout,
-                           (unsigned long)&sa1100_ports[i]);
+               timer_setup(&sa1100_ports[i].timer, sa1100_timeout, 0);
        }
 
        /*
 
                        (SCFCR_RTRG0 | SCFCR_RTRG1)) != 0;
 }
 
-static void rx_fifo_timer_fn(unsigned long arg)
+static void rx_fifo_timer_fn(struct timer_list *t)
 {
-       struct sci_port *s = (struct sci_port *)arg;
+       struct sci_port *s = from_timer(s, t, rx_fifo_timer);
        struct uart_port *port = &s->port;
 
        dev_dbg(port->dev, "Rx timed out\n");
                sci->rx_fifo_timeout = r;
                scif_set_rtrg(port, 1);
                if (r > 0)
-                       setup_timer(&sci->rx_fifo_timer, rx_fifo_timer_fn,
-                                   (unsigned long)sci);
+                       timer_setup(&sci->rx_fifo_timer, rx_fifo_timer_fn, 0);
        }
 
        return count;
        dma_async_issue_pending(chan);
 }
 
-static void rx_timer_fn(unsigned long arg)
+static void rx_timer_fn(struct timer_list *t)
 {
-       struct sci_port *s = (struct sci_port *)arg;
+       struct sci_port *s = from_timer(s, t, rx_timer);
        struct dma_chan *chan = s->chan_rx;
        struct uart_port *port = &s->port;
        struct dma_tx_state state;
                        dma += s->buf_len_rx;
                }
 
-               setup_timer(&s->rx_timer, rx_timer_fn, (unsigned long)s);
+               timer_setup(&s->rx_timer, rx_timer_fn, 0);
 
                if (port->type == PORT_SCIFA || port->type == PORT_SCIFB)
                        sci_submit_rx(s);
        if (s->rx_trigger > 1) {
                if (s->rx_fifo_timeout) {
                        scif_set_rtrg(port, 1);
-                       setup_timer(&s->rx_fifo_timer, rx_fifo_timer_fn,
-                                   (unsigned long)s);
+                       timer_setup(&s->rx_fifo_timer, rx_fifo_timer_fn, 0);
                } else {
                        if (port->type == PORT_SCIFA ||
                            port->type == PORT_SCIFB)
 
  * Obviously not used in interrupt mode
  *
  */
-static void sn_sal_timer_poll(unsigned long data)
+static void sn_sal_timer_poll(struct timer_list *t)
 {
-       struct sn_cons_port *port = (struct sn_cons_port *)data;
+       struct sn_cons_port *port = from_timer(port, t, sc_timer);
        unsigned long flags;
 
        if (!port)
         * timer to poll for input and push data from the console
         * buffer.
         */
-       setup_timer(&port->sc_timer, sn_sal_timer_poll, (unsigned long)port);
+       timer_setup(&port->sc_timer, sn_sal_timer_poll, 0);
 
        if (IS_RUNNING_ON_SIMULATOR())
                port->sc_interrupt_timeout = 6;
 
 
 static void usc_loopback_frame( struct mgsl_struct *info );
 
-static void mgsl_tx_timeout(unsigned long context);
+static void mgsl_tx_timeout(struct timer_list *t);
 
 
 static void usc_loopmode_cancel_transmit( struct mgsl_struct * info );
        
        memset(&info->icount, 0, sizeof(info->icount));
 
-       setup_timer(&info->tx_timer, mgsl_tx_timeout, (unsigned long)info);
+       timer_setup(&info->tx_timer, mgsl_tx_timeout, 0);
        
        /* Allocate and claim adapter resources */
        retval = mgsl_claim_resources(info);
  * Arguments:  context         pointer to device instance data
  * Return Value:       None
  */
-static void mgsl_tx_timeout(unsigned long context)
+static void mgsl_tx_timeout(struct timer_list *t)
 {
-       struct mgsl_struct *info = (struct mgsl_struct*)context;
+       struct mgsl_struct *info = from_timer(info, t, tx_timer);
        unsigned long flags;
        
        if ( debug_level >= DEBUG_LEVEL_INFO )
 
 static int  alloc_tmp_rbuf(struct slgt_info *info);
 static void free_tmp_rbuf(struct slgt_info *info);
 
-static void tx_timeout(unsigned long context);
-static void rx_timeout(unsigned long context);
+static void tx_timeout(struct timer_list *t);
+static void rx_timeout(struct timer_list *t);
 
 /*
  * ioctl handlers
                info->adapter_num = adapter_num;
                info->port_num = port_num;
 
-               setup_timer(&info->tx_timer, tx_timeout, (unsigned long)info);
-               setup_timer(&info->rx_timer, rx_timeout, (unsigned long)info);
+               timer_setup(&info->tx_timer, tx_timeout, 0);
+               timer_setup(&info->rx_timer, rx_timeout, 0);
 
                /* Copy configuration info to device instance data */
                info->pdev = pdev;
 /*
  * transmit timeout handler
  */
-static void tx_timeout(unsigned long context)
+static void tx_timeout(struct timer_list *t)
 {
-       struct slgt_info *info = (struct slgt_info*)context;
+       struct slgt_info *info = from_timer(info, t, tx_timer);
        unsigned long flags;
 
        DBGINFO(("%s tx_timeout\n", info->device_name));
 /*
  * receive buffer polling timer
  */
-static void rx_timeout(unsigned long context)
+static void rx_timeout(struct timer_list *t)
 {
-       struct slgt_info *info = (struct slgt_info*)context;
+       struct slgt_info *info = from_timer(info, t, rx_timer);
        unsigned long flags;
 
        DBGINFO(("%s rx_timeout\n", info->device_name));
 
 
 static void load_pci_memory(SLMP_INFO *info, char* dest, const char* src, unsigned short count);
 static void trace_block(SLMP_INFO *info, const char* data, int count, int xmit);
-static void tx_timeout(unsigned long context);
-static void status_timeout(unsigned long context);
+static void tx_timeout(struct timer_list *t);
+static void status_timeout(struct timer_list *t);
 
 static unsigned char read_reg(SLMP_INFO *info, unsigned char addr);
 static void write_reg(SLMP_INFO *info, unsigned char addr, unsigned char val);
                info->bus_type = MGSL_BUS_TYPE_PCI;
                info->irq_flags = IRQF_SHARED;
 
-               setup_timer(&info->tx_timer, tx_timeout, (unsigned long)info);
-               setup_timer(&info->status_timer, status_timeout,
-                               (unsigned long)info);
+               timer_setup(&info->tx_timer, tx_timeout, 0);
+               timer_setup(&info->status_timer, status_timeout, 0);
 
                /* Store the PCI9050 misc control register value because a flaw
                 * in the PCI9050 prevents LCR registers from being read if
 /* called when HDLC frame times out
  * update stats and do tx completion processing
  */
-static void tx_timeout(unsigned long context)
+static void tx_timeout(struct timer_list *t)
 {
-       SLMP_INFO *info = (SLMP_INFO*)context;
+       SLMP_INFO *info = from_timer(info, t, tx_timer);
        unsigned long flags;
 
        if ( debug_level >= DEBUG_LEVEL_INFO )
 
 /* called to periodically check the DSR/RI modem signal input status
  */
-static void status_timeout(unsigned long context)
+static void status_timeout(struct timer_list *t)
 {
        u16 status = 0;
-       SLMP_INFO *info = (SLMP_INFO*)context;
+       SLMP_INFO *info = from_timer(info, t, status_timer);
        unsigned long flags;
        unsigned char delta;
 
 
 EXPORT_SYMBOL_GPL(usb_hcd_poll_rh_status);
 
 /* timer callback */
-static void rh_timer_func (unsigned long _hcd)
+static void rh_timer_func (struct timer_list *t)
 {
-       usb_hcd_poll_rh_status((struct usb_hcd *) _hcd);
+       struct usb_hcd *_hcd = from_timer(_hcd, t, rh_timer);
+
+       usb_hcd_poll_rh_status(_hcd);
 }
 
 /*-------------------------------------------------------------------------*/
        hcd->self.bus_name = bus_name;
        hcd->self.uses_dma = (sysdev->dma_mask != NULL);
 
-       setup_timer(&hcd->rh_timer, rh_timer_func, (unsigned long)hcd);
+       timer_setup(&hcd->rh_timer, rh_timer_func, 0);
 #ifdef CONFIG_PM
        INIT_WORK(&hcd->wakeup_work, hcd_resume_work);
 #endif
 
        }
 }
 
-static void dwc2_wakeup_detected(unsigned long data)
+static void dwc2_wakeup_detected(struct timer_list *t)
 {
-       struct dwc2_hsotg *hsotg = (struct dwc2_hsotg *)data;
+       struct dwc2_hsotg *hsotg = from_timer(hsotg, t, wkp_timer);
        u32 hprt0;
 
        dev_dbg(hsotg->dev, "%s()\n", __func__);
        }
        INIT_WORK(&hsotg->wf_otg, dwc2_conn_id_status_change);
 
-       setup_timer(&hsotg->wkp_timer, dwc2_wakeup_detected,
-                   (unsigned long)hsotg);
+       timer_setup(&hsotg->wkp_timer, dwc2_wakeup_detected, 0);
 
        /* Initialize the non-periodic schedule */
        INIT_LIST_HEAD(&hsotg->non_periodic_sched_inactive);
 
  *
  * @work: Pointer to a qh unreserve_work.
  */
-static void dwc2_unreserve_timer_fn(unsigned long data)
+static void dwc2_unreserve_timer_fn(struct timer_list *t)
 {
-       struct dwc2_qh *qh = (struct dwc2_qh *)data;
+       struct dwc2_qh *qh = from_timer(qh, t, unreserve_timer);
        struct dwc2_hsotg *hsotg = qh->hsotg;
        unsigned long flags;
 
 
        /* Initialize QH */
        qh->hsotg = hsotg;
-       setup_timer(&qh->unreserve_timer, dwc2_unreserve_timer_fn,
-                   (unsigned long)qh);
+       timer_setup(&qh->unreserve_timer, dwc2_unreserve_timer_fn, 0);
        qh->ep_type = ep_type;
        qh->ep_is_in = ep_is_in;
 
 
                mod_timer(&udc->vbus_timer, jiffies + VBUS_POLL_TIMEOUT);
 }
 
-static void at91_vbus_timer(unsigned long data)
+static void at91_vbus_timer(struct timer_list *t)
 {
-       struct at91_udc *udc = (struct at91_udc *)data;
+       struct at91_udc *udc = from_timer(udc, t, vbus_timer);
 
        /*
         * If we are polling vbus it is likely that the gpio is on an
 
                if (udc->board.vbus_polled) {
                        INIT_WORK(&udc->vbus_timer_work, at91_vbus_timer_work);
-                       setup_timer(&udc->vbus_timer, at91_vbus_timer,
-                                   (unsigned long)udc);
+                       timer_setup(&udc->vbus_timer, at91_vbus_timer, 0);
                        mod_timer(&udc->vbus_timer,
                                  jiffies + VBUS_POLL_TIMEOUT);
                } else {
 
 /* drive both sides of the transfers; looks like irq handlers to
  * both drivers except the callbacks aren't in_irq().
  */
-static void dummy_timer(unsigned long _dum_hcd)
+static void dummy_timer(struct timer_list *t)
 {
-       struct dummy_hcd        *dum_hcd = (struct dummy_hcd *) _dum_hcd;
+       struct dummy_hcd        *dum_hcd = from_timer(dum_hcd, t, timer);
        struct dummy            *dum = dum_hcd->dum;
        struct urbp             *urbp, *tmp;
        unsigned long           flags;
 
 static int dummy_start_ss(struct dummy_hcd *dum_hcd)
 {
-       setup_timer(&dum_hcd->timer, dummy_timer, (unsigned long)dum_hcd);
+       timer_setup(&dum_hcd->timer, dummy_timer, 0);
        dum_hcd->rh_state = DUMMY_RH_RUNNING;
        dum_hcd->stream_en_ep = 0;
        INIT_LIST_HEAD(&dum_hcd->urbp_list);
                return dummy_start_ss(dum_hcd);
 
        spin_lock_init(&dum_hcd->dum->lock);
-       setup_timer(&dum_hcd->timer, dummy_timer, (unsigned long)dum_hcd);
+       timer_setup(&dum_hcd->timer, dummy_timer, 0);
        dum_hcd->rh_state = DUMMY_RH_RUNNING;
 
        INIT_LIST_HEAD(&dum_hcd->urbp_list);
 
        return IRQ_HANDLED;
 }
 
-static void m66592_timer(unsigned long _m66592)
+static void m66592_timer(struct timer_list *t)
 {
-       struct m66592 *m66592 = (struct m66592 *)_m66592;
+       struct m66592 *m66592 = from_timer(m66592, t, timer);
        unsigned long flags;
        u16 tmp;
 
        m66592->gadget.max_speed = USB_SPEED_HIGH;
        m66592->gadget.name = udc_name;
 
-       setup_timer(&m66592->timer, m66592_timer, (unsigned long)m66592);
+       timer_setup(&m66592->timer, m66592_timer, 0);
        m66592->reg = reg;
 
        ret = request_irq(ires->start, m66592_irq, IRQF_SHARED,
 
 #define PIO_OUT_TIMEOUT        (jiffies + HZ/3)
 #define HALF_FULL(f)   (!((f)&(UDC_NON_ISO_FIFO_FULL|UDC_NON_ISO_FIFO_EMPTY)))
 
-static void pio_out_timer(unsigned long _ep)
+static void pio_out_timer(struct timer_list *t)
 {
-       struct omap_ep  *ep = (void *) _ep;
+       struct omap_ep  *ep = from_timer(ep, t, timer);
        unsigned long   flags;
        u16             stat_flg;
 
                }
                if (dbuf && addr)
                        epn_rxtx |= UDC_EPN_RX_DB;
-               setup_timer(&ep->timer, pio_out_timer, (unsigned long)ep);
+               timer_setup(&ep->timer, pio_out_timer, 0);
        }
        if (addr)
                epn_rxtx |= UDC_EPN_RX_VALID;
 
                nuke(&dev->ep[i], -ECONNABORTED);
 }
 
-static void udc_watchdog(unsigned long _dev)
+static void udc_watchdog(struct timer_list *t)
 {
-       struct pxa25x_udc       *dev = (void *)_dev;
+       struct pxa25x_udc       *dev = from_timer(dev, t, timer);
 
        local_irq_disable();
        if (dev->ep0state == EP0_STALL
                gpio_direction_output(dev->mach->gpio_pullup, 0);
        }
 
-       setup_timer(&dev->timer, udc_watchdog, (unsigned long)dev);
+       timer_setup(&dev->timer, udc_watchdog, 0);
 
        the_controller = dev;
        platform_set_drvdata(pdev, dev);
 
        return IRQ_HANDLED;
 }
 
-static void r8a66597_timer(unsigned long _r8a66597)
+static void r8a66597_timer(struct timer_list *t)
 {
-       struct r8a66597 *r8a66597 = (struct r8a66597 *)_r8a66597;
+       struct r8a66597 *r8a66597 = from_timer(r8a66597, t, timer);
        unsigned long flags;
        u16 tmp;
 
        r8a66597->gadget.max_speed = USB_SPEED_HIGH;
        r8a66597->gadget.name = udc_name;
 
-       setup_timer(&r8a66597->timer, r8a66597_timer, (unsigned long)r8a66597);
+       timer_setup(&r8a66597->timer, r8a66597_timer, 0);
        r8a66597->reg = reg;
 
        if (r8a66597->pdata->on_chip) {
 
 
 static void ohci_dump(struct ohci_hcd *ohci);
 static void ohci_stop(struct usb_hcd *hcd);
-static void io_watchdog_func(unsigned long _ohci);
+static void io_watchdog_func(struct timer_list *t);
 
 #include "ohci-hub.c"
 #include "ohci-dbg.c"
        if (ohci->hcca)
                return 0;
 
-       setup_timer(&ohci->io_watchdog, io_watchdog_func,
-                       (unsigned long) ohci);
+       timer_setup(&ohci->io_watchdog, io_watchdog_func, 0);
 
        ohci->hcca = dma_alloc_coherent (hcd->self.controller,
                        sizeof(*ohci->hcca), &ohci->hcca_dma, GFP_KERNEL);
  * the unlink list.  As a result, URBs could never be dequeued and
  * endpoints could never be released.
  */
-static void io_watchdog_func(unsigned long _ohci)
+static void io_watchdog_func(struct timer_list *t)
 {
-       struct ohci_hcd *ohci = (struct ohci_hcd *) _ohci;
+       struct ohci_hcd *ohci = from_timer(ohci, t, io_watchdog);
        bool            takeback_all_pending = false;
        u32             status;
        u32             head;
 
        return ret;
 }
 
-static void oxu_watchdog(unsigned long param)
+static void oxu_watchdog(struct timer_list *t)
 {
-       struct oxu_hcd  *oxu = (struct oxu_hcd *) param;
+       struct oxu_hcd  *oxu = from_timer(oxu, t, watchdog);
        unsigned long flags;
 
        spin_lock_irqsave(&oxu->lock, flags);
 
        spin_lock_init(&oxu->lock);
 
-       setup_timer(&oxu->watchdog, oxu_watchdog, (unsigned long)oxu);
+       timer_setup(&oxu->watchdog, oxu_watchdog, 0);
 
        /*
         * hw default: 1K periodic list heads, one per frame.
 
        spin_unlock_irqrestore(&r8a66597->lock, flags);
 }
 
-static void r8a66597_timer(unsigned long _r8a66597)
+static void r8a66597_timer(struct timer_list *t)
 {
-       struct r8a66597 *r8a66597 = (struct r8a66597 *)_r8a66597;
+       struct r8a66597 *r8a66597 = from_timer(r8a66597, t, rh_timer);
        unsigned long flags;
        int port;
 
                r8a66597->max_root_hub = 2;
 
        spin_lock_init(&r8a66597->lock);
-       setup_timer(&r8a66597->rh_timer, r8a66597_timer,
-                   (unsigned long)r8a66597);
+       timer_setup(&r8a66597->rh_timer, r8a66597_timer, 0);
        r8a66597->reg = reg;
 
        /* make sure no interrupts are pending */
 
 }
 
 static void
-sl811h_timer(unsigned long _sl811)
+sl811h_timer(struct timer_list *t)
 {
-       struct sl811    *sl811 = (void *) _sl811;
+       struct sl811    *sl811 = from_timer(sl811, t, timer);
        unsigned long   flags;
        u8              irqstat;
        u8              signaling = sl811->ctrl1 & SL11H_CTL1MASK_FORCE;
        spin_lock_init(&sl811->lock);
        INIT_LIST_HEAD(&sl811->async);
        sl811->board = dev_get_platdata(&dev->dev);
-       setup_timer(&sl811->timer, sl811h_timer, (unsigned long)sl811);
+       timer_setup(&sl811->timer, sl811h_timer, 0);
        sl811->addr_reg = addr_reg;
        sl811->data_reg = data_reg;
 
 
                hcd->self.sg_tablesize = ~0;
 
        spin_lock_init(&uhci->lock);
-       setup_timer(&uhci->fsbr_timer, uhci_fsbr_timeout,
-                       (unsigned long) uhci);
+       timer_setup(&uhci->fsbr_timer, uhci_fsbr_timeout, 0);
        INIT_LIST_HEAD(&uhci->idle_qh_list);
        init_waitqueue_head(&uhci->waitqh);
 
 
        }
 }
 
-static void uhci_fsbr_timeout(unsigned long _uhci)
+static void uhci_fsbr_timeout(struct timer_list *t)
 {
-       struct uhci_hcd *uhci = (struct uhci_hcd *) _uhci;
+       struct uhci_hcd *uhci = from_timer(uhci, t, fsbr_timer);
        unsigned long flags;
 
        spin_lock_irqsave(&uhci->lock, flags);
 
 
 #endif
 
-static void compliance_mode_recovery(unsigned long arg)
+static void compliance_mode_recovery(struct timer_list *t)
 {
        struct xhci_hcd *xhci;
        struct usb_hcd *hcd;
        u32 temp;
        int i;
 
-       xhci = (struct xhci_hcd *)arg;
+       xhci = from_timer(xhci, t, comp_mode_recovery_timer);
 
        for (i = 0; i < xhci->num_usb3_ports; i++) {
                temp = readl(xhci->usb3_ports[i]);
 static void compliance_mode_recovery_timer_init(struct xhci_hcd *xhci)
 {
        xhci->port_status_u0 = 0;
-       setup_timer(&xhci->comp_mode_recovery_timer,
-                   compliance_mode_recovery, (unsigned long)xhci);
+       timer_setup(&xhci->comp_mode_recovery_timer, compliance_mode_recovery,
+                   0);
        xhci->comp_mode_recovery_timer.expires = jiffies +
                        msecs_to_jiffies(COMP_MODE_RCVRY_MSECS);
 
 
                        val, reg, NULL, 0, MOS_WDR_TIMEOUT);
 }
 
-static void mos7840_led_off(unsigned long arg)
+static void mos7840_led_off(struct timer_list *t)
 {
-       struct moschip_port *mcs = (struct moschip_port *) arg;
+       struct moschip_port *mcs = from_timer(mcs, t, led_timer1);
 
        /* Turn off LED */
        mos7840_set_led_async(mcs, 0x0300, MODEM_CONTROL_REGISTER);
                                jiffies + msecs_to_jiffies(LED_OFF_MS));
 }
 
-static void mos7840_led_flag_off(unsigned long arg)
+static void mos7840_led_flag_off(struct timer_list *t)
 {
-       struct moschip_port *mcs = (struct moschip_port *) arg;
+       struct moschip_port *mcs = from_timer(mcs, t, led_timer2);
 
        clear_bit_unlock(MOS7840_FLAG_LED_BUSY, &mcs->flags);
 }
                        goto error;
                }
 
-               setup_timer(&mos7840_port->led_timer1, mos7840_led_off,
-                           (unsigned long)mos7840_port);
+               timer_setup(&mos7840_port->led_timer1, mos7840_led_off, 0);
                mos7840_port->led_timer1.expires =
                        jiffies + msecs_to_jiffies(LED_ON_MS);
-               setup_timer(&mos7840_port->led_timer2, mos7840_led_flag_off,
-                           (unsigned long)mos7840_port);
+               timer_setup(&mos7840_port->led_timer2, mos7840_led_flag_off,
+                           0);
                mos7840_port->led_timer2.expires =
                        jiffies + msecs_to_jiffies(LED_OFF_MS);
 
 
        mod_timer(&chip->rts51x_suspend_timer, chip->timer_expires);
 }
 
-static void rts51x_suspend_timer_fn(unsigned long data)
+static void rts51x_suspend_timer_fn(struct timer_list *t)
 {
-       struct rts51x_chip *chip = (struct rts51x_chip *)data;
+       struct rts51x_chip *chip = from_timer(chip, t, rts51x_suspend_timer);
        struct us_data *us = chip->us;
 
        switch (rts51x_get_stat(chip)) {
        us->proto_handler = rts51x_invoke_transport;
 
        chip->timer_expires = 0;
-       setup_timer(&chip->rts51x_suspend_timer, rts51x_suspend_timer_fn,
-                       (unsigned long)chip);
+       timer_setup(&chip->rts51x_suspend_timer, rts51x_suspend_timer_fn, 0);
        fw5895_init(us);
 
        /* enable autosuspend function of the usb device */
 
        mutex_unlock(&rc->rsvs_mutex);
 }
 
-static void uwb_cnflt_timer(unsigned long arg)
+static void uwb_cnflt_timer(struct timer_list *t)
 {
-       struct uwb_cnflt_alien *cnflt = (struct uwb_cnflt_alien *)arg;
+       struct uwb_cnflt_alien *cnflt = from_timer(cnflt, t, timer);
 
        queue_work(cnflt->rc->rsv_workq, &cnflt->cnflt_update_work);
 }
        }
 
        INIT_LIST_HEAD(&cnflt->rc_node);
-       setup_timer(&cnflt->timer, uwb_cnflt_timer, (unsigned long)cnflt);
+       timer_setup(&cnflt->timer, uwb_cnflt_timer, 0);
 
        cnflt->rc = rc;
        INIT_WORK(&cnflt->cnflt_update_work, uwb_cnflt_update_work);
 
        struct list_head list_node;
 };
 
-static void uwb_rc_neh_timer(unsigned long arg);
+static void uwb_rc_neh_timer(struct timer_list *t);
 
 static void uwb_rc_neh_release(struct kref *kref)
 {
 
        kref_init(&neh->kref);
        INIT_LIST_HEAD(&neh->list_node);
-       setup_timer(&neh->timer, uwb_rc_neh_timer, (unsigned long)neh);
+       timer_setup(&neh->timer, uwb_rc_neh_timer, 0);
 
        neh->rc = rc;
        neh->evt_type = expected_type;
 EXPORT_SYMBOL_GPL(uwb_rc_neh_error);
 
 
-static void uwb_rc_neh_timer(unsigned long arg)
+static void uwb_rc_neh_timer(struct timer_list *t)
 {
-       struct uwb_rc_neh *neh = (struct uwb_rc_neh *)arg;
+       struct uwb_rc_neh *neh = from_timer(neh, t, timer);
        struct uwb_rc *rc = neh->rc;
        unsigned long flags;
 
 
 
 #include "uwb-internal.h"
 
-static void uwb_rsv_timer(unsigned long arg);
+static void uwb_rsv_timer(struct timer_list *t);
 
 static const char *rsv_states[] = {
        [UWB_RSV_STATE_NONE]                 = "none            ",
        dev_dbg(dev, "put stream %d\n", rsv->stream);
 }
 
-void uwb_rsv_backoff_win_timer(unsigned long arg)
+void uwb_rsv_backoff_win_timer(struct timer_list *t)
 {
-       struct uwb_drp_backoff_win *bow = (struct uwb_drp_backoff_win *)arg;
+       struct uwb_drp_backoff_win *bow = from_timer(bow, t, timer);
        struct uwb_rc *rc = container_of(bow, struct uwb_rc, bow);
        struct device *dev = &rc->uwb_dev.dev;
 
        INIT_LIST_HEAD(&rsv->rc_node);
        INIT_LIST_HEAD(&rsv->pal_node);
        kref_init(&rsv->kref);
-       setup_timer(&rsv->timer, uwb_rsv_timer, (unsigned long)rsv);
+       timer_setup(&rsv->timer, uwb_rsv_timer, 0);
 
        rsv->rc = rc;
        INIT_WORK(&rsv->handle_timeout_work, uwb_rsv_handle_timeout_work);
        mutex_unlock(&rc->rsvs_mutex);
 }
 
-static void uwb_rsv_timer(unsigned long arg)
+static void uwb_rsv_timer(struct timer_list *t)
 {
-       struct uwb_rsv *rsv = (struct uwb_rsv *)arg;
+       struct uwb_rsv *rsv = from_timer(rsv, t, timer);
 
        queue_work(rsv->rc->rsv_workq, &rsv->handle_timeout_work);
 }
        rc->bow.can_reserve_extra_mases = true;
        rc->bow.total_expired = 0;
        rc->bow.window = UWB_DRP_BACKOFF_WIN_MIN >> 1;
-       setup_timer(&rc->bow.timer, uwb_rsv_backoff_win_timer,
-                       (unsigned long)&rc->bow);
+       timer_setup(&rc->bow.timer, uwb_rsv_backoff_win_timer, 0);
 
        bitmap_complement(rc->uwb_dev.streams, rc->uwb_dev.streams, UWB_NUM_STREAMS);
 }
 
 bool uwb_rsv_has_two_drp_ies(struct uwb_rsv *rsv);
 void uwb_rsv_dump(char *text, struct uwb_rsv *rsv);
 int uwb_rsv_try_move(struct uwb_rsv *rsv, struct uwb_mas_bm *available);
-void uwb_rsv_backoff_win_timer(unsigned long arg);
+void uwb_rsv_backoff_win_timer(struct timer_list *t);
 void uwb_rsv_backoff_win_increment(struct uwb_rc *rc);
 int uwb_rsv_status(struct uwb_rsv *rsv);
 int uwb_rsv_companion_status(struct uwb_rsv *rsv);
 
 /*
  * Timer tick
  */
-static void at91_ping(unsigned long data)
+static void at91_ping(struct timer_list *t)
 {
-       struct at91wdt *wdt = (struct at91wdt *)data;
+       struct at91wdt *wdt = from_timer(wdt, t, timer);
        if (time_before(jiffies, wdt->next_heartbeat) ||
            !watchdog_active(&wdt->wdd)) {
                at91_wdt_reset(wdt);
                         "watchdog already configured differently (mr = %x expecting %x)\n",
                         tmp & wdt->mr_mask, wdt->mr & wdt->mr_mask);
 
-       setup_timer(&wdt->timer, at91_ping, (unsigned long)wdt);
+       timer_setup(&wdt->timer, at91_ping, 0);
 
        /*
         * Use min_heartbeat the first time to avoid spurious watchdog reset:
 
        .restart        = bcm47xx_wdt_restart,
 };
 
-static void bcm47xx_wdt_soft_timer_tick(unsigned long data)
+static void bcm47xx_wdt_soft_timer_tick(struct timer_list *t)
 {
-       struct bcm47xx_wdt *wdt = (struct bcm47xx_wdt *)data;
+       struct bcm47xx_wdt *wdt = from_timer(wdt, t, soft_timer);
        u32 next_tick = min(wdt->wdd.timeout * 1000, wdt->max_timer_ms);
 
        if (!atomic_dec_and_test(&wdt->soft_ticks)) {
        struct bcm47xx_wdt *wdt = bcm47xx_wdt_get(wdd);
 
        bcm47xx_wdt_soft_keepalive(wdd);
-       bcm47xx_wdt_soft_timer_tick((unsigned long)wdt);
+       bcm47xx_wdt_soft_timer_tick(&wdt->soft_timer);
 
        return 0;
 }
 
        if (soft) {
                wdt->wdd.ops = &bcm47xx_wdt_soft_ops;
-               setup_timer(&wdt->soft_timer, bcm47xx_wdt_soft_timer_tick,
-                           (long unsigned int)wdt);
+               timer_setup(&wdt->soft_timer, bcm47xx_wdt_soft_timer_tick, 0);
        } else {
                wdt->wdd.ops = &bcm47xx_wdt_hard_ops;
        }
 
        die(PFX " fire", regs);
 }
 
-static void bcm63xx_timer_tick(unsigned long unused)
+static void bcm63xx_timer_tick(struct timer_list *unused)
 {
        if (!atomic_dec_and_test(&bcm63xx_wdt_device.ticks)) {
                bcm63xx_wdt_hw_start();
        int ret;
        struct resource *r;
 
-       setup_timer(&bcm63xx_wdt_device.timer, bcm63xx_timer_tick, 0L);
+       timer_setup(&bcm63xx_wdt_device.timer, bcm63xx_timer_tick, 0);
 
        r = platform_get_resource(pdev, IORESOURCE_MEM, 0);
        if (!r) {
 
 
 /* generic helper functions */
 
-static void cpu5wdt_trigger(unsigned long unused)
+static void cpu5wdt_trigger(struct timer_list *unused)
 {
        if (verbose > 2)
                pr_debug("trigger at %i ticks\n", ticks);
 
        init_completion(&cpu5wdt_device.stop);
        cpu5wdt_device.queue = 0;
-       setup_timer(&cpu5wdt_device.timer, cpu5wdt_trigger, 0);
+       timer_setup(&cpu5wdt_device.timer, cpu5wdt_trigger, 0);
        cpu5wdt_device.default_ticks = ticks;
 
        if (!request_region(port, CPU5WDT_EXTENT, PFX)) {
 
        spin_unlock(&ddata->lock);
 }
 
-static void mpc8xxx_wdt_timer_ping(unsigned long arg)
+static void mpc8xxx_wdt_timer_ping(struct timer_list *t)
 {
-       struct mpc8xxx_wdt_ddata *ddata = (void *)arg;
+       struct mpc8xxx_wdt_ddata *ddata = from_timer(ddata, t, timer);
 
        mpc8xxx_wdt_keepalive(ddata);
        /* We're pinging it twice faster than needed, just to be sure. */
        }
 
        spin_lock_init(&ddata->lock);
-       setup_timer(&ddata->timer, mpc8xxx_wdt_timer_ping,
-                   (unsigned long)ddata);
+       timer_setup(&ddata->timer, mpc8xxx_wdt_timer_ping, 0);
 
        ddata->wdd.info = &mpc8xxx_wdt_info,
        ddata->wdd.ops = &mpc8xxx_wdt_ops,
 
        unsigned int gstate;
 } mtx1_wdt_device;
 
-static void mtx1_wdt_trigger(unsigned long unused)
+static void mtx1_wdt_trigger(struct timer_list *unused)
 {
        spin_lock(&mtx1_wdt_device.lock);
        if (mtx1_wdt_device.running)
        init_completion(&mtx1_wdt_device.stop);
        mtx1_wdt_device.queue = 0;
        clear_bit(0, &mtx1_wdt_device.inuse);
-       setup_timer(&mtx1_wdt_device.timer, mtx1_wdt_trigger, 0L);
+       timer_setup(&mtx1_wdt_device.timer, mtx1_wdt_trigger, 0);
        mtx1_wdt_device.default_ticks = ticks;
 
        ret = misc_register(&mtx1_wdt_misc);
 
        return len;
 }
 
-static void nuc900_wdt_timer_ping(unsigned long data)
+static void nuc900_wdt_timer_ping(struct timer_list *unused)
 {
        if (time_before(jiffies, nuc900_wdt->next_heartbeat)) {
                nuc900_wdt_keepalive();
 
        clk_enable(nuc900_wdt->wdt_clock);
 
-       setup_timer(&nuc900_wdt->timer, nuc900_wdt_timer_ping, 0);
+       timer_setup(&nuc900_wdt->timer, nuc900_wdt_timer_ping, 0);
 
        ret = misc_register(&nuc900wdt_miscdev);
        if (ret) {
 
                pr_info("No previous trip detected - Cold boot or reset\n");
 }
 
-static void pcwd_timer_ping(unsigned long data)
+static void pcwd_timer_ping(struct timer_list *unused)
 {
        int wdrst_stat;
 
        /* clear the "card caused reboot" flag */
        pcwd_clear_status();
 
-       setup_timer(&pcwd_private.timer, pcwd_timer_ping, 0);
+       timer_setup(&pcwd_private.timer, pcwd_timer_ping, 0);
 
        /*  Disable the board  */
        pcwd_stop();
 
 /*
  * Timer tick
  */
-static void pikawdt_ping(unsigned long data)
+static void pikawdt_ping(struct timer_list *unused)
 {
        if (time_before(jiffies, pikawdt_private.next_heartbeat) ||
                        (!nowayout && !pikawdt_private.open)) {
 
        iounmap(fpga);
 
-       setup_timer(&pikawdt_private.timer, pikawdt_ping, 0);
+       timer_setup(&pikawdt_private.timer, pikawdt_ping, 0);
 
        ret = misc_register(&pikawdt_miscdev);
        if (ret) {
 
 
 /* generic helper functions */
 
-static void rdc321x_wdt_trigger(unsigned long unused)
+static void rdc321x_wdt_trigger(struct timer_list *unused)
 {
        unsigned long flags;
        u32 val;
 
        clear_bit(0, &rdc321x_wdt_device.inuse);
 
-       setup_timer(&rdc321x_wdt_device.timer, rdc321x_wdt_trigger, 0);
+       timer_setup(&rdc321x_wdt_device.timer, rdc321x_wdt_trigger, 0);
 
        rdc321x_wdt_device.default_ticks = ticks;
 
 
        return 0;
 }
 
-static void sh_wdt_ping(unsigned long data)
+static void sh_wdt_ping(struct timer_list *t)
 {
-       struct sh_wdt *wdt = (struct sh_wdt *)data;
+       struct sh_wdt *wdt = from_timer(wdt, t, timer);
        unsigned long flags;
 
        spin_lock_irqsave(&wdt->lock, flags);
                return rc;
        }
 
-       setup_timer(&wdt->timer, sh_wdt_ping, (unsigned long)wdt);
+       timer_setup(&wdt->timer, sh_wdt_ping, 0);
        wdt->timer.expires      = next_ping_period(clock_division_ratio);
 
        dev_info(&pdev->dev, "initialized.\n");
 
 static void o2net_shutdown_sc(struct work_struct *work);
 static void o2net_listen_data_ready(struct sock *sk);
 static void o2net_sc_send_keep_req(struct work_struct *work);
-static void o2net_idle_timer(unsigned long data);
+static void o2net_idle_timer(struct timer_list *t);
 static void o2net_sc_postpone_idle(struct o2net_sock_container *sc);
 static void o2net_sc_reset_idle_timer(struct o2net_sock_container *sc);
 
        INIT_WORK(&sc->sc_shutdown_work, o2net_shutdown_sc);
        INIT_DELAYED_WORK(&sc->sc_keepalive_work, o2net_sc_send_keep_req);
 
-       setup_timer(&sc->sc_idle_timeout, o2net_idle_timer,
-                   (unsigned long)sc);
+       timer_setup(&sc->sc_idle_timeout, o2net_idle_timer, 0);
 
        sclog(sc, "alloced\n");
 
 /* socket shutdown does a del_timer_sync against this as it tears down.
  * we can't start this timer until we've got to the point in sc buildup
  * where shutdown is going to be involved */
-static void o2net_idle_timer(unsigned long data)
+static void o2net_idle_timer(struct timer_list *t)
 {
-       struct o2net_sock_container *sc = (struct o2net_sock_container *)data;
+       struct o2net_sock_container *sc = from_timer(sc, t, sc_idle_timeout);
        struct o2net_node *nn = o2net_nn_from_num(sc->sc_node->nd_num);
 #ifdef CONFIG_DEBUG_FS
        unsigned long msecs = ktime_to_ms(ktime_get()) -
 
        local_bh_enable();
 }
 
-static void padata_reorder_timer(unsigned long arg)
+static void padata_reorder_timer(struct timer_list *t)
 {
-       struct parallel_data *pd = (struct parallel_data *)arg;
+       struct parallel_data *pd = from_timer(pd, t, timer);
        unsigned int weight;
        int target_cpu, cpu;
 
 
        padata_init_pqueues(pd);
        padata_init_squeues(pd);
-       setup_timer(&pd->timer, padata_reorder_timer, (unsigned long)pd);
+       timer_setup(&pd->timer, padata_reorder_timer, 0);
        atomic_set(&pd->seq_nr, -1);
        atomic_set(&pd->reorder_objects, 0);
        atomic_set(&pd->refcnt, 0);
 
        spin_unlock_irqrestore(&watchdog_lock, flags);
 }
 
-static void clocksource_watchdog(unsigned long data)
+static void clocksource_watchdog(struct timer_list *unused)
 {
        struct clocksource *cs;
        u64 csnow, wdnow, cslast, wdlast, delta;
 {
        if (watchdog_running || !watchdog || list_empty(&watchdog_list))
                return;
-       setup_timer(&watchdog_timer, clocksource_watchdog, 0UL);
+       timer_setup(&watchdog_timer, clocksource_watchdog, 0);
        watchdog_timer.expires = jiffies + WATCHDOG_INTERVAL;
        add_timer_on(&watchdog_timer, cpumask_first(cpu_online_mask));
        watchdog_running = 1;
 
        mod_timer(&app->join_timer, jiffies + delay);
 }
 
-static void garp_join_timer(unsigned long data)
+static void garp_join_timer(struct timer_list *t)
 {
-       struct garp_applicant *app = (struct garp_applicant *)data;
+       struct garp_applicant *app = from_timer(app, t, join_timer);
 
        spin_lock(&app->lock);
        garp_gid_event(app, GARP_EVENT_TRANSMIT_PDU);
        spin_lock_init(&app->lock);
        skb_queue_head_init(&app->queue);
        rcu_assign_pointer(dev->garp_port->applicants[appl->type], app);
-       setup_timer(&app->join_timer, garp_join_timer, (unsigned long)app);
+       timer_setup(&app->join_timer, garp_join_timer, 0);
        garp_join_timer_arm(app);
        return 0;
 
 
        mod_timer(&app->join_timer, jiffies + delay);
 }
 
-static void mrp_join_timer(unsigned long data)
+static void mrp_join_timer(struct timer_list *t)
 {
-       struct mrp_applicant *app = (struct mrp_applicant *)data;
+       struct mrp_applicant *app = from_timer(app, t, join_timer);
 
        spin_lock(&app->lock);
        mrp_mad_event(app, MRP_EVENT_TX);
                  jiffies + msecs_to_jiffies(mrp_periodic_time));
 }
 
-static void mrp_periodic_timer(unsigned long data)
+static void mrp_periodic_timer(struct timer_list *t)
 {
-       struct mrp_applicant *app = (struct mrp_applicant *)data;
+       struct mrp_applicant *app = from_timer(app, t, periodic_timer);
 
        spin_lock(&app->lock);
        mrp_mad_event(app, MRP_EVENT_PERIODIC);
        spin_lock_init(&app->lock);
        skb_queue_head_init(&app->queue);
        rcu_assign_pointer(dev->mrp_port->applicants[appl->type], app);
-       setup_timer(&app->join_timer, mrp_join_timer, (unsigned long)app);
+       timer_setup(&app->join_timer, mrp_join_timer, 0);
        mrp_join_timer_arm(app);
-       setup_timer(&app->periodic_timer, mrp_periodic_timer,
-                   (unsigned long)app);
+       timer_setup(&app->periodic_timer, mrp_periodic_timer, 0);
        mrp_periodic_timer_arm(app);
        return 0;
 
 
 }
 
 /* Handle the timer event */
-static void aarp_expire_timeout(unsigned long unused)
+static void aarp_expire_timeout(struct timer_list *unused)
 {
        int ct;
 
        aarp_dl = register_snap_client(aarp_snap_id, aarp_rcv);
        if (!aarp_dl)
                printk(KERN_CRIT "Unable to register AARP with SNAP.\n");
-       setup_timer(&aarp_timer, aarp_expire_timeout, 0);
+       timer_setup(&aarp_timer, aarp_expire_timeout, 0);
        aarp_timer.expires  = jiffies + sysctl_aarp_expiry_time;
        add_timer(&aarp_timer);
        register_netdevice_notifier(&aarp_notifier);
 
        return s;
 }
 
-static void atalk_destroy_timer(unsigned long data)
+static void atalk_destroy_timer(struct timer_list *t)
 {
-       struct sock *sk = (struct sock *)data;
+       struct sock *sk = from_timer(sk, t, sk_timer);
 
        if (sk_has_allocations(sk)) {
                sk->sk_timer.expires = jiffies + SOCK_DESTROY_TIME;
        skb_queue_purge(&sk->sk_receive_queue);
 
        if (sk_has_allocations(sk)) {
-               setup_timer(&sk->sk_timer, atalk_destroy_timer,
-                               (unsigned long)sk);
+               timer_setup(&sk->sk_timer, atalk_destroy_timer, 0);
                sk->sk_timer.expires    = jiffies + SOCK_DESTROY_TIME;
                add_timer(&sk->sk_timer);
        } else
 
  * Switch to Slow Start, set the ss_threshold to half of the current cwnd and
  * reset the cwnd to 3*MSS
  */
-static void batadv_tp_sender_timeout(unsigned long arg)
+static void batadv_tp_sender_timeout(struct timer_list *t)
 {
-       struct batadv_tp_vars *tp_vars = (struct batadv_tp_vars *)arg;
+       struct batadv_tp_vars *tp_vars = from_timer(tp_vars, t, timer);
        struct batadv_priv *bat_priv = tp_vars->bat_priv;
 
        if (atomic_read(&tp_vars->sending) == 0)
        atomic64_set(&tp_vars->tot_sent, 0);
 
        kref_get(&tp_vars->refcount);
-       setup_timer(&tp_vars->timer, batadv_tp_sender_timeout,
-                   (unsigned long)tp_vars);
+       timer_setup(&tp_vars->timer, batadv_tp_sender_timeout, 0);
 
        tp_vars->bat_priv = bat_priv;
        tp_vars->start_time = jiffies;
  *  reached without received ack
  * @arg: address of the related tp_vars
  */
-static void batadv_tp_receiver_shutdown(unsigned long arg)
+static void batadv_tp_receiver_shutdown(struct timer_list *t)
 {
-       struct batadv_tp_vars *tp_vars = (struct batadv_tp_vars *)arg;
+       struct batadv_tp_vars *tp_vars = from_timer(tp_vars, t, timer);
        struct batadv_tp_unacked *un, *safe;
        struct batadv_priv *bat_priv;
 
        hlist_add_head_rcu(&tp_vars->list, &bat_priv->tp_list);
 
        kref_get(&tp_vars->refcount);
-       setup_timer(&tp_vars->timer, batadv_tp_receiver_shutdown,
-                   (unsigned long)tp_vars);
+       timer_setup(&tp_vars->timer, batadv_tp_receiver_shutdown, 0);
 
        batadv_tp_reset_receiver_timer(tp_vars);
 
 
        }
 }
 
-static void hidp_idle_timeout(unsigned long arg)
+static void hidp_idle_timeout(struct timer_list *t)
 {
-       struct hidp_session *session = (struct hidp_session *) arg;
+       struct hidp_session *session = from_timer(session, t, timer);
 
        /* The HIDP user-space API only contains calls to add and remove
         * devices. There is no way to forward events of any kind. Therefore,
 
        /* device management */
        INIT_WORK(&session->dev_init, hidp_session_dev_work);
-       setup_timer(&session->timer, hidp_idle_timeout,
-                   (unsigned long)session);
+       timer_setup(&session->timer, hidp_idle_timeout, 0);
 
        /* session data */
        mutex_init(&session->report_mutex);
 
                                 d->out);
 }
 
-static void rfcomm_session_timeout(unsigned long arg)
+static void rfcomm_session_timeout(struct timer_list *t)
 {
-       struct rfcomm_session *s = (void *) arg;
+       struct rfcomm_session *s = from_timer(s, t, timer);
 
        BT_DBG("session %p state %ld", s, s->state);
 
 }
 
 /* ---- RFCOMM DLCs ---- */
-static void rfcomm_dlc_timeout(unsigned long arg)
+static void rfcomm_dlc_timeout(struct timer_list *t)
 {
-       struct rfcomm_dlc *d = (void *) arg;
+       struct rfcomm_dlc *d = from_timer(d, t, timer);
 
        BT_DBG("dlc %p state %ld", d, d->state);
 
        if (!d)
                return NULL;
 
-       setup_timer(&d->timer, rfcomm_dlc_timeout, (unsigned long)d);
+       timer_setup(&d->timer, rfcomm_dlc_timeout, 0);
 
        skb_queue_head_init(&d->tx_queue);
        mutex_init(&d->lock);
 
        BT_DBG("session %p sock %p", s, sock);
 
-       setup_timer(&s->timer, rfcomm_session_timeout, (unsigned long) s);
+       timer_setup(&s->timer, rfcomm_session_timeout, 0);
 
        INIT_LIST_HEAD(&s->dlcs);
        s->state = state;
 
 #define SCO_CONN_TIMEOUT       (HZ * 40)
 #define SCO_DISCONN_TIMEOUT    (HZ * 2)
 
-static void sco_sock_timeout(unsigned long arg)
+static void sco_sock_timeout(struct timer_list *t)
 {
-       struct sock *sk = (struct sock *)arg;
+       struct sock *sk = from_timer(sk, t, sk_timer);
 
        BT_DBG("sock %p state %d", sk, sk->sk_state);
 
 
        sco_pi(sk)->setting = BT_VOICE_CVSD_16BIT;
 
-       setup_timer(&sk->sk_timer, sco_sock_timeout, (unsigned long)sk);
+       timer_setup(&sk->sk_timer, sco_sock_timeout, 0);
 
        bt_sock_link(&sco_sk_list, sk);
        return sk;
 
  * in the event that more drops will arrive during the
  * hysteresis period.
  */
-static void sched_send_work(unsigned long _data)
+static void sched_send_work(struct timer_list *t)
 {
-       struct per_cpu_dm_data *data = (struct per_cpu_dm_data *)_data;
+       struct per_cpu_dm_data *data = from_timer(data, t, send_timer);
 
        schedule_work(&data->dm_alert_work);
 }
        for_each_possible_cpu(cpu) {
                data = &per_cpu(dm_cpu_data, cpu);
                INIT_WORK(&data->dm_alert_work, send_dm_alert);
-               setup_timer(&data->send_timer, sched_send_work,
-                           (unsigned long)data);
+               timer_setup(&data->send_timer, sched_send_work, 0);
                spin_lock_init(&data->lock);
                reset_per_cpu_data(data);
        }
 
 
 }
 
-static void est_timer(unsigned long arg)
+static void est_timer(struct timer_list *t)
 {
-       struct net_rate_estimator *est = (struct net_rate_estimator *)arg;
+       struct net_rate_estimator *est = from_timer(est, t, timer);
        struct gnet_stats_basic_packed b;
        u64 rate, brate;
 
        }
 
        est->next_jiffies = jiffies + ((HZ/4) << intvl_log);
-       setup_timer(&est->timer, est_timer, (unsigned long)est);
+       timer_setup(&est->timer, est_timer, 0);
        mod_timer(&est->timer, est->next_jiffies);
 
        rcu_assign_pointer(*rate_est, est);
 
 
 #define PNEIGH_HASHMASK                0xF
 
-static void neigh_timer_handler(unsigned long arg);
+static void neigh_timer_handler(struct timer_list *t);
 static void __neigh_notify(struct neighbour *n, int type, int flags,
                           u32 pid);
 static void neigh_update_notify(struct neighbour *neigh, u32 nlmsg_pid);
        n->output         = neigh_blackhole;
        seqlock_init(&n->hh.hh_lock);
        n->parms          = neigh_parms_clone(&tbl->parms);
-       setup_timer(&n->timer, neigh_timer_handler, (unsigned long)n);
+       timer_setup(&n->timer, neigh_timer_handler, 0);
 
        NEIGH_CACHE_STAT_INC(tbl, allocs);
        n->tbl            = tbl;
 
 /* Called when a timer expires for a neighbour entry. */
 
-static void neigh_timer_handler(unsigned long arg)
+static void neigh_timer_handler(struct timer_list *t)
 {
        unsigned long now, next;
-       struct neighbour *neigh = (struct neighbour *)arg;
+       struct neighbour *neigh = from_timer(neigh, t, timer);
        unsigned int state;
        int notify = 0;
 
 }
 EXPORT_SYMBOL(neigh_direct_output);
 
-static void neigh_proxy_process(unsigned long arg)
+static void neigh_proxy_process(struct timer_list *t)
 {
-       struct neigh_table *tbl = (struct neigh_table *)arg;
+       struct neigh_table *tbl = from_timer(tbl, t, proxy_timer);
        long sched_next = 0;
        unsigned long now = jiffies;
        struct sk_buff *skb, *n;
        INIT_DEFERRABLE_WORK(&tbl->gc_work, neigh_periodic_work);
        queue_delayed_work(system_power_efficient_wq, &tbl->gc_work,
                        tbl->parms.reachable_time);
-       setup_timer(&tbl->proxy_timer, neigh_proxy_process, (unsigned long)tbl);
+       timer_setup(&tbl->proxy_timer, neigh_proxy_process, 0);
        skb_queue_head_init_class(&tbl->proxy_queue,
                        &neigh_table_proxy_queue_class);
 
 
        return dn_rt_hash_mask & (unsigned int)tmp;
 }
 
-static void dn_dst_check_expire(unsigned long dummy)
+static void dn_dst_check_expire(struct timer_list *unused)
 {
        int i;
        struct dn_route *rt;
                kmem_cache_create("dn_dst_cache", sizeof(struct dn_route), 0,
                                  SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL);
        dst_entries_init(&dn_dst_ops);
-       setup_timer(&dn_route_timer, dn_dst_check_expire, 0);
+       timer_setup(&dn_route_timer, dn_dst_check_expire, 0);
        dn_route_timer.expires = jiffies + decnet_dst_gc_interval * HZ;
        add_timer(&dn_route_timer);
 
 
 
 #define SLOW_INTERVAL (HZ/2)
 
-static void dn_slow_timer(unsigned long arg);
+static void dn_slow_timer(struct timer_list *t);
 
 void dn_start_slow_timer(struct sock *sk)
 {
-       setup_timer(&sk->sk_timer, dn_slow_timer, (unsigned long)sk);
+       timer_setup(&sk->sk_timer, dn_slow_timer, 0);
        sk_reset_timer(sk, &sk->sk_timer, jiffies + SLOW_INTERVAL);
 }
 
        sk_stop_timer(sk, &sk->sk_timer);
 }
 
-static void dn_slow_timer(unsigned long arg)
+static void dn_slow_timer(struct timer_list *t)
 {
-       struct sock *sk = (struct sock *)arg;
+       struct sock *sk = from_timer(sk, t, sk_timer);
        struct dn_scp *scp = DN_SK(sk);
 
        bh_lock_sock(sk);
 
        return ip_local_out(net, skb->sk, skb);
 }
 
-static void igmp_gq_timer_expire(unsigned long data)
+static void igmp_gq_timer_expire(struct timer_list *t)
 {
-       struct in_device *in_dev = (struct in_device *)data;
+       struct in_device *in_dev = from_timer(in_dev, t, mr_gq_timer);
 
        in_dev->mr_gq_running = 0;
        igmpv3_send_report(in_dev, NULL);
        in_dev_put(in_dev);
 }
 
-static void igmp_ifc_timer_expire(unsigned long data)
+static void igmp_ifc_timer_expire(struct timer_list *t)
 {
-       struct in_device *in_dev = (struct in_device *)data;
+       struct in_device *in_dev = from_timer(in_dev, t, mr_ifc_timer);
 
        igmpv3_send_cr(in_dev);
        if (in_dev->mr_ifc_count) {
 }
 
 
-static void igmp_timer_expire(unsigned long data)
+static void igmp_timer_expire(struct timer_list *t)
 {
-       struct ip_mc_list *im = (struct ip_mc_list *)data;
+       struct ip_mc_list *im = from_timer(im, t, timer);
        struct in_device *in_dev = im->interface;
 
        spin_lock(&im->lock);
        refcount_set(&im->refcnt, 1);
        spin_lock_init(&im->lock);
 #ifdef CONFIG_IP_MULTICAST
-       setup_timer(&im->timer, igmp_timer_expire, (unsigned long)im);
+       timer_setup(&im->timer, igmp_timer_expire, 0);
        im->unsolicit_count = net->ipv4.sysctl_igmp_qrv;
 #endif
 
        ASSERT_RTNL();
 
 #ifdef CONFIG_IP_MULTICAST
-       setup_timer(&in_dev->mr_gq_timer, igmp_gq_timer_expire,
-                       (unsigned long)in_dev);
-       setup_timer(&in_dev->mr_ifc_timer, igmp_ifc_timer_expire,
-                       (unsigned long)in_dev);
+       timer_setup(&in_dev->mr_gq_timer, igmp_gq_timer_expire, 0);
+       timer_setup(&in_dev->mr_ifc_timer, igmp_ifc_timer_expire, 0);
        in_dev->mr_qrv = net->ipv4.sysctl_igmp_qrv;
 #endif
 
 
                                 int cmd);
 static void igmpmsg_netlink_event(struct mr_table *mrt, struct sk_buff *pkt);
 static void mroute_clean_tables(struct mr_table *mrt, bool all);
-static void ipmr_expire_process(unsigned long arg);
+static void ipmr_expire_process(struct timer_list *t);
 
 #ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES
 #define ipmr_for_each_table(mrt, net) \
        INIT_LIST_HEAD(&mrt->mfc_cache_list);
        INIT_LIST_HEAD(&mrt->mfc_unres_queue);
 
-       setup_timer(&mrt->ipmr_expire_timer, ipmr_expire_process,
-                   (unsigned long)mrt);
+       timer_setup(&mrt->ipmr_expire_timer, ipmr_expire_process, 0);
 
        mrt->mroute_reg_vif_num = -1;
 #ifdef CONFIG_IP_MROUTE_MULTIPLE_TABLES
 }
 
 /* Timer process for the unresolved queue. */
-static void ipmr_expire_process(unsigned long arg)
+static void ipmr_expire_process(struct timer_list *t)
 {
-       struct mr_table *mrt = (struct mr_table *)arg;
+       struct mr_table *mrt = from_timer(mrt, t, ipmr_expire_timer);
        unsigned long now;
        unsigned long expires;
        struct mfc_cache *c, *next;
 
 static void addrconf_dad_work(struct work_struct *w);
 static void addrconf_dad_completed(struct inet6_ifaddr *ifp, bool bump_id);
 static void addrconf_dad_run(struct inet6_dev *idev);
-static void addrconf_rs_timer(unsigned long data);
+static void addrconf_rs_timer(struct timer_list *t);
 static void __ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
 static void ipv6_ifa_notify(int event, struct inet6_ifaddr *ifa);
 
        rwlock_init(&ndev->lock);
        ndev->dev = dev;
        INIT_LIST_HEAD(&ndev->addr_list);
-       setup_timer(&ndev->rs_timer, addrconf_rs_timer,
-                   (unsigned long)ndev);
+       timer_setup(&ndev->rs_timer, addrconf_rs_timer, 0);
        memcpy(&ndev->cnf, dev_net(dev)->ipv6.devconf_dflt, sizeof(ndev->cnf));
 
        if (ndev->cnf.stable_secret.initialized)
        return 0;
 }
 
-static void addrconf_rs_timer(unsigned long data)
+static void addrconf_rs_timer(struct timer_list *t)
 {
-       struct inet6_dev *idev = (struct inet6_dev *)data;
+       struct inet6_dev *idev = from_timer(idev, t, rs_timer);
        struct net_device *dev = idev->dev;
        struct in6_addr lladdr;
 
 
 static int ip6mr_rtm_dumproute(struct sk_buff *skb,
                               struct netlink_callback *cb);
 static void mroute_clean_tables(struct mr6_table *mrt, bool all);
-static void ipmr_expire_process(unsigned long arg);
+static void ipmr_expire_process(struct timer_list *t);
 
 #ifdef CONFIG_IPV6_MROUTE_MULTIPLE_TABLES
 #define ip6mr_for_each_table(mrt, net) \
 
        INIT_LIST_HEAD(&mrt->mfc6_unres_queue);
 
-       setup_timer(&mrt->ipmr_expire_timer, ipmr_expire_process,
-                   (unsigned long)mrt);
+       timer_setup(&mrt->ipmr_expire_timer, ipmr_expire_process, 0);
 
 #ifdef CONFIG_IPV6_PIMSM_V2
        mrt->mroute_reg_vif_num = -1;
                mod_timer(&mrt->ipmr_expire_timer, jiffies + expires);
 }
 
-static void ipmr_expire_process(unsigned long arg)
+static void ipmr_expire_process(struct timer_list *t)
 {
-       struct mr6_table *mrt = (struct mr6_table *)arg;
+       struct mr6_table *mrt = from_timer(mrt, t, ipmr_expire_timer);
 
        if (!spin_trylock(&mfc_unres_lock)) {
                mod_timer(&mrt->ipmr_expire_timer, jiffies + 1);
 
 
 static void igmp6_join_group(struct ifmcaddr6 *ma);
 static void igmp6_leave_group(struct ifmcaddr6 *ma);
-static void igmp6_timer_handler(unsigned long data);
+static void igmp6_timer_handler(struct timer_list *t);
 
-static void mld_gq_timer_expire(unsigned long data);
-static void mld_ifc_timer_expire(unsigned long data);
+static void mld_gq_timer_expire(struct timer_list *t);
+static void mld_ifc_timer_expire(struct timer_list *t);
 static void mld_ifc_event(struct inet6_dev *idev);
 static void mld_add_delrec(struct inet6_dev *idev, struct ifmcaddr6 *pmc);
 static void mld_del_delrec(struct inet6_dev *idev, struct ifmcaddr6 *pmc);
        if (!mc)
                return NULL;
 
-       setup_timer(&mc->mca_timer, igmp6_timer_handler, (unsigned long)mc);
+       timer_setup(&mc->mca_timer, igmp6_timer_handler, 0);
 
        mc->mca_addr = *addr;
        mc->idev = idev; /* reference taken by caller */
        }
 }
 
-static void mld_dad_timer_expire(unsigned long data)
+static void mld_dad_timer_expire(struct timer_list *t)
 {
-       struct inet6_dev *idev = (struct inet6_dev *)data;
+       struct inet6_dev *idev = from_timer(idev, t, mc_dad_timer);
 
        mld_send_initial_cr(idev);
        if (idev->mc_dad_count) {
        }
 }
 
-static void mld_gq_timer_expire(unsigned long data)
+static void mld_gq_timer_expire(struct timer_list *t)
 {
-       struct inet6_dev *idev = (struct inet6_dev *)data;
+       struct inet6_dev *idev = from_timer(idev, t, mc_gq_timer);
 
        idev->mc_gq_running = 0;
        mld_send_report(idev, NULL);
        in6_dev_put(idev);
 }
 
-static void mld_ifc_timer_expire(unsigned long data)
+static void mld_ifc_timer_expire(struct timer_list *t)
 {
-       struct inet6_dev *idev = (struct inet6_dev *)data;
+       struct inet6_dev *idev = from_timer(idev, t, mc_ifc_timer);
 
        mld_send_cr(idev);
        if (idev->mc_ifc_count) {
        mld_ifc_start_timer(idev, 1);
 }
 
-static void igmp6_timer_handler(unsigned long data)
+static void igmp6_timer_handler(struct timer_list *t)
 {
-       struct ifmcaddr6 *ma = (struct ifmcaddr6 *) data;
+       struct ifmcaddr6 *ma = from_timer(ma, t, mca_timer);
 
        if (mld_in_v1_mode(ma->idev))
                igmp6_send(&ma->mca_addr, ma->idev->dev, ICMPV6_MGM_REPORT);
        write_lock_bh(&idev->lock);
        spin_lock_init(&idev->mc_lock);
        idev->mc_gq_running = 0;
-       setup_timer(&idev->mc_gq_timer, mld_gq_timer_expire,
-                       (unsigned long)idev);
+       timer_setup(&idev->mc_gq_timer, mld_gq_timer_expire, 0);
        idev->mc_tomb = NULL;
        idev->mc_ifc_count = 0;
-       setup_timer(&idev->mc_ifc_timer, mld_ifc_timer_expire,
-                       (unsigned long)idev);
-       setup_timer(&idev->mc_dad_timer, mld_dad_timer_expire,
-                   (unsigned long)idev);
+       timer_setup(&idev->mc_ifc_timer, mld_ifc_timer_expire, 0);
+       timer_setup(&idev->mc_dad_timer, mld_dad_timer_expire, 0);
        ipv6_mc_reset(idev);
        write_unlock_bh(&idev->lock);
 }
 
        return NULL;
 }
 
-static void ncsi_request_timeout(unsigned long data)
+static void ncsi_request_timeout(struct timer_list *t)
 {
-       struct ncsi_request *nr = (struct ncsi_request *)data;
+       struct ncsi_request *nr = from_timer(nr, t, timer);
        struct ncsi_dev_priv *ndp = nr->ndp;
        unsigned long flags;
 
        for (i = 0; i < ARRAY_SIZE(ndp->requests); i++) {
                ndp->requests[i].id = i;
                ndp->requests[i].ndp = ndp;
-               setup_timer(&ndp->requests[i].timer,
-                           ncsi_request_timeout,
-                           (unsigned long)&ndp->requests[i]);
+               timer_setup(&ndp->requests[i].timer, ncsi_request_timeout, 0);
        }
 
        spin_lock_irqsave(&ncsi_dev_lock, flags);
 
 }
 EXPORT_SYMBOL_GPL(nf_ct_unlink_expect_report);
 
-static void nf_ct_expectation_timed_out(unsigned long ul_expect)
+static void nf_ct_expectation_timed_out(struct timer_list *t)
 {
-       struct nf_conntrack_expect *exp = (void *)ul_expect;
+       struct nf_conntrack_expect *exp = from_timer(exp, t, timeout);
 
        spin_lock_bh(&nf_conntrack_expect_lock);
        nf_ct_unlink_expect(exp);
        /* two references : one for hash insert, one for the timer */
        refcount_add(2, &exp->use);
 
-       setup_timer(&exp->timeout, nf_ct_expectation_timed_out,
-                   (unsigned long)exp);
+       timer_setup(&exp->timeout, nf_ct_expectation_timed_out, 0);
        helper = rcu_dereference_protected(master_help->helper,
                                           lockdep_is_held(&nf_conntrack_expect_lock));
        if (helper) {
 
                call_rcu_bh(&inst->rcu, nfulnl_instance_free_rcu);
 }
 
-static void nfulnl_timer(unsigned long data);
+static void nfulnl_timer(struct timer_list *t);
 
 static struct nfulnl_instance *
 instance_create(struct net *net, u_int16_t group_num,
        /* needs to be two, since we _put() after creation */
        refcount_set(&inst->use, 2);
 
-       setup_timer(&inst->timer, nfulnl_timer, (unsigned long)inst);
+       timer_setup(&inst->timer, nfulnl_timer, 0);
 
        inst->net = get_net(net);
        inst->peer_user_ns = user_ns;
 }
 
 static void
-nfulnl_timer(unsigned long data)
+nfulnl_timer(struct timer_list *t)
 {
-       struct nfulnl_instance *inst = (struct nfulnl_instance *)data;
+       struct nfulnl_instance *inst = from_timer(inst, t, timer);
 
        spin_lock_bh(&inst->lock);
        if (inst->skb)
 
        sysfs_notify(idletimer_tg_kobj, NULL, timer->attr.attr.name);
 }
 
-static void idletimer_tg_expired(unsigned long data)
+static void idletimer_tg_expired(struct timer_list *t)
 {
-       struct idletimer_tg *timer = (struct idletimer_tg *) data;
+       struct idletimer_tg *timer = from_timer(timer, t, timer);
 
        pr_debug("timer %s expired\n", timer->attr.attr.name);
 
 
        list_add(&info->timer->entry, &idletimer_tg_list);
 
-       setup_timer(&info->timer->timer, idletimer_tg_expired,
-                   (unsigned long) info->timer);
+       timer_setup(&info->timer->timer, idletimer_tg_expired, 0);
        info->timer->refcnt = 1;
 
        mod_timer(&info->timer->timer,
 
        return XT_CONTINUE;
 }
 
-static void led_timeout_callback(unsigned long data)
+static void led_timeout_callback(struct timer_list *t)
 {
-       struct xt_led_info_internal *ledinternal = (struct xt_led_info_internal *)data;
+       struct xt_led_info_internal *ledinternal = from_timer(ledinternal, t,
+                                                             timer);
 
        led_trigger_event(&ledinternal->netfilter_led_trigger, LED_OFF);
 }
 
        /* See if we need to set up a timer */
        if (ledinfo->delay > 0)
-               setup_timer(&ledinternal->timer, led_timeout_callback,
-                           (unsigned long)ledinternal);
+               timer_setup(&ledinternal->timer, led_timeout_callback, 0);
 
        list_add_tail(&ledinternal->list, &xt_led_triggers);
 
 
 }
 
 /* NCI command timer function */
-static void nci_cmd_timer(unsigned long arg)
+static void nci_cmd_timer(struct timer_list *t)
 {
-       struct nci_dev *ndev = (void *) arg;
+       struct nci_dev *ndev = from_timer(ndev, t, cmd_timer);
 
        atomic_set(&ndev->cmd_cnt, 1);
        queue_work(ndev->cmd_wq, &ndev->cmd_work);
 }
 
 /* NCI data exchange timer function */
-static void nci_data_timer(unsigned long arg)
+static void nci_data_timer(struct timer_list *t)
 {
-       struct nci_dev *ndev = (void *) arg;
+       struct nci_dev *ndev = from_timer(ndev, t, data_timer);
 
        set_bit(NCI_DATA_EXCHANGE_TO, &ndev->flags);
        queue_work(ndev->rx_wq, &ndev->rx_work);
        skb_queue_head_init(&ndev->rx_q);
        skb_queue_head_init(&ndev->tx_q);
 
-       setup_timer(&ndev->cmd_timer, nci_cmd_timer,
-                   (unsigned long) ndev);
-       setup_timer(&ndev->data_timer, nci_data_timer,
-                   (unsigned long) ndev);
+       timer_setup(&ndev->cmd_timer, nci_cmd_timer, 0);
+       timer_setup(&ndev->data_timer, nci_data_timer, 0);
 
        mutex_init(&ndev->req_lock);
        INIT_LIST_HEAD(&ndev->conn_info_list);
 
 
 struct kmem_cache *rxrpc_call_jar;
 
-static void rxrpc_call_timer_expired(unsigned long _call)
+static void rxrpc_call_timer_expired(struct timer_list *t)
 {
-       struct rxrpc_call *call = (struct rxrpc_call *)_call;
+       struct rxrpc_call *call = from_timer(call, t, timer);
 
        _enter("%d", call->debug_id);
 
                goto nomem_2;
 
        mutex_init(&call->user_mutex);
-       setup_timer(&call->timer, rxrpc_call_timer_expired,
-                   (unsigned long)call);
+       timer_setup(&call->timer, rxrpc_call_timer_expired, 0);
        INIT_WORK(&call->processor, &rxrpc_process_call);
        INIT_LIST_HEAD(&call->link);
        INIT_LIST_HEAD(&call->chan_wait_link);
 
 static void lib80211_crypt_deinit_entries(struct lib80211_crypt_info *info,
                                          int force);
 static void lib80211_crypt_quiescing(struct lib80211_crypt_info *info);
-static void lib80211_crypt_deinit_handler(unsigned long data);
+static void lib80211_crypt_deinit_handler(struct timer_list *t);
 
 int lib80211_crypt_info_init(struct lib80211_crypt_info *info, char *name,
                                spinlock_t *lock)
        info->lock = lock;
 
        INIT_LIST_HEAD(&info->crypt_deinit_list);
-       setup_timer(&info->crypt_deinit_timer, lib80211_crypt_deinit_handler,
-                       (unsigned long)info);
+       timer_setup(&info->crypt_deinit_timer, lib80211_crypt_deinit_handler,
+                   0);
 
        return 0;
 }
        spin_unlock_irqrestore(info->lock, flags);
 }
 
-static void lib80211_crypt_deinit_handler(unsigned long data)
+static void lib80211_crypt_deinit_handler(struct timer_list *t)
 {
-       struct lib80211_crypt_info *info = (struct lib80211_crypt_info *)data;
+       struct lib80211_crypt_info *info = from_timer(info, t,
+                                                     crypt_deinit_timer);
        unsigned long flags;
 
        lib80211_crypt_deinit_entries(info, 0);
 
 LIST_HEAD(x25_neigh_list);
 DEFINE_RWLOCK(x25_neigh_list_lock);
 
-static void x25_t20timer_expiry(unsigned long);
+static void x25_t20timer_expiry(struct timer_list *);
 
 static void x25_transmit_restart_confirmation(struct x25_neigh *nb);
 static void x25_transmit_restart_request(struct x25_neigh *nb);
        mod_timer(&nb->t20timer, jiffies + nb->t20);
 }
 
-static void x25_t20timer_expiry(unsigned long param)
+static void x25_t20timer_expiry(struct timer_list *t)
 {
-       struct x25_neigh *nb = (struct x25_neigh *)param;
+       struct x25_neigh *nb = from_timer(nb, t, t20timer);
 
        x25_transmit_restart_request(nb);
 
                return;
 
        skb_queue_head_init(&nb->queue);
-       setup_timer(&nb->t20timer, x25_t20timer_expiry, (unsigned long)nb);
+       timer_setup(&nb->t20timer, x25_t20timer_expiry, 0);
 
        dev_hold(dev);
        nb->dev      = dev;
 
        return HRTIMER_NORESTART;
 }
 
-static void xfrm_replay_timer_handler(unsigned long data);
+static void xfrm_replay_timer_handler(struct timer_list *t);
 
 struct xfrm_state *xfrm_state_alloc(struct net *net)
 {
                INIT_HLIST_NODE(&x->byspi);
                tasklet_hrtimer_init(&x->mtimer, xfrm_timer_handler,
                                        CLOCK_BOOTTIME, HRTIMER_MODE_ABS);
-               setup_timer(&x->rtimer, xfrm_replay_timer_handler,
-                               (unsigned long)x);
+               timer_setup(&x->rtimer, xfrm_replay_timer_handler, 0);
                x->curlft.add_time = get_seconds();
                x->lft.soft_byte_limit = XFRM_INF;
                x->lft.soft_packet_limit = XFRM_INF;
 }
 EXPORT_SYMBOL(xfrm_state_walk_done);
 
-static void xfrm_replay_timer_handler(unsigned long data)
+static void xfrm_replay_timer_handler(struct timer_list *t)
 {
-       struct xfrm_state *x = (struct xfrm_state *)data;
+       struct xfrm_state *x = from_timer(x, t, rtimer);
 
        spin_lock(&x->lock);