aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJunchang Wang <junchangwang@gmail.com>2012-03-05 12:13:05 -0500
committerDavid S. Miller <davem@davemloft.net>2012-03-06 00:04:16 -0500
commit9184a22701ed257974e7950be11da4cbd3116c63 (patch)
tree022a9470cd75376abbc24bdf065b8b7bd59defb9
parentf6a1ad4295f9291038380178d09978caf6982dd8 (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.c46
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
568struct rtl8139_stats {
569 u64 packets;
570 u64 bytes;
571 struct u64_stats_sync syncp;
572};
573
568struct rtl8139_private { 574struct 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);
641static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance); 649static irqreturn_t rtl8139_interrupt (int irq, void *dev_instance);
642static int rtl8139_close (struct net_device *dev); 650static int rtl8139_close (struct net_device *dev);
643static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd); 651static int netdev_ioctl (struct net_device *dev, struct ifreq *rq, int cmd);
644static struct net_device_stats *rtl8139_get_stats (struct net_device *dev); 652static struct rtnl_link_stats64 *rtl8139_get_stats64(struct net_device *dev,
653 struct rtnl_link_stats64
654 *stats);
645static void rtl8139_set_rx_mode (struct net_device *dev); 655static void rtl8139_set_rx_mode (struct net_device *dev);
646static void __set_rx_mode (struct net_device *dev); 656static void __set_rx_mode (struct net_device *dev);
647static void rtl8139_hw_start (struct net_device *dev); 657static 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
937static const struct net_device_ops rtl8139_netdev_ops = { 947static 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
2518static struct net_device_stats *rtl8139_get_stats (struct net_device *dev) 2532static struct rtnl_link_stats64 *
2533rtl8139_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.