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