/*
  *     Handler for deferred kills.
  */
-static void rose_destroy_timer(unsigned long data)
+static void rose_destroy_timer(struct timer_list *t)
 {
-       rose_destroy_socket((struct sock *)data);
+       struct sock *sk = from_timer(sk, t, sk_timer);
+
+       rose_destroy_socket(sk);
 }
 
 /*
 
        if (sk_has_allocations(sk)) {
                /* Defer: outstanding buffers */
-               setup_timer(&sk->sk_timer, rose_destroy_timer,
-                               (unsigned long)sk);
+               timer_setup(&sk->sk_timer, rose_destroy_timer, 0);
                sk->sk_timer.expires  = jiffies + 10 * HZ;
                add_timer(&sk->sk_timer);
        } else
        sock->ops    = &rose_proto_ops;
        sk->sk_protocol = protocol;
 
-       init_timer(&rose->timer);
-       init_timer(&rose->idletimer);
+       timer_setup(&rose->timer, NULL, 0);
+       timer_setup(&rose->idletimer, NULL, 0);
 
        rose->t1   = msecs_to_jiffies(sysctl_rose_call_request_timeout);
        rose->t2   = msecs_to_jiffies(sysctl_rose_reset_request_timeout);
        sk->sk_state    = TCP_ESTABLISHED;
        sock_copy_flags(sk, osk);
 
-       init_timer(&rose->timer);
-       init_timer(&rose->idletimer);
+       timer_setup(&rose->timer, NULL, 0);
+       timer_setup(&rose->idletimer, NULL, 0);
 
        orose           = rose_sk(osk);
        rose->t1        = orose->t1;
 
 #include <linux/interrupt.h>
 #include <net/rose.h>
 
