Bart Dorsey wrote:
> I constantly get this message on the console while using a Madge Smart
> 16/4 PCI Mk2 (Abyss) token ring card.
> 
> kernel: Warning: kfree_skb on hard IRQ d08cfea9

The attached patch, against 2.4.1-pre10, should fix things.  tms380tr,
the base module that abyss driver uses, needed to be updated to use
special IRQ versions of the dev_kfree_skb function.

Linus (and others), the patch also adds a missing dev->last_rx
assignment (which records the time of last packet reception).

-- 
Jeff Garzik       | "You see, in this world there's two kinds of
Building 1024     |  people, my friend: Those with loaded guns
MandrakeSoft      |  and those who dig. You dig."  --Blondie
Index: linux_2_4/drivers/net/tokenring/tms380tr.c
diff -u linux_2_4/drivers/net/tokenring/tms380tr.c:1.1.1.3 
linux_2_4/drivers/net/tokenring/tms380tr.c:1.1.1.3.76.2
--- linux_2_4/drivers/net/tokenring/tms380tr.c:1.1.1.3  Sun Oct 22 14:56:23 2000
+++ linux_2_4/drivers/net/tokenring/tms380tr.c  Tue Jan 23 07:19:16 2001
@@ -1977,7 +1977,7 @@
 
                printk(KERN_INFO "Cancel tx (%08lXh).\n", (unsigned long)tpl);
 
-               dev_kfree_skb(tpl->Skb);
+               dev_kfree_skb_any(tpl->Skb);
        }
 
        for(;;)
@@ -1986,7 +1986,7 @@
                if(skb == NULL)
                        break;
                tp->QueueSkb++;
-               dev_kfree_skb(skb);
+               dev_kfree_skb_any(skb);
        }
 
        return;
@@ -2053,7 +2053,7 @@
                }
 
                tp->MacStat.tx_packets++;
-               dev_kfree_skb(tpl->Skb);
+               dev_kfree_skb_irq(tpl->Skb);
                tpl->BusyFlag = 0;      /* "free" TPL */
        }
 
@@ -2127,7 +2127,7 @@
                                printk(KERN_INFO "%s: Received my own frame\n",
                                        dev->name);
                                if(rpl->Skb != NULL)
-                                       dev_kfree_skb(rpl->Skb);
+                                       dev_kfree_skb_irq(rpl->Skb);
                        }
                        else
 #endif
@@ -2171,13 +2171,14 @@
                                        skb_trim(skb,Length);
                                        skb->protocol = tr_type_trans(skb,dev);
                                        netif_rx(skb);
+                                       dev->last_rx = jiffies;
                                }
                        }
                }
                else    /* Invalid frame */
                {
                        if(rpl->Skb != NULL)
-                               dev_kfree_skb(rpl->Skb);
+                               dev_kfree_skb_irq(rpl->Skb);
 
                        /* Skip list. */
                        if(rpl->Status & RX_START_FRAME)

Reply via email to