Skip to content

Commit 098ce84

Browse files
Jakub Kicinskidavem330
authored andcommitted
nfp: report MAC statistics in ethtool
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>
1 parent 7344bea commit 098ce84

File tree

2 files changed

+153
-17
lines changed

2 files changed

+153
-17
lines changed

drivers/net/ethernet/netronome/nfp/nfp_net_ethtool.c

Lines changed: 125 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,86 @@ static const struct nfp_et_stat nfp_net_et_stats[] = {
9999
{ "bpf_app3_bytes", NFP_NET_CFG_STATS_APP3_BYTES },
100100
};
101101

102+
static const struct nfp_et_stat nfp_mac_et_stats[] = {
103+
{ "rx_octets", NFP_MAC_STATS_RX_IN_OCTETS, },
104+
{ "rx_frame_too_long_errors",
105+
NFP_MAC_STATS_RX_FRAME_TOO_LONG_ERRORS, },
106+
{ "rx_range_length_errors", NFP_MAC_STATS_RX_RANGE_LENGTH_ERRORS, },
107+
{ "rx_vlan_reveive_ok", NFP_MAC_STATS_RX_VLAN_REVEIVE_OK, },
108+
{ "rx_errors", NFP_MAC_STATS_RX_IN_ERRORS, },
109+
{ "rx_broadcast_pkts", NFP_MAC_STATS_RX_IN_BROADCAST_PKTS, },
110+
{ "rx_drop_events", NFP_MAC_STATS_RX_DROP_EVENTS, },
111+
{ "rx_alignment_errors", NFP_MAC_STATS_RX_ALIGNMENT_ERRORS, },
112+
{ "rx_pause_mac_ctrl_frames",
113+
NFP_MAC_STATS_RX_PAUSE_MAC_CTRL_FRAMES, },
114+
{ "rx_frames_received_ok", NFP_MAC_STATS_RX_FRAMES_RECEIVED_OK, },
115+
{ "rx_frame_check_sequence_errors",
116+
NFP_MAC_STATS_RX_FRAME_CHECK_SEQUENCE_ERRORS, },
117+
{ "rx_unicast_pkts", NFP_MAC_STATS_RX_UNICAST_PKTS, },
118+
{ "rx_multicast_pkts", NFP_MAC_STATS_RX_MULTICAST_PKTS, },
119+
{ "rx_pkts", NFP_MAC_STATS_RX_PKTS, },
120+
{ "rx_undersize_pkts", NFP_MAC_STATS_RX_UNDERSIZE_PKTS, },
121+
{ "rx_pkts_64_octets", NFP_MAC_STATS_RX_PKTS_64_OCTETS, },
122+
{ "rx_pkts_65_to_127_octets",
123+
NFP_MAC_STATS_RX_PKTS_65_TO_127_OCTETS, },
124+
{ "rx_pkts_128_to_255_octets",
125+
NFP_MAC_STATS_RX_PKTS_128_TO_255_OCTETS, },
126+
{ "rx_pkts_256_to_511_octets",
127+
NFP_MAC_STATS_RX_PKTS_256_TO_511_OCTETS, },
128+
{ "rx_pkts_512_to_1023_octets",
129+
NFP_MAC_STATS_RX_PKTS_512_TO_1023_OCTETS, },
130+
{ "rx_pkts_1024_to_1518_octets",
131+
NFP_MAC_STATS_RX_PKTS_1024_TO_1518_OCTETS, },
132+
{ "rx_pkts_1519_to_max_octets",
133+
NFP_MAC_STATS_RX_PKTS_1519_TO_MAX_OCTETS, },
134+
{ "rx_jabbers", NFP_MAC_STATS_RX_JABBERS, },
135+
{ "rx_fragments", NFP_MAC_STATS_RX_FRAGMENTS, },
136+
{ "rx_oversize_pkts", NFP_MAC_STATS_RX_OVERSIZE_PKTS, },
137+
{ "rx_pause_frames_class0", NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS0, },
138+
{ "rx_pause_frames_class1", NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS1, },
139+
{ "rx_pause_frames_class2", NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS2, },
140+
{ "rx_pause_frames_class3", NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS3, },
141+
{ "rx_pause_frames_class4", NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS4, },
142+
{ "rx_pause_frames_class5", NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS5, },
143+
{ "rx_pause_frames_class6", NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS6, },
144+
{ "rx_pause_frames_class7", NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS7, },
145+
{ "rx_mac_ctrl_frames_received",
146+
NFP_MAC_STATS_RX_MAC_CTRL_FRAMES_RECEIVED, },
147+
{ "rx_mac_head_drop", NFP_MAC_STATS_RX_MAC_HEAD_DROP, },
148+
{ "tx_queue_drop", NFP_MAC_STATS_TX_QUEUE_DROP, },
149+
{ "tx_octets", NFP_MAC_STATS_TX_OUT_OCTETS, },
150+
{ "tx_vlan_transmitted_ok", NFP_MAC_STATS_TX_VLAN_TRANSMITTED_OK, },
151+
{ "tx_errors", NFP_MAC_STATS_TX_OUT_ERRORS, },
152+
{ "tx_broadcast_pkts", NFP_MAC_STATS_TX_BROADCAST_PKTS, },
153+
{ "tx_pause_mac_ctrl_frames",
154+
NFP_MAC_STATS_TX_PAUSE_MAC_CTRL_FRAMES, },
155+
{ "tx_frames_transmitted_ok",
156+
NFP_MAC_STATS_TX_FRAMES_TRANSMITTED_OK, },
157+
{ "tx_unicast_pkts", NFP_MAC_STATS_TX_UNICAST_PKTS, },
158+
{ "tx_multicast_pkts", NFP_MAC_STATS_TX_MULTICAST_PKTS, },
159+
{ "tx_pkts_64_octets", NFP_MAC_STATS_TX_PKTS_64_OCTETS, },
160+
{ "tx_pkts_65_to_127_octets",
161+
NFP_MAC_STATS_TX_PKTS_65_TO_127_OCTETS, },
162+
{ "tx_pkts_128_to_255_octets",
163+
NFP_MAC_STATS_TX_PKTS_128_TO_255_OCTETS, },
164+
{ "tx_pkts_256_to_511_octets",
165+
NFP_MAC_STATS_TX_PKTS_256_TO_511_OCTETS, },
166+
{ "tx_pkts_512_to_1023_octets",
167+
NFP_MAC_STATS_TX_PKTS_512_TO_1023_OCTETS, },
168+
{ "tx_pkts_1024_to_1518_octets",
169+
NFP_MAC_STATS_TX_PKTS_1024_TO_1518_OCTETS, },
170+
{ "tx_pkts_1519_to_max_octets",
171+
NFP_MAC_STATS_TX_PKTS_1519_TO_MAX_OCTETS, },
172+
{ "tx_pause_frames_class0", NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS0, },
173+
{ "tx_pause_frames_class1", NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS1, },
174+
{ "tx_pause_frames_class2", NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS2, },
175+
{ "tx_pause_frames_class3", NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS3, },
176+
{ "tx_pause_frames_class4", NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS4, },
177+
{ "tx_pause_frames_class5", NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS5, },
178+
{ "tx_pause_frames_class6", NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS6, },
179+
{ "tx_pause_frames_class7", NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS7, },
180+
};
181+
102182
#define NN_ET_GLOBAL_STATS_LEN ARRAY_SIZE(nfp_net_et_stats)
103183
#define NN_ET_RVEC_GATHER_STATS 7
104184

