diff options
Diffstat (limited to 'drivers/net/ariadne.c')
| -rw-r--r-- | drivers/net/ariadne.c | 47 |
1 files changed, 22 insertions, 25 deletions
diff --git a/drivers/net/ariadne.c b/drivers/net/ariadne.c index 10f3a196be32..29e53eb71c74 100644 --- a/drivers/net/ariadne.c +++ b/drivers/net/ariadne.c | |||
| @@ -98,7 +98,6 @@ struct ariadne_private { | |||
| 98 | volatile u_short *rx_buff[RX_RING_SIZE]; | 98 | volatile u_short *rx_buff[RX_RING_SIZE]; |
| 99 | int cur_tx, cur_rx; /* The next free ring entry */ | 99 | int cur_tx, cur_rx; /* The next free ring entry */ |
| 100 | int dirty_tx; /* The ring entries to be free()ed. */ | 100 | int dirty_tx; /* The ring entries to be free()ed. */ |
| 101 | struct net_device_stats stats; | ||
| 102 | char tx_full; | 101 | char tx_full; |
| 103 | }; | 102 | }; |
| 104 | 103 | ||
| @@ -378,20 +377,19 @@ static void ariadne_init_ring(struct net_device *dev) | |||
| 378 | 377 | ||
| 379 | static int ariadne_close(struct net_device *dev) | 378 | static int ariadne_close(struct net_device *dev) |
| 380 | { | 379 | { |
| 381 | struct ariadne_private *priv = netdev_priv(dev); | ||
| 382 | volatile struct Am79C960 *lance = (struct Am79C960*)dev->base_addr; | 380 | volatile struct Am79C960 *lance = (struct Am79C960*)dev->base_addr; |
| 383 | 381 | ||
| 384 | netif_stop_queue(dev); | 382 | netif_stop_queue(dev); |
| 385 | 383 | ||
| 386 | lance->RAP = CSR112; /* Missed Frame Count */ | 384 | lance->RAP = CSR112; /* Missed Frame Count */ |
| 387 | priv->stats.rx_missed_errors = swapw(lance->RDP); | 385 | dev->stats.rx_missed_errors = swapw(lance->RDP); |
| 388 | lance->RAP = CSR0; /* PCnet-ISA Controller Status */ | 386 | lance->RAP = CSR0; /* PCnet-ISA Controller Status */ |
| 389 | 387 | ||
| 390 | if (ariadne_debug > 1) { | 388 | if (ariadne_debug > 1) { |
| 391 | printk(KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n", | 389 | printk(KERN_DEBUG "%s: Shutting down ethercard, status was %2.2x.\n", |
| 392 | dev->name, lance->RDP); | 390 | dev->name, lance->RDP); |
| 393 | printk(KERN_DEBUG "%s: %lu packets missed\n", dev->name, | 391 | printk(KERN_DEBUG "%s: %lu packets missed\n", dev->name, |
| 394 | priv->stats.rx_missed_errors); | 392 | dev->stats.rx_missed_errors); |
| 395 | } | 393 | } |
| 396 | 394 | ||
| 397 | /* We stop the LANCE here -- it occasionally polls memory if we don't. */ | 395 | /* We stop the LANCE here -- it occasionally polls memory if we don't. */ |
| @@ -502,16 +500,16 @@ static irqreturn_t ariadne_interrupt(int irq, void *data) | |||
| 502 | if (status & TF_ERR) { | 500 | if (status & TF_ERR) { |
| 503 | /* There was an major error, log it. */ | 501 | /* There was an major error, log it. */ |
| 504 | int err_status = priv->tx_ring[entry]->TMD3; | 502 | int err_status = priv->tx_ring[entry]->TMD3; |
| 505 | priv->stats.tx_errors++; | 503 | dev->stats.tx_errors++; |
| 506 | if (err_status & EF_RTRY) | 504 | if (err_status & EF_RTRY) |
| 507 | priv->stats.tx_aborted_errors++; | 505 | dev->stats.tx_aborted_errors++; |
| 508 | if (err_status & EF_LCAR) | 506 | if (err_status & EF_LCAR) |
| 509 | priv->stats.tx_carrier_errors++; | 507 | dev->stats.tx_carrier_errors++; |
| 510 | if (err_status & EF_LCOL) | 508 | if (err_status & EF_LCOL) |
| 511 | priv->stats.tx_window_errors++; | 509 | dev->stats.tx_window_errors++; |
| 512 | if (err_status & EF_UFLO) { | 510 | if (err_status & EF_UFLO) { |
| 513 | /* Ackk! On FIFO errors the Tx unit is turned off! */ | 511 | /* Ackk! On FIFO errors the Tx unit is turned off! */ |
| 514 | priv->stats.tx_fifo_errors++; | 512 | dev->stats.tx_fifo_errors++; |
| 515 | /* Remove this verbosity later! */ | 513 | /* Remove this verbosity later! */ |
| 516 | printk(KERN_ERR "%s: Tx FIFO error! Status %4.4x.\n", | 514 | printk(KERN_ERR "%s: Tx FIFO error! Status %4.4x.\n", |
| 517 | dev->name, csr0); | 515 | dev->name, csr0); |
| @@ -520,8 +518,8 @@ static irqreturn_t ariadne_interrupt(int irq, void *data) | |||
| 520 | } | 518 | } |
| 521 | } else { | 519 | } else { |
| 522 | if (status & (TF_MORE|TF_ONE)) | 520 | if (status & (TF_MORE|TF_ONE)) |
| 523 | priv->stats.collisions++; | 521 | dev->stats.collisions++; |
| 524 | priv->stats.tx_packets++; | 522 | dev->stats.tx_packets++; |
| 525 | } | 523 | } |
| 526 | dirty_tx++; | 524 | dirty_tx++; |
| 527 | } | 525 | } |
| @@ -547,11 +545,11 @@ static irqreturn_t ariadne_interrupt(int irq, void *data) | |||
| 547 | /* Log misc errors. */ | 545 | /* Log misc errors. */ |
| 548 | if (csr0 & BABL) { | 546 | if (csr0 & BABL) { |
| 549 | handled = 1; | 547 | handled = 1; |
| 550 | priv->stats.tx_errors++; /* Tx babble. */ | 548 | dev->stats.tx_errors++; /* Tx babble. */ |
| 551 | } | 549 | } |
| 552 | if (csr0 & MISS) { | 550 | if (csr0 & MISS) { |
| 553 | handled = 1; | 551 | handled = 1; |
| 554 | priv->stats.rx_errors++; /* Missed a Rx frame. */ | 552 | dev->stats.rx_errors++; /* Missed a Rx frame. */ |
| 555 | } | 553 | } |
| 556 | if (csr0 & MERR) { | 554 | if (csr0 & MERR) { |
| 557 | handled = 1; | 555 | handled = 1; |
| @@ -672,7 +670,7 @@ static int ariadne_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
| 672 | priv->cur_tx -= TX_RING_SIZE; | 670 | priv->cur_tx -= TX_RING_SIZE; |
| 673 | priv->dirty_tx -= TX_RING_SIZE; | 671 | priv->dirty_tx -= TX_RING_SIZE; |
| 674 | } | 672 | } |
| 675 | priv->stats.tx_bytes += len; | 673 | dev->stats.tx_bytes += len; |
| 676 | 674 | ||
| 677 | /* Trigger an immediate send poll. */ | 675 | /* Trigger an immediate send poll. */ |
| 678 | lance->RAP = CSR0; /* PCnet-ISA Controller Status */ | 676 | lance->RAP = CSR0; /* PCnet-ISA Controller Status */ |
| @@ -707,15 +705,15 @@ static int ariadne_rx(struct net_device *dev) | |||
| 707 | buffers, with only the last correctly noting the error. */ | 705 | buffers, with only the last correctly noting the error. */ |
| 708 | if (status & RF_ENP) | 706 | if (status & RF_ENP) |
| 709 | /* Only count a general error at the end of a packet.*/ | 707 | /* Only count a general error at the end of a packet.*/ |
| 710 | priv->stats.rx_errors++; | 708 | dev->stats.rx_errors++; |
| 711 | if (status & RF_FRAM) | 709 | if (status & RF_FRAM) |
| 712 | priv->stats.rx_frame_errors++; | 710 | dev->stats.rx_frame_errors++; |
| 713 | if (status & RF_OFLO) | 711 | if (status & RF_OFLO) |
| 714 | priv->stats.rx_over_errors++; | 712 | dev->stats.rx_over_errors++; |
| 715 | if (status & RF_CRC) | 713 | if (status & RF_CRC) |
| 716 | priv->stats.rx_crc_errors++; | 714 | dev->stats.rx_crc_errors++; |
| 717 | if (status & RF_BUFF) | 715 | if (status & RF_BUFF) |
| 718 | priv->stats.rx_fifo_errors++; | 716 | dev->stats.rx_fifo_errors++; |
| 719 | priv->rx_ring[entry]->RMD1 &= 0xff00|RF_STP|RF_ENP; | 717 | priv->rx_ring[entry]->RMD1 &= 0xff00|RF_STP|RF_ENP; |
| 720 | } else { | 718 | } else { |
| 721 | /* Malloc up new buffer, compatible with net-3. */ | 719 | /* Malloc up new buffer, compatible with net-3. */ |
| @@ -731,7 +729,7 @@ static int ariadne_rx(struct net_device *dev) | |||
| 731 | break; | 729 | break; |
| 732 | 730 | ||
| 733 | if (i > RX_RING_SIZE-2) { | 731 | if (i > RX_RING_SIZE-2) { |
| 734 | priv->stats.rx_dropped++; | 732 | dev->stats.rx_dropped++; |
| 735 | priv->rx_ring[entry]->RMD1 |= RF_OWN; | 733 | priv->rx_ring[entry]->RMD1 |= RF_OWN; |
| 736 | priv->cur_rx++; | 734 | priv->cur_rx++; |
| 737 | } | 735 | } |
| @@ -764,8 +762,8 @@ static int ariadne_rx(struct net_device *dev) | |||
| 764 | 762 | ||
| 765 | netif_rx(skb); | 763 | netif_rx(skb); |
| 766 | dev->last_rx = jiffies; | 764 | dev->last_rx = jiffies; |
| 767 | priv->stats.rx_packets++; | 765 | dev->stats.rx_packets++; |
| 768 | priv->stats.rx_bytes += pkt_len; | 766 | dev->stats.rx_bytes += pkt_len; |
| 769 | } | 767 | } |
| 770 | 768 | ||
| 771 | priv->rx_ring[entry]->RMD1 |= RF_OWN; | 769 | priv->rx_ring[entry]->RMD1 |= RF_OWN; |
| @@ -783,7 +781,6 @@ static int ariadne_rx(struct net_device *dev) | |||
| 783 | 781 | ||
| 784 | static struct net_device_stats *ariadne_get_stats(struct net_device *dev) | 782 | static struct net_device_stats *ariadne_get_stats(struct net_device *dev) |
| 785 | { | 783 | { |
| 786 | struct ariadne_private *priv = netdev_priv(dev); | ||
| 787 | volatile struct Am79C960 *lance = (struct Am79C960*)dev->base_addr; | 784 | volatile struct Am79C960 *lance = (struct Am79C960*)dev->base_addr; |
| 788 | short saved_addr; | 785 | short saved_addr; |
| 789 | unsigned long flags; | 786 | unsigned long flags; |
| @@ -791,11 +788,11 @@ static struct net_device_stats *ariadne_get_stats(struct net_device *dev) | |||
| 791 | local_irq_save(flags); | 788 | local_irq_save(flags); |
| 792 | saved_addr = lance->RAP; | 789 | saved_addr = lance->RAP; |
| 793 | lance->RAP = CSR112; /* Missed Frame Count */ | 790 | lance->RAP = CSR112; /* Missed Frame Count */ |
| 794 | priv->stats.rx_missed_errors = swapw(lance->RDP); | 791 | dev->stats.rx_missed_errors = swapw(lance->RDP); |
| 795 | lance->RAP = saved_addr; | 792 | lance->RAP = saved_addr; |
| 796 | local_irq_restore(flags); | 793 | local_irq_restore(flags); |
| 797 | 794 | ||
| 798 | return &priv->stats; | 795 | return &dev->stats; |
| 799 | } | 796 | } |
| 800 | 797 | ||
| 801 | 798 | ||
