brintos

brintos / linux-shallow public Read only

0
0
Text · 24.9 KiB · 54560f9 Raw
823 lines · c
1/*2	drivers/net/ethernet/dec/tulip/interrupt.c3 4	Copyright 2000,2001  The Linux Kernel Team5	Written/copyright 1994-2001 by Donald Becker.6 7	This software may be used and distributed according to the terms8	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_MITIGATION21#define MIT_SIZE 1522#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 Interrupt27            We use only RX mitigation we other techniques for28            TX intr. mitigation.29 30           31    Cycle Size (timer control)31           30:27 TX timer in 16 * Cycle size32           26:24 TX No pkts before Int.33           23:20 RX timer in Cycle size34           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#endif57 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 it96			 */97			iowrite32(0x01, tp->base_addr + CSR2);98		}99	}100	return refilled;101}102 103#ifdef CONFIG_TULIP_NAPI104 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_MITIGATION119	int received = 0;120#endif121 122#ifdef CONFIG_TULIP_NAPI_HW_MITIGATION123 124/* that one buffer is needed for mit activation; or might be a125   bug in the ring buffer code; check later -- JHS*/126 127        if (budget >=RX_RING_SIZE) budget--;128#endif129 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 have161			* 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 invalid168			* regardless of RxLengthOver2047 bits169			*/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 copying209                                  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#else222                                       skb_put_data(skb,223                                                    tp->rx_buffers[entry].skb->data,224                                                    pkt_len);225#endif226					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_version235                                       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#endif244 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_MITIGATION261		       received++;262#endif263 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 longer271                  hopefully this helps */272 273               /* Really bad things can happen here... If new packet arrives274                * and an irq arrives (tx or just due to occasionally unset275                * mask), it will be acked by irq handler, but new thread276                * is not scheduled. It is major hole in design.277                * No idea how to fix this if "playing with fire" will fail278                * tomorrow (night 011029). If it will not fail, we won279                * finally: amount of IO did not increase at all. */280       } while ((ioread32(tp->base_addr + CSR5) & RxIntr));281 282 #ifdef CONFIG_TULIP_NAPI_HW_MITIGATION283 284          /* We use this simplistic scheme for IM. It's proven by285             real life installations. We can have IM enabled286            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 contributing289            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 dropping296             OFF: Only 1 pkt received297 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 handler331          * 2. it can race with dise/enabling irqs in other poll threads332          * 3. if an irq raised after beginning loop, it will be immediately333          *    triggered here.334          *335          * Summarizing: the logic results in some redundant irqs both336          * due to races in masking and due to too late acking of already337          * 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 completed359          * 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 have393		  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 invalid399		  regardless of RxLengthOver2047 bits400		*/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 copying439			   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#else452				skb_put_data(skb,453					     tp->rx_buffers[entry].skb->data,454					     pkt_len);455#endif456				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_version465				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#endif474 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#endif516 517	return 0;518}519 520/* The interrupt handler does all of the Rx thread work and cleans up521   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_NAPI536	int rxd = 0;537#else538	int entry;539#endif540	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_NAPI557 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 ASAP569                  the poll function does Rx and RxNoBuf acking */570 571		iowrite32(csr5 & 0x0001ff3f, ioaddr + CSR5);572 573#else574		/* 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_version617					if (tulip_debug > 1)618						netdev_dbg(dev, "Transmit error, Tx status %08x\n",619							   status);620#endif621					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_version652			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#endif659 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				else685					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 this703			 * call is ever done under the spinlock704			 */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 corresponds712				 * to the reason:713				 *  0 - parity error714				 *  1 - master abort715				 *  2 - target abort716				 * Note that on parity error, we should do a software reset717				 * of the chip to get it back into a sane state (according718				 * to the 21142/3 docs that is).719				 *   -- rmk720				 */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 experimentation748			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 to756				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_NAPI770		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#else783	} 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}823