]> www.pilppa.org Git - linux-2.6-omap-h63xx.git/commitdiff
[netdrvr 8139too] use cancel_rearming_delayed_work() to cancel thread
authorJeff Garzik <jgarzik@pobox.com>
Sat, 5 Nov 2005 03:36:28 +0000 (22:36 -0500)
committerJeff Garzik <jgarzik@pobox.com>
Sat, 5 Nov 2005 03:36:28 +0000 (22:36 -0500)
Noted by Herbert Xu.

drivers/net/8139too.c

index 9de58e249bc32e70739537a7fe3504d8893998bf..bcea9d41c32cd8153b86f654b5491e221d8983f4 100644 (file)
@@ -586,7 +586,8 @@ struct rtl8139_private {
        dma_addr_t tx_bufs_dma;
        signed char phys[4];            /* MII device addresses. */
        char twistie, twist_row, twist_col;     /* Twister tune state. */
-       unsigned int default_port:4;    /* Last dev->if_port value. */
+       unsigned int default_port : 4;  /* Last dev->if_port value. */
+       unsigned int have_thread : 1;
        spinlock_t lock;
        spinlock_t rx_lock;
        chip_t chipset;
@@ -594,7 +595,6 @@ struct rtl8139_private {
        struct rtl_extra_stats xstats;
 
        struct work_struct thread;
-       long time_to_die;       /* -1 no thr, 0 thr active, 1 thr cancel */
 
        struct mii_if_info mii;
        unsigned int regs_len;
@@ -1599,40 +1599,33 @@ static void rtl8139_thread (void *_data)
        struct net_device *dev = _data;
        struct rtl8139_private *tp = netdev_priv(dev);
 
-       if ((tp->time_to_die == 0) &&
-           (rtnl_lock_interruptible() == 0)) {
+       if (rtnl_lock_interruptible() == 0) {
                rtl8139_thread_iter (dev, tp, tp->mmio_addr);
                rtnl_unlock ();
        }
 
-       if (tp->time_to_die == 0)
-               schedule_delayed_work(&tp->thread, next_tick);
+       schedule_delayed_work(&tp->thread, next_tick);
 }
 
 static void rtl8139_start_thread(struct rtl8139_private *tp)
 {
        tp->twistie = 0;
-       tp->time_to_die = -1;
        if (tp->chipset == CH_8139_K)
                tp->twistie = 1;
        else if (tp->drv_flags & HAS_LNK_CHNG)
                return;
 
-       tp->time_to_die = 0;
+       tp->have_thread = 1;
 
        schedule_delayed_work(&tp->thread, next_tick);
 }
 
 static void rtl8139_stop_thread(struct rtl8139_private *tp)
 {
-       if (tp->time_to_die < 0)
-               return;
-
-       tp->time_to_die = 1;
-       wmb();
-
-       if (cancel_delayed_work(&tp->thread) == 0)
-               flush_scheduled_work();
+       if (tp->have_thread) {
+               cancel_rearming_delayed_work(&tp->thread);
+               tp->have_thread = 0;
+       }
 }
 
 static inline void rtl8139_tx_clear (struct rtl8139_private *tp)