spin_lock_init(&vp->lock);
 
+       setup_timer(&vp->timer, corkscrew_timer, (unsigned long) dev);
+
        /* Read the station address from the EEPROM. */
        EL3WINDOW(0);
        for (i = 0; i < 0x18; i++) {
 {
        int ioaddr = dev->base_addr;
        struct corkscrew_private *vp = netdev_priv(dev);
+       bool armtimer = false;
        __u32 config;
        int i;
 
                if (corkscrew_debug > 1)
                        pr_debug("%s: Initial media type %s.\n",
                               dev->name, media_tbl[dev->if_port].name);
-
-               init_timer(&vp->timer);
-               vp->timer.expires = jiffies + media_tbl[dev->if_port].wait;
-               vp->timer.data = (unsigned long) dev;
-               vp->timer.function = corkscrew_timer;   /* timer handler */
-               add_timer(&vp->timer);
+               armtimer = true;
        } else
                dev->if_port = vp->default_media;
 
                return -EAGAIN;
        }
 
+       if (armtimer)
+               mod_timer(&vp->timer, jiffies + media_tbl[dev->if_port].wait);
+
        if (corkscrew_debug > 1) {
                EL3WINDOW(4);
                pr_debug("%s: corkscrew_open() irq %d media status %4.4x.\n",
                        dev->name, rx_nocopy, rx_copy, queued_packet);
        }
 
-       del_timer(&vp->timer);
+       del_timer_sync(&vp->timer);
 
        /* Turn off statistics ASAP.  We update lp->stats below. */
        outw(StatsDisable, ioaddr + EL3_CMD);