diff options
author | Junchang Wang <junchangwang@gmail.com> | 2012-03-05 12:13:05 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-03-06 00:04:16 -0500 |
commit | 9184a22701ed257974e7950be11da4cbd3116c63 (patch) | |
tree | 022a9470cd75376abbc24bdf065b8b7bd59defb9 | |
parent | f6a1ad4295f9291038380178d09978caf6982dd8 (diff) |
8139too: Add 64bit statistics
Switch to use ndo_get_stats64 to get 64bit statistics.
Two sync entries are used (one for Rx and one for Tx).
Signed-off-by: Junchang Wang <junchangwang@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/ethernet/realtek/8139too.c | 46 |
1 files changed, 38 insertions, 8 deletions
diff --git a/drivers/net/ethernet/realtek/8139too.c b/drivers/net/ethernet/realtek/8139too.c index abd6aca70e9..df7fd8d083d 100644 --- a/drivers/net/ethernet/realtek/8139too.c +++ b/drivers/net/ethernet/realtek/8139too.c | |||
@@ -565,6 +565,12 @@ struct rtl_extra_stats { | |||
565 | unsigned long rx_lost_in_ring; | 565 | unsigned long rx_lost_in_ring; |
566 | }; | 566 | }; |
567 | 567 | ||
568 | struct rtl8139_stats { | ||
569 | u64 packets; | ||
570 | u64 bytes; | ||
571 | struct u64_stats_sync syncp; | ||
572 | }; | ||
573 | |||
568 | struct rtl8139_private { | 574 | struct rtl8139_private { |
569 | void __iomem *mmio_addr; | 575 | void __iomem *mmio_addr; |
570 | int drv_flags; | 576 | int drv_flags; |
@@ -575,11 +581,13 @@ struct rtl8139_private { | |||
575 | 581 | ||
576 | unsigned char *rx_ring; | 582 | unsigned char *rx_ring; |
577 | unsigned int cur_rx; /* RX buf index of next pkt */ | 583 | unsigned int cur_rx; /* RX buf index of next pkt */ |
584 | struct rtl8139_stats rx_stats; | ||
578 | dma_addr_t rx_ring_dma; | 585 | dma_addr_t rx_ring_dma; |
579 | 586 | ||
580 | unsigned int tx_flag; | 587 | unsigned int tx_flag; |
581 | unsigned long cur_tx; | 588 | unsigned long cur_tx; |
582 | unsigned long dirty_tx; | 589 | unsigned long dirty_tx; |
590 | struct rtl8139_stats tx_stats; | ||
583 | unsigned char *tx_buf[NUM_TX_DESC]; /* Tx bounce buffers */ | 591 | unsigned char *tx_buf[NUM_TX_DESC]; /* Tx bounce buffers */ |
584 | unsigned char *tx_bufs; /* Tx bounce buffer region. */ | 592 | unsigned char *tx_bufs; /* Tx bounce buffer region. */ |
585 | dma_addr_t tx_bufs_dma; | 593 | dma_addr_t tx_bufs_dma; |
@@ -641,7 +649,9 @@ static int rtl8139_poll(struct napi_struct *napi, int budget); | |||
641 | static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance); | 649 | static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance); |
642 | static int rtl8139_close (struct net_device *dev); | 650 | static int rtl8139_close (struct net_device *dev); |
643 | static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); | 651 | static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); |
644 | static struct net_device_stats *rtl8139_get_stats (struct net_device *dev); | 652 | static struct rtnl_link_stats64 *rtl8139_get_stats64(struct net_device *dev, |
653 | struct rtnl_link_stats64 | ||
654 | *stats); | ||
645 | static void rtl8139_set_rx_mode (struct net_device *dev); | 655 | static void rtl8139_set_rx_mode (struct net_device *dev); |
646 | static void __set_rx_mode (struct net_device *dev); | 656 | static void __set_rx_mode (struct net_device *dev); |
647 | static void rtl8139_hw_start (struct net_device *dev); | 657 | static void rtl8139_hw_start (struct net_device *dev); |
@@ -937,7 +947,7 @@ static int rtl8139_set_features(struct net_device *dev, netdev_features_t featur | |||
937 | static const struct net_device_ops rtl8139_netdev_ops = { | 947 | static const struct net_device_ops rtl8139_netdev_ops = { |
938 | .ndo_open = rtl8139_open, | 948 | .ndo_open = rtl8139_open, |
939 | .ndo_stop = rtl8139_close, | 949 | .ndo_stop = rtl8139_close, |
940 | .ndo_get_stats = rtl8139_get_stats, | 950 | .ndo_get_stats64 = rtl8139_get_stats64, |
941 | .ndo_change_mtu = eth_change_mtu, | 951 | .ndo_change_mtu = eth_change_mtu, |
942 | .ndo_validate_addr = eth_validate_addr, | 952 | .ndo_validate_addr = eth_validate_addr, |
943 | .ndo_set_mac_address = rtl8139_set_mac_address, | 953 | .ndo_set_mac_address = rtl8139_set_mac_address, |
@@ -1807,8 +1817,10 @@ static void rtl8139_tx_interrupt (struct net_device *dev, | |||
1807 | dev->stats.tx_fifo_errors++; | 1817 | dev->stats.tx_fifo_errors++; |
1808 | } | 1818 | } |
1809 | dev->stats.collisions += (txstatus >> 24) & 15; | 1819 | dev->stats.collisions += (txstatus >> 24) & 15; |
1810 | dev->stats.tx_bytes += txstatus & 0x7ff; | 1820 | u64_stats_update_begin(&tp->tx_stats.syncp); |
1811 | dev->stats.tx_packets++; | 1821 | tp->tx_stats.packets++; |
1822 | tp->tx_stats.bytes += txstatus & 0x7ff; | ||
1823 | u64_stats_update_end(&tp->tx_stats.syncp); | ||
1812 | } | 1824 | } |
1813 | 1825 | ||
1814 | dirty_tx++; | 1826 | dirty_tx++; |
@@ -2050,8 +2062,10 @@ keep_pkt: | |||
2050 | 2062 | ||
2051 | skb->protocol = eth_type_trans (skb, dev); | 2063 | skb->protocol = eth_type_trans (skb, dev); |
2052 | 2064 | ||
2053 | dev->stats.rx_bytes += pkt_size; | 2065 | u64_stats_update_begin(&tp->rx_stats.syncp); |
2054 | dev->stats.rx_packets++; | 2066 | tp->rx_stats.packets++; |
2067 | tp->rx_stats.bytes += pkt_size; | ||
2068 | u64_stats_update_end(&tp->rx_stats.syncp); | ||
2055 | 2069 | ||
2056 | netif_receive_skb (skb); | 2070 | netif_receive_skb (skb); |
2057 | } else { | 2071 | } else { |
@@ -2515,11 +2529,13 @@ static int netdev_ioctl(struct net_device *dev, struct ifreq *rq, int cmd) | |||
2515 | } | 2529 | } |
2516 | 2530 | ||
2517 | 2531 | ||
2518 | static struct net_device_stats *rtl8139_get_stats (struct net_device *dev) | 2532 | static struct rtnl_link_stats64 * |
2533 | rtl8139_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats) | ||
2519 | { | 2534 | { |
2520 | struct rtl8139_private *tp = netdev_priv(dev); | 2535 | struct rtl8139_private *tp = netdev_priv(dev); |
2521 | void __iomem *ioaddr = tp->mmio_addr; | 2536 | void __iomem *ioaddr = tp->mmio_addr; |
2522 | unsigned long flags; | 2537 | unsigned long flags; |
2538 | unsigned int start; | ||
2523 | 2539 | ||
2524 | if (netif_running(dev)) { | 2540 | if (netif_running(dev)) { |
2525 | spin_lock_irqsave (&tp->lock, flags); | 2541 | spin_lock_irqsave (&tp->lock, flags); |
@@ -2528,7 +2544,21 @@ static struct net_device_stats *rtl8139_get_stats (struct net_device *dev) | |||
2528 | spin_unlock_irqrestore (&tp->lock, flags); | 2544 | spin_unlock_irqrestore (&tp->lock, flags); |
2529 | } | 2545 | } |
2530 | 2546 | ||
2531 | return &dev->stats; | 2547 | netdev_stats_to_stats64(stats, &dev->stats); |
2548 | |||
2549 | do { | ||
2550 | start = u64_stats_fetch_begin_bh(&tp->rx_stats.syncp); | ||
2551 | stats->rx_packets = tp->rx_stats.packets; | ||
2552 | stats->rx_bytes = tp->rx_stats.bytes; | ||
2553 | } while (u64_stats_fetch_retry_bh(&tp->rx_stats.syncp, start)); | ||
2554 | |||
2555 | do { | ||
2556 | start = u64_stats_fetch_begin_bh(&tp->tx_stats.syncp); | ||
2557 | stats->tx_packets = tp->tx_stats.packets; | ||
2558 | stats->tx_bytes = tp->tx_stats.bytes; | ||
2559 | } while (u64_stats_fetch_retry_bh(&tp->tx_stats.syncp, start)); | ||
2560 | |||
2561 | return stats; | ||
2532 | } | 2562 | } |
2533 | 2563 | ||
2534 | /* Set or clear the multicast filter for this adaptor. | 2564 | /* Set or clear the multicast filter for this adaptor. |