@@ -459,6 +539,47 @@ nfp_vnic_get_hw_stats(u64 *data, u8 __iomem *mem,
459539
return data;
460540
}
461541

542+
static unsigned int nfp_mac_get_stats_count(struct net_device *netdev)
543+
{
544+
struct nfp_port *port;
545+
546+
port = nfp_port_from_netdev(netdev);
547+
if (!__nfp_port_get_eth_port(port) || !port->eth_stats)
548+
return 0;
549+
550+
return ARRAY_SIZE(nfp_mac_et_stats);
551+
}
552+
553+
static u8 *nfp_mac_get_stats_strings(struct net_device *netdev, u8 *data)
554+
{
555+
struct nfp_port *port;
556+
unsigned int i;
557+
558+
port = nfp_port_from_netdev(netdev);
559+
if (!__nfp_port_get_eth_port(port) || !port->eth_stats)
560+
return data;
561+
562+
for (i = 0; i < ARRAY_SIZE(nfp_mac_et_stats); i++)
563+
data = nfp_pr_et(data, "mac.%s", nfp_mac_et_stats[i].name);
564+
565+
return data;
566+
}
567+
568+
static u64 *nfp_mac_get_stats(struct net_device *netdev, u64 *data)
569+
{
570+
struct nfp_port *port;
571+
unsigned int i;
572+
573+
port = nfp_port_from_netdev(netdev);
574+
if (!__nfp_port_get_eth_port(port) || !port->eth_stats)
575+
return data;
576+
577+
for (i = 0; i < ARRAY_SIZE(nfp_mac_et_stats); i++)
578+
*data++ = readq(port->eth_stats + nfp_mac_et_stats[i].off);
579+
580+
return data;
581+
}
582+
462583
static void nfp_net_get_strings(struct net_device *netdev,
463584
u32 stringset, u8 *data)
464585
{
@@ -469,6 +590,7 @@ static void nfp_net_get_strings(struct net_device *netdev,
469590
data = nfp_vnic_get_sw_stats_strings(netdev, data);
470591
data = nfp_vnic_get_hw_stats_strings(data, nn->dp.num_rx_rings,
471592
nn->dp.num_tx_rings);
593+
data = nfp_mac_get_stats_strings(netdev, data);
472594
break;
473595
}
474596
}
@@ -482,6 +604,7 @@ nfp_net_get_stats(struct net_device *netdev, struct ethtool_stats *stats,
482604
data = nfp_vnic_get_sw_stats(netdev, data);
483605
data = nfp_vnic_get_hw_stats(data, nn->dp.ctrl_bar,
484606
nn->dp.num_rx_rings, nn->dp.num_tx_rings);
607+
data = nfp_mac_get_stats(netdev, data);
485608
}
486609

