#ifdef __KERNEL__
 #include <linux/interrupt.h>
+#include <linux/workqueue.h>
 
 /*
  * RECON_THRESHOLD is the maximum number of RECON messages to receive
 
        struct net_device *dev;
        int reply_status;
-       struct tasklet_struct reply_tasklet;
+       struct work_struct reply_work;
 
        /*
         * Buffer management: an ARCnet card has 4 x 512-byte buffers, each of
 
 #include <linux/errqueue.h>
 
 #include <linux/leds.h>
+#include <linux/workqueue.h>
 
 #include "arcdevice.h"
 #include "com9026.h"
        rtnl_unlock();
 }
 
-static void arcnet_reply_tasklet(struct tasklet_struct *t)
+static void arcnet_reply_work(struct work_struct *t)
 {
-       struct arcnet_local *lp = from_tasklet(lp, t, reply_tasklet);
+       struct arcnet_local *lp = from_work(lp, t, reply_work);
 
        struct sk_buff *ackskb, *skb;
        struct sock_exterr_skb *serr;
                arc_cont(D_PROTO, "\n");
        }
 
-       tasklet_setup(&lp->reply_tasklet, arcnet_reply_tasklet);
+       INIT_WORK(&lp->reply_work, arcnet_reply_work);
 
        arc_printk(D_INIT, dev, "arcnet_open: resetting card.\n");
 
        netif_stop_queue(dev);
        netif_carrier_off(dev);
 
-       tasklet_kill(&lp->reply_tasklet);
+       cancel_work_sync(&lp->reply_work);
 
        /* flush TX and disable RX */
        lp->hw.intmask(dev, 0);
                                                ->ack_tx(dev, ackstatus);
                                }
                                lp->reply_status = ackstatus;
-                               tasklet_hi_schedule(&lp->reply_tasklet);
+                               queue_work(system_bh_highpri_wq, &lp->reply_work);
                        }
                        if (lp->cur_tx != -1)
                                release_arcbuf(dev, lp->cur_tx);