nfp: report MAC statistics in ethtool
authorJakub Kicinski <jakub.kicinski@netronome.com>
Fri, 18 Aug 2017 22:48:18 +0000 (15:48 -0700)
committerDavid S. Miller <davem@davemloft.net>
Sat, 19 Aug 2017 05:39:28 +0000 (22:39 -0700)
Add reporting of MAC statistics in ethtool.  MAC statistics
are read out from the MAC IP and accumulated by application
FW, therefore their presence depends on the application FW.

Add missing defines and string names for the statistics and
dump them in ethtool -S.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Simon Horman <simon.horman@netronome.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c
drivers/net/ethernet/netronome/nfp/nfp_port.h

index 169f3e3714fd33f12c3fa1a63728ef863ac5ed36..f33c341844bed69e8c32a2c63eb22b2db815b342 100644 (file)
@@ -99,6 +99,86 @@ static const struct nfp_et_stat nfp_net_et_stats[] = {
        { "bpf_app3_bytes",     NFP_NET_CFG_STATS_APP3_BYTES },
 };
 
+static const struct nfp_et_stat nfp_mac_et_stats[] = {
+       { "rx_octets",                  NFP_MAC_STATS_RX_IN_OCTETS, },
+       { "rx_frame_too_long_errors",
+                       NFP_MAC_STATS_RX_FRAME_TOO_LONG_ERRORS, },
+       { "rx_range_length_errors",     NFP_MAC_STATS_RX_RANGE_LENGTH_ERRORS, },
+       { "rx_vlan_reveive_ok",         NFP_MAC_STATS_RX_VLAN_REVEIVE_OK, },
+       { "rx_errors",                  NFP_MAC_STATS_RX_IN_ERRORS, },
+       { "rx_broadcast_pkts",          NFP_MAC_STATS_RX_IN_BROADCAST_PKTS, },
+       { "rx_drop_events",             NFP_MAC_STATS_RX_DROP_EVENTS, },
+       { "rx_alignment_errors",        NFP_MAC_STATS_RX_ALIGNMENT_ERRORS, },
+       { "rx_pause_mac_ctrl_frames",
+                       NFP_MAC_STATS_RX_PAUSE_MAC_CTRL_FRAMES, },
+       { "rx_frames_received_ok",      NFP_MAC_STATS_RX_FRAMES_RECEIVED_OK, },
+       { "rx_frame_check_sequence_errors",
+                       NFP_MAC_STATS_RX_FRAME_CHECK_SEQUENCE_ERRORS, },
+       { "rx_unicast_pkts",            NFP_MAC_STATS_RX_UNICAST_PKTS, },
+       { "rx_multicast_pkts",          NFP_MAC_STATS_RX_MULTICAST_PKTS, },
+       { "rx_pkts",                    NFP_MAC_STATS_RX_PKTS, },
+       { "rx_undersize_pkts",          NFP_MAC_STATS_RX_UNDERSIZE_PKTS, },
+       { "rx_pkts_64_octets",          NFP_MAC_STATS_RX_PKTS_64_OCTETS, },
+       { "rx_pkts_65_to_127_octets",
+                       NFP_MAC_STATS_RX_PKTS_65_TO_127_OCTETS, },
+       { "rx_pkts_128_to_255_octets",
+                       NFP_MAC_STATS_RX_PKTS_128_TO_255_OCTETS, },
+       { "rx_pkts_256_to_511_octets",
+                       NFP_MAC_STATS_RX_PKTS_256_TO_511_OCTETS, },
+       { "rx_pkts_512_to_1023_octets",
+                       NFP_MAC_STATS_RX_PKTS_512_TO_1023_OCTETS, },
+       { "rx_pkts_1024_to_1518_octets",
+                       NFP_MAC_STATS_RX_PKTS_1024_TO_1518_OCTETS, },
+       { "rx_pkts_1519_to_max_octets",
+                       NFP_MAC_STATS_RX_PKTS_1519_TO_MAX_OCTETS, },
+       { "rx_jabbers",                 NFP_MAC_STATS_RX_JABBERS, },
+       { "rx_fragments",               NFP_MAC_STATS_RX_FRAGMENTS, },
+       { "rx_oversize_pkts",           NFP_MAC_STATS_RX_OVERSIZE_PKTS, },
+       { "rx_pause_frames_class0",     NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS0, },
+       { "rx_pause_frames_class1",     NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS1, },
+       { "rx_pause_frames_class2",     NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS2, },
+       { "rx_pause_frames_class3",     NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS3, },
+       { "rx_pause_frames_class4",     NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS4, },
+       { "rx_pause_frames_class5",     NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS5, },
+       { "rx_pause_frames_class6",     NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS6, },
+       { "rx_pause_frames_class7",     NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS7, },
+       { "rx_mac_ctrl_frames_received",
+                       NFP_MAC_STATS_RX_MAC_CTRL_FRAMES_RECEIVED, },
+       { "rx_mac_head_drop",           NFP_MAC_STATS_RX_MAC_HEAD_DROP, },
+       { "tx_queue_drop",              NFP_MAC_STATS_TX_QUEUE_DROP, },
+       { "tx_octets",                  NFP_MAC_STATS_TX_OUT_OCTETS, },
+       { "tx_vlan_transmitted_ok",     NFP_MAC_STATS_TX_VLAN_TRANSMITTED_OK, },
+       { "tx_errors",                  NFP_MAC_STATS_TX_OUT_ERRORS, },
+       { "tx_broadcast_pkts",          NFP_MAC_STATS_TX_BROADCAST_PKTS, },
+       { "tx_pause_mac_ctrl_frames",
+                       NFP_MAC_STATS_TX_PAUSE_MAC_CTRL_FRAMES, },
+       { "tx_frames_transmitted_ok",
+                       NFP_MAC_STATS_TX_FRAMES_TRANSMITTED_OK, },
+       { "tx_unicast_pkts",            NFP_MAC_STATS_TX_UNICAST_PKTS, },
+       { "tx_multicast_pkts",          NFP_MAC_STATS_TX_MULTICAST_PKTS, },
+       { "tx_pkts_64_octets",          NFP_MAC_STATS_TX_PKTS_64_OCTETS, },
+       { "tx_pkts_65_to_127_octets",
+                       NFP_MAC_STATS_TX_PKTS_65_TO_127_OCTETS, },
+       { "tx_pkts_128_to_255_octets",
+                       NFP_MAC_STATS_TX_PKTS_128_TO_255_OCTETS, },
+       { "tx_pkts_256_to_511_octets",
+                       NFP_MAC_STATS_TX_PKTS_256_TO_511_OCTETS, },
+       { "tx_pkts_512_to_1023_octets",
+                       NFP_MAC_STATS_TX_PKTS_512_TO_1023_OCTETS, },
+       { "tx_pkts_1024_to_1518_octets",
+                       NFP_MAC_STATS_TX_PKTS_1024_TO_1518_OCTETS, },
+       { "tx_pkts_1519_to_max_octets",
+                       NFP_MAC_STATS_TX_PKTS_1519_TO_MAX_OCTETS, },
+       { "tx_pause_frames_class0",     NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS0, },
+       { "tx_pause_frames_class1",     NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS1, },
+       { "tx_pause_frames_class2",     NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS2, },
+       { "tx_pause_frames_class3",     NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS3, },
+       { "tx_pause_frames_class4",     NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS4, },
+       { "tx_pause_frames_class5",     NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS5, },
+       { "tx_pause_frames_class6",     NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS6, },
+       { "tx_pause_frames_class7",     NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS7, },
+};
+
 #define NN_ET_GLOBAL_STATS_LEN ARRAY_SIZE(nfp_net_et_stats)
 #define NN_ET_RVEC_GATHER_STATS 7
 
