hsr = netdev_priv(hsr_dev);
 
-       del_timer(&hsr->announce_timer);
+       del_timer_sync(&hsr->prune_timer);
+       del_timer_sync(&hsr->announce_timer);
        unregister_hsr_master(hsr);    /* calls list_del_rcu on hsr */
        restore_slaves(hsr_dev);
        call_rcu(&hsr->rcu_head, reclaim_hsr_dev);   /* reclaim hsr */
        hsr->announce_timer.function = hsr_announce;
        hsr->announce_timer.data = (unsigned long) hsr;
 
+       init_timer(&hsr->prune_timer);
+       hsr->prune_timer.function = hsr_prune_nodes;
+       hsr->prune_timer.data = (unsigned long) hsr;
+
        ether_addr_copy(hsr->sup_multicast_addr, def_multicast_addr);
        hsr->sup_multicast_addr[ETH_ALEN - 1] = multicast_spec;
 
        if (res)
                goto fail;
 
+       hsr->prune_timer.expires = jiffies + msecs_to_jiffies(PRUNE_PERIOD);
+       add_timer(&hsr->prune_timer);
+
        register_hsr_master(hsr);
 
        return 0;
 
 /* Remove stale sequence_nr records. Called by timer every
  * HSR_LIFE_CHECK_INTERVAL (two seconds or so).
  */
-void hsr_prune_nodes(struct hsr_priv *hsr)
+void hsr_prune_nodes(unsigned long data)
 {
+       struct hsr_priv *hsr;
        struct hsr_node *node;
        unsigned long timestamp;
        unsigned long time_a, time_b;
 
+       hsr = (struct hsr_priv *) data;
+
        rcu_read_lock();
        list_for_each_entry_rcu(node, &hsr->node_db, mac_list) {
                /* Shorthand */
 
 int hsr_register_frame_out(struct hsr_node *node, enum hsr_dev_idx dev_idx,
                           struct sk_buff *skb);
 
-void hsr_prune_nodes(struct hsr_priv *hsr);
+void hsr_prune_nodes(unsigned long data);
 
 int hsr_create_self_node(struct list_head *self_node_db,
                         unsigned char addr_a[ETH_ALEN],
 
 }
 
 
-static struct timer_list prune_timer;
-
-static void prune_nodes_all(unsigned long data)
-{
-       struct hsr_priv *hsr;
-
-       rcu_read_lock();
-       list_for_each_entry_rcu(hsr, &hsr_list, hsr_list)
-               hsr_prune_nodes(hsr);
-       rcu_read_unlock();
-
-       prune_timer.expires = jiffies + msecs_to_jiffies(PRUNE_PERIOD);
-       add_timer(&prune_timer);
-}
-
-
 static struct notifier_block hsr_nb = {
        .notifier_call = hsr_netdev_notify,     /* Slave event notifications */
 };
 
        BUILD_BUG_ON(sizeof(struct hsr_tag) != HSR_HLEN);
 
-       init_timer(&prune_timer);
-       prune_timer.function = prune_nodes_all;
-       prune_timer.data = 0;
-       prune_timer.expires = jiffies + msecs_to_jiffies(PRUNE_PERIOD);
-       add_timer(&prune_timer);
-
        register_netdevice_notifier(&hsr_nb);
-
        res = hsr_netlink_init();
 
        return res;
 static void __exit hsr_exit(void)
 {
        unregister_netdevice_notifier(&hsr_nb);
-       del_timer_sync(&prune_timer);
        hsr_netlink_exit();
 }
 
 
        struct list_head        node_db;        /* Other HSR nodes */
        struct list_head        self_node_db;   /* MACs of slaves */
        struct timer_list       announce_timer; /* Supervision frame dispatch */
+       struct timer_list       prune_timer;
        int announce_count;
        u16 sequence_nr;
        spinlock_t seqnr_lock;                  /* locking for sequence_nr */