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 = pci_map_single(tp->pdev, skb->data, PKT_BUF_SZ, 78 PCI_DMA_FROMDEVICE); 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 | 166 RxDescCRCError | 167 RxDescCollisionSeen | 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, 238 PKT_BUF_SZ, PCI_DMA_FROMDEVICE); 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 | 393 RxDescCRCError | 394 RxDescCollisionSeen | 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, 464 PKT_BUF_SZ, PCI_DMA_FROMDEVICE); 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 551 if (!(csr5&~(AbnormalIntr|NormalIntr|RxPollInt|TPLnkPass))) 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), 597 PCI_DMA_TODEVICE); 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, 628 PCI_DMA_TODEVICE); 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 | 764 TxFIFOUnderflow | 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 } 809