@@ -459,6 +539,47 @@ nfp_vnic_get_hw_stats(u64 *data, u8 __iomem *mem,
        return data;
 }
 
+static unsigned int nfp_mac_get_stats_count(struct net_device *netdev)
+{
+       struct nfp_port *port;
+
+       port = nfp_port_from_netdev(netdev);
+       if (!__nfp_port_get_eth_port(port) || !port->eth_stats)
+               return 0;
+
+       return ARRAY_SIZE(nfp_mac_et_stats);
+}
+
+static u8 *nfp_mac_get_stats_strings(struct net_device *netdev, u8 *data)
+{
+       struct nfp_port *port;
+       unsigned int i;
+
+       port = nfp_port_from_netdev(netdev);
+       if (!__nfp_port_get_eth_port(port) || !port->eth_stats)
+               return data;
+
+       for (i = 0; i < ARRAY_SIZE(nfp_mac_et_stats); i++)
+               data = nfp_pr_et(data, "mac.%s", nfp_mac_et_stats[i].name);
+
+       return data;
+}
+
+static u64 *nfp_mac_get_stats(struct net_device *netdev, u64 *data)
+{
+       struct nfp_port *port;
+       unsigned int i;
+
+       port = nfp_port_from_netdev(netdev);
+       if (!__nfp_port_get_eth_port(port) || !port->eth_stats)
+               return data;
+
+       for (i = 0; i < ARRAY_SIZE(nfp_mac_et_stats); i++)
+               *data++ = readq(port->eth_stats + nfp_mac_et_stats[i].off);
+
+       return data;
+}
+
 static void nfp_net_get_strings(struct net_device *netdev,
                                u32 stringset, u8 *data)
 {
@@ -469,6 +590,7 @@ static void nfp_net_get_strings(struct net_device *netdev,
                data = nfp_vnic_get_sw_stats_strings(netdev, data);
                data = nfp_vnic_get_hw_stats_strings(data, nn->dp.num_rx_rings,
                                                     nn->dp.num_tx_rings);
+               data = nfp_mac_get_stats_strings(netdev, data);
                break;
        }
 }