487610
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)
492615
case ETH_SS_STATS:
493616
return nfp_vnic_get_sw_stats_count(netdev) +
494617
nfp_vnic_get_hw_stats_count(nn->dp.num_rx_rings,
495-
nn->dp.num_tx_rings);
618+
nn->dp.num_tx_rings) +
619+
nfp_mac_get_stats_count(netdev);
496620
default:
497621
return -EOPNOTSUPP;
498622
}

drivers/net/ethernet/netronome/nfp/nfp_port.h

Lines changed: 28 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -147,31 +147,32 @@ void nfp_devlink_port_unregister(struct nfp_port *port);
147147
#define NFP_MAC_STATS_SIZE 0x0200
148148

149149
#define NFP_MAC_STATS_RX_IN_OCTETS (NFP_MAC_STATS_BASE + 0x000)
150+
/* unused 0x008 */
150151
#define NFP_MAC_STATS_RX_FRAME_TOO_LONG_ERRORS (NFP_MAC_STATS_BASE + 0x010)
151152
#define NFP_MAC_STATS_RX_RANGE_LENGTH_ERRORS (NFP_MAC_STATS_BASE + 0x018)
152153
#define NFP_MAC_STATS_RX_VLAN_REVEIVE_OK (NFP_MAC_STATS_BASE + 0x020)
153154
#define NFP_MAC_STATS_RX_IN_ERRORS (NFP_MAC_STATS_BASE + 0x028)
154155
#define NFP_MAC_STATS_RX_IN_BROADCAST_PKTS (NFP_MAC_STATS_BASE + 0x030)
155-
#define NFP_MAC_STATS_RX_STATS_DROP_EVENTS (NFP_MAC_STATS_BASE + 0x038)
156+
#define NFP_MAC_STATS_RX_DROP_EVENTS (NFP_MAC_STATS_BASE + 0x038)
156157
#define NFP_MAC_STATS_RX_ALIGNMENT_ERRORS (NFP_MAC_STATS_BASE + 0x040)
157158
#define NFP_MAC_STATS_RX_PAUSE_MAC_CTRL_FRAMES (NFP_MAC_STATS_BASE + 0x048)
158159
#define NFP_MAC_STATS_RX_FRAMES_RECEIVED_OK (NFP_MAC_STATS_BASE + 0x050)
159160
#define NFP_MAC_STATS_RX_FRAME_CHECK_SEQUENCE_ERRORS (NFP_MAC_STATS_BASE + 0x058)
160161
#define NFP_MAC_STATS_RX_UNICAST_PKTS (NFP_MAC_STATS_BASE + 0x060)
161162
#define NFP_MAC_STATS_RX_MULTICAST_PKTS (NFP_MAC_STATS_BASE + 0x068)
162-
#define NFP_MAC_STATS_RX_STATS_PKTS (NFP_MAC_STATS_BASE + 0x070)
163-
#define NFP_MAC_STATS_RX_STATS_UNDERSIZE_PKTS (NFP_MAC_STATS_BASE + 0x078)
164-
#define NFP_MAC_STATS_RX_STATS_PKTS_64_OCTETS (NFP_MAC_STATS_BASE + 0x080)
165-
#define NFP_MAC_STATS_RX_STATS_PKTS_65_TO_127_OCTETS (NFP_MAC_STATS_BASE + 0x088)
166-
#define NFP_MAC_STATS_RX_STATS_PKTS_512_TO_1023_OCTETS (NFP_MAC_STATS_BASE + 0x090)
167-
#define NFP_MAC_STATS_RX_STATS_PKTS_1024_TO_1518_OCTETS (NFP_MAC_STATS_BASE + 0x098)
168-
#define NFP_MAC_STATS_RX_STATS_JABBERS (NFP_MAC_STATS_BASE + 0x0a0)
169-
#define NFP_MAC_STATS_RX_STATS_FRAGMENTS (NFP_MAC_STATS_BASE + 0x0a8)
163+
#define NFP_MAC_STATS_RX_PKTS (NFP_MAC_STATS_BASE + 0x070)
164+
#define NFP_MAC_STATS_RX_UNDERSIZE_PKTS (NFP_MAC_STATS_BASE + 0x078)
165+
#define NFP_MAC_STATS_RX_PKTS_64_OCTETS (NFP_MAC_STATS_BASE + 0x080)
166+
#define NFP_MAC_STATS_RX_PKTS_65_TO_127_OCTETS (NFP_MAC_STATS_BASE + 0x088)
167+
#define NFP_MAC_STATS_RX_PKTS_512_TO_1023_OCTETS (NFP_MAC_STATS_BASE + 0x090)
168+
#define NFP_MAC_STATS_RX_PKTS_1024_TO_1518_OCTETS (NFP_MAC_STATS_BASE + 0x098)
169+
#define NFP_MAC_STATS_RX_JABBERS (NFP_MAC_STATS_BASE + 0x0a0)
170+
#define NFP_MAC_STATS_RX_FRAGMENTS (NFP_MAC_STATS_BASE + 0x0a8)
170171
#define NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS2 (NFP_MAC_STATS_BASE + 0x0b0)
171172
#define NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS3 (NFP_MAC_STATS_BASE + 0x0b8)
172-
#define NFP_MAC_STATS_RX_STATS_PKTS_128_TO_255_OCTETS (NFP_MAC_STATS_BASE + 0x0c0)
173-
#define NFP_MAC_STATS_RX_STATS_PKTS_256_TO_511_OCTETS (NFP_MAC_STATS_BASE + 0x0c8)
174-
#define NFP_MAC_STATS_RX_STATS_PKTS_1519_TO_MAX_OCTETS (NFP_MAC_STATS_BASE + 0x0d0)
173+
#define NFP_MAC_STATS_RX_PKTS_128_TO_255_OCTETS (NFP_MAC_STATS_BASE + 0x0c0)
174+
#define NFP_MAC_STATS_RX_PKTS_256_TO_511_OCTETS (NFP_MAC_STATS_BASE + 0x0c8)
175+
#define NFP_MAC_STATS_RX_PKTS_1519_TO_MAX_OCTETS (NFP_MAC_STATS_BASE + 0x0d0)
175176
#define NFP_MAC_STATS_RX_OVERSIZE_PKTS (NFP_MAC_STATS_BASE + 0x0d8)
176177
#define NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS0 (NFP_MAC_STATS_BASE + 0x0e0)
177178
#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);
181182
#define NFP_MAC_STATS_RX_PAUSE_FRAMES_CLASS7 (NFP_MAC_STATS_BASE + 0x108)
182183
#define NFP_MAC_STATS_RX_MAC_CTRL_FRAMES_RECEIVED (NFP_MAC_STATS_BASE + 0x110)
183184
#define NFP_MAC_STATS_RX_MAC_HEAD_DROP (NFP_MAC_STATS_BASE + 0x118)
184-
185+
/* unused 0x120 */
186+
/* unused 0x128 */
187+
/* unused 0x130 */
185188
#define NFP_MAC_STATS_TX_QUEUE_DROP (NFP_MAC_STATS_BASE + 0x138)
186189
#define NFP_MAC_STATS_TX_OUT_OCTETS (NFP_MAC_STATS_BASE + 0x140)
190+
/* unused 0x148 */
187191
#define NFP_MAC_STATS_TX_VLAN_TRANSMITTED_OK (NFP_MAC_STATS_BASE + 0x150)
188192
#define NFP_MAC_STATS_TX_OUT_ERRORS (NFP_MAC_STATS_BASE + 0x158)
189193
#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);
195199
#define NFP_MAC_STATS_TX_UNICAST_PKTS (NFP_MAC_STATS_BASE + 0x190)
196200
#define NFP_MAC_STATS_TX_MULTICAST_PKTS (NFP_MAC_STATS_BASE + 0x198)
197201
#define NFP_MAC_STATS_TX_PKTS_65_TO_127_OCTETS (NFP_MAC_STATS_BASE + 0x1a0)
198-
#define NFP_MAC_STATS_TX_PKTS_127_TO_512_OCTETS (NFP_MAC_STATS_BASE + 0x1a8)
199-
#define NFP_MAC_STATS_TX_PKTS_128_TO_1518_OCTETS (NFP_MAC_STATS_BASE + 0x1b0)
200-
#define NFP_MAC_STATS_TX_PKTS_1518_TO_MAX_OCTETS (NFP_MAC_STATS_BASE + 0x1b8)
202+
#define NFP_MAC_STATS_TX_PKTS_128_TO_255_OCTETS (NFP_MAC_STATS_BASE + 0x1a8)
203+
#define NFP_MAC_STATS_TX_PKTS_1024_TO_1518_OCTETS (NFP_MAC_STATS_BASE + 0x1b0)
204+
#define NFP_MAC_STATS_TX_PKTS_1519_TO_MAX_OCTETS (NFP_MAC_STATS_BASE + 0x1b8)
205+
#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS0 (NFP_MAC_STATS_BASE + 0x1c0)
206+
#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS1 (NFP_MAC_STATS_BASE + 0x1c8)
207+
#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS4 (NFP_MAC_STATS_BASE + 0x1d0)
208+
#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS5 (NFP_MAC_STATS_BASE + 0x1d8)
209+
#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS2 (NFP_MAC_STATS_BASE + 0x1e0)
210+
#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS3 (NFP_MAC_STATS_BASE + 0x1e8)
211+
#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS6 (NFP_MAC_STATS_BASE + 0x1f0)
212+
#define NFP_MAC_STATS_TX_PAUSE_FRAMES_CLASS7 (NFP_MAC_STATS_BASE + 0x1f8)
201213

202214
#endif

0 commit comments

Comments
 (0)