diff -Nur linux-2.6.17-gentoo-r4_orig/drivers/net/pcmcia/xirc2ps_cs.c linux-2.6.17-gentoo-r4/drivers/net/pcmcia/xirc2ps_cs.c --- linux-2.6.17-gentoo-r4_orig/drivers/net/pcmcia/xirc2ps_cs.c 2006-07-28 18:47:14.000000000 +0200 +++ linux-2.6.17-gentoo-r4/drivers/net/pcmcia/xirc2ps_cs.c 2006-07-29 00:03:36.000000000 +0200 @@ -345,6 +345,7 @@ void __iomem *dingo_ccr; /* only used for CEM56 cards */ unsigned last_ptr_value; /* last packets transmitted value */ const char *manf_str; + struct work_struct tx_timeout_task; } local_info_t; /**************** @@ -1339,9 +1340,8 @@ } /* xirc2ps_interrupt */ /*====================================================================*/ - static void -do_tx_timeout(struct net_device *dev) +xirc2ps_tx_timeout_task(struct net_device *dev) { local_info_t *lp = netdev_priv(dev); printk(KERN_NOTICE "%s: transmit timed out\n", dev->name); @@ -1351,6 +1351,13 @@ dev->trans_start = jiffies; netif_wake_queue(dev); } +static void +do_tx_timeout(struct net_device *dev) +{ + local_info_t *lp = netdev_priv(dev); + schedule_work(&lp->tx_timeout_task); +} + static int do_start_xmit(struct sk_buff *skb, struct net_device *dev) @@ -1528,6 +1535,9 @@ if (!pcmcia_dev_present(link)) return -ENODEV; + INIT_WORK(&lp->tx_timeout_task, + (void (*)(void *))xirc2ps_tx_timeout_task, dev); + /* okay */ link->open++;