@@ -482,6 +604,7 @@ nfp_net_get_stats(struct net_device *netdev, struct ethtool_stats *stats,
        data = nfp_vnic_get_sw_stats(netdev, data);
        data = nfp_vnic_get_hw_stats(data, nn->dp.ctrl_bar,
                                     nn->dp.num_rx_rings, nn->dp.num_tx_rings);
+       data = nfp_mac_get_stats(netdev, data);
 }
 
 static int nfp_net_get_sset_count(struct net_device *netdev, int sset)
@@ -492,7 +615,8 @@ static int nfp_net_get_sset_count(struct net_device *netdev, int sset)
        case ETH_SS_STATS:
                return nfp_vnic_get_sw_stats_count(netdev) +
                       nfp_vnic_get_hw_stats_count(nn->dp.num_rx_rings,
-                                                  nn->dp.num_tx_rings);
+                                                  nn->dp.num_tx_rings) +
+                      nfp_mac_get_stats_count(netdev);
        default:
                return -EOPNOTSUPP;
        }
index cf71ac065e85f51713f0b36d55cbf3744108dae6..de8ec609b57eda2c41397bf3fcff5fbf745fa946 100644 (file)
@@ -147,31 +147,32 @@ void nfp_devlink_port_unregister(struct nfp_port *port);
 #define NFP_MAC_STATS_SIZE                0x0200
 
 #define NFP_MAC_STATS_RX_IN_OCTETS                     (NFP_MAC_STATS_BASE + 0x000)
+                                                       /* unused 0x008 */
 #define NFP_MAC_STATS_RX_FRAME_TOO_LONG_ERRORS         (NFP_MAC_STATS_BASE + 0x010)
 #define NFP_MAC_STATS_RX_RANGE_LENGTH_ERRORS           (NFP_MAC_STATS_BASE + 0x018)
 #define NFP_MAC_STATS_RX_VLAN_REVEIVE_OK               (NFP_MAC_STATS_BASE + 0x020)
 #define NFP_MAC_STATS_RX_IN_ERRORS                     (NFP_MAC_STATS_BASE + 0x028)
 #define NFP_MAC_STATS_RX_IN_BROADCAST_PKTS             (NFP_MAC_STATS_BASE + 0x030)
