Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

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