-static void rose_ftimer_expiry(unsigned long);
-static void rose_t0timer_expiry(unsigned long);
+static void rose_ftimer_expiry(struct timer_list *);
+static void rose_t0timer_expiry(struct timer_list *);
 
 static void rose_transmit_restart_confirmation(struct rose_neigh *neigh);
 static void rose_transmit_restart_request(struct rose_neigh *neigh);
 {
        del_timer(&neigh->ftimer);
 
-       neigh->ftimer.data     = (unsigned long)neigh;
-       neigh->ftimer.function = &rose_ftimer_expiry;
+       neigh->ftimer.function = (TIMER_FUNC_TYPE)rose_ftimer_expiry;
        neigh->ftimer.expires  =
                jiffies + msecs_to_jiffies(sysctl_rose_link_fail_timeout);
 
 {
        del_timer(&neigh->t0timer);
 
-       neigh->t0timer.data     = (unsigned long)neigh;
-       neigh->t0timer.function = &rose_t0timer_expiry;
+       neigh->t0timer.function = (TIMER_FUNC_TYPE)rose_t0timer_expiry;
        neigh->t0timer.expires  =
                jiffies + msecs_to_jiffies(sysctl_rose_restart_request_timeout);
 
        return timer_pending(&neigh->t0timer);
 }
 
-static void rose_ftimer_expiry(unsigned long param)
+static void rose_ftimer_expiry(struct timer_list *t)
 {
 }
 
-static void rose_t0timer_expiry(unsigned long param)
+static void rose_t0timer_expiry(struct timer_list *t)
 {
-       struct rose_neigh *neigh = (struct rose_neigh *)param;
+       struct rose_neigh *neigh = from_timer(neigh, t, t0timer);
 
        rose_transmit_restart_request(neigh);
 
 
 static struct timer_list loopback_timer;
 
 static void rose_set_loopback_timer(void);
+static void rose_loopback_timer(struct timer_list *unused);
 
 void rose_loopback_init(void)
 {
        skb_queue_head_init(&loopback_queue);
 
-       init_timer(&loopback_timer);
+       timer_setup(&loopback_timer, rose_loopback_timer, 0);
 }
 
 static int rose_loopback_running(void)
        return 1;
 }
 
-static void rose_loopback_timer(unsigned long);
 
 static void rose_set_loopback_timer(void)
 {
        del_timer(&loopback_timer);
 
-       loopback_timer.data     = 0;
-       loopback_timer.function = &rose_loopback_timer;
        loopback_timer.expires  = jiffies + 10;
-
        add_timer(&loopback_timer);
 }
 
-static void rose_loopback_timer(unsigned long param)
+static void rose_loopback_timer(struct timer_list *unused)
 {
        struct sk_buff *skb;
        struct net_device *dev;
 
 
                skb_queue_head_init(&rose_neigh->queue);
 
-               init_timer(&rose_neigh->ftimer);
-               init_timer(&rose_neigh->t0timer);
+               timer_setup(&rose_neigh->ftimer, NULL, 0);
+               timer_setup(&rose_neigh->t0timer, NULL, 0);
 
                if (rose_route->ndigis != 0) {
                        rose_neigh->digipeat =
 
        skb_queue_head_init(&sn->queue);
 
-       init_timer(&sn->ftimer);
-       init_timer(&sn->t0timer);
+       timer_setup(&sn->ftimer, NULL, 0);
+       timer_setup(&sn->t0timer, NULL, 0);
 
        spin_lock_bh(&rose_neigh_list_lock);
        sn->next = rose_neigh_list;
 
 #include <net/rose.h>
 
 static void rose_heartbeat_expiry(unsigned long);
-static void rose_timer_expiry(unsigned long);
-static void rose_idletimer_expiry(unsigned long);
+static void rose_timer_expiry(struct timer_list *);
+static void rose_idletimer_expiry(struct timer_list *);
 
 void rose_start_heartbeat(struct sock *sk)
 {
 
        del_timer(&rose->timer);
 
-       rose->timer.data     = (unsigned long)sk;
-       rose->timer.function = &rose_timer_expiry;
+       rose->timer.function = (TIMER_FUNC_TYPE)rose_timer_expiry;
        rose->timer.expires  = jiffies + rose->t1;
 
        add_timer(&rose->timer);
 
        del_timer(&rose->timer);
 
-       rose->timer.data     = (unsigned long)sk;
-       rose->timer.function = &rose_timer_expiry;
+       rose->timer.function = (TIMER_FUNC_TYPE)rose_timer_expiry;
        rose->timer.expires  = jiffies + rose->t2;
 
        add_timer(&rose->timer);
 
        del_timer(&rose->timer);
 
-       rose->timer.data     = (unsigned long)sk;
-       rose->timer.function = &rose_timer_expiry;
+       rose->timer.function = (TIMER_FUNC_TYPE)rose_timer_expiry;
        rose->timer.expires  = jiffies + rose->t3;
 
        add_timer(&rose->timer);
 
        del_timer(&rose->timer);
 
-       rose->timer.data     = (unsigned long)sk;
-       rose->timer.function = &rose_timer_expiry;
+       rose->timer.function = (TIMER_FUNC_TYPE)rose_timer_expiry;
        rose->timer.expires  = jiffies + rose->hb;
 
        add_timer(&rose->timer);
        del_timer(&rose->idletimer);
 
        if (rose->idle > 0) {
-               rose->idletimer.data     = (unsigned long)sk;
-               rose->idletimer.function = &rose_idletimer_expiry;
+               rose->idletimer.function = (TIMER_FUNC_TYPE)rose_idletimer_expiry;
                rose->idletimer.expires  = jiffies + rose->idle;
 
                add_timer(&rose->idletimer);
        bh_unlock_sock(sk);
 }
 
-static void rose_timer_expiry(unsigned long param)
+static void rose_timer_expiry(struct timer_list *t)
 {
-       struct sock *sk = (struct sock *)param;
-       struct rose_sock *rose = rose_sk(sk);
+       struct rose_sock *rose = from_timer(rose, t, timer);
+       struct sock *sk = &rose->sock;
 
        bh_lock_sock(sk);
        switch (rose->state) {
        bh_unlock_sock(sk);
 }
 
-static void rose_idletimer_expiry(unsigned long param)
+static void rose_idletimer_expiry(struct timer_list *t)
 {
-       struct sock *sk = (struct sock *)param;
+       struct rose_sock *rose = from_timer(rose, t, idletimer);
+       struct sock *sk = &rose->sock;
 
        bh_lock_sock(sk);
        rose_clear_queues(sk);