-#define NFP_MAC_STATS_RX_STATS_DROP_EVENTS             (NFP_MAC_STATS_BASE + 0x038)
+#define NFP_MAC_STATS_RX_DROP_EVENTS                   (NFP_MAC_STATS_BASE + 0x038)
 #define NFP_MAC_STATS_RX_ALIGNMENT_ERRORS              (NFP_MAC_STATS_BASE + 0x040)
 #define NFP_MAC_STATS_RX_PAUSE_MAC_CTRL_FRAMES         (NFP_MAC_STATS_BASE + 0x048)
 #define NFP_MAC_STATS_RX_FRAMES_RECEIVED_OK            (NFP_MAC_STATS_BASE + 0x050)
 #define NFP_MAC_STATS_RX_FRAME_CHECK_SEQUENCE_ERRORS   (NFP_MAC_STATS_BASE + 0x058)
 #define NFP_MAC_STATS_RX_UNICAST_PKTS                  (NFP_MAC_STATS_BASE + 0x060)
 #define NFP_MAC_STATS_RX_MULTICAST_PKTS                        (NFP_MAC_STATS_BASE + 0x068)
-#define NFP_MAC_STATS_RX_STATS_PKTS                    (NFP_MAC_STATS_BASE + 0x070)
-#define NFP_MAC_STATS_RX_STATS_UNDERSIZE_PKTS          (NFP_MAC_STATS_BASE + 0x078)
-#define NFP_MAC_STATS_RX_STATS_PKTS_64_OCTETS          (NFP_MAC_STATS_BASE + 0x080)
-#define NFP_MAC_STATS_RX_STATS_PKTS_65_TO_127_OCTETS   (NFP_MAC_STATS_BASE + 0x088)
-#define NFP_MAC_STATS_RX_STATS_PKTS_512_TO_1023_OCTETS (NFP_MAC_STATS_BASE + 0x090)
-#define NFP_MAC_STATS_RX_STATS_PKTS_1024_TO_1518_OCTETS        (NFP_MAC_STATS_BASE + 0x098)
-#define NFP_MAC_STATS_RX_STATS_JABBERS                 (NFP_MAC_STATS_BASE + 0x0a0)
-#define NFP_MAC_STATS_RX_STATS_FRAGMENTS               (NFP_MAC_STATS_BASE + 0x0a8)
+#define NFP_MAC_STATS_RX_PKTS                          (NFP_MAC_STATS_BASE + 0x070)
+#define NFP_MAC_STATS_RX_UNDERSIZE_PKTS                        (NFP_MAC_STATS_BASE + 0x078)
+#define NFP_MAC_STATS_RX_PKTS_64_OCTETS                        (NFP_MAC_STATS_BASE + 0x080)
+#define NFP_MAC_STATS_RX_PKTS_65_TO_127_OCTETS         (NFP_MAC_STATS_BASE + 0x088)
+#define NFP_MAC_STATS_RX_PKTS_512_TO_1023_OCTETS       (NFP_MAC_STATS_BASE + 0x090)
+#define NFP_MAC_STATS_RX_PKTS_1024_TO_1518_OCTETS      (NFP_MAC_STATS_BASE + 0x098)
+#define NFP_MAC_STATS_RX_JABBERS                       (NFP_MAC_STATS_BASE + 0x0a0)
+#define NFP_MAC_STATS_RX_FRAGMENTS                     (NFP_MAC_STATS_BASE + 0x0a8)
 #define NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS2           (NFP_MAC_STATS_BASE + 0x0b0)
 #define NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS3           (NFP_MAC_STATS_BASE + 0x0b8)
