|
@@ -183,10 +183,11 @@ static int mlx4_en_set_wol(struct net_device *netdev,
|
|
|
static int mlx4_en_get_sset_count(struct net_device *dev, int sset)
|
|
|
{
|
|
|
struct mlx4_en_priv *priv = netdev_priv(dev);
|
|
|
+ int bit_count = hweight64(priv->stats_bitmap);
|
|
|
|
|
|
switch (sset) {
|
|
|
case ETH_SS_STATS:
|
|
|
- return NUM_ALL_STATS +
|
|
|
+ return (priv->stats_bitmap ? bit_count : NUM_ALL_STATS) +
|
|
|
(priv->tx_ring_num + priv->rx_ring_num) * 2;
|
|
|
case ETH_SS_TEST:
|
|
|
return MLX4_EN_NUM_SELF_TEST - !(priv->mdev->dev->caps.flags
|
|
@@ -201,14 +202,34 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
|
|
|
{
|
|
|
struct mlx4_en_priv *priv = netdev_priv(dev);
|
|
|
int index = 0;
|
|
|
- int i;
|
|
|
+ int i, j = 0;
|
|
|
|
|
|
spin_lock_bh(&priv->stats_lock);
|
|
|
|
|
|
- for (i = 0; i < NUM_MAIN_STATS; i++)
|
|
|
- data[index++] = ((unsigned long *) &priv->stats)[i];
|
|
|
- for (i = 0; i < NUM_PORT_STATS; i++)
|
|
|
- data[index++] = ((unsigned long *) &priv->port_stats)[i];
|
|
|
+ if (!(priv->stats_bitmap)) {
|
|
|
+ for (i = 0; i < NUM_MAIN_STATS; i++)
|
|
|
+ data[index++] =
|
|
|
+ ((unsigned long *) &priv->stats)[i];
|
|
|
+ for (i = 0; i < NUM_PORT_STATS; i++)
|
|
|
+ data[index++] =
|
|
|
+ ((unsigned long *) &priv->port_stats)[i];
|
|
|
+ for (i = 0; i < NUM_PKT_STATS; i++)
|
|
|
+ data[index++] =
|
|
|
+ ((unsigned long *) &priv->pkstats)[i];
|
|
|
+ } else {
|
|
|
+ for (i = 0; i < NUM_MAIN_STATS; i++) {
|
|
|
+ if ((priv->stats_bitmap >> j) & 1)
|
|
|
+ data[index++] =
|
|
|
+ ((unsigned long *) &priv->stats)[i];
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+ for (i = 0; i < NUM_PORT_STATS; i++) {
|
|
|
+ if ((priv->stats_bitmap >> j) & 1)
|
|
|
+ data[index++] =
|
|
|
+ ((unsigned long *) &priv->port_stats)[i];
|
|
|
+ j++;
|
|
|
+ }
|
|
|
+ }
|
|
|
for (i = 0; i < priv->tx_ring_num; i++) {
|
|
|
data[index++] = priv->tx_ring[i].packets;
|
|
|
data[index++] = priv->tx_ring[i].bytes;
|
|
@@ -217,8 +238,6 @@ static void mlx4_en_get_ethtool_stats(struct net_device *dev,
|
|
|
data[index++] = priv->rx_ring[i].packets;
|
|
|
data[index++] = priv->rx_ring[i].bytes;
|
|
|
}
|
|
|
- for (i = 0; i < NUM_PKT_STATS; i++)
|
|
|
- data[index++] = ((unsigned long *) &priv->pkstats)[i];
|
|
|
spin_unlock_bh(&priv->stats_lock);
|
|
|
|
|
|
}
|
|
@@ -247,11 +266,29 @@ static void mlx4_en_get_strings(struct net_device *dev,
|
|
|
|
|
|
case ETH_SS_STATS:
|
|
|
/* Add main counters */
|
|
|
- for (i = 0; i < NUM_MAIN_STATS; i++)
|
|
|
- strcpy(data + (index++) * ETH_GSTRING_LEN, main_strings[i]);
|
|
|
- for (i = 0; i< NUM_PORT_STATS; i++)
|
|
|
- strcpy(data + (index++) * ETH_GSTRING_LEN,
|
|
|
- main_strings[i + NUM_MAIN_STATS]);
|
|
|
+ if (!priv->stats_bitmap) {
|
|
|
+ for (i = 0; i < NUM_MAIN_STATS; i++)
|
|
|
+ strcpy(data + (index++) * ETH_GSTRING_LEN,
|
|
|
+ main_strings[i]);
|
|
|
+ for (i = 0; i < NUM_PORT_STATS; i++)
|
|
|
+ strcpy(data + (index++) * ETH_GSTRING_LEN,
|
|
|
+ main_strings[i +
|
|
|
+ NUM_MAIN_STATS]);
|
|
|
+ for (i = 0; i < NUM_PKT_STATS; i++)
|
|
|
+ strcpy(data + (index++) * ETH_GSTRING_LEN,
|
|
|
+ main_strings[i +
|
|
|
+ NUM_MAIN_STATS +
|
|
|
+ NUM_PORT_STATS]);
|
|
|
+ } else
|
|
|
+ for (i = 0; i < NUM_MAIN_STATS + NUM_PORT_STATS; i++) {
|
|
|
+ if ((priv->stats_bitmap >> i) & 1) {
|
|
|
+ strcpy(data +
|
|
|
+ (index++) * ETH_GSTRING_LEN,
|
|
|
+ main_strings[i]);
|
|
|
+ }
|
|
|
+ if (!(priv->stats_bitmap >> i))
|
|
|
+ break;
|
|
|
+ }
|
|
|
for (i = 0; i < priv->tx_ring_num; i++) {
|
|
|
sprintf(data + (index++) * ETH_GSTRING_LEN,
|
|
|
"tx%d_packets", i);
|
|
@@ -264,9 +301,6 @@ static void mlx4_en_get_strings(struct net_device *dev,
|
|
|
sprintf(data + (index++) * ETH_GSTRING_LEN,
|
|
|
"rx%d_bytes", i);
|
|
|
}
|
|
|
- for (i = 0; i< NUM_PKT_STATS; i++)
|
|
|
- strcpy(data + (index++) * ETH_GSTRING_LEN,
|
|
|
- main_strings[i + NUM_MAIN_STATS + NUM_PORT_STATS]);
|
|
|
break;
|
|
|
}
|
|
|
}
|