mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

The ICSSG firmware maintains set of stats called PA_STATS. Currently the driver only dumps 4 stats. Add support for dumping more stats. The offset for different stats are defined as MACROs in icssg_switch_map.h file. All the offsets are for Slice0. Slice1 offsets are slice0 + 4. The offset calculation is taken care while reading the stats in emac_update_hardware_stats(). The statistics are documented in Documentation/networking/device_drivers/icssg_prueth.rst Reviewed-by: Simon Horman <horms@kernel.org> Signed-off-by: MD Danish Anwar <danishanwar@ti.com> Link: https://patch.msgid.link/20250424095316.2643573-1-danishanwar@ti.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
204 lines
5.9 KiB
C
204 lines
5.9 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
/* Texas Instruments ICSSG Ethernet driver
|
|
*
|
|
* Copyright (C) 2018-2022 Texas Instruments Incorporated - https://www.ti.com/
|
|
*
|
|
*/
|
|
|
|
#ifndef __NET_TI_ICSSG_STATS_H
|
|
#define __NET_TI_ICSSG_STATS_H
|
|
|
|
#include "icssg_prueth.h"
|
|
|
|
#define STATS_TIME_LIMIT_1G_MS 25000 /* 25 seconds @ 1G */
|
|
|
|
struct miig_stats_regs {
|
|
/* Rx */
|
|
u32 rx_packets;
|
|
u32 rx_broadcast_frames;
|
|
u32 rx_multicast_frames;
|
|
u32 rx_crc_errors;
|
|
u32 rx_mii_error_frames;
|
|
u32 rx_odd_nibble_frames;
|
|
u32 rx_frame_max_size;
|
|
u32 rx_max_size_error_frames;
|
|
u32 rx_frame_min_size;
|
|
u32 rx_min_size_error_frames;
|
|
u32 rx_over_errors;
|
|
u32 rx_class0_hits;
|
|
u32 rx_class1_hits;
|
|
u32 rx_class2_hits;
|
|
u32 rx_class3_hits;
|
|
u32 rx_class4_hits;
|
|
u32 rx_class5_hits;
|
|
u32 rx_class6_hits;
|
|
u32 rx_class7_hits;
|
|
u32 rx_class8_hits;
|
|
u32 rx_class9_hits;
|
|
u32 rx_class10_hits;
|
|
u32 rx_class11_hits;
|
|
u32 rx_class12_hits;
|
|
u32 rx_class13_hits;
|
|
u32 rx_class14_hits;
|
|
u32 rx_class15_hits;
|
|
u32 rx_smd_frags;
|
|
u32 rx_bucket1_size;
|
|
u32 rx_bucket2_size;
|
|
u32 rx_bucket3_size;
|
|
u32 rx_bucket4_size;
|
|
u32 rx_64B_frames;
|
|
u32 rx_bucket1_frames;
|
|
u32 rx_bucket2_frames;
|
|
u32 rx_bucket3_frames;
|
|
u32 rx_bucket4_frames;
|
|
u32 rx_bucket5_frames;
|
|
u32 rx_bytes;
|
|
u32 rx_tx_total_bytes;
|
|
/* Tx */
|
|
u32 tx_packets;
|
|
u32 tx_broadcast_frames;
|
|
u32 tx_multicast_frames;
|
|
u32 tx_odd_nibble_frames;
|
|
u32 tx_underflow_errors;
|
|
u32 tx_frame_max_size;
|
|
u32 tx_max_size_error_frames;
|
|
u32 tx_frame_min_size;
|
|
u32 tx_min_size_error_frames;
|
|
u32 tx_bucket1_size;
|
|
u32 tx_bucket2_size;
|
|
u32 tx_bucket3_size;
|
|
u32 tx_bucket4_size;
|
|
u32 tx_64B_frames;
|
|
u32 tx_bucket1_frames;
|
|
u32 tx_bucket2_frames;
|
|
u32 tx_bucket3_frames;
|
|
u32 tx_bucket4_frames;
|
|
u32 tx_bucket5_frames;
|
|
u32 tx_bytes;
|
|
};
|
|
|
|
#define ICSSG_MIIG_STATS(field, stats_type) \
|
|
{ \
|
|
#field, \
|
|
offsetof(struct miig_stats_regs, field), \
|
|
stats_type \
|
|
}
|
|
|
|
struct icssg_miig_stats {
|
|
char name[ETH_GSTRING_LEN];
|
|
u32 offset;
|
|
bool standard_stats;
|
|
};
|
|
|
|
static const struct icssg_miig_stats icssg_all_miig_stats[] = {
|
|
/* Rx */
|
|
ICSSG_MIIG_STATS(rx_packets, true),
|
|
ICSSG_MIIG_STATS(rx_broadcast_frames, false),
|
|
ICSSG_MIIG_STATS(rx_multicast_frames, true),
|
|
ICSSG_MIIG_STATS(rx_crc_errors, true),
|
|
ICSSG_MIIG_STATS(rx_mii_error_frames, false),
|
|
ICSSG_MIIG_STATS(rx_odd_nibble_frames, false),
|
|
ICSSG_MIIG_STATS(rx_frame_max_size, true),
|
|
ICSSG_MIIG_STATS(rx_max_size_error_frames, false),
|
|
ICSSG_MIIG_STATS(rx_frame_min_size, true),
|
|
ICSSG_MIIG_STATS(rx_min_size_error_frames, false),
|
|
ICSSG_MIIG_STATS(rx_over_errors, true),
|
|
ICSSG_MIIG_STATS(rx_class0_hits, false),
|
|
ICSSG_MIIG_STATS(rx_class1_hits, false),
|
|
ICSSG_MIIG_STATS(rx_class2_hits, false),
|
|
ICSSG_MIIG_STATS(rx_class3_hits, false),
|
|
ICSSG_MIIG_STATS(rx_class4_hits, false),
|
|
ICSSG_MIIG_STATS(rx_class5_hits, false),
|
|
ICSSG_MIIG_STATS(rx_class6_hits, false),
|
|
ICSSG_MIIG_STATS(rx_class7_hits, false),
|
|
ICSSG_MIIG_STATS(rx_class8_hits, false),
|
|
ICSSG_MIIG_STATS(rx_class9_hits, false),
|
|
ICSSG_MIIG_STATS(rx_class10_hits, false),
|
|
ICSSG_MIIG_STATS(rx_class11_hits, false),
|
|
ICSSG_MIIG_STATS(rx_class12_hits, false),
|
|
ICSSG_MIIG_STATS(rx_class13_hits, false),
|
|
ICSSG_MIIG_STATS(rx_class14_hits, false),
|
|
ICSSG_MIIG_STATS(rx_class15_hits, false),
|
|
ICSSG_MIIG_STATS(rx_smd_frags, false),
|
|
ICSSG_MIIG_STATS(rx_bucket1_size, true),
|
|
ICSSG_MIIG_STATS(rx_bucket2_size, true),
|
|
ICSSG_MIIG_STATS(rx_bucket3_size, true),
|
|
ICSSG_MIIG_STATS(rx_bucket4_size, true),
|
|
ICSSG_MIIG_STATS(rx_64B_frames, true),
|
|
ICSSG_MIIG_STATS(rx_bucket1_frames, true),
|
|
ICSSG_MIIG_STATS(rx_bucket2_frames, true),
|
|
ICSSG_MIIG_STATS(rx_bucket3_frames, true),
|
|
ICSSG_MIIG_STATS(rx_bucket4_frames, true),
|
|
ICSSG_MIIG_STATS(rx_bucket5_frames, true),
|
|
ICSSG_MIIG_STATS(rx_bytes, true),
|
|
ICSSG_MIIG_STATS(rx_tx_total_bytes, false),
|
|
/* Tx */
|
|
ICSSG_MIIG_STATS(tx_packets, true),
|
|
ICSSG_MIIG_STATS(tx_broadcast_frames, false),
|
|
ICSSG_MIIG_STATS(tx_multicast_frames, false),
|
|
ICSSG_MIIG_STATS(tx_odd_nibble_frames, false),
|
|
ICSSG_MIIG_STATS(tx_underflow_errors, false),
|
|
ICSSG_MIIG_STATS(tx_frame_max_size, true),
|
|
ICSSG_MIIG_STATS(tx_max_size_error_frames, false),
|
|
ICSSG_MIIG_STATS(tx_frame_min_size, true),
|
|
ICSSG_MIIG_STATS(tx_min_size_error_frames, false),
|
|
ICSSG_MIIG_STATS(tx_bucket1_size, true),
|
|
ICSSG_MIIG_STATS(tx_bucket2_size, true),
|
|
ICSSG_MIIG_STATS(tx_bucket3_size, true),
|
|
ICSSG_MIIG_STATS(tx_bucket4_size, true),
|
|
ICSSG_MIIG_STATS(tx_64B_frames, true),
|
|
ICSSG_MIIG_STATS(tx_bucket1_frames, true),
|
|
ICSSG_MIIG_STATS(tx_bucket2_frames, true),
|
|
ICSSG_MIIG_STATS(tx_bucket3_frames, true),
|
|
ICSSG_MIIG_STATS(tx_bucket4_frames, true),
|
|
ICSSG_MIIG_STATS(tx_bucket5_frames, true),
|
|
ICSSG_MIIG_STATS(tx_bytes, true),
|
|
};
|
|
|
|
#define ICSSG_PA_STATS(field) \
|
|
{ \
|
|
#field, \
|
|
field, \
|
|
}
|
|
|
|
struct icssg_pa_stats {
|
|
char name[ETH_GSTRING_LEN];
|
|
u32 offset;
|
|
};
|
|
|
|
static const struct icssg_pa_stats icssg_all_pa_stats[] = {
|
|
ICSSG_PA_STATS(FW_RTU_PKT_DROP),
|
|
ICSSG_PA_STATS(FW_Q0_OVERFLOW),
|
|
ICSSG_PA_STATS(FW_Q1_OVERFLOW),
|
|
ICSSG_PA_STATS(FW_Q2_OVERFLOW),
|
|
ICSSG_PA_STATS(FW_Q3_OVERFLOW),
|
|
ICSSG_PA_STATS(FW_Q4_OVERFLOW),
|
|
ICSSG_PA_STATS(FW_Q5_OVERFLOW),
|
|
ICSSG_PA_STATS(FW_Q6_OVERFLOW),
|
|
ICSSG_PA_STATS(FW_Q7_OVERFLOW),
|
|
ICSSG_PA_STATS(FW_DROPPED_PKT),
|
|
ICSSG_PA_STATS(FW_RX_ERROR),
|
|
ICSSG_PA_STATS(FW_RX_DS_INVALID),
|
|
ICSSG_PA_STATS(FW_TX_DROPPED_PACKET),
|
|
ICSSG_PA_STATS(FW_TX_TS_DROPPED_PACKET),
|
|
ICSSG_PA_STATS(FW_INF_PORT_DISABLED),
|
|
ICSSG_PA_STATS(FW_INF_SAV),
|
|
ICSSG_PA_STATS(FW_INF_SA_DL),
|
|
ICSSG_PA_STATS(FW_INF_PORT_BLOCKED),
|
|
ICSSG_PA_STATS(FW_INF_DROP_TAGGED),
|
|
ICSSG_PA_STATS(FW_INF_DROP_PRIOTAGGED),
|
|
ICSSG_PA_STATS(FW_INF_DROP_NOTAG),
|
|
ICSSG_PA_STATS(FW_INF_DROP_NOTMEMBER),
|
|
ICSSG_PA_STATS(FW_RX_EOF_SHORT_FRMERR),
|
|
ICSSG_PA_STATS(FW_RX_B0_DROP_EARLY_EOF),
|
|
ICSSG_PA_STATS(FW_TX_JUMBO_FRM_CUTOFF),
|
|
ICSSG_PA_STATS(FW_RX_EXP_FRAG_Q_DROP),
|
|
ICSSG_PA_STATS(FW_RX_FIFO_OVERRUN),
|
|
ICSSG_PA_STATS(FW_CUT_THR_PKT),
|
|
ICSSG_PA_STATS(FW_HOST_RX_PKT_CNT),
|
|
ICSSG_PA_STATS(FW_HOST_TX_PKT_CNT),
|
|
ICSSG_PA_STATS(FW_HOST_EGRESS_Q_PRE_OVERFLOW),
|
|
ICSSG_PA_STATS(FW_HOST_EGRESS_Q_EXP_OVERFLOW),
|
|
};
|
|
|
|
#endif /* __NET_TI_ICSSG_STATS_H */
|