]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/net/ethernet/realtek/r8169.c
r8169: Add software counter for multicast packages
[karo-tx-linux.git] / drivers / net / ethernet / realtek / r8169.c
index d6d39df5b3dc9db95f43659318b6e78c23e397dd..24dcbe62412a10a457bc5fa7ea8ce0ed1f016221 100644 (file)
@@ -754,7 +754,6 @@ struct rtl8169_tc_offsets {
        bool    inited;
        __le64  tx_errors;
        __le32  tx_multi_collision;
-       __le32  rx_multicast;
        __le16  tx_aborted;
 };
 
@@ -2326,7 +2325,6 @@ static bool rtl8169_init_counter_offsets(struct net_device *dev)
 
        tp->tc_offset.tx_errors = tp->counters.tx_errors;
        tp->tc_offset.tx_multi_collision = tp->counters.tx_multi_collision;
-       tp->tc_offset.rx_multicast = tp->counters.rx_multicast;
        tp->tc_offset.tx_aborted = tp->counters.tx_aborted;
        tp->tc_offset.inited = true;
 
@@ -7480,6 +7478,9 @@ process_pkt:
                        tp->rx_stats.packets++;
                        tp->rx_stats.bytes += pkt_size;
                        u64_stats_update_end(&tp->rx_stats.syncp);
+
+                       if (skb->pkt_type == PACKET_MULTICAST)
+                               dev->stats.multicast++;
                }
 release_descriptor:
                desc->opts2 = 0;
@@ -7790,7 +7791,6 @@ rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
                stats->rx_bytes = tp->rx_stats.bytes;
        } while (u64_stats_fetch_retry_irq(&tp->rx_stats.syncp, start));
 
-
        do {
                start = u64_stats_fetch_begin_irq(&tp->tx_stats.syncp);
                stats->tx_packets = tp->tx_stats.packets;
@@ -7804,6 +7804,7 @@ rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
        stats->rx_crc_errors    = dev->stats.rx_crc_errors;
        stats->rx_fifo_errors   = dev->stats.rx_fifo_errors;
        stats->rx_missed_errors = dev->stats.rx_missed_errors;
+       stats->multicast        = dev->stats.multicast;
 
        /*
         * Fetch additonal counter values missing in stats collected by driver
@@ -7819,8 +7820,6 @@ rtl8169_get_stats64(struct net_device *dev, struct rtnl_link_stats64 *stats)
                le64_to_cpu(tp->tc_offset.tx_errors);
        stats->collisions = le32_to_cpu(tp->counters.tx_multi_collision) -
                le32_to_cpu(tp->tc_offset.tx_multi_collision);
-       stats->multicast = le32_to_cpu(tp->counters.rx_multicast) -
-               le32_to_cpu(tp->tc_offset.rx_multicast);
        stats->tx_aborted_errors = le16_to_cpu(tp->counters.tx_aborted) -
                le16_to_cpu(tp->tc_offset.tx_aborted);