--- 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; .