|
@@ -121,13 +121,22 @@ static const struct fm10k_stats fm10k_gstrings_mbx_stats[] = {
|
|
|
FM10K_MBX_STAT("mbx_rx_mbmem_pushed", rx_mbmem_pushed),
|
|
|
};
|
|
|
|
|
|
+#define FM10K_QUEUE_STAT(_name, _stat) { \
|
|
|
+ .stat_string = _name, \
|
|
|
+ .sizeof_stat = FIELD_SIZEOF(struct fm10k_ring, _stat), \
|
|
|
+ .stat_offset = offsetof(struct fm10k_ring, _stat) \
|
|
|
+}
|
|
|
+
|
|
|
+static const struct fm10k_stats fm10k_gstrings_queue_stats[] = {
|
|
|
+ FM10K_QUEUE_STAT("packets", stats.packets),
|
|
|
+ FM10K_QUEUE_STAT("bytes", stats.bytes),
|
|
|
+};
|
|
|
+
|
|
|
#define FM10K_GLOBAL_STATS_LEN ARRAY_SIZE(fm10k_gstrings_global_stats)
|
|
|
#define FM10K_DEBUG_STATS_LEN ARRAY_SIZE(fm10k_gstrings_debug_stats)
|
|
|
#define FM10K_PF_STATS_LEN ARRAY_SIZE(fm10k_gstrings_pf_stats)
|
|
|
#define FM10K_MBX_STATS_LEN ARRAY_SIZE(fm10k_gstrings_mbx_stats)
|
|
|
-
|
|
|
-#define FM10K_QUEUE_STATS_LEN(_n) \
|
|
|
- ((_n) * 2 * (sizeof(struct fm10k_queue_stats) / sizeof(u64)))
|
|
|
+#define FM10K_QUEUE_STATS_LEN ARRAY_SIZE(fm10k_gstrings_queue_stats)
|
|
|
|
|
|
#define FM10K_STATIC_STATS_LEN (FM10K_GLOBAL_STATS_LEN + \
|
|
|
FM10K_NETDEV_STATS_LEN + \
|
|
@@ -202,14 +211,17 @@ static void fm10k_get_stat_strings(struct net_device *dev, u8 *data)
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < interface->hw.mac.max_queues; i++) {
|
|
|
- snprintf(p, ETH_GSTRING_LEN, "tx_queue_%u_packets", i);
|
|
|
- p += ETH_GSTRING_LEN;
|
|
|
- snprintf(p, ETH_GSTRING_LEN, "tx_queue_%u_bytes", i);
|
|
|
- p += ETH_GSTRING_LEN;
|
|
|
- snprintf(p, ETH_GSTRING_LEN, "rx_queue_%u_packets", i);
|
|
|
- p += ETH_GSTRING_LEN;
|
|
|
- snprintf(p, ETH_GSTRING_LEN, "rx_queue_%u_bytes", i);
|
|
|
- p += ETH_GSTRING_LEN;
|
|
|
+ char prefix[ETH_GSTRING_LEN];
|
|
|
+
|
|
|
+ snprintf(prefix, ETH_GSTRING_LEN, "tx_queue_%u_", i);
|
|
|
+ fm10k_add_stat_strings(&p, prefix,
|
|
|
+ fm10k_gstrings_queue_stats,
|
|
|
+ FM10K_QUEUE_STATS_LEN);
|
|
|
+
|
|
|
+ snprintf(prefix, ETH_GSTRING_LEN, "rx_queue_%u_", i);
|
|
|
+ fm10k_add_stat_strings(&p, prefix,
|
|
|
+ fm10k_gstrings_queue_stats,
|
|
|
+ FM10K_QUEUE_STATS_LEN);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -244,7 +256,7 @@ static int fm10k_get_sset_count(struct net_device *dev, int sset)
|
|
|
case ETH_SS_TEST:
|
|
|
return FM10K_TEST_LEN;
|
|
|
case ETH_SS_STATS:
|
|
|
- stats_len += FM10K_QUEUE_STATS_LEN(hw->mac.max_queues);
|
|
|
+ stats_len += hw->mac.max_queues * 2 * FM10K_QUEUE_STATS_LEN;
|
|
|
|
|
|
if (hw->mac.type != fm10k_mac_vf)
|
|
|
stats_len += FM10K_PF_STATS_LEN;
|
|
@@ -272,9 +284,10 @@ static void fm10k_add_ethtool_stats(u64 **data, void *pointer,
|
|
|
unsigned int i;
|
|
|
char *p;
|
|
|
|
|
|
- /* simply skip forward if we were not given a valid pointer */
|
|
|
if (!pointer) {
|
|
|
- *data += size;
|
|
|
+ /* memory is not zero allocated so we have to clear it */
|
|
|
+ for (i = 0; i < size; i++)
|
|
|
+ *((*data)++) = 0;
|
|
|
return;
|
|
|
}
|
|
|
|
|
@@ -304,11 +317,10 @@ static void fm10k_get_ethtool_stats(struct net_device *netdev,
|
|
|
struct ethtool_stats __always_unused *stats,
|
|
|
u64 *data)
|
|
|
{
|
|
|
- const int stat_count = sizeof(struct fm10k_queue_stats) / sizeof(u64);
|
|
|
struct fm10k_intfc *interface = netdev_priv(netdev);
|
|
|
struct fm10k_iov_data *iov_data = interface->iov_data;
|
|
|
struct net_device_stats *net_stats = &netdev->stats;
|
|
|
- int i, j;
|
|
|
+ int i;
|
|
|
|
|
|
fm10k_update_stats(interface);
|
|
|
|
|
@@ -347,19 +359,16 @@ static void fm10k_get_ethtool_stats(struct net_device *netdev,
|
|
|
|
|
|
for (i = 0; i < interface->hw.mac.max_queues; i++) {
|
|
|
struct fm10k_ring *ring;
|
|
|
- u64 *queue_stat;
|
|
|
|
|
|
ring = interface->tx_ring[i];
|
|
|
- if (ring)
|
|
|
- queue_stat = (u64 *)&ring->stats;
|
|
|
- for (j = 0; j < stat_count; j++)
|
|
|
- *(data++) = ring ? queue_stat[j] : 0;
|
|
|
+ fm10k_add_ethtool_stats(&data, ring,
|
|
|
+ fm10k_gstrings_queue_stats,
|
|
|
+ FM10K_QUEUE_STATS_LEN);
|
|
|
|
|
|
ring = interface->rx_ring[i];
|
|
|
- if (ring)
|
|
|
- queue_stat = (u64 *)&ring->stats;
|
|
|
- for (j = 0; j < stat_count; j++)
|
|
|
- *(data++) = ring ? queue_stat[j] : 0;
|
|
|
+ fm10k_add_ethtool_stats(&data, ring,
|
|
|
+ fm10k_gstrings_queue_stats,
|
|
|
+ FM10K_QUEUE_STATS_LEN);
|
|
|
}
|
|
|
}
|
|
|
|