interrupt.c (25455B)
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 17int tulip_rx_copybreak; 18unsigned 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 24static 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 59int tulip_refill_rx(struct net_device *dev) 60{ 61 struct tulip_private *tp = netdev_priv(dev); 62 int entry; 63 int refilled = 0; 64 65 /* Refill the Rx ring buffers. */ 66 for (; tp->cur_rx - tp->dirty_rx > 0; tp->dirty_rx++) { 67 entry = tp->dirty_rx % RX_RING_SIZE; 68 if (tp->rx_buffers[entry].skb == NULL) { 69 struct sk_buff *skb; 70 dma_addr_t mapping; 71 72 skb = tp->rx_buffers[entry].skb = 73 netdev_alloc_skb(dev, PKT_BUF_SZ); 74 if (skb == NULL) 75 break; 76 77 mapping = dma_map_single(&tp->pdev->dev, skb->data, 78 PKT_BUF_SZ, DMA_FROM_DEVICE); 79 if (dma_mapping_error(&tp->pdev->dev, mapping)) { 80 dev_kfree_skb(skb); 81 tp->rx_buffers[entry].skb = NULL; 82 break; 83 } 84 85 tp->rx_buffers[entry].mapping = mapping; 86 87 tp->rx_ring[entry].buffer1 = cpu_to_le32(mapping); 88 refilled++; 89 } 90 tp->rx_ring[entry].status = cpu_to_le32(DescOwned); 91 } 92 if(tp->chip_id == LC82C168) { 93 if(((ioread32(tp->base_addr + CSR5)>>17)&0x07) == 4) { 94 /* Rx stopped due to out of buffers, 95 * restart it 96 */ 97 iowrite32(0x01, tp->base_addr + CSR2); 98 } 99 } 100 return refilled; 101} 102 103#ifdef CONFIG_TULIP_NAPI 104 105void oom_timer(struct timer_list *t) 106{ 107 struct tulip_private *tp = from_timer(tp, t, oom_timer); 108 109 napi_schedule(&tp->napi); 110} 111 112int tulip_poll(struct napi_struct *napi, int budget) 113{ 114 struct tulip_private *tp = container_of(napi, struct tulip_private, napi); 115 struct net_device *dev = tp->dev; 116 int entry = tp->cur_rx % RX_RING_SIZE; 117 int work_done = 0; 118#ifdef CONFIG_TULIP_NAPI_HW_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 369static int tulip_rx(struct net_device *dev) 370{ 371 struct tulip_private *tp = netdev_priv(dev); 372 int entry = tp->cur_rx % RX_RING_SIZE; 373 int rx_work_limit = tp->dirty_rx + RX_RING_SIZE - tp->cur_rx; 374 int received = 0; 375 376 if (tulip_debug > 4) 377 netdev_dbg(dev, "In tulip_rx(), entry %d %08x\n", 378 entry, tp->rx_ring[entry].status); 379 /* If we own the next entry, it is a new packet. Send it up. */ 380 while ( ! (tp->rx_ring[entry].status & cpu_to_le32(DescOwned))) { 381 s32 status = le32_to_cpu(tp->rx_ring[entry].status); 382 short pkt_len; 383 384 if (tulip_debug > 5) 385 netdev_dbg(dev, "In tulip_rx(), entry %d %08x\n", 386 entry, status); 387 if (--rx_work_limit < 0) 388 break; 389 390 /* 391 Omit the four octet CRC from the length. 392 (May not be considered valid until we 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 496static inline unsigned int phy_interrupt (struct net_device *dev) 497{ 498#ifdef __hppa__ 499 struct tulip_private *tp = netdev_priv(dev); 500 int csr12 = ioread32(tp->base_addr + CSR12) & 0xff; 501 502 if (csr12 != tp->csr12_shadow) { 503 /* ack interrupt */ 504 iowrite32(csr12 | 0x02, tp->base_addr + CSR12); 505 tp->csr12_shadow = csr12; 506 /* do link change stuff */ 507 spin_lock(&tp->lock); 508 tulip_check_duplex(dev); 509 spin_unlock(&tp->lock); 510 /* clear irq ack bit */ 511 iowrite32(csr12 & ~0x02, tp->base_addr + CSR12); 512 513 return 1; 514 } 515#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. */ 522irqreturn_t tulip_interrupt(int irq, void *dev_instance) 523{ 524 struct net_device *dev = (struct net_device *)dev_instance; 525 struct tulip_private *tp = netdev_priv(dev); 526 void __iomem *ioaddr = tp->base_addr; 527 int csr5; 528 int missed; 529 int rx = 0; 530 int tx = 0; 531 int oi = 0; 532 int maxrx = RX_RING_SIZE; 533 int maxtx = TX_RING_SIZE; 534 int maxoi = TX_RING_SIZE; 535#ifdef CONFIG_TULIP_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}