--- tlan.c.0    Thu Feb 10 08:06:44 2000
+++ tlan.c      Thu Feb 10 08:04:44 2000
@@ -89,16 +89,12 @@
static int             duplex = 0;
static int             speed = 0;

-#ifdef MODULE
-
MODULE_PARM(aui, "i");
MODULE_PARM(duplex, "i");
MODULE_PARM(speed, "i");
MODULE_PARM(debug, "i");
EXPORT_NO_SYMBOLS;

-#endif
-
/* Turn on debugging. See linux/Documentation/networking/tlan.txt for details */
static  int            debug = 0;

@@ -645,9 +641,7 @@
               return -EAGAIN;
       }

-       dev->tbusy = 0;
-       dev->interrupt = 0;
-       dev->start = 1;
+       netif_start_queue(dev);

       /* NOTE: It might not be necessary to read the stats before a
                        reset if you don't care what the values are.
@@ -696,7 +690,10 @@

       if ( ! priv->phyOnline ) {
               TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT:  %s PHY is not ready\n", dev->name );
-               dev_kfree_skb( skb );
+               if (in_irq())
+                       dev_kfree_skb_irq( skb );
+               else
+                       dev_kfree_skb( skb );
               return 0;
       }

@@ -704,7 +701,7 @@

       if ( tail_list->cStat != TLAN_CSTAT_UNUSED ) {
               TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT:  %s is busy (Head=%d Tail=%d)\n", dev->name, priv->txHead, priv->txTail );
-               dev->tbusy = 1;
+               netif_stop_queue(dev);
               priv->txBusyCount++;
               return 1;
       }
@@ -754,7 +751,10 @@
       CIRC_INC( priv->txTail, TLAN_NUM_TX_LISTS );

       if ( bbuf ) {
-               dev_kfree_skb( skb );
+               if (in_irq())
+                       dev_kfree_skb_irq( skb );
+               else
+                       dev_kfree_skb( skb );
       }

       dev->trans_start = jiffies;
@@ -799,10 +799,6 @@
       priv = (TLanPrivateInfo *) dev->priv;

       spin_lock(&priv->lock);
-       if ( dev->interrupt ) {
-               printk( "TLAN:   Re-entering interrupt handler for %s: %ld.\n" , dev->name, dev->interrupt );
-       }
-       dev->interrupt++;

       host_int = inw( dev->base_addr + TLAN_HOST_INT );
       outw( host_int, dev->base_addr + TLAN_HOST_INT );
@@ -816,7 +812,6 @@
               outl( host_cmd, dev->base_addr + TLAN_HOST_CMD );
       }

-       dev->interrupt--;
       spin_unlock(&priv->lock);

} /* TLan_HandleInterrupts */
@@ -843,9 +838,7 @@
{
       TLanPrivateInfo *priv = (TLanPrivateInfo *) dev->priv;

-       dev->start = 0;
-       dev->tbusy = 1;
-
+       netif_stop_queue(dev);
       TLan_ReadAndClearStats( dev, TLAN_RECORD );
       outl( TLAN_HC_AD_RST, dev->base_addr + TLAN_HOST_CMD );
       if ( priv->timer.function != NULL )
@@ -1045,7 +1038,10 @@
       head_list = priv->txList + priv->txHead;

       if ( ! bbuf ) {
-               dev_kfree_skb( (struct sk_buff *) head_list->buffer[9].address );
+               if (in_irq())
+                       dev_kfree_skb_irq( (struct sk_buff *) head_list->buffer[9].address );
+               else
+                       dev_kfree_skb( (struct sk_buff *) head_list->buffer[9].address );
               head_list->buffer[9].address = 0;
       }

@@ -1058,7 +1054,7 @@
       priv->stats.tx_bytes += head_list->frameSize;

       head_list->cStat = TLAN_CSTAT_UNUSED;
-       dev->tbusy = 0;
+       netif_start_queue(dev);
       CIRC_INC( priv->txHead, TLAN_NUM_TX_LISTS );
       if ( eoc ) {
               TLAN_DBG( TLAN_DEBUG_TX, "TRANSMIT:  Handling TX EOC (Head=%d Tail=%d)\n", priv->txHead, priv->txTail );
@@ -1367,7 +1363,7 @@
               TLan_FreeLists( dev );
               TLan_ResetLists( dev );
               TLan_ResetAdapter( dev );
-               dev->tbusy = 0;
+               netif_start_queue(dev);
               ack = 0;
       } else {
               TLAN_DBG( TLAN_DEBUG_GNRL, "%s: Status Check\n", dev->name );
@@ -2377,9 +2373,7 @@
       outw(TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR);
       sio = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO;

-       if ( dev->interrupt == 0 )
-               spin_lock_irqsave(&priv->lock, flags);
-       dev->interrupt++;
+       spin_lock_irqsave(&priv->lock, flags);

       TLan_MiiSync(dev->base_addr);

@@ -2426,9 +2420,7 @@

       *val = tmp;

-       dev->interrupt--;
-       if ( dev->interrupt == 0 )
-               spin_unlock_irqrestore(&priv->lock, flags);
+       spin_unlock_irqrestore(&priv->lock, flags);

       return err;

@@ -2546,9 +2538,7 @@
       outw(TLAN_NET_SIO, dev->base_addr + TLAN_DIO_ADR);
       sio = dev->base_addr + TLAN_DIO_DATA + TLAN_NET_SIO;

-       if ( dev->interrupt == 0 )
-               spin_lock_irqsave(&priv->lock, flags);
-       dev->interrupt++;
+       spin_lock_irqsave(&priv->lock, flags);

       TLan_MiiSync( dev->base_addr );

@@ -2570,9 +2560,7 @@
       if ( minten )
               TLan_SetBit( TLAN_NET_SIO_MINTEN, sio );

-       dev->interrupt--;
-       if ( dev->interrupt == 0 )
-               spin_unlock_irqrestore(&priv->lock, flags);
+       spin_unlock_irqrestore(&priv->lock, flags);

} /* TLan_MiiWriteReg */

@@ -2774,9 +2762,7 @@
       unsigned long flags = 0;
       int ret=0;

-       if ( dev->interrupt == 0 )
-               spin_lock_irqsave(&priv->lock, flags);
-       dev->interrupt++;
+       spin_lock_irqsave(&priv->lock, flags);

       TLan_EeSendStart( dev->base_addr );
       err = TLan_EeSendByte( dev->base_addr, 0xA0, TLAN_EEPROM_ACK );
@@ -2800,9 +2786,7 @@
       }
       TLan_EeReceiveByte( dev->base_addr, data, TLAN_EEPROM_STOP );
fail:
-       dev->interrupt--;
-       if ( dev->interrupt == 0 )
-               spin_unlock_irqrestore(&priv->lock, flags);
+       spin_unlock_irqrestore(&priv->lock, flags);

       return ret;