-#define NFP_MAC_STATS_RX_STATS_PKTS_128_TO_255_OCTETS  (NFP_MAC_STATS_BASE + 0x0c0)
-#define NFP_MAC_STATS_RX_STATS_PKTS_256_TO_511_OCTETS  (NFP_MAC_STATS_BASE + 0x0c8)
-#define NFP_MAC_STATS_RX_STATS_PKTS_1519_TO_MAX_OCTETS (NFP_MAC_STATS_BASE + 0x0d0)
+#define NFP_MAC_STATS_RX_PKTS_128_TO_255_OCTETS                (NFP_MAC_STATS_BASE + 0x0c0)
+#define NFP_MAC_STATS_RX_PKTS_256_TO_511_OCTETS                (NFP_MAC_STATS_BASE + 0x0c8)
+#define NFP_MAC_STATS_RX_PKTS_1519_TO_MAX_OCTETS       (NFP_MAC_STATS_BASE + 0x0d0)
 #define NFP_MAC_STATS_RX_OVERSIZE_PKTS                 (NFP_MAC_STATS_BASE + 0x0d8)
 #define NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS0           (NFP_MAC_STATS_BASE + 0x0e0)
 #define NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS1           (NFP_MAC_STATS_BASE + 0x0e8)
@@ -181,9 +182,12 @@ void nfp_devlink_port_unregister(struct nfp_port *port);
 #define NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS7           (NFP_MAC_STATS_BASE + 0x108)
 #define NFP_MAC_STATS_RX_MAC_CTRL_FRAMES_RECEIVED      (NFP_MAC_STATS_BASE + 0x110)
 #define NFP_MAC_STATS_RX_MAC_HEAD_DROP                 (NFP_MAC_STATS_BASE + 0x118)
-
+                                                       /* unused 0x120 */
+                                                       /* unused 0x128 */
+                                                       /* unused 0x130 */
 #define NFP_MAC_STATS_TX_QUEUE_DROP                    (NFP_MAC_STATS_BASE + 0x138)
 #define NFP_MAC_STATS_TX_OUT_OCTETS                    (NFP_MAC_STATS_BASE + 0x140)
+                                                       /* unused 0x148 */
 #define NFP_MAC_STATS_TX_VLAN_TRANSMITTED_OK           (NFP_MAC_STATS_BASE + 0x150)
 #define NFP_MAC_STATS_TX_OUT_ERRORS                    (NFP_MAC_STATS_BASE + 0x158)
 #define NFP_MAC_STATS_TX_BROADCAST_PKTS                        (NFP_MAC_STATS_BASE + 0x160)
@@ -195,8 +199,16 @@ void nfp_devlink_port_unregister(struct nfp_port *port);
 #define NFP_MAC_STATS_TX_UNICAST_PKTS                  (NFP_MAC_STATS_BASE + 0x190)
 #define NFP_MAC_STATS_TX_MULTICAST_PKTS                        (NFP_MAC_STATS_BASE + 0x198)
 #define NFP_MAC_STATS_TX_PKTS_65_TO_127_OCTETS         (NFP_MAC_STATS_BASE + 0x1a0)
-#define NFP_MAC_STATS_TX_PKTS_127_TO_512_OCTETS                (NFP_MAC_STATS_BASE + 0x1a8)
-#define NFP_MAC_STATS_TX_PKTS_128_TO_1518_OCTETS       (NFP_MAC_STATS_BASE + 0x1b0)
-#define NFP_MAC_STATS_TX_PKTS_1518_TO_MAX_OCTETS       (NFP_MAC_STATS_BASE + 0x1b8)
+#define NFP_MAC_STATS_TX_PKTS_128_TO_255_OCTETS                (NFP_MAC_STATS_BASE + 0x1a8)
+#define NFP_MAC_STATS_TX_PKTS_1024_TO_1518_OCTETS      (NFP_MAC_STATS_BASE + 0x1b0)
+#define NFP_MAC_STATS_TX_PKTS_1519_TO_MAX_OCTETS       (NFP_MAC_STATS_BASE + 0x1b8)
+#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS0           (NFP_MAC_STATS_BASE + 0x1c0)
+#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS1           (NFP_MAC_STATS_BASE + 0x1c8)
+#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS4           (NFP_MAC_STATS_BASE + 0x1d0)
+#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS5           (NFP_MAC_STATS_BASE + 0x1d8)
+#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS2           (NFP_MAC_STATS_BASE + 0x1e0)
+#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS3           (NFP_MAC_STATS_BASE + 0x1e8)
+#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS6           (NFP_MAC_STATS_BASE + 0x1f0)
+#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS7           (NFP_MAC_STATS_BASE + 0x1f8)
 
 #endif