diff -u -r linux/drivers/net/tokenring/tms380tr.c linux-2.4.17-llc/drivers/net/tokenring/tms380tr.c
--- linux/drivers/net/tokenring/tms380tr.c	Fri Sep 14 01:04:43 2001
+++ linux-2.4.17-llc/drivers/net/tokenring/tms380tr.c	Sun Jan 13 00:00:47 2002
@@ -253,6 +253,9 @@
 	struct net_local *tp = (struct net_local *)dev->priv;
 	int err;
 	
+	/* init the spinlock */
+	tp->lock = (spinlock_t) SPIN_LOCK_UNLOCKED;
+
 	/* Reset the hardware here. Don't forget to set the station address. */
 
 	if(dev->dma > 0) 
@@ -630,6 +633,7 @@
 	TPL *tpl;
 	short length;
 	unsigned char *buf;
+	unsigned long flags;
 	struct sk_buff *skb;
 	int i;
 	dma_addr_t dmabuf, newbuf;
@@ -641,18 +645,22 @@
 		 * NOTE: We *must* always leave one unused TPL in the chain, 
 		 * because otherwise the adapter might send frames twice.
 		 */
+		spin_lock_irqsave(&(tp->lock), flags);
 		if(tp->TplFree->NextTPLPtr->BusyFlag)	/* No free TPL */
 		{
 			if (tms380tr_debug > 0)
 				printk(KERN_INFO "%s: No free TPL\n", dev->name);
+				spin_unlock_irqrestore(&(tp->lock), flags);
 			return;
 		}
 
 		/* Send first buffer from queue */
 		skb = skb_dequeue(&tp->SendSkbQueue);
 		if(skb == NULL)
+		{
+			spin_unlock_irqrestore(&(tp->lock), flags);
 			return;
-
+		}
 		tp->QueueSkb++;
 		dmabuf = 0;
 
@@ -700,6 +708,7 @@
 
 		/* Let adapter send the frame. */
 		tms380tr_exec_sifcmd(dev, CMD_TX_VALID);
+		spin_unlock_irqrestore(&(tp->lock), flags);
 	}
 
 	return;
diff -u -r linux/drivers/net/tokenring/tms380tr.h linux-2.4.17-llc/drivers/net/tokenring/tms380tr.h
--- linux/drivers/net/tokenring/tms380tr.h	Fri May 25 18:58:07 2001
+++ linux-2.4.17-llc/drivers/net/tokenring/tms380tr.h	Sun Jan 13 09:09:11 2002
@@ -1135,6 +1135,7 @@
 	unsigned short (*sifreadw)(struct net_device *, unsigned short);
 	void (*sifwritew)(struct net_device *, unsigned short, unsigned short);
 
+	spinlock_t lock;                /* SMP protection */
 	void *tmspriv;
 } NET_LOCAL;
 
