GNU Linux-libre 5.19-rc6-gnu
[releases.git] / drivers / net / ethernet / dec / tulip / interrupt.c
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
17 int tulip_rx_copybreak;
18 unsigned 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
24 static 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
59 int 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
105 void 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
112 int 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
369 static 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
496 static 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. */
522 irqreturn_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 }