cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

interrupt.c (25455B)


      1/*
      2	drivers/net/ethernet/dec/tulip/interrupt.c
      3
      4	Copyright 2000,2001  The Linux Kernel Team
      5	Written/copyright 1994-2001 by Donald Becker.
      6
      7	This software may be used and distributed according to the terms
      8	of the GNU General Public License, incorporated herein by reference.
      9
     10        Please submit bugs to http://bugzilla.kernel.org/ .
     11*/
     12
     13#include <linux/pci.h>
     14#include "tulip.h"
     15#include <linux/etherdevice.h>
     16
     17int tulip_rx_copybreak;
     18unsigned int tulip_max_interrupt_work;
     19
     20#ifdef CONFIG_TULIP_NAPI_HW_MITIGATION
     21#define MIT_SIZE 15
     22#define MIT_TABLE 15 /* We use 0 or max */
     23
     24static unsigned int mit_table[MIT_SIZE+1] =
     25{
     26        /*  CRS11 21143 hardware Mitigation Control Interrupt
     27            We use only RX mitigation we other techniques for
     28            TX intr. mitigation.
     29
     30           31    Cycle Size (timer control)
     31           30:27 TX timer in 16 * Cycle size
     32           26:24 TX No pkts before Int.
     33           23:20 RX timer in Cycle size
     34           19:17 RX No pkts before Int.
     35           16       Continues Mode (CM)
     36        */
     37
     38        0x0,             /* IM disabled */
     39        0x80150000,      /* RX time = 1, RX pkts = 2, CM = 1 */
     40        0x80150000,
     41        0x80270000,
     42        0x80370000,
     43        0x80490000,
     44        0x80590000,
     45        0x80690000,
     46        0x807B0000,
     47        0x808B0000,
     48        0x809D0000,
     49        0x80AD0000,
     50        0x80BD0000,
     51        0x80CF0000,
     52        0x80DF0000,
     53//       0x80FF0000      /* RX time = 16, RX pkts = 7, CM = 1 */
     54        0x80F10000      /* RX time = 16, RX pkts = 0, CM = 1 */
     55};
     56#endif
     57
     58
     59int tulip_refill_rx(struct net_device *dev)
     60{
     61	struct tulip_private *tp = netdev_priv(dev);
     62	int entry;
     63	int refilled = 0;
     64
     65	/* Refill the Rx ring buffers. */
     66	for (; tp->cur_rx - tp->dirty_rx > 0; tp->dirty_rx++) {
     67		entry = tp->dirty_rx % RX_RING_SIZE;
     68		if (tp->rx_buffers[entry].skb == NULL) {
     69			struct sk_buff *skb;
     70			dma_addr_t mapping;
     71
     72			skb = tp->rx_buffers[entry].skb =
     73				netdev_alloc_skb(dev, PKT_BUF_SZ);
     74			if (skb == NULL)
     75				break;
     76
     77			mapping = dma_map_single(&tp->pdev->dev, skb->data,
     78						 PKT_BUF_SZ, DMA_FROM_DEVICE);
     79			if (dma_mapping_error(&tp->pdev->dev, mapping)) {
     80				dev_kfree_skb(skb);
     81				tp->rx_buffers[entry].skb = NULL;
     82				break;
     83			}
     84
     85			tp->rx_buffers[entry].mapping = mapping;
     86
     87			tp->rx_ring[entry].buffer1 = cpu_to_le32(mapping);
     88			refilled++;
     89		}
     90		tp->rx_ring[entry].status = cpu_to_le32(DescOwned);
     91	}
     92	if(tp->chip_id == LC82C168) {
     93		if(((ioread32(tp->base_addr + CSR5)>>17)&0x07) == 4) {
     94			/* Rx stopped due to out of buffers,
     95			 * restart it
     96			 */
     97			iowrite32(0x01, tp->base_addr + CSR2);
     98		}
     99	}
    100	return refilled;
    101}
    102
    103#ifdef CONFIG_TULIP_NAPI
    104
    105void oom_timer(struct timer_list *t)
    106{
    107	struct tulip_private *tp = from_timer(tp, t, oom_timer);
    108
    109	napi_schedule(&tp->napi);
    110}
    111
    112int tulip_poll(struct napi_struct *napi, int budget)
    113{
    114	struct tulip_private *tp = container_of(napi, struct tulip_private, napi);
    115	struct net_device *dev = tp->dev;
    116	int entry = tp->cur_rx % RX_RING_SIZE;
    117	int work_done = 0;
    118#ifdef CONFIG_TULIP_NAPI_HW_MITIGATION
    119	int received = 0;
    120#endif
    121
    122#ifdef CONFIG_TULIP_NAPI_HW_MITIGATION
    123
    124/* that one buffer is needed for mit activation; or might be a
    125   bug in the ring buffer code; check later -- JHS*/
    126
    127        if (budget >=RX_RING_SIZE) budget--;
    128#endif
    129
    130	if (tulip_debug > 4)
    131		netdev_dbg(dev, " In tulip_rx(), entry %d %08x\n",
    132			   entry, tp->rx_ring[entry].status);
    133
    134       do {
    135		if (ioread32(tp->base_addr + CSR5) == 0xffffffff) {
    136			netdev_dbg(dev, " In tulip_poll(), hardware disappeared\n");
    137			break;
    138		}
    139               /* Acknowledge current RX interrupt sources. */
    140               iowrite32((RxIntr | RxNoBuf), tp->base_addr + CSR5);
    141
    142
    143               /* If we own the next entry, it is a new packet. Send it up. */
    144               while ( ! (tp->rx_ring[entry].status & cpu_to_le32(DescOwned))) {
    145                       s32 status = le32_to_cpu(tp->rx_ring[entry].status);
    146		       short pkt_len;
    147
    148                       if (tp->dirty_rx + RX_RING_SIZE == tp->cur_rx)
    149                               break;
    150
    151		       if (tulip_debug > 5)
    152				netdev_dbg(dev, "In tulip_rx(), entry %d %08x\n",
    153					   entry, status);
    154
    155		       if (++work_done >= budget)
    156                               goto not_done;
    157
    158		       /*
    159			* Omit the four octet CRC from the length.
    160			* (May not be considered valid until we have
    161			* checked status for RxLengthOver2047 bits)
    162			*/
    163		       pkt_len = ((status >> 16) & 0x7ff) - 4;
    164
    165		       /*
    166			* Maximum pkt_len is 1518 (1514 + vlan header)
    167			* Anything higher than this is always invalid
    168			* regardless of RxLengthOver2047 bits
    169			*/
    170
    171		       if ((status & (RxLengthOver2047 |
    172				      RxDescCRCError |
    173				      RxDescCollisionSeen |
    174				      RxDescRunt |
    175				      RxDescDescErr |
    176				      RxWholePkt)) != RxWholePkt ||
    177			   pkt_len > 1518) {
    178			       if ((status & (RxLengthOver2047 |
    179					      RxWholePkt)) != RxWholePkt) {
    180                                /* Ingore earlier buffers. */
    181                                       if ((status & 0xffff) != 0x7fff) {
    182                                               if (tulip_debug > 1)
    183                                                       dev_warn(&dev->dev,
    184								"Oversized Ethernet frame spanned multiple buffers, status %08x!\n",
    185								status);
    186						dev->stats.rx_length_errors++;
    187					}
    188			       } else {
    189                                /* There was a fatal error. */
    190				       if (tulip_debug > 2)
    191						netdev_dbg(dev, "Receive error, Rx status %08x\n",
    192							   status);
    193					dev->stats.rx_errors++; /* end of a packet.*/
    194					if (pkt_len > 1518 ||
    195					    (status & RxDescRunt))
    196						dev->stats.rx_length_errors++;
    197
    198					if (status & 0x0004)
    199						dev->stats.rx_frame_errors++;
    200					if (status & 0x0002)
    201						dev->stats.rx_crc_errors++;
    202					if (status & 0x0001)
    203						dev->stats.rx_fifo_errors++;
    204                               }
    205                       } else {
    206                               struct sk_buff *skb;
    207
    208                               /* Check if the packet is long enough to accept without copying
    209                                  to a minimally-sized skbuff. */
    210                               if (pkt_len < tulip_rx_copybreak &&
    211                                   (skb = netdev_alloc_skb(dev, pkt_len + 2)) != NULL) {
    212                                       skb_reserve(skb, 2);    /* 16 byte align the IP header */
    213					dma_sync_single_for_cpu(&tp->pdev->dev,
    214								tp->rx_buffers[entry].mapping,
    215								pkt_len,
    216								DMA_FROM_DEVICE);
    217#if ! defined(__alpha__)
    218                                       skb_copy_to_linear_data(skb, tp->rx_buffers[entry].skb->data,
    219                                                        pkt_len);
    220                                       skb_put(skb, pkt_len);
    221#else
    222                                       skb_put_data(skb,
    223                                                    tp->rx_buffers[entry].skb->data,
    224                                                    pkt_len);
    225#endif
    226					dma_sync_single_for_device(&tp->pdev->dev,
    227								   tp->rx_buffers[entry].mapping,
    228								   pkt_len,
    229								   DMA_FROM_DEVICE);
    230                               } else {        /* Pass up the skb already on the Rx ring. */
    231                                       char *temp = skb_put(skb = tp->rx_buffers[entry].skb,
    232                                                            pkt_len);
    233
    234#ifndef final_version
    235                                       if (tp->rx_buffers[entry].mapping !=
    236                                           le32_to_cpu(tp->rx_ring[entry].buffer1)) {
    237                                               dev_err(&dev->dev,
    238						       "Internal fault: The skbuff addresses do not match in tulip_rx: %08x vs. %08llx %p / %p\n",
    239						       le32_to_cpu(tp->rx_ring[entry].buffer1),
    240						       (unsigned long long)tp->rx_buffers[entry].mapping,
    241						       skb->head, temp);
    242                                       }
    243#endif
    244
    245					dma_unmap_single(&tp->pdev->dev,
    246							 tp->rx_buffers[entry].mapping,
    247							 PKT_BUF_SZ,
    248							 DMA_FROM_DEVICE);
    249
    250                                       tp->rx_buffers[entry].skb = NULL;
    251                                       tp->rx_buffers[entry].mapping = 0;
    252                               }
    253                               skb->protocol = eth_type_trans(skb, dev);
    254
    255                               netif_receive_skb(skb);
    256
    257				dev->stats.rx_packets++;
    258				dev->stats.rx_bytes += pkt_len;
    259                       }
    260#ifdef CONFIG_TULIP_NAPI_HW_MITIGATION
    261		       received++;
    262#endif
    263
    264                       entry = (++tp->cur_rx) % RX_RING_SIZE;
    265                       if (tp->cur_rx - tp->dirty_rx > RX_RING_SIZE/4)
    266                               tulip_refill_rx(dev);
    267
    268                }
    269
    270               /* New ack strategy... irq does not ack Rx any longer
    271                  hopefully this helps */
    272
    273               /* Really bad things can happen here... If new packet arrives
    274                * and an irq arrives (tx or just due to occasionally unset
    275                * mask), it will be acked by irq handler, but new thread
    276                * is not scheduled. It is major hole in design.
    277                * No idea how to fix this if "playing with fire" will fail
    278                * tomorrow (night 011029). If it will not fail, we won
    279                * finally: amount of IO did not increase at all. */
    280       } while ((ioread32(tp->base_addr + CSR5) & RxIntr));
    281
    282 #ifdef CONFIG_TULIP_NAPI_HW_MITIGATION
    283
    284          /* We use this simplistic scheme for IM. It's proven by
    285             real life installations. We can have IM enabled
    286            continuesly but this would cause unnecessary latency.
    287            Unfortunely we can't use all the NET_RX_* feedback here.
    288            This would turn on IM for devices that is not contributing
    289            to backlog congestion with unnecessary latency.
    290
    291             We monitor the device RX-ring and have:
    292
    293             HW Interrupt Mitigation either ON or OFF.
    294
    295            ON:  More then 1 pkt received (per intr.) OR we are dropping
    296             OFF: Only 1 pkt received
    297
    298             Note. We only use min and max (0, 15) settings from mit_table */
    299
    300
    301          if( tp->flags &  HAS_INTR_MITIGATION) {
    302                 if( received > 1 ) {
    303                         if( ! tp->mit_on ) {
    304                                 tp->mit_on = 1;
    305                                 iowrite32(mit_table[MIT_TABLE], tp->base_addr + CSR11);
    306                         }
    307                  }
    308                 else {
    309                         if( tp->mit_on ) {
    310                                 tp->mit_on = 0;
    311                                 iowrite32(0, tp->base_addr + CSR11);
    312                         }
    313                  }
    314          }
    315
    316#endif /* CONFIG_TULIP_NAPI_HW_MITIGATION */
    317
    318         tulip_refill_rx(dev);
    319
    320         /* If RX ring is not full we are out of memory. */
    321         if (tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL)
    322		 goto oom;
    323
    324         /* Remove us from polling list and enable RX intr. */
    325
    326	napi_complete_done(napi, work_done);
    327	iowrite32(tulip_tbl[tp->chip_id].valid_intrs, tp->base_addr+CSR7);
    328
    329         /* The last op happens after poll completion. Which means the following:
    330          * 1. it can race with disabling irqs in irq handler
    331          * 2. it can race with dise/enabling irqs in other poll threads
    332          * 3. if an irq raised after beginning loop, it will be immediately
    333          *    triggered here.
    334          *
    335          * Summarizing: the logic results in some redundant irqs both
    336          * due to races in masking and due to too late acking of already
    337          * processed irqs. But it must not result in losing events.
    338          */
    339
    340         return work_done;
    341
    342 not_done:
    343         if (tp->cur_rx - tp->dirty_rx > RX_RING_SIZE/2 ||
    344             tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL)
    345                 tulip_refill_rx(dev);
    346
    347         if (tp->rx_buffers[tp->dirty_rx % RX_RING_SIZE].skb == NULL)
    348		 goto oom;
    349
    350         return work_done;
    351
    352 oom:    /* Executed with RX ints disabled */
    353
    354         /* Start timer, stop polling, but do not enable rx interrupts. */
    355         mod_timer(&tp->oom_timer, jiffies+1);
    356
    357         /* Think: timer_pending() was an explicit signature of bug.
    358          * Timer can be pending now but fired and completed
    359          * before we did napi_complete(). See? We would lose it. */
    360
    361         /* remove ourselves from the polling list */
    362         napi_complete_done(napi, work_done);
    363
    364         return work_done;
    365}
    366
    367#else /* CONFIG_TULIP_NAPI */
    368
    369static int tulip_rx(struct net_device *dev)
    370{
    371	struct tulip_private *tp = netdev_priv(dev);
    372	int entry = tp->cur_rx % RX_RING_SIZE;
    373	int rx_work_limit = tp->dirty_rx + RX_RING_SIZE - tp->cur_rx;
    374	int received = 0;
    375
    376	if (tulip_debug > 4)
    377		netdev_dbg(dev, "In tulip_rx(), entry %d %08x\n",
    378			   entry, tp->rx_ring[entry].status);
    379	/* If we own the next entry, it is a new packet. Send it up. */
    380	while ( ! (tp->rx_ring[entry].status & cpu_to_le32(DescOwned))) {
    381		s32 status = le32_to_cpu(tp->rx_ring[entry].status);
    382		short pkt_len;
    383
    384		if (tulip_debug > 5)
    385			netdev_dbg(dev, "In tulip_rx(), entry %d %08x\n",
    386				   entry, status);
    387		if (--rx_work_limit < 0)
    388			break;
    389
    390		/*
    391		  Omit the four octet CRC from the length.
    392		  (May not be considered valid until we have
    393		  checked status for RxLengthOver2047 bits)
    394		*/
    395		pkt_len = ((status >> 16) & 0x7ff) - 4;
    396		/*
    397		  Maximum pkt_len is 1518 (1514 + vlan header)
    398		  Anything higher than this is always invalid
    399		  regardless of RxLengthOver2047 bits
    400		*/
    401
    402		if ((status & (RxLengthOver2047 |
    403			       RxDescCRCError |
    404			       RxDescCollisionSeen |
    405			       RxDescRunt |
    406			       RxDescDescErr |
    407			       RxWholePkt))        != RxWholePkt ||
    408		    pkt_len > 1518) {
    409			if ((status & (RxLengthOver2047 |
    410			     RxWholePkt))         != RxWholePkt) {
    411				/* Ingore earlier buffers. */
    412				if ((status & 0xffff) != 0x7fff) {
    413					if (tulip_debug > 1)
    414						netdev_warn(dev,
    415							    "Oversized Ethernet frame spanned multiple buffers, status %08x!\n",
    416							    status);
    417					dev->stats.rx_length_errors++;
    418				}
    419			} else {
    420				/* There was a fatal error. */
    421				if (tulip_debug > 2)
    422					netdev_dbg(dev, "Receive error, Rx status %08x\n",
    423						   status);
    424				dev->stats.rx_errors++; /* end of a packet.*/
    425				if (pkt_len > 1518 ||
    426				    (status & RxDescRunt))
    427					dev->stats.rx_length_errors++;
    428				if (status & 0x0004)
    429					dev->stats.rx_frame_errors++;
    430				if (status & 0x0002)
    431					dev->stats.rx_crc_errors++;
    432				if (status & 0x0001)
    433					dev->stats.rx_fifo_errors++;
    434			}
    435		} else {
    436			struct sk_buff *skb;
    437
    438			/* Check if the packet is long enough to accept without copying
    439			   to a minimally-sized skbuff. */
    440			if (pkt_len < tulip_rx_copybreak &&
    441			    (skb = netdev_alloc_skb(dev, pkt_len + 2)) != NULL) {
    442				skb_reserve(skb, 2);	/* 16 byte align the IP header */
    443				dma_sync_single_for_cpu(&tp->pdev->dev,
    444							tp->rx_buffers[entry].mapping,
    445							pkt_len,
    446							DMA_FROM_DEVICE);
    447#if ! defined(__alpha__)
    448				skb_copy_to_linear_data(skb, tp->rx_buffers[entry].skb->data,
    449						 pkt_len);
    450				skb_put(skb, pkt_len);
    451#else
    452				skb_put_data(skb,
    453					     tp->rx_buffers[entry].skb->data,
    454					     pkt_len);
    455#endif
    456				dma_sync_single_for_device(&tp->pdev->dev,
    457							   tp->rx_buffers[entry].mapping,
    458							   pkt_len,
    459							   DMA_FROM_DEVICE);
    460			} else { 	/* Pass up the skb already on the Rx ring. */
    461				char *temp = skb_put(skb = tp->rx_buffers[entry].skb,
    462						     pkt_len);
    463
    464#ifndef final_version
    465				if (tp->rx_buffers[entry].mapping !=
    466				    le32_to_cpu(tp->rx_ring[entry].buffer1)) {
    467					dev_err(&dev->dev,
    468						"Internal fault: The skbuff addresses do not match in tulip_rx: %08x vs. %Lx %p / %p\n",
    469						le32_to_cpu(tp->rx_ring[entry].buffer1),
    470						(long long)tp->rx_buffers[entry].mapping,
    471						skb->head, temp);
    472				}
    473#endif
    474
    475				dma_unmap_single(&tp->pdev->dev,
    476						 tp->rx_buffers[entry].mapping,
    477						 PKT_BUF_SZ, DMA_FROM_DEVICE);
    478
    479				tp->rx_buffers[entry].skb = NULL;
    480				tp->rx_buffers[entry].mapping = 0;
    481			}
    482			skb->protocol = eth_type_trans(skb, dev);
    483
    484			netif_rx(skb);
    485
    486			dev->stats.rx_packets++;
    487			dev->stats.rx_bytes += pkt_len;
    488		}
    489		received++;
    490		entry = (++tp->cur_rx) % RX_RING_SIZE;
    491	}
    492	return received;
    493}
    494#endif  /* CONFIG_TULIP_NAPI */
    495
    496static inline unsigned int phy_interrupt (struct net_device *dev)
    497{
    498#ifdef __hppa__
    499	struct tulip_private *tp = netdev_priv(dev);
    500	int csr12 = ioread32(tp->base_addr + CSR12) & 0xff;
    501
    502	if (csr12 != tp->csr12_shadow) {
    503		/* ack interrupt */
    504		iowrite32(csr12 | 0x02, tp->base_addr + CSR12);
    505		tp->csr12_shadow = csr12;
    506		/* do link change stuff */
    507		spin_lock(&tp->lock);
    508		tulip_check_duplex(dev);
    509		spin_unlock(&tp->lock);
    510		/* clear irq ack bit */
    511		iowrite32(csr12 & ~0x02, tp->base_addr + CSR12);
    512
    513		return 1;
    514	}
    515#endif
    516
    517	return 0;
    518}
    519
    520/* The interrupt handler does all of the Rx thread work and cleans up
    521   after the Tx thread. */
    522irqreturn_t tulip_interrupt(int irq, void *dev_instance)
    523{
    524	struct net_device *dev = (struct net_device *)dev_instance;
    525	struct tulip_private *tp = netdev_priv(dev);
    526	void __iomem *ioaddr = tp->base_addr;
    527	int csr5;
    528	int missed;
    529	int rx = 0;
    530	int tx = 0;
    531	int oi = 0;
    532	int maxrx = RX_RING_SIZE;
    533	int maxtx = TX_RING_SIZE;
    534	int maxoi = TX_RING_SIZE;
    535#ifdef CONFIG_TULIP_NAPI
    536	int rxd = 0;
    537#else
    538	int entry;
    539#endif
    540	unsigned int work_count = tulip_max_interrupt_work;
    541	unsigned int handled = 0;
    542
    543	/* Let's see whether the interrupt really is for us */
    544	csr5 = ioread32(ioaddr + CSR5);
    545
    546        if (tp->flags & HAS_PHY_IRQ)
    547	        handled = phy_interrupt (dev);
    548
    549	if ((csr5 & (NormalIntr|AbnormalIntr)) == 0)
    550		return IRQ_RETVAL(handled);
    551
    552	tp->nir++;
    553
    554	do {
    555
    556#ifdef CONFIG_TULIP_NAPI
    557
    558		if (!rxd && (csr5 & (RxIntr | RxNoBuf))) {
    559			rxd++;
    560			/* Mask RX intrs and add the device to poll list. */
    561			iowrite32(tulip_tbl[tp->chip_id].valid_intrs&~RxPollInt, ioaddr + CSR7);
    562			napi_schedule(&tp->napi);
    563
    564			if (!(csr5&~(AbnormalIntr|NormalIntr|RxPollInt|TPLnkPass)))
    565                               break;
    566		}
    567
    568               /* Acknowledge the interrupt sources we handle here ASAP
    569                  the poll function does Rx and RxNoBuf acking */
    570
    571		iowrite32(csr5 & 0x0001ff3f, ioaddr + CSR5);
    572
    573#else
    574		/* Acknowledge all of the current interrupt sources ASAP. */
    575		iowrite32(csr5 & 0x0001ffff, ioaddr + CSR5);
    576
    577
    578		if (csr5 & (RxIntr | RxNoBuf)) {
    579				rx += tulip_rx(dev);
    580			tulip_refill_rx(dev);
    581		}
    582
    583#endif /*  CONFIG_TULIP_NAPI */
    584
    585		if (tulip_debug > 4)
    586			netdev_dbg(dev, "interrupt  csr5=%#8.8x new csr5=%#8.8x\n",
    587				   csr5, ioread32(ioaddr + CSR5));
    588
    589
    590		if (csr5 & (TxNoBuf | TxDied | TxIntr | TimerInt)) {
    591			unsigned int dirty_tx;
    592
    593			spin_lock(&tp->lock);
    594
    595			for (dirty_tx = tp->dirty_tx; tp->cur_tx - dirty_tx > 0;
    596				 dirty_tx++) {
    597				int entry = dirty_tx % TX_RING_SIZE;
    598				int status = le32_to_cpu(tp->tx_ring[entry].status);
    599
    600				if (status < 0)
    601					break;			/* It still has not been Txed */
    602
    603				/* Check for Rx filter setup frames. */
    604				if (tp->tx_buffers[entry].skb == NULL) {
    605					/* test because dummy frames not mapped */
    606					if (tp->tx_buffers[entry].mapping)
    607						dma_unmap_single(&tp->pdev->dev,
    608								 tp->tx_buffers[entry].mapping,
    609								 sizeof(tp->setup_frame),
    610								 DMA_TO_DEVICE);
    611					continue;
    612				}
    613
    614				if (status & 0x8000) {
    615					/* There was an major error, log it. */
    616#ifndef final_version
    617					if (tulip_debug > 1)
    618						netdev_dbg(dev, "Transmit error, Tx status %08x\n",
    619							   status);
    620#endif
    621					dev->stats.tx_errors++;
    622					if (status & 0x4104)
    623						dev->stats.tx_aborted_errors++;
    624					if (status & 0x0C00)
    625						dev->stats.tx_carrier_errors++;
    626					if (status & 0x0200)
    627						dev->stats.tx_window_errors++;
    628					if (status & 0x0002)
    629						dev->stats.tx_fifo_errors++;
    630					if ((status & 0x0080) && tp->full_duplex == 0)
    631						dev->stats.tx_heartbeat_errors++;
    632				} else {
    633					dev->stats.tx_bytes +=
    634						tp->tx_buffers[entry].skb->len;
    635					dev->stats.collisions += (status >> 3) & 15;
    636					dev->stats.tx_packets++;
    637				}
    638
    639				dma_unmap_single(&tp->pdev->dev,
    640						 tp->tx_buffers[entry].mapping,
    641						 tp->tx_buffers[entry].skb->len,
    642						 DMA_TO_DEVICE);
    643
    644				/* Free the original skb. */
    645				dev_kfree_skb_irq(tp->tx_buffers[entry].skb);
    646				tp->tx_buffers[entry].skb = NULL;
    647				tp->tx_buffers[entry].mapping = 0;
    648				tx++;
    649			}
    650
    651#ifndef final_version
    652			if (tp->cur_tx - dirty_tx > TX_RING_SIZE) {
    653				dev_err(&dev->dev,
    654					"Out-of-sync dirty pointer, %d vs. %d\n",
    655					dirty_tx, tp->cur_tx);
    656				dirty_tx += TX_RING_SIZE;
    657			}
    658#endif
    659
    660			if (tp->cur_tx - dirty_tx < TX_RING_SIZE - 2)
    661				netif_wake_queue(dev);
    662
    663			tp->dirty_tx = dirty_tx;
    664			if (csr5 & TxDied) {
    665				if (tulip_debug > 2)
    666					dev_warn(&dev->dev,
    667						 "The transmitter stopped.  CSR5 is %x, CSR6 %x, new CSR6 %x\n",
    668						 csr5, ioread32(ioaddr + CSR6),
    669						 tp->csr6);
    670				tulip_restart_rxtx(tp);
    671			}
    672			spin_unlock(&tp->lock);
    673		}
    674
    675		/* Log errors. */
    676		if (csr5 & AbnormalIntr) {	/* Abnormal error summary bit. */
    677			if (csr5 == 0xffffffff)
    678				break;
    679			if (csr5 & TxJabber)
    680				dev->stats.tx_errors++;
    681			if (csr5 & TxFIFOUnderflow) {
    682				if ((tp->csr6 & 0xC000) != 0xC000)
    683					tp->csr6 += 0x4000;	/* Bump up the Tx threshold */
    684				else
    685					tp->csr6 |= 0x00200000;  /* Store-n-forward. */
    686				/* Restart the transmit process. */
    687				tulip_restart_rxtx(tp);
    688				iowrite32(0, ioaddr + CSR1);
    689			}
    690			if (csr5 & (RxDied | RxNoBuf)) {
    691				if (tp->flags & COMET_MAC_ADDR) {
    692					iowrite32(tp->mc_filter[0], ioaddr + 0xAC);
    693					iowrite32(tp->mc_filter[1], ioaddr + 0xB0);
    694				}
    695			}
    696			if (csr5 & RxDied) {		/* Missed a Rx frame. */
    697				dev->stats.rx_missed_errors += ioread32(ioaddr + CSR8) & 0xffff;
    698				dev->stats.rx_errors++;
    699				tulip_start_rxtx(tp);
    700			}
    701			/*
    702			 * NB: t21142_lnk_change() does a del_timer_sync(), so be careful if this
    703			 * call is ever done under the spinlock
    704			 */
    705			if (csr5 & (TPLnkPass | TPLnkFail | 0x08000000)) {
    706				if (tp->link_change)
    707					(tp->link_change)(dev, csr5);
    708			}
    709			if (csr5 & SystemError) {
    710				int error = (csr5 >> 23) & 7;
    711				/* oops, we hit a PCI error.  The code produced corresponds
    712				 * to the reason:
    713				 *  0 - parity error
    714				 *  1 - master abort
    715				 *  2 - target abort
    716				 * Note that on parity error, we should do a software reset
    717				 * of the chip to get it back into a sane state (according
    718				 * to the 21142/3 docs that is).
    719				 *   -- rmk
    720				 */
    721				dev_err(&dev->dev,
    722					"(%lu) System Error occurred (%d)\n",
    723					tp->nir, error);
    724			}
    725			/* Clear all error sources, included undocumented ones! */
    726			iowrite32(0x0800f7ba, ioaddr + CSR5);
    727			oi++;
    728		}
    729		if (csr5 & TimerInt) {
    730
    731			if (tulip_debug > 2)
    732				dev_err(&dev->dev,
    733					"Re-enabling interrupts, %08x\n",
    734					csr5);
    735			iowrite32(tulip_tbl[tp->chip_id].valid_intrs, ioaddr + CSR7);
    736			tp->ttimer = 0;
    737			oi++;
    738		}
    739		if (tx > maxtx || rx > maxrx || oi > maxoi) {
    740			if (tulip_debug > 1)
    741				dev_warn(&dev->dev, "Too much work during an interrupt, csr5=0x%08x. (%lu) (%d,%d,%d)\n",
    742					 csr5, tp->nir, tx, rx, oi);
    743
    744                       /* Acknowledge all interrupt sources. */
    745                        iowrite32(0x8001ffff, ioaddr + CSR5);
    746                        if (tp->flags & HAS_INTR_MITIGATION) {
    747                     /* Josip Loncaric at ICASE did extensive experimentation
    748			to develop a good interrupt mitigation setting.*/
    749                                iowrite32(0x8b240000, ioaddr + CSR11);
    750                        } else if (tp->chip_id == LC82C168) {
    751				/* the LC82C168 doesn't have a hw timer.*/
    752				iowrite32(0x00, ioaddr + CSR7);
    753				mod_timer(&tp->timer, RUN_AT(HZ/50));
    754			} else {
    755                          /* Mask all interrupting sources, set timer to
    756				re-enable. */
    757                                iowrite32(((~csr5) & 0x0001ebef) | AbnormalIntr | TimerInt, ioaddr + CSR7);
    758                                iowrite32(0x0012, ioaddr + CSR11);
    759                        }
    760			break;
    761		}
    762
    763		work_count--;
    764		if (work_count == 0)
    765			break;
    766
    767		csr5 = ioread32(ioaddr + CSR5);
    768
    769#ifdef CONFIG_TULIP_NAPI
    770		if (rxd)
    771			csr5 &= ~RxPollInt;
    772	} while ((csr5 & (TxNoBuf |
    773			  TxDied |
    774			  TxIntr |
    775			  TimerInt |
    776			  /* Abnormal intr. */
    777			  RxDied |
    778			  TxFIFOUnderflow |
    779			  TxJabber |
    780			  TPLnkFail |
    781			  SystemError )) != 0);
    782#else
    783	} while ((csr5 & (NormalIntr|AbnormalIntr)) != 0);
    784
    785	tulip_refill_rx(dev);
    786
    787	/* check if the card is in suspend mode */
    788	entry = tp->dirty_rx % RX_RING_SIZE;
    789	if (tp->rx_buffers[entry].skb == NULL) {
    790		if (tulip_debug > 1)
    791			dev_warn(&dev->dev,
    792				 "in rx suspend mode: (%lu) (tp->cur_rx = %u, ttimer = %d, rx = %d) go/stay in suspend mode\n",
    793				 tp->nir, tp->cur_rx, tp->ttimer, rx);
    794		if (tp->chip_id == LC82C168) {
    795			iowrite32(0x00, ioaddr + CSR7);
    796			mod_timer(&tp->timer, RUN_AT(HZ/50));
    797		} else {
    798			if (tp->ttimer == 0 || (ioread32(ioaddr + CSR11) & 0xffff) == 0) {
    799				if (tulip_debug > 1)
    800					dev_warn(&dev->dev,
    801						 "in rx suspend mode: (%lu) set timer\n",
    802						 tp->nir);
    803				iowrite32(tulip_tbl[tp->chip_id].valid_intrs | TimerInt,
    804					ioaddr + CSR7);
    805				iowrite32(TimerInt, ioaddr + CSR5);
    806				iowrite32(12, ioaddr + CSR11);
    807				tp->ttimer = 1;
    808			}
    809		}
    810	}
    811#endif /* CONFIG_TULIP_NAPI */
    812
    813	if ((missed = ioread32(ioaddr + CSR8) & 0x1ffff)) {
    814		dev->stats.rx_dropped += missed & 0x10000 ? 0x10000 : missed;
    815	}
    816
    817	if (tulip_debug > 4)
    818		netdev_dbg(dev, "exiting interrupt, csr5=%#04x\n",
    819			   ioread32(ioaddr + CSR5));
    820
    821	return IRQ_HANDLED;
    822}