|
@@ -1,5 +1,5 @@
|
|
|
/* Intel Ethernet Switch Host Interface Driver
|
|
|
- * Copyright(c) 2013 - 2014 Intel Corporation.
|
|
|
+ * Copyright(c) 2013 - 2015 Intel Corporation.
|
|
|
*
|
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
|
* under the terms and conditions of the GNU General Public License,
|
|
@@ -57,13 +57,12 @@ static const struct fm10k_stats fm10k_gstrings_net_stats[] = {
|
|
|
.stat_offset = offsetof(struct fm10k_intfc, _stat) \
|
|
|
}
|
|
|
|
|
|
-static const struct fm10k_stats fm10k_gstrings_stats[] = {
|
|
|
+static const struct fm10k_stats fm10k_gstrings_global_stats[] = {
|
|
|
FM10K_STAT("tx_restart_queue", restart_queue),
|
|
|
FM10K_STAT("tx_busy", tx_busy),
|
|
|
FM10K_STAT("tx_csum_errors", tx_csum_errors),
|
|
|
FM10K_STAT("rx_alloc_failed", alloc_failed),
|
|
|
FM10K_STAT("rx_csum_errors", rx_csum_errors),
|
|
|
- FM10K_STAT("rx_errors", rx_errors),
|
|
|
|
|
|
FM10K_STAT("tx_packets_nic", tx_packets_nic),
|
|
|
FM10K_STAT("tx_bytes_nic", tx_bytes_nic),
|
|
@@ -73,38 +72,42 @@ static const struct fm10k_stats fm10k_gstrings_stats[] = {
|
|
|
FM10K_STAT("rx_overrun_pf", rx_overrun_pf),
|
|
|
FM10K_STAT("rx_overrun_vf", rx_overrun_vf),
|
|
|
|
|
|
- FM10K_STAT("timeout", stats.timeout.count),
|
|
|
- FM10K_STAT("ur", stats.ur.count),
|
|
|
- FM10K_STAT("ca", stats.ca.count),
|
|
|
- FM10K_STAT("um", stats.um.count),
|
|
|
- FM10K_STAT("xec", stats.xec.count),
|
|
|
- FM10K_STAT("vlan_drop", stats.vlan_drop.count),
|
|
|
- FM10K_STAT("loopback_drop", stats.loopback_drop.count),
|
|
|
- FM10K_STAT("nodesc_drop", stats.nodesc_drop.count),
|
|
|
-
|
|
|
FM10K_STAT("swapi_status", hw.swapi.status),
|
|
|
FM10K_STAT("mac_rules_used", hw.swapi.mac.used),
|
|
|
FM10K_STAT("mac_rules_avail", hw.swapi.mac.avail),
|
|
|
|
|
|
FM10K_STAT("mbx_tx_busy", hw.mbx.tx_busy),
|
|
|
- FM10K_STAT("mbx_tx_dropped", hw.mbx.tx_dropped),
|
|
|
+ FM10K_STAT("mbx_tx_oversized", hw.mbx.tx_dropped),
|
|
|
FM10K_STAT("mbx_tx_messages", hw.mbx.tx_messages),
|
|
|
FM10K_STAT("mbx_tx_dwords", hw.mbx.tx_dwords),
|
|
|
FM10K_STAT("mbx_rx_messages", hw.mbx.rx_messages),
|
|
|
FM10K_STAT("mbx_rx_dwords", hw.mbx.rx_dwords),
|
|
|
FM10K_STAT("mbx_rx_parse_err", hw.mbx.rx_parse_err),
|
|
|
|
|
|
+ FM10K_STAT("tx_hang_count", tx_timeout_count),
|
|
|
+
|
|
|
FM10K_STAT("tx_hwtstamp_timeouts", tx_hwtstamp_timeouts),
|
|
|
};
|
|
|
|
|
|
-#define FM10K_GLOBAL_STATS_LEN ARRAY_SIZE(fm10k_gstrings_stats)
|
|
|
+static const struct fm10k_stats fm10k_gstrings_pf_stats[] = {
|
|
|
+ FM10K_STAT("timeout", stats.timeout.count),
|
|
|
+ FM10K_STAT("ur", stats.ur.count),
|
|
|
+ FM10K_STAT("ca", stats.ca.count),
|
|
|
+ FM10K_STAT("um", stats.um.count),
|
|
|
+ FM10K_STAT("xec", stats.xec.count),
|
|
|
+ FM10K_STAT("vlan_drop", stats.vlan_drop.count),
|
|
|
+ FM10K_STAT("loopback_drop", stats.loopback_drop.count),
|
|
|
+ FM10K_STAT("nodesc_drop", stats.nodesc_drop.count),
|
|
|
+};
|
|
|
+
|
|
|
+#define FM10K_GLOBAL_STATS_LEN ARRAY_SIZE(fm10k_gstrings_global_stats)
|
|
|
+#define FM10K_PF_STATS_LEN ARRAY_SIZE(fm10k_gstrings_pf_stats)
|
|
|
|
|
|
-#define FM10K_QUEUE_STATS_LEN \
|
|
|
- (MAX_QUEUES * 2 * (sizeof(struct fm10k_queue_stats) / sizeof(u64)))
|
|
|
+#define FM10K_QUEUE_STATS_LEN(_n) \
|
|
|
+ ( (_n) * 2 * (sizeof(struct fm10k_queue_stats) / sizeof(u64)))
|
|
|
|
|
|
-#define FM10K_STATS_LEN (FM10K_GLOBAL_STATS_LEN + \
|
|
|
- FM10K_NETDEV_STATS_LEN + \
|
|
|
- FM10K_QUEUE_STATS_LEN)
|
|
|
+#define FM10K_STATIC_STATS_LEN (FM10K_GLOBAL_STATS_LEN + \
|
|
|
+ FM10K_NETDEV_STATS_LEN)
|
|
|
|
|
|
static const char fm10k_gstrings_test[][ETH_GSTRING_LEN] = {
|
|
|
"Mailbox test (on/offline)"
|
|
@@ -117,9 +120,9 @@ enum fm10k_self_test_types {
|
|
|
FM10K_TEST_MAX = FM10K_TEST_LEN
|
|
|
};
|
|
|
|
|
|
-static void fm10k_get_strings(struct net_device *dev, u32 stringset,
|
|
|
- u8 *data)
|
|
|
+static void fm10k_get_strings(struct net_device *dev, u32 stringset, u8 *data)
|
|
|
{
|
|
|
+ struct fm10k_intfc *interface = netdev_priv(dev);
|
|
|
char *p = (char *)data;
|
|
|
int i;
|
|
|
|
|
@@ -135,12 +138,19 @@ static void fm10k_get_strings(struct net_device *dev, u32 stringset,
|
|
|
p += ETH_GSTRING_LEN;
|
|
|
}
|
|
|
for (i = 0; i < FM10K_GLOBAL_STATS_LEN; i++) {
|
|
|
- memcpy(p, fm10k_gstrings_stats[i].stat_string,
|
|
|
+ memcpy(p, fm10k_gstrings_global_stats[i].stat_string,
|
|
|
ETH_GSTRING_LEN);
|
|
|
p += ETH_GSTRING_LEN;
|
|
|
}
|
|
|
|
|
|
- for (i = 0; i < MAX_QUEUES; i++) {
|
|
|
+ if (interface->hw.mac.type != fm10k_mac_vf)
|
|
|
+ for (i = 0; i < FM10K_PF_STATS_LEN; i++) {
|
|
|
+ memcpy(p, fm10k_gstrings_pf_stats[i].stat_string,
|
|
|
+ ETH_GSTRING_LEN);
|
|
|
+ p += ETH_GSTRING_LEN;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < interface->hw.mac.max_queues; i++) {
|
|
|
sprintf(p, "tx_queue_%u_packets", i);
|
|
|
p += ETH_GSTRING_LEN;
|
|
|
sprintf(p, "tx_queue_%u_bytes", i);
|
|
@@ -156,18 +166,28 @@ static void fm10k_get_strings(struct net_device *dev, u32 stringset,
|
|
|
|
|
|
static int fm10k_get_sset_count(struct net_device *dev, int sset)
|
|
|
{
|
|
|
+ struct fm10k_intfc *interface = netdev_priv(dev);
|
|
|
+ struct fm10k_hw *hw = &interface->hw;
|
|
|
+ int stats_len = FM10K_STATIC_STATS_LEN;
|
|
|
+
|
|
|
switch (sset) {
|
|
|
case ETH_SS_TEST:
|
|
|
return FM10K_TEST_LEN;
|
|
|
case ETH_SS_STATS:
|
|
|
- return FM10K_STATS_LEN;
|
|
|
+ stats_len += FM10K_QUEUE_STATS_LEN(hw->mac.max_queues);
|
|
|
+
|
|
|
+ if (hw->mac.type != fm10k_mac_vf)
|
|
|
+ stats_len += FM10K_PF_STATS_LEN;
|
|
|
+
|
|
|
+ return stats_len;
|
|
|
default:
|
|
|
return -EOPNOTSUPP;
|
|
|
}
|
|
|
}
|
|
|
|
|
|
static void fm10k_get_ethtool_stats(struct net_device *netdev,
|
|
|
- struct ethtool_stats *stats, u64 *data)
|
|
|
+ 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);
|
|
@@ -184,12 +204,21 @@ static void fm10k_get_ethtool_stats(struct net_device *netdev,
|
|
|
}
|
|
|
|
|
|
for (i = 0; i < FM10K_GLOBAL_STATS_LEN; i++) {
|
|
|
- p = (char *)interface + fm10k_gstrings_stats[i].stat_offset;
|
|
|
- *(data++) = (fm10k_gstrings_stats[i].sizeof_stat ==
|
|
|
+ p = (char *)interface +
|
|
|
+ fm10k_gstrings_global_stats[i].stat_offset;
|
|
|
+ *(data++) = (fm10k_gstrings_global_stats[i].sizeof_stat ==
|
|
|
sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
|
|
|
}
|
|
|
|
|
|
- for (i = 0; i < MAX_QUEUES; i++) {
|
|
|
+ if (interface->hw.mac.type != fm10k_mac_vf)
|
|
|
+ for (i = 0; i < FM10K_PF_STATS_LEN; i++) {
|
|
|
+ p = (char *)interface +
|
|
|
+ fm10k_gstrings_pf_stats[i].stat_offset;
|
|
|
+ *(data++) = (fm10k_gstrings_pf_stats[i].sizeof_stat ==
|
|
|
+ sizeof(u64)) ? *(u64 *)p : *(u32 *)p;
|
|
|
+ }
|
|
|
+
|
|
|
+ for (i = 0; i < interface->hw.mac.max_queues; i++) {
|
|
|
struct fm10k_ring *ring;
|
|
|
u64 *queue_stat;
|
|
|
|
|
@@ -369,7 +398,7 @@ static void fm10k_get_drvinfo(struct net_device *dev,
|
|
|
strncpy(info->bus_info, pci_name(interface->pdev),
|
|
|
sizeof(info->bus_info) - 1);
|
|
|
|
|
|
- info->n_stats = FM10K_STATS_LEN;
|
|
|
+ info->n_stats = fm10k_get_sset_count(dev, ETH_SS_STATS);
|
|
|
|
|
|
info->regdump_len = fm10k_get_regs_len(dev);
|
|
|
}
|
|
@@ -645,7 +674,7 @@ static int fm10k_get_rss_hash_opts(struct fm10k_intfc *interface,
|
|
|
}
|
|
|
|
|
|
static int fm10k_get_rxnfc(struct net_device *dev, struct ethtool_rxnfc *cmd,
|
|
|
- u32 *rule_locs)
|
|
|
+ u32 __always_unused *rule_locs)
|
|
|
{
|
|
|
struct fm10k_intfc *interface = netdev_priv(dev);
|
|
|
int ret = -EOPNOTSUPP;
|
|
@@ -851,7 +880,7 @@ static void fm10k_self_test(struct net_device *dev,
|
|
|
eth_test->flags |= ETH_TEST_FL_FAILED;
|
|
|
}
|
|
|
|
|
|
-static u32 fm10k_get_reta_size(struct net_device *netdev)
|
|
|
+static u32 fm10k_get_reta_size(struct net_device __always_unused *netdev)
|
|
|
{
|
|
|
return FM10K_RETA_SIZE * FM10K_RETA_ENTRIES_PER_REG;
|
|
|
}
|
|
@@ -911,7 +940,7 @@ static int fm10k_set_reta(struct net_device *netdev, const u32 *indir)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static u32 fm10k_get_rssrk_size(struct net_device *netdev)
|
|
|
+static u32 fm10k_get_rssrk_size(struct net_device __always_unused *netdev)
|
|
|
{
|
|
|
return FM10K_RSSRK_SIZE * FM10K_RSSRK_ENTRIES_PER_REG;
|
|
|
}
|