162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci/* Microchip Sparx5 Switch driver 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (c) 2021 Microchip Technology Inc. and its subsidiaries. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include <linux/ethtool.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "sparx5_main_regs.h" 1062306a36Sopenharmony_ci#include "sparx5_main.h" 1162306a36Sopenharmony_ci#include "sparx5_port.h" 1262306a36Sopenharmony_ci 1362306a36Sopenharmony_ci/* Index of ANA_AC port counters */ 1462306a36Sopenharmony_ci#define SPX5_PORT_POLICER_DROPS 0 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci/* Add a potentially wrapping 32 bit value to a 64 bit counter */ 1762306a36Sopenharmony_cistatic void sparx5_update_counter(u64 *cnt, u32 val) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci if (val < (*cnt & U32_MAX)) 2062306a36Sopenharmony_ci *cnt += (u64)1 << 32; /* value has wrapped */ 2162306a36Sopenharmony_ci *cnt = (*cnt & ~(u64)U32_MAX) + val; 2262306a36Sopenharmony_ci} 2362306a36Sopenharmony_ci 2462306a36Sopenharmony_cienum sparx5_stats_entry { 2562306a36Sopenharmony_ci spx5_stats_rx_symbol_err_cnt = 0, 2662306a36Sopenharmony_ci spx5_stats_pmac_rx_symbol_err_cnt = 1, 2762306a36Sopenharmony_ci spx5_stats_tx_uc_cnt = 2, 2862306a36Sopenharmony_ci spx5_stats_pmac_tx_uc_cnt = 3, 2962306a36Sopenharmony_ci spx5_stats_tx_mc_cnt = 4, 3062306a36Sopenharmony_ci spx5_stats_tx_bc_cnt = 5, 3162306a36Sopenharmony_ci spx5_stats_tx_backoff1_cnt = 6, 3262306a36Sopenharmony_ci spx5_stats_tx_multi_coll_cnt = 7, 3362306a36Sopenharmony_ci spx5_stats_rx_uc_cnt = 8, 3462306a36Sopenharmony_ci spx5_stats_pmac_rx_uc_cnt = 9, 3562306a36Sopenharmony_ci spx5_stats_rx_mc_cnt = 10, 3662306a36Sopenharmony_ci spx5_stats_rx_bc_cnt = 11, 3762306a36Sopenharmony_ci spx5_stats_rx_crc_err_cnt = 12, 3862306a36Sopenharmony_ci spx5_stats_pmac_rx_crc_err_cnt = 13, 3962306a36Sopenharmony_ci spx5_stats_rx_alignment_lost_cnt = 14, 4062306a36Sopenharmony_ci spx5_stats_pmac_rx_alignment_lost_cnt = 15, 4162306a36Sopenharmony_ci spx5_stats_tx_ok_bytes_cnt = 16, 4262306a36Sopenharmony_ci spx5_stats_pmac_tx_ok_bytes_cnt = 17, 4362306a36Sopenharmony_ci spx5_stats_tx_defer_cnt = 18, 4462306a36Sopenharmony_ci spx5_stats_tx_late_coll_cnt = 19, 4562306a36Sopenharmony_ci spx5_stats_tx_xcoll_cnt = 20, 4662306a36Sopenharmony_ci spx5_stats_tx_csense_cnt = 21, 4762306a36Sopenharmony_ci spx5_stats_rx_ok_bytes_cnt = 22, 4862306a36Sopenharmony_ci spx5_stats_pmac_rx_ok_bytes_cnt = 23, 4962306a36Sopenharmony_ci spx5_stats_pmac_tx_mc_cnt = 24, 5062306a36Sopenharmony_ci spx5_stats_pmac_tx_bc_cnt = 25, 5162306a36Sopenharmony_ci spx5_stats_tx_xdefer_cnt = 26, 5262306a36Sopenharmony_ci spx5_stats_pmac_rx_mc_cnt = 27, 5362306a36Sopenharmony_ci spx5_stats_pmac_rx_bc_cnt = 28, 5462306a36Sopenharmony_ci spx5_stats_rx_in_range_len_err_cnt = 29, 5562306a36Sopenharmony_ci spx5_stats_pmac_rx_in_range_len_err_cnt = 30, 5662306a36Sopenharmony_ci spx5_stats_rx_out_of_range_len_err_cnt = 31, 5762306a36Sopenharmony_ci spx5_stats_pmac_rx_out_of_range_len_err_cnt = 32, 5862306a36Sopenharmony_ci spx5_stats_rx_oversize_cnt = 33, 5962306a36Sopenharmony_ci spx5_stats_pmac_rx_oversize_cnt = 34, 6062306a36Sopenharmony_ci spx5_stats_tx_pause_cnt = 35, 6162306a36Sopenharmony_ci spx5_stats_pmac_tx_pause_cnt = 36, 6262306a36Sopenharmony_ci spx5_stats_rx_pause_cnt = 37, 6362306a36Sopenharmony_ci spx5_stats_pmac_rx_pause_cnt = 38, 6462306a36Sopenharmony_ci spx5_stats_rx_unsup_opcode_cnt = 39, 6562306a36Sopenharmony_ci spx5_stats_pmac_rx_unsup_opcode_cnt = 40, 6662306a36Sopenharmony_ci spx5_stats_rx_undersize_cnt = 41, 6762306a36Sopenharmony_ci spx5_stats_pmac_rx_undersize_cnt = 42, 6862306a36Sopenharmony_ci spx5_stats_rx_fragments_cnt = 43, 6962306a36Sopenharmony_ci spx5_stats_pmac_rx_fragments_cnt = 44, 7062306a36Sopenharmony_ci spx5_stats_rx_jabbers_cnt = 45, 7162306a36Sopenharmony_ci spx5_stats_pmac_rx_jabbers_cnt = 46, 7262306a36Sopenharmony_ci spx5_stats_rx_size64_cnt = 47, 7362306a36Sopenharmony_ci spx5_stats_pmac_rx_size64_cnt = 48, 7462306a36Sopenharmony_ci spx5_stats_rx_size65to127_cnt = 49, 7562306a36Sopenharmony_ci spx5_stats_pmac_rx_size65to127_cnt = 50, 7662306a36Sopenharmony_ci spx5_stats_rx_size128to255_cnt = 51, 7762306a36Sopenharmony_ci spx5_stats_pmac_rx_size128to255_cnt = 52, 7862306a36Sopenharmony_ci spx5_stats_rx_size256to511_cnt = 53, 7962306a36Sopenharmony_ci spx5_stats_pmac_rx_size256to511_cnt = 54, 8062306a36Sopenharmony_ci spx5_stats_rx_size512to1023_cnt = 55, 8162306a36Sopenharmony_ci spx5_stats_pmac_rx_size512to1023_cnt = 56, 8262306a36Sopenharmony_ci spx5_stats_rx_size1024to1518_cnt = 57, 8362306a36Sopenharmony_ci spx5_stats_pmac_rx_size1024to1518_cnt = 58, 8462306a36Sopenharmony_ci spx5_stats_rx_size1519tomax_cnt = 59, 8562306a36Sopenharmony_ci spx5_stats_pmac_rx_size1519tomax_cnt = 60, 8662306a36Sopenharmony_ci spx5_stats_tx_size64_cnt = 61, 8762306a36Sopenharmony_ci spx5_stats_pmac_tx_size64_cnt = 62, 8862306a36Sopenharmony_ci spx5_stats_tx_size65to127_cnt = 63, 8962306a36Sopenharmony_ci spx5_stats_pmac_tx_size65to127_cnt = 64, 9062306a36Sopenharmony_ci spx5_stats_tx_size128to255_cnt = 65, 9162306a36Sopenharmony_ci spx5_stats_pmac_tx_size128to255_cnt = 66, 9262306a36Sopenharmony_ci spx5_stats_tx_size256to511_cnt = 67, 9362306a36Sopenharmony_ci spx5_stats_pmac_tx_size256to511_cnt = 68, 9462306a36Sopenharmony_ci spx5_stats_tx_size512to1023_cnt = 69, 9562306a36Sopenharmony_ci spx5_stats_pmac_tx_size512to1023_cnt = 70, 9662306a36Sopenharmony_ci spx5_stats_tx_size1024to1518_cnt = 71, 9762306a36Sopenharmony_ci spx5_stats_pmac_tx_size1024to1518_cnt = 72, 9862306a36Sopenharmony_ci spx5_stats_tx_size1519tomax_cnt = 73, 9962306a36Sopenharmony_ci spx5_stats_pmac_tx_size1519tomax_cnt = 74, 10062306a36Sopenharmony_ci spx5_stats_mm_rx_assembly_err_cnt = 75, 10162306a36Sopenharmony_ci spx5_stats_mm_rx_assembly_ok_cnt = 76, 10262306a36Sopenharmony_ci spx5_stats_mm_rx_merge_frag_cnt = 77, 10362306a36Sopenharmony_ci spx5_stats_mm_rx_smd_err_cnt = 78, 10462306a36Sopenharmony_ci spx5_stats_mm_tx_pfragment_cnt = 79, 10562306a36Sopenharmony_ci spx5_stats_rx_bad_bytes_cnt = 80, 10662306a36Sopenharmony_ci spx5_stats_pmac_rx_bad_bytes_cnt = 81, 10762306a36Sopenharmony_ci spx5_stats_rx_in_bytes_cnt = 82, 10862306a36Sopenharmony_ci spx5_stats_rx_ipg_shrink_cnt = 83, 10962306a36Sopenharmony_ci spx5_stats_rx_sync_lost_err_cnt = 84, 11062306a36Sopenharmony_ci spx5_stats_rx_tagged_frms_cnt = 85, 11162306a36Sopenharmony_ci spx5_stats_rx_untagged_frms_cnt = 86, 11262306a36Sopenharmony_ci spx5_stats_tx_out_bytes_cnt = 87, 11362306a36Sopenharmony_ci spx5_stats_tx_tagged_frms_cnt = 88, 11462306a36Sopenharmony_ci spx5_stats_tx_untagged_frms_cnt = 89, 11562306a36Sopenharmony_ci spx5_stats_rx_hih_cksm_err_cnt = 90, 11662306a36Sopenharmony_ci spx5_stats_pmac_rx_hih_cksm_err_cnt = 91, 11762306a36Sopenharmony_ci spx5_stats_rx_xgmii_prot_err_cnt = 92, 11862306a36Sopenharmony_ci spx5_stats_pmac_rx_xgmii_prot_err_cnt = 93, 11962306a36Sopenharmony_ci spx5_stats_ana_ac_port_stat_lsb_cnt = 94, 12062306a36Sopenharmony_ci spx5_stats_green_p0_rx_fwd = 95, 12162306a36Sopenharmony_ci spx5_stats_green_p0_rx_port_drop = 111, 12262306a36Sopenharmony_ci spx5_stats_green_p0_tx_port = 127, 12362306a36Sopenharmony_ci spx5_stats_rx_local_drop = 143, 12462306a36Sopenharmony_ci spx5_stats_tx_local_drop = 144, 12562306a36Sopenharmony_ci spx5_stats_count = 145, 12662306a36Sopenharmony_ci}; 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_cistatic const char *const sparx5_stats_layout[] = { 12962306a36Sopenharmony_ci "mm_rx_assembly_err_cnt", 13062306a36Sopenharmony_ci "mm_rx_assembly_ok_cnt", 13162306a36Sopenharmony_ci "mm_rx_merge_frag_cnt", 13262306a36Sopenharmony_ci "mm_rx_smd_err_cnt", 13362306a36Sopenharmony_ci "mm_tx_pfragment_cnt", 13462306a36Sopenharmony_ci "rx_bad_bytes_cnt", 13562306a36Sopenharmony_ci "pmac_rx_bad_bytes_cnt", 13662306a36Sopenharmony_ci "rx_in_bytes_cnt", 13762306a36Sopenharmony_ci "rx_ipg_shrink_cnt", 13862306a36Sopenharmony_ci "rx_sync_lost_err_cnt", 13962306a36Sopenharmony_ci "rx_tagged_frms_cnt", 14062306a36Sopenharmony_ci "rx_untagged_frms_cnt", 14162306a36Sopenharmony_ci "tx_out_bytes_cnt", 14262306a36Sopenharmony_ci "tx_tagged_frms_cnt", 14362306a36Sopenharmony_ci "tx_untagged_frms_cnt", 14462306a36Sopenharmony_ci "rx_hih_cksm_err_cnt", 14562306a36Sopenharmony_ci "pmac_rx_hih_cksm_err_cnt", 14662306a36Sopenharmony_ci "rx_xgmii_prot_err_cnt", 14762306a36Sopenharmony_ci "pmac_rx_xgmii_prot_err_cnt", 14862306a36Sopenharmony_ci "rx_port_policer_drop", 14962306a36Sopenharmony_ci "rx_fwd_green_p0", 15062306a36Sopenharmony_ci "rx_fwd_green_p1", 15162306a36Sopenharmony_ci "rx_fwd_green_p2", 15262306a36Sopenharmony_ci "rx_fwd_green_p3", 15362306a36Sopenharmony_ci "rx_fwd_green_p4", 15462306a36Sopenharmony_ci "rx_fwd_green_p5", 15562306a36Sopenharmony_ci "rx_fwd_green_p6", 15662306a36Sopenharmony_ci "rx_fwd_green_p7", 15762306a36Sopenharmony_ci "rx_fwd_yellow_p0", 15862306a36Sopenharmony_ci "rx_fwd_yellow_p1", 15962306a36Sopenharmony_ci "rx_fwd_yellow_p2", 16062306a36Sopenharmony_ci "rx_fwd_yellow_p3", 16162306a36Sopenharmony_ci "rx_fwd_yellow_p4", 16262306a36Sopenharmony_ci "rx_fwd_yellow_p5", 16362306a36Sopenharmony_ci "rx_fwd_yellow_p6", 16462306a36Sopenharmony_ci "rx_fwd_yellow_p7", 16562306a36Sopenharmony_ci "rx_port_drop_green_p0", 16662306a36Sopenharmony_ci "rx_port_drop_green_p1", 16762306a36Sopenharmony_ci "rx_port_drop_green_p2", 16862306a36Sopenharmony_ci "rx_port_drop_green_p3", 16962306a36Sopenharmony_ci "rx_port_drop_green_p4", 17062306a36Sopenharmony_ci "rx_port_drop_green_p5", 17162306a36Sopenharmony_ci "rx_port_drop_green_p6", 17262306a36Sopenharmony_ci "rx_port_drop_green_p7", 17362306a36Sopenharmony_ci "rx_port_drop_yellow_p0", 17462306a36Sopenharmony_ci "rx_port_drop_yellow_p1", 17562306a36Sopenharmony_ci "rx_port_drop_yellow_p2", 17662306a36Sopenharmony_ci "rx_port_drop_yellow_p3", 17762306a36Sopenharmony_ci "rx_port_drop_yellow_p4", 17862306a36Sopenharmony_ci "rx_port_drop_yellow_p5", 17962306a36Sopenharmony_ci "rx_port_drop_yellow_p6", 18062306a36Sopenharmony_ci "rx_port_drop_yellow_p7", 18162306a36Sopenharmony_ci "tx_port_green_p0", 18262306a36Sopenharmony_ci "tx_port_green_p1", 18362306a36Sopenharmony_ci "tx_port_green_p2", 18462306a36Sopenharmony_ci "tx_port_green_p3", 18562306a36Sopenharmony_ci "tx_port_green_p4", 18662306a36Sopenharmony_ci "tx_port_green_p5", 18762306a36Sopenharmony_ci "tx_port_green_p6", 18862306a36Sopenharmony_ci "tx_port_green_p7", 18962306a36Sopenharmony_ci "tx_port_yellow_p0", 19062306a36Sopenharmony_ci "tx_port_yellow_p1", 19162306a36Sopenharmony_ci "tx_port_yellow_p2", 19262306a36Sopenharmony_ci "tx_port_yellow_p3", 19362306a36Sopenharmony_ci "tx_port_yellow_p4", 19462306a36Sopenharmony_ci "tx_port_yellow_p5", 19562306a36Sopenharmony_ci "tx_port_yellow_p6", 19662306a36Sopenharmony_ci "tx_port_yellow_p7", 19762306a36Sopenharmony_ci "rx_local_drop", 19862306a36Sopenharmony_ci "tx_local_drop", 19962306a36Sopenharmony_ci}; 20062306a36Sopenharmony_ci 20162306a36Sopenharmony_cistatic void sparx5_get_queue_sys_stats(struct sparx5 *sparx5, int portno) 20262306a36Sopenharmony_ci{ 20362306a36Sopenharmony_ci u64 *portstats; 20462306a36Sopenharmony_ci u64 *stats; 20562306a36Sopenharmony_ci u32 addr; 20662306a36Sopenharmony_ci int idx; 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci portstats = &sparx5->stats[portno * sparx5->num_stats]; 20962306a36Sopenharmony_ci mutex_lock(&sparx5->queue_stats_lock); 21062306a36Sopenharmony_ci spx5_wr(XQS_STAT_CFG_STAT_VIEW_SET(portno), sparx5, XQS_STAT_CFG); 21162306a36Sopenharmony_ci addr = 0; 21262306a36Sopenharmony_ci stats = &portstats[spx5_stats_green_p0_rx_fwd]; 21362306a36Sopenharmony_ci for (idx = 0; idx < 2 * SPX5_PRIOS; ++idx, ++addr, ++stats) 21462306a36Sopenharmony_ci sparx5_update_counter(stats, spx5_rd(sparx5, XQS_CNT(addr))); 21562306a36Sopenharmony_ci addr = 16; 21662306a36Sopenharmony_ci stats = &portstats[spx5_stats_green_p0_rx_port_drop]; 21762306a36Sopenharmony_ci for (idx = 0; idx < 2 * SPX5_PRIOS; ++idx, ++addr, ++stats) 21862306a36Sopenharmony_ci sparx5_update_counter(stats, spx5_rd(sparx5, XQS_CNT(addr))); 21962306a36Sopenharmony_ci addr = 256; 22062306a36Sopenharmony_ci stats = &portstats[spx5_stats_green_p0_tx_port]; 22162306a36Sopenharmony_ci for (idx = 0; idx < 2 * SPX5_PRIOS; ++idx, ++addr, ++stats) 22262306a36Sopenharmony_ci sparx5_update_counter(stats, spx5_rd(sparx5, XQS_CNT(addr))); 22362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_local_drop], 22462306a36Sopenharmony_ci spx5_rd(sparx5, XQS_CNT(32))); 22562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_local_drop], 22662306a36Sopenharmony_ci spx5_rd(sparx5, XQS_CNT(272))); 22762306a36Sopenharmony_ci mutex_unlock(&sparx5->queue_stats_lock); 22862306a36Sopenharmony_ci} 22962306a36Sopenharmony_ci 23062306a36Sopenharmony_cistatic void sparx5_get_ana_ac_stats_stats(struct sparx5 *sparx5, int portno) 23162306a36Sopenharmony_ci{ 23262306a36Sopenharmony_ci u64 *portstats = &sparx5->stats[portno * sparx5->num_stats]; 23362306a36Sopenharmony_ci 23462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_ana_ac_port_stat_lsb_cnt], 23562306a36Sopenharmony_ci spx5_rd(sparx5, ANA_AC_PORT_STAT_LSB_CNT(portno, 23662306a36Sopenharmony_ci SPX5_PORT_POLICER_DROPS))); 23762306a36Sopenharmony_ci} 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_cistatic void sparx5_get_dev_phy_stats(u64 *portstats, void __iomem *inst, u32 24062306a36Sopenharmony_ci tinst) 24162306a36Sopenharmony_ci{ 24262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_symbol_err_cnt], 24362306a36Sopenharmony_ci spx5_inst_rd(inst, 24462306a36Sopenharmony_ci DEV5G_RX_SYMBOL_ERR_CNT(tinst))); 24562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_symbol_err_cnt], 24662306a36Sopenharmony_ci spx5_inst_rd(inst, 24762306a36Sopenharmony_ci DEV5G_PMAC_RX_SYMBOL_ERR_CNT(tinst))); 24862306a36Sopenharmony_ci} 24962306a36Sopenharmony_ci 25062306a36Sopenharmony_cistatic void sparx5_get_dev_mac_stats(u64 *portstats, void __iomem *inst, u32 25162306a36Sopenharmony_ci tinst) 25262306a36Sopenharmony_ci{ 25362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_uc_cnt], 25462306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_TX_UC_CNT(tinst))); 25562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_uc_cnt], 25662306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_PMAC_TX_UC_CNT(tinst))); 25762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_mc_cnt], 25862306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_TX_MC_CNT(tinst))); 25962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_bc_cnt], 26062306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_TX_BC_CNT(tinst))); 26162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_uc_cnt], 26262306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_RX_UC_CNT(tinst))); 26362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_uc_cnt], 26462306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_PMAC_RX_UC_CNT(tinst))); 26562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_mc_cnt], 26662306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_RX_MC_CNT(tinst))); 26762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_bc_cnt], 26862306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_RX_BC_CNT(tinst))); 26962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_crc_err_cnt], 27062306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_RX_CRC_ERR_CNT(tinst))); 27162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_crc_err_cnt], 27262306a36Sopenharmony_ci spx5_inst_rd(inst, 27362306a36Sopenharmony_ci DEV5G_PMAC_RX_CRC_ERR_CNT(tinst))); 27462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_alignment_lost_cnt], 27562306a36Sopenharmony_ci spx5_inst_rd(inst, 27662306a36Sopenharmony_ci DEV5G_RX_ALIGNMENT_LOST_CNT(tinst))); 27762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_alignment_lost_cnt], 27862306a36Sopenharmony_ci spx5_inst_rd(inst, 27962306a36Sopenharmony_ci DEV5G_PMAC_RX_ALIGNMENT_LOST_CNT(tinst))); 28062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_ok_bytes_cnt], 28162306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_TX_OK_BYTES_CNT(tinst))); 28262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_ok_bytes_cnt], 28362306a36Sopenharmony_ci spx5_inst_rd(inst, 28462306a36Sopenharmony_ci DEV5G_PMAC_TX_OK_BYTES_CNT(tinst))); 28562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_ok_bytes_cnt], 28662306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_RX_OK_BYTES_CNT(tinst))); 28762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_ok_bytes_cnt], 28862306a36Sopenharmony_ci spx5_inst_rd(inst, 28962306a36Sopenharmony_ci DEV5G_PMAC_RX_OK_BYTES_CNT(tinst))); 29062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_mc_cnt], 29162306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_PMAC_TX_MC_CNT(tinst))); 29262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_bc_cnt], 29362306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_PMAC_TX_BC_CNT(tinst))); 29462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_mc_cnt], 29562306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_PMAC_RX_MC_CNT(tinst))); 29662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_bc_cnt], 29762306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_PMAC_RX_BC_CNT(tinst))); 29862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_in_range_len_err_cnt], 29962306a36Sopenharmony_ci spx5_inst_rd(inst, 30062306a36Sopenharmony_ci DEV5G_RX_IN_RANGE_LEN_ERR_CNT(tinst))); 30162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_in_range_len_err_cnt], 30262306a36Sopenharmony_ci spx5_inst_rd(inst, 30362306a36Sopenharmony_ci DEV5G_PMAC_RX_IN_RANGE_LEN_ERR_CNT(tinst))); 30462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_out_of_range_len_err_cnt], 30562306a36Sopenharmony_ci spx5_inst_rd(inst, 30662306a36Sopenharmony_ci DEV5G_RX_OUT_OF_RANGE_LEN_ERR_CNT(tinst))); 30762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_out_of_range_len_err_cnt], 30862306a36Sopenharmony_ci spx5_inst_rd(inst, 30962306a36Sopenharmony_ci DEV5G_PMAC_RX_OUT_OF_RANGE_LEN_ERR_CNT(tinst))); 31062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_oversize_cnt], 31162306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_RX_OVERSIZE_CNT(tinst))); 31262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_oversize_cnt], 31362306a36Sopenharmony_ci spx5_inst_rd(inst, 31462306a36Sopenharmony_ci DEV5G_PMAC_RX_OVERSIZE_CNT(tinst))); 31562306a36Sopenharmony_ci} 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_cistatic void sparx5_get_dev_mac_ctrl_stats(u64 *portstats, void __iomem *inst, 31862306a36Sopenharmony_ci u32 tinst) 31962306a36Sopenharmony_ci{ 32062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_pause_cnt], 32162306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_TX_PAUSE_CNT(tinst))); 32262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_pause_cnt], 32362306a36Sopenharmony_ci spx5_inst_rd(inst, 32462306a36Sopenharmony_ci DEV5G_PMAC_TX_PAUSE_CNT(tinst))); 32562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_pause_cnt], 32662306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_RX_PAUSE_CNT(tinst))); 32762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_pause_cnt], 32862306a36Sopenharmony_ci spx5_inst_rd(inst, 32962306a36Sopenharmony_ci DEV5G_PMAC_RX_PAUSE_CNT(tinst))); 33062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_unsup_opcode_cnt], 33162306a36Sopenharmony_ci spx5_inst_rd(inst, 33262306a36Sopenharmony_ci DEV5G_RX_UNSUP_OPCODE_CNT(tinst))); 33362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_unsup_opcode_cnt], 33462306a36Sopenharmony_ci spx5_inst_rd(inst, 33562306a36Sopenharmony_ci DEV5G_PMAC_RX_UNSUP_OPCODE_CNT(tinst))); 33662306a36Sopenharmony_ci} 33762306a36Sopenharmony_ci 33862306a36Sopenharmony_cistatic void sparx5_get_dev_rmon_stats(u64 *portstats, void __iomem *inst, u32 33962306a36Sopenharmony_ci tinst) 34062306a36Sopenharmony_ci{ 34162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_undersize_cnt], 34262306a36Sopenharmony_ci spx5_inst_rd(inst, 34362306a36Sopenharmony_ci DEV5G_RX_UNDERSIZE_CNT(tinst))); 34462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_undersize_cnt], 34562306a36Sopenharmony_ci spx5_inst_rd(inst, 34662306a36Sopenharmony_ci DEV5G_PMAC_RX_UNDERSIZE_CNT(tinst))); 34762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_oversize_cnt], 34862306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_RX_OVERSIZE_CNT(tinst))); 34962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_oversize_cnt], 35062306a36Sopenharmony_ci spx5_inst_rd(inst, 35162306a36Sopenharmony_ci DEV5G_PMAC_RX_OVERSIZE_CNT(tinst))); 35262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_fragments_cnt], 35362306a36Sopenharmony_ci spx5_inst_rd(inst, 35462306a36Sopenharmony_ci DEV5G_RX_FRAGMENTS_CNT(tinst))); 35562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_fragments_cnt], 35662306a36Sopenharmony_ci spx5_inst_rd(inst, 35762306a36Sopenharmony_ci DEV5G_PMAC_RX_FRAGMENTS_CNT(tinst))); 35862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_jabbers_cnt], 35962306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_RX_JABBERS_CNT(tinst))); 36062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_jabbers_cnt], 36162306a36Sopenharmony_ci spx5_inst_rd(inst, 36262306a36Sopenharmony_ci DEV5G_PMAC_RX_JABBERS_CNT(tinst))); 36362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_size64_cnt], 36462306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_RX_SIZE64_CNT(tinst))); 36562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size64_cnt], 36662306a36Sopenharmony_ci spx5_inst_rd(inst, 36762306a36Sopenharmony_ci DEV5G_PMAC_RX_SIZE64_CNT(tinst))); 36862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_size65to127_cnt], 36962306a36Sopenharmony_ci spx5_inst_rd(inst, 37062306a36Sopenharmony_ci DEV5G_RX_SIZE65TO127_CNT(tinst))); 37162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size65to127_cnt], 37262306a36Sopenharmony_ci spx5_inst_rd(inst, 37362306a36Sopenharmony_ci DEV5G_PMAC_RX_SIZE65TO127_CNT(tinst))); 37462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_size128to255_cnt], 37562306a36Sopenharmony_ci spx5_inst_rd(inst, 37662306a36Sopenharmony_ci DEV5G_RX_SIZE128TO255_CNT(tinst))); 37762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size128to255_cnt], 37862306a36Sopenharmony_ci spx5_inst_rd(inst, 37962306a36Sopenharmony_ci DEV5G_PMAC_RX_SIZE128TO255_CNT(tinst))); 38062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_size256to511_cnt], 38162306a36Sopenharmony_ci spx5_inst_rd(inst, 38262306a36Sopenharmony_ci DEV5G_RX_SIZE256TO511_CNT(tinst))); 38362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size256to511_cnt], 38462306a36Sopenharmony_ci spx5_inst_rd(inst, 38562306a36Sopenharmony_ci DEV5G_PMAC_RX_SIZE256TO511_CNT(tinst))); 38662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_size512to1023_cnt], 38762306a36Sopenharmony_ci spx5_inst_rd(inst, 38862306a36Sopenharmony_ci DEV5G_RX_SIZE512TO1023_CNT(tinst))); 38962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size512to1023_cnt], 39062306a36Sopenharmony_ci spx5_inst_rd(inst, 39162306a36Sopenharmony_ci DEV5G_PMAC_RX_SIZE512TO1023_CNT(tinst))); 39262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_size1024to1518_cnt], 39362306a36Sopenharmony_ci spx5_inst_rd(inst, 39462306a36Sopenharmony_ci DEV5G_RX_SIZE1024TO1518_CNT(tinst))); 39562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size1024to1518_cnt], 39662306a36Sopenharmony_ci spx5_inst_rd(inst, 39762306a36Sopenharmony_ci DEV5G_PMAC_RX_SIZE1024TO1518_CNT(tinst))); 39862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_size1519tomax_cnt], 39962306a36Sopenharmony_ci spx5_inst_rd(inst, 40062306a36Sopenharmony_ci DEV5G_RX_SIZE1519TOMAX_CNT(tinst))); 40162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size1519tomax_cnt], 40262306a36Sopenharmony_ci spx5_inst_rd(inst, 40362306a36Sopenharmony_ci DEV5G_PMAC_RX_SIZE1519TOMAX_CNT(tinst))); 40462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_size64_cnt], 40562306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_TX_SIZE64_CNT(tinst))); 40662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size64_cnt], 40762306a36Sopenharmony_ci spx5_inst_rd(inst, 40862306a36Sopenharmony_ci DEV5G_PMAC_TX_SIZE64_CNT(tinst))); 40962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_size65to127_cnt], 41062306a36Sopenharmony_ci spx5_inst_rd(inst, 41162306a36Sopenharmony_ci DEV5G_TX_SIZE65TO127_CNT(tinst))); 41262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size65to127_cnt], 41362306a36Sopenharmony_ci spx5_inst_rd(inst, 41462306a36Sopenharmony_ci DEV5G_PMAC_TX_SIZE65TO127_CNT(tinst))); 41562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_size128to255_cnt], 41662306a36Sopenharmony_ci spx5_inst_rd(inst, 41762306a36Sopenharmony_ci DEV5G_TX_SIZE128TO255_CNT(tinst))); 41862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size128to255_cnt], 41962306a36Sopenharmony_ci spx5_inst_rd(inst, 42062306a36Sopenharmony_ci DEV5G_PMAC_TX_SIZE128TO255_CNT(tinst))); 42162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_size256to511_cnt], 42262306a36Sopenharmony_ci spx5_inst_rd(inst, 42362306a36Sopenharmony_ci DEV5G_TX_SIZE256TO511_CNT(tinst))); 42462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size256to511_cnt], 42562306a36Sopenharmony_ci spx5_inst_rd(inst, 42662306a36Sopenharmony_ci DEV5G_PMAC_TX_SIZE256TO511_CNT(tinst))); 42762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_size512to1023_cnt], 42862306a36Sopenharmony_ci spx5_inst_rd(inst, 42962306a36Sopenharmony_ci DEV5G_TX_SIZE512TO1023_CNT(tinst))); 43062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size512to1023_cnt], 43162306a36Sopenharmony_ci spx5_inst_rd(inst, 43262306a36Sopenharmony_ci DEV5G_PMAC_TX_SIZE512TO1023_CNT(tinst))); 43362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_size1024to1518_cnt], 43462306a36Sopenharmony_ci spx5_inst_rd(inst, 43562306a36Sopenharmony_ci DEV5G_TX_SIZE1024TO1518_CNT(tinst))); 43662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size1024to1518_cnt], 43762306a36Sopenharmony_ci spx5_inst_rd(inst, 43862306a36Sopenharmony_ci DEV5G_PMAC_TX_SIZE1024TO1518_CNT(tinst))); 43962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_size1519tomax_cnt], 44062306a36Sopenharmony_ci spx5_inst_rd(inst, 44162306a36Sopenharmony_ci DEV5G_TX_SIZE1519TOMAX_CNT(tinst))); 44262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size1519tomax_cnt], 44362306a36Sopenharmony_ci spx5_inst_rd(inst, 44462306a36Sopenharmony_ci DEV5G_PMAC_TX_SIZE1519TOMAX_CNT(tinst))); 44562306a36Sopenharmony_ci} 44662306a36Sopenharmony_ci 44762306a36Sopenharmony_cistatic void sparx5_get_dev_misc_stats(u64 *portstats, void __iomem *inst, u32 44862306a36Sopenharmony_ci tinst) 44962306a36Sopenharmony_ci{ 45062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_mm_rx_assembly_err_cnt], 45162306a36Sopenharmony_ci spx5_inst_rd(inst, 45262306a36Sopenharmony_ci DEV5G_MM_RX_ASSEMBLY_ERR_CNT(tinst))); 45362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_mm_rx_assembly_ok_cnt], 45462306a36Sopenharmony_ci spx5_inst_rd(inst, 45562306a36Sopenharmony_ci DEV5G_MM_RX_ASSEMBLY_OK_CNT(tinst))); 45662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_mm_rx_merge_frag_cnt], 45762306a36Sopenharmony_ci spx5_inst_rd(inst, 45862306a36Sopenharmony_ci DEV5G_MM_RX_MERGE_FRAG_CNT(tinst))); 45962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_mm_rx_smd_err_cnt], 46062306a36Sopenharmony_ci spx5_inst_rd(inst, 46162306a36Sopenharmony_ci DEV5G_MM_RX_SMD_ERR_CNT(tinst))); 46262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_mm_tx_pfragment_cnt], 46362306a36Sopenharmony_ci spx5_inst_rd(inst, 46462306a36Sopenharmony_ci DEV5G_MM_TX_PFRAGMENT_CNT(tinst))); 46562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_bad_bytes_cnt], 46662306a36Sopenharmony_ci spx5_inst_rd(inst, 46762306a36Sopenharmony_ci DEV5G_RX_BAD_BYTES_CNT(tinst))); 46862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_bad_bytes_cnt], 46962306a36Sopenharmony_ci spx5_inst_rd(inst, 47062306a36Sopenharmony_ci DEV5G_PMAC_RX_BAD_BYTES_CNT(tinst))); 47162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_in_bytes_cnt], 47262306a36Sopenharmony_ci spx5_inst_rd(inst, DEV5G_RX_IN_BYTES_CNT(tinst))); 47362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_ipg_shrink_cnt], 47462306a36Sopenharmony_ci spx5_inst_rd(inst, 47562306a36Sopenharmony_ci DEV5G_RX_IPG_SHRINK_CNT(tinst))); 47662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_tagged_frms_cnt], 47762306a36Sopenharmony_ci spx5_inst_rd(inst, 47862306a36Sopenharmony_ci DEV5G_RX_TAGGED_FRMS_CNT(tinst))); 47962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_untagged_frms_cnt], 48062306a36Sopenharmony_ci spx5_inst_rd(inst, 48162306a36Sopenharmony_ci DEV5G_RX_UNTAGGED_FRMS_CNT(tinst))); 48262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_out_bytes_cnt], 48362306a36Sopenharmony_ci spx5_inst_rd(inst, 48462306a36Sopenharmony_ci DEV5G_TX_OUT_BYTES_CNT(tinst))); 48562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_tagged_frms_cnt], 48662306a36Sopenharmony_ci spx5_inst_rd(inst, 48762306a36Sopenharmony_ci DEV5G_TX_TAGGED_FRMS_CNT(tinst))); 48862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_untagged_frms_cnt], 48962306a36Sopenharmony_ci spx5_inst_rd(inst, 49062306a36Sopenharmony_ci DEV5G_TX_UNTAGGED_FRMS_CNT(tinst))); 49162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_hih_cksm_err_cnt], 49262306a36Sopenharmony_ci spx5_inst_rd(inst, 49362306a36Sopenharmony_ci DEV5G_RX_HIH_CKSM_ERR_CNT(tinst))); 49462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_hih_cksm_err_cnt], 49562306a36Sopenharmony_ci spx5_inst_rd(inst, 49662306a36Sopenharmony_ci DEV5G_PMAC_RX_HIH_CKSM_ERR_CNT(tinst))); 49762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_xgmii_prot_err_cnt], 49862306a36Sopenharmony_ci spx5_inst_rd(inst, 49962306a36Sopenharmony_ci DEV5G_RX_XGMII_PROT_ERR_CNT(tinst))); 50062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_xgmii_prot_err_cnt], 50162306a36Sopenharmony_ci spx5_inst_rd(inst, 50262306a36Sopenharmony_ci DEV5G_PMAC_RX_XGMII_PROT_ERR_CNT(tinst))); 50362306a36Sopenharmony_ci} 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_cistatic void sparx5_get_device_stats(struct sparx5 *sparx5, int portno) 50662306a36Sopenharmony_ci{ 50762306a36Sopenharmony_ci u64 *portstats = &sparx5->stats[portno * sparx5->num_stats]; 50862306a36Sopenharmony_ci u32 tinst = sparx5_port_dev_index(portno); 50962306a36Sopenharmony_ci u32 dev = sparx5_to_high_dev(portno); 51062306a36Sopenharmony_ci void __iomem *inst; 51162306a36Sopenharmony_ci 51262306a36Sopenharmony_ci inst = spx5_inst_get(sparx5, dev, tinst); 51362306a36Sopenharmony_ci sparx5_get_dev_phy_stats(portstats, inst, tinst); 51462306a36Sopenharmony_ci sparx5_get_dev_mac_stats(portstats, inst, tinst); 51562306a36Sopenharmony_ci sparx5_get_dev_mac_ctrl_stats(portstats, inst, tinst); 51662306a36Sopenharmony_ci sparx5_get_dev_rmon_stats(portstats, inst, tinst); 51762306a36Sopenharmony_ci sparx5_get_dev_misc_stats(portstats, inst, tinst); 51862306a36Sopenharmony_ci} 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_cistatic void sparx5_get_asm_phy_stats(u64 *portstats, void __iomem *inst, int 52162306a36Sopenharmony_ci portno) 52262306a36Sopenharmony_ci{ 52362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_symbol_err_cnt], 52462306a36Sopenharmony_ci spx5_inst_rd(inst, 52562306a36Sopenharmony_ci ASM_RX_SYMBOL_ERR_CNT(portno))); 52662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_symbol_err_cnt], 52762306a36Sopenharmony_ci spx5_inst_rd(inst, 52862306a36Sopenharmony_ci ASM_PMAC_RX_SYMBOL_ERR_CNT(portno))); 52962306a36Sopenharmony_ci} 53062306a36Sopenharmony_ci 53162306a36Sopenharmony_cistatic void sparx5_get_asm_mac_stats(u64 *portstats, void __iomem *inst, int 53262306a36Sopenharmony_ci portno) 53362306a36Sopenharmony_ci{ 53462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_uc_cnt], 53562306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_TX_UC_CNT(portno))); 53662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_uc_cnt], 53762306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_PMAC_TX_UC_CNT(portno))); 53862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_mc_cnt], 53962306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_TX_MC_CNT(portno))); 54062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_bc_cnt], 54162306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_TX_BC_CNT(portno))); 54262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_backoff1_cnt], 54362306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_TX_BACKOFF1_CNT(portno))); 54462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_multi_coll_cnt], 54562306a36Sopenharmony_ci spx5_inst_rd(inst, 54662306a36Sopenharmony_ci ASM_TX_MULTI_COLL_CNT(portno))); 54762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_uc_cnt], 54862306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_RX_UC_CNT(portno))); 54962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_uc_cnt], 55062306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_PMAC_RX_UC_CNT(portno))); 55162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_mc_cnt], 55262306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_RX_MC_CNT(portno))); 55362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_bc_cnt], 55462306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_RX_BC_CNT(portno))); 55562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_crc_err_cnt], 55662306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_RX_CRC_ERR_CNT(portno))); 55762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_crc_err_cnt], 55862306a36Sopenharmony_ci spx5_inst_rd(inst, 55962306a36Sopenharmony_ci ASM_PMAC_RX_CRC_ERR_CNT(portno))); 56062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_alignment_lost_cnt], 56162306a36Sopenharmony_ci spx5_inst_rd(inst, 56262306a36Sopenharmony_ci ASM_RX_ALIGNMENT_LOST_CNT(portno))); 56362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_alignment_lost_cnt], 56462306a36Sopenharmony_ci spx5_inst_rd(inst, 56562306a36Sopenharmony_ci ASM_PMAC_RX_ALIGNMENT_LOST_CNT(portno))); 56662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_ok_bytes_cnt], 56762306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_TX_OK_BYTES_CNT(portno))); 56862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_ok_bytes_cnt], 56962306a36Sopenharmony_ci spx5_inst_rd(inst, 57062306a36Sopenharmony_ci ASM_PMAC_TX_OK_BYTES_CNT(portno))); 57162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_defer_cnt], 57262306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_TX_DEFER_CNT(portno))); 57362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_late_coll_cnt], 57462306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_TX_LATE_COLL_CNT(portno))); 57562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_xcoll_cnt], 57662306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_TX_XCOLL_CNT(portno))); 57762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_csense_cnt], 57862306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_TX_CSENSE_CNT(portno))); 57962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_ok_bytes_cnt], 58062306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_RX_OK_BYTES_CNT(portno))); 58162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_ok_bytes_cnt], 58262306a36Sopenharmony_ci spx5_inst_rd(inst, 58362306a36Sopenharmony_ci ASM_PMAC_RX_OK_BYTES_CNT(portno))); 58462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_mc_cnt], 58562306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_PMAC_TX_MC_CNT(portno))); 58662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_bc_cnt], 58762306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_PMAC_TX_BC_CNT(portno))); 58862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_xdefer_cnt], 58962306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_TX_XDEFER_CNT(portno))); 59062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_mc_cnt], 59162306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_PMAC_RX_MC_CNT(portno))); 59262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_bc_cnt], 59362306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_PMAC_RX_BC_CNT(portno))); 59462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_in_range_len_err_cnt], 59562306a36Sopenharmony_ci spx5_inst_rd(inst, 59662306a36Sopenharmony_ci ASM_RX_IN_RANGE_LEN_ERR_CNT(portno))); 59762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_in_range_len_err_cnt], 59862306a36Sopenharmony_ci spx5_inst_rd(inst, 59962306a36Sopenharmony_ci ASM_PMAC_RX_IN_RANGE_LEN_ERR_CNT(portno))); 60062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_out_of_range_len_err_cnt], 60162306a36Sopenharmony_ci spx5_inst_rd(inst, 60262306a36Sopenharmony_ci ASM_RX_OUT_OF_RANGE_LEN_ERR_CNT(portno))); 60362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_out_of_range_len_err_cnt], 60462306a36Sopenharmony_ci spx5_inst_rd(inst, 60562306a36Sopenharmony_ci ASM_PMAC_RX_OUT_OF_RANGE_LEN_ERR_CNT(portno))); 60662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_oversize_cnt], 60762306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_RX_OVERSIZE_CNT(portno))); 60862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_oversize_cnt], 60962306a36Sopenharmony_ci spx5_inst_rd(inst, 61062306a36Sopenharmony_ci ASM_PMAC_RX_OVERSIZE_CNT(portno))); 61162306a36Sopenharmony_ci} 61262306a36Sopenharmony_ci 61362306a36Sopenharmony_cistatic void sparx5_get_asm_mac_ctrl_stats(u64 *portstats, void __iomem *inst, 61462306a36Sopenharmony_ci int portno) 61562306a36Sopenharmony_ci{ 61662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_pause_cnt], 61762306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_TX_PAUSE_CNT(portno))); 61862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_pause_cnt], 61962306a36Sopenharmony_ci spx5_inst_rd(inst, 62062306a36Sopenharmony_ci ASM_PMAC_TX_PAUSE_CNT(portno))); 62162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_pause_cnt], 62262306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_RX_PAUSE_CNT(portno))); 62362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_pause_cnt], 62462306a36Sopenharmony_ci spx5_inst_rd(inst, 62562306a36Sopenharmony_ci ASM_PMAC_RX_PAUSE_CNT(portno))); 62662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_unsup_opcode_cnt], 62762306a36Sopenharmony_ci spx5_inst_rd(inst, 62862306a36Sopenharmony_ci ASM_RX_UNSUP_OPCODE_CNT(portno))); 62962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_unsup_opcode_cnt], 63062306a36Sopenharmony_ci spx5_inst_rd(inst, 63162306a36Sopenharmony_ci ASM_PMAC_RX_UNSUP_OPCODE_CNT(portno))); 63262306a36Sopenharmony_ci} 63362306a36Sopenharmony_ci 63462306a36Sopenharmony_cistatic void sparx5_get_asm_rmon_stats(u64 *portstats, void __iomem *inst, int 63562306a36Sopenharmony_ci portno) 63662306a36Sopenharmony_ci{ 63762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_undersize_cnt], 63862306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_RX_UNDERSIZE_CNT(portno))); 63962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_undersize_cnt], 64062306a36Sopenharmony_ci spx5_inst_rd(inst, 64162306a36Sopenharmony_ci ASM_PMAC_RX_UNDERSIZE_CNT(portno))); 64262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_oversize_cnt], 64362306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_RX_OVERSIZE_CNT(portno))); 64462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_oversize_cnt], 64562306a36Sopenharmony_ci spx5_inst_rd(inst, 64662306a36Sopenharmony_ci ASM_PMAC_RX_OVERSIZE_CNT(portno))); 64762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_fragments_cnt], 64862306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_RX_FRAGMENTS_CNT(portno))); 64962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_fragments_cnt], 65062306a36Sopenharmony_ci spx5_inst_rd(inst, 65162306a36Sopenharmony_ci ASM_PMAC_RX_FRAGMENTS_CNT(portno))); 65262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_jabbers_cnt], 65362306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_RX_JABBERS_CNT(portno))); 65462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_jabbers_cnt], 65562306a36Sopenharmony_ci spx5_inst_rd(inst, 65662306a36Sopenharmony_ci ASM_PMAC_RX_JABBERS_CNT(portno))); 65762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_size64_cnt], 65862306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_RX_SIZE64_CNT(portno))); 65962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size64_cnt], 66062306a36Sopenharmony_ci spx5_inst_rd(inst, 66162306a36Sopenharmony_ci ASM_PMAC_RX_SIZE64_CNT(portno))); 66262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_size65to127_cnt], 66362306a36Sopenharmony_ci spx5_inst_rd(inst, 66462306a36Sopenharmony_ci ASM_RX_SIZE65TO127_CNT(portno))); 66562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size65to127_cnt], 66662306a36Sopenharmony_ci spx5_inst_rd(inst, 66762306a36Sopenharmony_ci ASM_PMAC_RX_SIZE65TO127_CNT(portno))); 66862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_size128to255_cnt], 66962306a36Sopenharmony_ci spx5_inst_rd(inst, 67062306a36Sopenharmony_ci ASM_RX_SIZE128TO255_CNT(portno))); 67162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size128to255_cnt], 67262306a36Sopenharmony_ci spx5_inst_rd(inst, 67362306a36Sopenharmony_ci ASM_PMAC_RX_SIZE128TO255_CNT(portno))); 67462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_size256to511_cnt], 67562306a36Sopenharmony_ci spx5_inst_rd(inst, 67662306a36Sopenharmony_ci ASM_RX_SIZE256TO511_CNT(portno))); 67762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size256to511_cnt], 67862306a36Sopenharmony_ci spx5_inst_rd(inst, 67962306a36Sopenharmony_ci ASM_PMAC_RX_SIZE256TO511_CNT(portno))); 68062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_size512to1023_cnt], 68162306a36Sopenharmony_ci spx5_inst_rd(inst, 68262306a36Sopenharmony_ci ASM_RX_SIZE512TO1023_CNT(portno))); 68362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size512to1023_cnt], 68462306a36Sopenharmony_ci spx5_inst_rd(inst, 68562306a36Sopenharmony_ci ASM_PMAC_RX_SIZE512TO1023_CNT(portno))); 68662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_size1024to1518_cnt], 68762306a36Sopenharmony_ci spx5_inst_rd(inst, 68862306a36Sopenharmony_ci ASM_RX_SIZE1024TO1518_CNT(portno))); 68962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size1024to1518_cnt], 69062306a36Sopenharmony_ci spx5_inst_rd(inst, 69162306a36Sopenharmony_ci ASM_PMAC_RX_SIZE1024TO1518_CNT(portno))); 69262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_size1519tomax_cnt], 69362306a36Sopenharmony_ci spx5_inst_rd(inst, 69462306a36Sopenharmony_ci ASM_RX_SIZE1519TOMAX_CNT(portno))); 69562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_size1519tomax_cnt], 69662306a36Sopenharmony_ci spx5_inst_rd(inst, 69762306a36Sopenharmony_ci ASM_PMAC_RX_SIZE1519TOMAX_CNT(portno))); 69862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_size64_cnt], 69962306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_TX_SIZE64_CNT(portno))); 70062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size64_cnt], 70162306a36Sopenharmony_ci spx5_inst_rd(inst, 70262306a36Sopenharmony_ci ASM_PMAC_TX_SIZE64_CNT(portno))); 70362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_size65to127_cnt], 70462306a36Sopenharmony_ci spx5_inst_rd(inst, 70562306a36Sopenharmony_ci ASM_TX_SIZE65TO127_CNT(portno))); 70662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size65to127_cnt], 70762306a36Sopenharmony_ci spx5_inst_rd(inst, 70862306a36Sopenharmony_ci ASM_PMAC_TX_SIZE65TO127_CNT(portno))); 70962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_size128to255_cnt], 71062306a36Sopenharmony_ci spx5_inst_rd(inst, 71162306a36Sopenharmony_ci ASM_TX_SIZE128TO255_CNT(portno))); 71262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size128to255_cnt], 71362306a36Sopenharmony_ci spx5_inst_rd(inst, 71462306a36Sopenharmony_ci ASM_PMAC_TX_SIZE128TO255_CNT(portno))); 71562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_size256to511_cnt], 71662306a36Sopenharmony_ci spx5_inst_rd(inst, 71762306a36Sopenharmony_ci ASM_TX_SIZE256TO511_CNT(portno))); 71862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size256to511_cnt], 71962306a36Sopenharmony_ci spx5_inst_rd(inst, 72062306a36Sopenharmony_ci ASM_PMAC_TX_SIZE256TO511_CNT(portno))); 72162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_size512to1023_cnt], 72262306a36Sopenharmony_ci spx5_inst_rd(inst, 72362306a36Sopenharmony_ci ASM_TX_SIZE512TO1023_CNT(portno))); 72462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size512to1023_cnt], 72562306a36Sopenharmony_ci spx5_inst_rd(inst, 72662306a36Sopenharmony_ci ASM_PMAC_TX_SIZE512TO1023_CNT(portno))); 72762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_size1024to1518_cnt], 72862306a36Sopenharmony_ci spx5_inst_rd(inst, 72962306a36Sopenharmony_ci ASM_TX_SIZE1024TO1518_CNT(portno))); 73062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size1024to1518_cnt], 73162306a36Sopenharmony_ci spx5_inst_rd(inst, 73262306a36Sopenharmony_ci ASM_PMAC_TX_SIZE1024TO1518_CNT(portno))); 73362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_size1519tomax_cnt], 73462306a36Sopenharmony_ci spx5_inst_rd(inst, 73562306a36Sopenharmony_ci ASM_TX_SIZE1519TOMAX_CNT(portno))); 73662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_tx_size1519tomax_cnt], 73762306a36Sopenharmony_ci spx5_inst_rd(inst, 73862306a36Sopenharmony_ci ASM_PMAC_TX_SIZE1519TOMAX_CNT(portno))); 73962306a36Sopenharmony_ci} 74062306a36Sopenharmony_ci 74162306a36Sopenharmony_cistatic void sparx5_get_asm_misc_stats(u64 *portstats, void __iomem *inst, int 74262306a36Sopenharmony_ci portno) 74362306a36Sopenharmony_ci{ 74462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_mm_rx_assembly_err_cnt], 74562306a36Sopenharmony_ci spx5_inst_rd(inst, 74662306a36Sopenharmony_ci ASM_MM_RX_ASSEMBLY_ERR_CNT(portno))); 74762306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_mm_rx_assembly_ok_cnt], 74862306a36Sopenharmony_ci spx5_inst_rd(inst, 74962306a36Sopenharmony_ci ASM_MM_RX_ASSEMBLY_OK_CNT(portno))); 75062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_mm_rx_merge_frag_cnt], 75162306a36Sopenharmony_ci spx5_inst_rd(inst, 75262306a36Sopenharmony_ci ASM_MM_RX_MERGE_FRAG_CNT(portno))); 75362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_mm_rx_smd_err_cnt], 75462306a36Sopenharmony_ci spx5_inst_rd(inst, 75562306a36Sopenharmony_ci ASM_MM_RX_SMD_ERR_CNT(portno))); 75662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_mm_tx_pfragment_cnt], 75762306a36Sopenharmony_ci spx5_inst_rd(inst, 75862306a36Sopenharmony_ci ASM_MM_TX_PFRAGMENT_CNT(portno))); 75962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_bad_bytes_cnt], 76062306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_RX_BAD_BYTES_CNT(portno))); 76162306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_pmac_rx_bad_bytes_cnt], 76262306a36Sopenharmony_ci spx5_inst_rd(inst, 76362306a36Sopenharmony_ci ASM_PMAC_RX_BAD_BYTES_CNT(portno))); 76462306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_in_bytes_cnt], 76562306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_RX_IN_BYTES_CNT(portno))); 76662306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_ipg_shrink_cnt], 76762306a36Sopenharmony_ci spx5_inst_rd(inst, 76862306a36Sopenharmony_ci ASM_RX_IPG_SHRINK_CNT(portno))); 76962306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_sync_lost_err_cnt], 77062306a36Sopenharmony_ci spx5_inst_rd(inst, 77162306a36Sopenharmony_ci ASM_RX_SYNC_LOST_ERR_CNT(portno))); 77262306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_tagged_frms_cnt], 77362306a36Sopenharmony_ci spx5_inst_rd(inst, 77462306a36Sopenharmony_ci ASM_RX_TAGGED_FRMS_CNT(portno))); 77562306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_rx_untagged_frms_cnt], 77662306a36Sopenharmony_ci spx5_inst_rd(inst, 77762306a36Sopenharmony_ci ASM_RX_UNTAGGED_FRMS_CNT(portno))); 77862306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_out_bytes_cnt], 77962306a36Sopenharmony_ci spx5_inst_rd(inst, ASM_TX_OUT_BYTES_CNT(portno))); 78062306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_tagged_frms_cnt], 78162306a36Sopenharmony_ci spx5_inst_rd(inst, 78262306a36Sopenharmony_ci ASM_TX_TAGGED_FRMS_CNT(portno))); 78362306a36Sopenharmony_ci sparx5_update_counter(&portstats[spx5_stats_tx_untagged_frms_cnt], 78462306a36Sopenharmony_ci spx5_inst_rd(inst, 78562306a36Sopenharmony_ci ASM_TX_UNTAGGED_FRMS_CNT(portno))); 78662306a36Sopenharmony_ci} 78762306a36Sopenharmony_ci 78862306a36Sopenharmony_cistatic void sparx5_get_asm_stats(struct sparx5 *sparx5, int portno) 78962306a36Sopenharmony_ci{ 79062306a36Sopenharmony_ci u64 *portstats = &sparx5->stats[portno * sparx5->num_stats]; 79162306a36Sopenharmony_ci void __iomem *inst = spx5_inst_get(sparx5, TARGET_ASM, 0); 79262306a36Sopenharmony_ci 79362306a36Sopenharmony_ci sparx5_get_asm_phy_stats(portstats, inst, portno); 79462306a36Sopenharmony_ci sparx5_get_asm_mac_stats(portstats, inst, portno); 79562306a36Sopenharmony_ci sparx5_get_asm_mac_ctrl_stats(portstats, inst, portno); 79662306a36Sopenharmony_ci sparx5_get_asm_rmon_stats(portstats, inst, portno); 79762306a36Sopenharmony_ci sparx5_get_asm_misc_stats(portstats, inst, portno); 79862306a36Sopenharmony_ci} 79962306a36Sopenharmony_ci 80062306a36Sopenharmony_cistatic const struct ethtool_rmon_hist_range sparx5_rmon_ranges[] = { 80162306a36Sopenharmony_ci { 0, 64 }, 80262306a36Sopenharmony_ci { 65, 127 }, 80362306a36Sopenharmony_ci { 128, 255 }, 80462306a36Sopenharmony_ci { 256, 511 }, 80562306a36Sopenharmony_ci { 512, 1023 }, 80662306a36Sopenharmony_ci { 1024, 1518 }, 80762306a36Sopenharmony_ci { 1519, 10239 }, 80862306a36Sopenharmony_ci {} 80962306a36Sopenharmony_ci}; 81062306a36Sopenharmony_ci 81162306a36Sopenharmony_cistatic void sparx5_get_eth_phy_stats(struct net_device *ndev, 81262306a36Sopenharmony_ci struct ethtool_eth_phy_stats *phy_stats) 81362306a36Sopenharmony_ci{ 81462306a36Sopenharmony_ci struct sparx5_port *port = netdev_priv(ndev); 81562306a36Sopenharmony_ci struct sparx5 *sparx5 = port->sparx5; 81662306a36Sopenharmony_ci int portno = port->portno; 81762306a36Sopenharmony_ci void __iomem *inst; 81862306a36Sopenharmony_ci u64 *portstats; 81962306a36Sopenharmony_ci 82062306a36Sopenharmony_ci portstats = &sparx5->stats[portno * sparx5->num_stats]; 82162306a36Sopenharmony_ci if (sparx5_is_baser(port->conf.portmode)) { 82262306a36Sopenharmony_ci u32 tinst = sparx5_port_dev_index(portno); 82362306a36Sopenharmony_ci u32 dev = sparx5_to_high_dev(portno); 82462306a36Sopenharmony_ci 82562306a36Sopenharmony_ci inst = spx5_inst_get(sparx5, dev, tinst); 82662306a36Sopenharmony_ci sparx5_get_dev_phy_stats(portstats, inst, tinst); 82762306a36Sopenharmony_ci } else { 82862306a36Sopenharmony_ci inst = spx5_inst_get(sparx5, TARGET_ASM, 0); 82962306a36Sopenharmony_ci sparx5_get_asm_phy_stats(portstats, inst, portno); 83062306a36Sopenharmony_ci } 83162306a36Sopenharmony_ci phy_stats->SymbolErrorDuringCarrier = 83262306a36Sopenharmony_ci portstats[spx5_stats_rx_symbol_err_cnt] + 83362306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_symbol_err_cnt]; 83462306a36Sopenharmony_ci} 83562306a36Sopenharmony_ci 83662306a36Sopenharmony_cistatic void sparx5_get_eth_mac_stats(struct net_device *ndev, 83762306a36Sopenharmony_ci struct ethtool_eth_mac_stats *mac_stats) 83862306a36Sopenharmony_ci{ 83962306a36Sopenharmony_ci struct sparx5_port *port = netdev_priv(ndev); 84062306a36Sopenharmony_ci struct sparx5 *sparx5 = port->sparx5; 84162306a36Sopenharmony_ci int portno = port->portno; 84262306a36Sopenharmony_ci void __iomem *inst; 84362306a36Sopenharmony_ci u64 *portstats; 84462306a36Sopenharmony_ci 84562306a36Sopenharmony_ci portstats = &sparx5->stats[portno * sparx5->num_stats]; 84662306a36Sopenharmony_ci if (sparx5_is_baser(port->conf.portmode)) { 84762306a36Sopenharmony_ci u32 tinst = sparx5_port_dev_index(portno); 84862306a36Sopenharmony_ci u32 dev = sparx5_to_high_dev(portno); 84962306a36Sopenharmony_ci 85062306a36Sopenharmony_ci inst = spx5_inst_get(sparx5, dev, tinst); 85162306a36Sopenharmony_ci sparx5_get_dev_mac_stats(portstats, inst, tinst); 85262306a36Sopenharmony_ci } else { 85362306a36Sopenharmony_ci inst = spx5_inst_get(sparx5, TARGET_ASM, 0); 85462306a36Sopenharmony_ci sparx5_get_asm_mac_stats(portstats, inst, portno); 85562306a36Sopenharmony_ci } 85662306a36Sopenharmony_ci mac_stats->FramesTransmittedOK = portstats[spx5_stats_tx_uc_cnt] + 85762306a36Sopenharmony_ci portstats[spx5_stats_pmac_tx_uc_cnt] + 85862306a36Sopenharmony_ci portstats[spx5_stats_tx_mc_cnt] + 85962306a36Sopenharmony_ci portstats[spx5_stats_tx_bc_cnt]; 86062306a36Sopenharmony_ci mac_stats->SingleCollisionFrames = 86162306a36Sopenharmony_ci portstats[spx5_stats_tx_backoff1_cnt]; 86262306a36Sopenharmony_ci mac_stats->MultipleCollisionFrames = 86362306a36Sopenharmony_ci portstats[spx5_stats_tx_multi_coll_cnt]; 86462306a36Sopenharmony_ci mac_stats->FramesReceivedOK = portstats[spx5_stats_rx_uc_cnt] + 86562306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_uc_cnt] + 86662306a36Sopenharmony_ci portstats[spx5_stats_rx_mc_cnt] + 86762306a36Sopenharmony_ci portstats[spx5_stats_rx_bc_cnt]; 86862306a36Sopenharmony_ci mac_stats->FrameCheckSequenceErrors = 86962306a36Sopenharmony_ci portstats[spx5_stats_rx_crc_err_cnt] + 87062306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_crc_err_cnt]; 87162306a36Sopenharmony_ci mac_stats->AlignmentErrors = portstats[spx5_stats_rx_alignment_lost_cnt] 87262306a36Sopenharmony_ci + portstats[spx5_stats_pmac_rx_alignment_lost_cnt]; 87362306a36Sopenharmony_ci mac_stats->OctetsTransmittedOK = portstats[spx5_stats_tx_ok_bytes_cnt] + 87462306a36Sopenharmony_ci portstats[spx5_stats_pmac_tx_ok_bytes_cnt]; 87562306a36Sopenharmony_ci mac_stats->FramesWithDeferredXmissions = 87662306a36Sopenharmony_ci portstats[spx5_stats_tx_defer_cnt]; 87762306a36Sopenharmony_ci mac_stats->LateCollisions = 87862306a36Sopenharmony_ci portstats[spx5_stats_tx_late_coll_cnt]; 87962306a36Sopenharmony_ci mac_stats->FramesAbortedDueToXSColls = 88062306a36Sopenharmony_ci portstats[spx5_stats_tx_xcoll_cnt]; 88162306a36Sopenharmony_ci mac_stats->CarrierSenseErrors = portstats[spx5_stats_tx_csense_cnt]; 88262306a36Sopenharmony_ci mac_stats->OctetsReceivedOK = portstats[spx5_stats_rx_ok_bytes_cnt] + 88362306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_ok_bytes_cnt]; 88462306a36Sopenharmony_ci mac_stats->MulticastFramesXmittedOK = portstats[spx5_stats_tx_mc_cnt] + 88562306a36Sopenharmony_ci portstats[spx5_stats_pmac_tx_mc_cnt]; 88662306a36Sopenharmony_ci mac_stats->BroadcastFramesXmittedOK = portstats[spx5_stats_tx_bc_cnt] + 88762306a36Sopenharmony_ci portstats[spx5_stats_pmac_tx_bc_cnt]; 88862306a36Sopenharmony_ci mac_stats->FramesWithExcessiveDeferral = 88962306a36Sopenharmony_ci portstats[spx5_stats_tx_xdefer_cnt]; 89062306a36Sopenharmony_ci mac_stats->MulticastFramesReceivedOK = portstats[spx5_stats_rx_mc_cnt] + 89162306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_mc_cnt]; 89262306a36Sopenharmony_ci mac_stats->BroadcastFramesReceivedOK = portstats[spx5_stats_rx_bc_cnt] + 89362306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_bc_cnt]; 89462306a36Sopenharmony_ci mac_stats->InRangeLengthErrors = 89562306a36Sopenharmony_ci portstats[spx5_stats_rx_in_range_len_err_cnt] + 89662306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_in_range_len_err_cnt]; 89762306a36Sopenharmony_ci mac_stats->OutOfRangeLengthField = 89862306a36Sopenharmony_ci portstats[spx5_stats_rx_out_of_range_len_err_cnt] + 89962306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_out_of_range_len_err_cnt]; 90062306a36Sopenharmony_ci mac_stats->FrameTooLongErrors = portstats[spx5_stats_rx_oversize_cnt] + 90162306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_oversize_cnt]; 90262306a36Sopenharmony_ci} 90362306a36Sopenharmony_ci 90462306a36Sopenharmony_cistatic void sparx5_get_eth_mac_ctrl_stats(struct net_device *ndev, 90562306a36Sopenharmony_ci struct ethtool_eth_ctrl_stats *mac_ctrl_stats) 90662306a36Sopenharmony_ci{ 90762306a36Sopenharmony_ci struct sparx5_port *port = netdev_priv(ndev); 90862306a36Sopenharmony_ci struct sparx5 *sparx5 = port->sparx5; 90962306a36Sopenharmony_ci int portno = port->portno; 91062306a36Sopenharmony_ci void __iomem *inst; 91162306a36Sopenharmony_ci u64 *portstats; 91262306a36Sopenharmony_ci 91362306a36Sopenharmony_ci portstats = &sparx5->stats[portno * sparx5->num_stats]; 91462306a36Sopenharmony_ci if (sparx5_is_baser(port->conf.portmode)) { 91562306a36Sopenharmony_ci u32 tinst = sparx5_port_dev_index(portno); 91662306a36Sopenharmony_ci u32 dev = sparx5_to_high_dev(portno); 91762306a36Sopenharmony_ci 91862306a36Sopenharmony_ci inst = spx5_inst_get(sparx5, dev, tinst); 91962306a36Sopenharmony_ci sparx5_get_dev_mac_ctrl_stats(portstats, inst, tinst); 92062306a36Sopenharmony_ci } else { 92162306a36Sopenharmony_ci inst = spx5_inst_get(sparx5, TARGET_ASM, 0); 92262306a36Sopenharmony_ci sparx5_get_asm_mac_ctrl_stats(portstats, inst, portno); 92362306a36Sopenharmony_ci } 92462306a36Sopenharmony_ci mac_ctrl_stats->MACControlFramesTransmitted = 92562306a36Sopenharmony_ci portstats[spx5_stats_tx_pause_cnt] + 92662306a36Sopenharmony_ci portstats[spx5_stats_pmac_tx_pause_cnt]; 92762306a36Sopenharmony_ci mac_ctrl_stats->MACControlFramesReceived = 92862306a36Sopenharmony_ci portstats[spx5_stats_rx_pause_cnt] + 92962306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_pause_cnt]; 93062306a36Sopenharmony_ci mac_ctrl_stats->UnsupportedOpcodesReceived = 93162306a36Sopenharmony_ci portstats[spx5_stats_rx_unsup_opcode_cnt] + 93262306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_unsup_opcode_cnt]; 93362306a36Sopenharmony_ci} 93462306a36Sopenharmony_ci 93562306a36Sopenharmony_cistatic void sparx5_get_eth_rmon_stats(struct net_device *ndev, 93662306a36Sopenharmony_ci struct ethtool_rmon_stats *rmon_stats, 93762306a36Sopenharmony_ci const struct ethtool_rmon_hist_range **ranges) 93862306a36Sopenharmony_ci{ 93962306a36Sopenharmony_ci struct sparx5_port *port = netdev_priv(ndev); 94062306a36Sopenharmony_ci struct sparx5 *sparx5 = port->sparx5; 94162306a36Sopenharmony_ci int portno = port->portno; 94262306a36Sopenharmony_ci void __iomem *inst; 94362306a36Sopenharmony_ci u64 *portstats; 94462306a36Sopenharmony_ci 94562306a36Sopenharmony_ci portstats = &sparx5->stats[portno * sparx5->num_stats]; 94662306a36Sopenharmony_ci if (sparx5_is_baser(port->conf.portmode)) { 94762306a36Sopenharmony_ci u32 tinst = sparx5_port_dev_index(portno); 94862306a36Sopenharmony_ci u32 dev = sparx5_to_high_dev(portno); 94962306a36Sopenharmony_ci 95062306a36Sopenharmony_ci inst = spx5_inst_get(sparx5, dev, tinst); 95162306a36Sopenharmony_ci sparx5_get_dev_rmon_stats(portstats, inst, tinst); 95262306a36Sopenharmony_ci } else { 95362306a36Sopenharmony_ci inst = spx5_inst_get(sparx5, TARGET_ASM, 0); 95462306a36Sopenharmony_ci sparx5_get_asm_rmon_stats(portstats, inst, portno); 95562306a36Sopenharmony_ci } 95662306a36Sopenharmony_ci rmon_stats->undersize_pkts = portstats[spx5_stats_rx_undersize_cnt] + 95762306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_undersize_cnt]; 95862306a36Sopenharmony_ci rmon_stats->oversize_pkts = portstats[spx5_stats_rx_oversize_cnt] + 95962306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_oversize_cnt]; 96062306a36Sopenharmony_ci rmon_stats->fragments = portstats[spx5_stats_rx_fragments_cnt] + 96162306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_fragments_cnt]; 96262306a36Sopenharmony_ci rmon_stats->jabbers = portstats[spx5_stats_rx_jabbers_cnt] + 96362306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_jabbers_cnt]; 96462306a36Sopenharmony_ci rmon_stats->hist[0] = portstats[spx5_stats_rx_size64_cnt] + 96562306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_size64_cnt]; 96662306a36Sopenharmony_ci rmon_stats->hist[1] = portstats[spx5_stats_rx_size65to127_cnt] + 96762306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_size65to127_cnt]; 96862306a36Sopenharmony_ci rmon_stats->hist[2] = portstats[spx5_stats_rx_size128to255_cnt] + 96962306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_size128to255_cnt]; 97062306a36Sopenharmony_ci rmon_stats->hist[3] = portstats[spx5_stats_rx_size256to511_cnt] + 97162306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_size256to511_cnt]; 97262306a36Sopenharmony_ci rmon_stats->hist[4] = portstats[spx5_stats_rx_size512to1023_cnt] + 97362306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_size512to1023_cnt]; 97462306a36Sopenharmony_ci rmon_stats->hist[5] = portstats[spx5_stats_rx_size1024to1518_cnt] + 97562306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_size1024to1518_cnt]; 97662306a36Sopenharmony_ci rmon_stats->hist[6] = portstats[spx5_stats_rx_size1519tomax_cnt] + 97762306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_size1519tomax_cnt]; 97862306a36Sopenharmony_ci rmon_stats->hist_tx[0] = portstats[spx5_stats_tx_size64_cnt] + 97962306a36Sopenharmony_ci portstats[spx5_stats_pmac_tx_size64_cnt]; 98062306a36Sopenharmony_ci rmon_stats->hist_tx[1] = portstats[spx5_stats_tx_size65to127_cnt] + 98162306a36Sopenharmony_ci portstats[spx5_stats_pmac_tx_size65to127_cnt]; 98262306a36Sopenharmony_ci rmon_stats->hist_tx[2] = portstats[spx5_stats_tx_size128to255_cnt] + 98362306a36Sopenharmony_ci portstats[spx5_stats_pmac_tx_size128to255_cnt]; 98462306a36Sopenharmony_ci rmon_stats->hist_tx[3] = portstats[spx5_stats_tx_size256to511_cnt] + 98562306a36Sopenharmony_ci portstats[spx5_stats_pmac_tx_size256to511_cnt]; 98662306a36Sopenharmony_ci rmon_stats->hist_tx[4] = portstats[spx5_stats_tx_size512to1023_cnt] + 98762306a36Sopenharmony_ci portstats[spx5_stats_pmac_tx_size512to1023_cnt]; 98862306a36Sopenharmony_ci rmon_stats->hist_tx[5] = portstats[spx5_stats_tx_size1024to1518_cnt] + 98962306a36Sopenharmony_ci portstats[spx5_stats_pmac_tx_size1024to1518_cnt]; 99062306a36Sopenharmony_ci rmon_stats->hist_tx[6] = portstats[spx5_stats_tx_size1519tomax_cnt] + 99162306a36Sopenharmony_ci portstats[spx5_stats_pmac_tx_size1519tomax_cnt]; 99262306a36Sopenharmony_ci *ranges = sparx5_rmon_ranges; 99362306a36Sopenharmony_ci} 99462306a36Sopenharmony_ci 99562306a36Sopenharmony_cistatic int sparx5_get_sset_count(struct net_device *ndev, int sset) 99662306a36Sopenharmony_ci{ 99762306a36Sopenharmony_ci struct sparx5_port *port = netdev_priv(ndev); 99862306a36Sopenharmony_ci struct sparx5 *sparx5 = port->sparx5; 99962306a36Sopenharmony_ci 100062306a36Sopenharmony_ci if (sset != ETH_SS_STATS) 100162306a36Sopenharmony_ci return -EOPNOTSUPP; 100262306a36Sopenharmony_ci return sparx5->num_ethtool_stats; 100362306a36Sopenharmony_ci} 100462306a36Sopenharmony_ci 100562306a36Sopenharmony_cistatic void sparx5_get_sset_strings(struct net_device *ndev, u32 sset, u8 *data) 100662306a36Sopenharmony_ci{ 100762306a36Sopenharmony_ci struct sparx5_port *port = netdev_priv(ndev); 100862306a36Sopenharmony_ci struct sparx5 *sparx5 = port->sparx5; 100962306a36Sopenharmony_ci int idx; 101062306a36Sopenharmony_ci 101162306a36Sopenharmony_ci if (sset != ETH_SS_STATS) 101262306a36Sopenharmony_ci return; 101362306a36Sopenharmony_ci 101462306a36Sopenharmony_ci for (idx = 0; idx < sparx5->num_ethtool_stats; idx++) 101562306a36Sopenharmony_ci strncpy(data + idx * ETH_GSTRING_LEN, 101662306a36Sopenharmony_ci sparx5->stats_layout[idx], ETH_GSTRING_LEN); 101762306a36Sopenharmony_ci} 101862306a36Sopenharmony_ci 101962306a36Sopenharmony_cistatic void sparx5_get_sset_data(struct net_device *ndev, 102062306a36Sopenharmony_ci struct ethtool_stats *stats, u64 *data) 102162306a36Sopenharmony_ci{ 102262306a36Sopenharmony_ci struct sparx5_port *port = netdev_priv(ndev); 102362306a36Sopenharmony_ci struct sparx5 *sparx5 = port->sparx5; 102462306a36Sopenharmony_ci int portno = port->portno; 102562306a36Sopenharmony_ci void __iomem *inst; 102662306a36Sopenharmony_ci u64 *portstats; 102762306a36Sopenharmony_ci int idx; 102862306a36Sopenharmony_ci 102962306a36Sopenharmony_ci portstats = &sparx5->stats[portno * sparx5->num_stats]; 103062306a36Sopenharmony_ci if (sparx5_is_baser(port->conf.portmode)) { 103162306a36Sopenharmony_ci u32 tinst = sparx5_port_dev_index(portno); 103262306a36Sopenharmony_ci u32 dev = sparx5_to_high_dev(portno); 103362306a36Sopenharmony_ci 103462306a36Sopenharmony_ci inst = spx5_inst_get(sparx5, dev, tinst); 103562306a36Sopenharmony_ci sparx5_get_dev_misc_stats(portstats, inst, tinst); 103662306a36Sopenharmony_ci } else { 103762306a36Sopenharmony_ci inst = spx5_inst_get(sparx5, TARGET_ASM, 0); 103862306a36Sopenharmony_ci sparx5_get_asm_misc_stats(portstats, inst, portno); 103962306a36Sopenharmony_ci } 104062306a36Sopenharmony_ci sparx5_get_ana_ac_stats_stats(sparx5, portno); 104162306a36Sopenharmony_ci sparx5_get_queue_sys_stats(sparx5, portno); 104262306a36Sopenharmony_ci /* Copy port counters to the ethtool buffer */ 104362306a36Sopenharmony_ci for (idx = spx5_stats_mm_rx_assembly_err_cnt; 104462306a36Sopenharmony_ci idx < spx5_stats_mm_rx_assembly_err_cnt + 104562306a36Sopenharmony_ci sparx5->num_ethtool_stats; idx++) 104662306a36Sopenharmony_ci *data++ = portstats[idx]; 104762306a36Sopenharmony_ci} 104862306a36Sopenharmony_ci 104962306a36Sopenharmony_civoid sparx5_get_stats64(struct net_device *ndev, 105062306a36Sopenharmony_ci struct rtnl_link_stats64 *stats) 105162306a36Sopenharmony_ci{ 105262306a36Sopenharmony_ci struct sparx5_port *port = netdev_priv(ndev); 105362306a36Sopenharmony_ci struct sparx5 *sparx5 = port->sparx5; 105462306a36Sopenharmony_ci u64 *portstats; 105562306a36Sopenharmony_ci int idx; 105662306a36Sopenharmony_ci 105762306a36Sopenharmony_ci if (!sparx5->stats) 105862306a36Sopenharmony_ci return; /* Not initialized yet */ 105962306a36Sopenharmony_ci 106062306a36Sopenharmony_ci portstats = &sparx5->stats[port->portno * sparx5->num_stats]; 106162306a36Sopenharmony_ci 106262306a36Sopenharmony_ci stats->rx_packets = portstats[spx5_stats_rx_uc_cnt] + 106362306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_uc_cnt] + 106462306a36Sopenharmony_ci portstats[spx5_stats_rx_mc_cnt] + 106562306a36Sopenharmony_ci portstats[spx5_stats_rx_bc_cnt]; 106662306a36Sopenharmony_ci stats->tx_packets = portstats[spx5_stats_tx_uc_cnt] + 106762306a36Sopenharmony_ci portstats[spx5_stats_pmac_tx_uc_cnt] + 106862306a36Sopenharmony_ci portstats[spx5_stats_tx_mc_cnt] + 106962306a36Sopenharmony_ci portstats[spx5_stats_tx_bc_cnt]; 107062306a36Sopenharmony_ci stats->rx_bytes = portstats[spx5_stats_rx_ok_bytes_cnt] + 107162306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_ok_bytes_cnt]; 107262306a36Sopenharmony_ci stats->tx_bytes = portstats[spx5_stats_tx_ok_bytes_cnt] + 107362306a36Sopenharmony_ci portstats[spx5_stats_pmac_tx_ok_bytes_cnt]; 107462306a36Sopenharmony_ci stats->rx_errors = portstats[spx5_stats_rx_in_range_len_err_cnt] + 107562306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_in_range_len_err_cnt] + 107662306a36Sopenharmony_ci portstats[spx5_stats_rx_out_of_range_len_err_cnt] + 107762306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_out_of_range_len_err_cnt] + 107862306a36Sopenharmony_ci portstats[spx5_stats_rx_oversize_cnt] + 107962306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_oversize_cnt] + 108062306a36Sopenharmony_ci portstats[spx5_stats_rx_crc_err_cnt] + 108162306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_crc_err_cnt] + 108262306a36Sopenharmony_ci portstats[spx5_stats_rx_alignment_lost_cnt] + 108362306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_alignment_lost_cnt]; 108462306a36Sopenharmony_ci stats->tx_errors = portstats[spx5_stats_tx_xcoll_cnt] + 108562306a36Sopenharmony_ci portstats[spx5_stats_tx_csense_cnt] + 108662306a36Sopenharmony_ci portstats[spx5_stats_tx_late_coll_cnt]; 108762306a36Sopenharmony_ci stats->multicast = portstats[spx5_stats_rx_mc_cnt] + 108862306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_mc_cnt]; 108962306a36Sopenharmony_ci stats->collisions = portstats[spx5_stats_tx_late_coll_cnt] + 109062306a36Sopenharmony_ci portstats[spx5_stats_tx_xcoll_cnt] + 109162306a36Sopenharmony_ci portstats[spx5_stats_tx_backoff1_cnt]; 109262306a36Sopenharmony_ci stats->rx_length_errors = portstats[spx5_stats_rx_in_range_len_err_cnt] + 109362306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_in_range_len_err_cnt] + 109462306a36Sopenharmony_ci portstats[spx5_stats_rx_out_of_range_len_err_cnt] + 109562306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_out_of_range_len_err_cnt] + 109662306a36Sopenharmony_ci portstats[spx5_stats_rx_oversize_cnt] + 109762306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_oversize_cnt]; 109862306a36Sopenharmony_ci stats->rx_crc_errors = portstats[spx5_stats_rx_crc_err_cnt] + 109962306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_crc_err_cnt]; 110062306a36Sopenharmony_ci stats->rx_frame_errors = portstats[spx5_stats_rx_alignment_lost_cnt] + 110162306a36Sopenharmony_ci portstats[spx5_stats_pmac_rx_alignment_lost_cnt]; 110262306a36Sopenharmony_ci stats->tx_aborted_errors = portstats[spx5_stats_tx_xcoll_cnt]; 110362306a36Sopenharmony_ci stats->tx_carrier_errors = portstats[spx5_stats_tx_csense_cnt]; 110462306a36Sopenharmony_ci stats->tx_window_errors = portstats[spx5_stats_tx_late_coll_cnt]; 110562306a36Sopenharmony_ci stats->rx_dropped = portstats[spx5_stats_ana_ac_port_stat_lsb_cnt]; 110662306a36Sopenharmony_ci for (idx = 0; idx < 2 * SPX5_PRIOS; ++idx) 110762306a36Sopenharmony_ci stats->rx_dropped += portstats[spx5_stats_green_p0_rx_port_drop 110862306a36Sopenharmony_ci + idx]; 110962306a36Sopenharmony_ci stats->tx_dropped = portstats[spx5_stats_tx_local_drop]; 111062306a36Sopenharmony_ci} 111162306a36Sopenharmony_ci 111262306a36Sopenharmony_cistatic void sparx5_update_port_stats(struct sparx5 *sparx5, int portno) 111362306a36Sopenharmony_ci{ 111462306a36Sopenharmony_ci if (sparx5_is_baser(sparx5->ports[portno]->conf.portmode)) 111562306a36Sopenharmony_ci sparx5_get_device_stats(sparx5, portno); 111662306a36Sopenharmony_ci else 111762306a36Sopenharmony_ci sparx5_get_asm_stats(sparx5, portno); 111862306a36Sopenharmony_ci sparx5_get_ana_ac_stats_stats(sparx5, portno); 111962306a36Sopenharmony_ci sparx5_get_queue_sys_stats(sparx5, portno); 112062306a36Sopenharmony_ci} 112162306a36Sopenharmony_ci 112262306a36Sopenharmony_cistatic void sparx5_update_stats(struct sparx5 *sparx5) 112362306a36Sopenharmony_ci{ 112462306a36Sopenharmony_ci int idx; 112562306a36Sopenharmony_ci 112662306a36Sopenharmony_ci for (idx = 0; idx < SPX5_PORTS; idx++) 112762306a36Sopenharmony_ci if (sparx5->ports[idx]) 112862306a36Sopenharmony_ci sparx5_update_port_stats(sparx5, idx); 112962306a36Sopenharmony_ci} 113062306a36Sopenharmony_ci 113162306a36Sopenharmony_cistatic void sparx5_check_stats_work(struct work_struct *work) 113262306a36Sopenharmony_ci{ 113362306a36Sopenharmony_ci struct delayed_work *dwork = to_delayed_work(work); 113462306a36Sopenharmony_ci struct sparx5 *sparx5 = container_of(dwork, 113562306a36Sopenharmony_ci struct sparx5, 113662306a36Sopenharmony_ci stats_work); 113762306a36Sopenharmony_ci 113862306a36Sopenharmony_ci sparx5_update_stats(sparx5); 113962306a36Sopenharmony_ci 114062306a36Sopenharmony_ci queue_delayed_work(sparx5->stats_queue, &sparx5->stats_work, 114162306a36Sopenharmony_ci SPX5_STATS_CHECK_DELAY); 114262306a36Sopenharmony_ci} 114362306a36Sopenharmony_ci 114462306a36Sopenharmony_cistatic int sparx5_get_link_settings(struct net_device *ndev, 114562306a36Sopenharmony_ci struct ethtool_link_ksettings *cmd) 114662306a36Sopenharmony_ci{ 114762306a36Sopenharmony_ci struct sparx5_port *port = netdev_priv(ndev); 114862306a36Sopenharmony_ci 114962306a36Sopenharmony_ci return phylink_ethtool_ksettings_get(port->phylink, cmd); 115062306a36Sopenharmony_ci} 115162306a36Sopenharmony_ci 115262306a36Sopenharmony_cistatic int sparx5_set_link_settings(struct net_device *ndev, 115362306a36Sopenharmony_ci const struct ethtool_link_ksettings *cmd) 115462306a36Sopenharmony_ci{ 115562306a36Sopenharmony_ci struct sparx5_port *port = netdev_priv(ndev); 115662306a36Sopenharmony_ci 115762306a36Sopenharmony_ci return phylink_ethtool_ksettings_set(port->phylink, cmd); 115862306a36Sopenharmony_ci} 115962306a36Sopenharmony_ci 116062306a36Sopenharmony_cistatic void sparx5_config_stats(struct sparx5 *sparx5) 116162306a36Sopenharmony_ci{ 116262306a36Sopenharmony_ci /* Enable global events for port policer drops */ 116362306a36Sopenharmony_ci spx5_rmw(ANA_AC_PORT_SGE_CFG_MASK_SET(0xf0f0), 116462306a36Sopenharmony_ci ANA_AC_PORT_SGE_CFG_MASK, 116562306a36Sopenharmony_ci sparx5, 116662306a36Sopenharmony_ci ANA_AC_PORT_SGE_CFG(SPX5_PORT_POLICER_DROPS)); 116762306a36Sopenharmony_ci} 116862306a36Sopenharmony_ci 116962306a36Sopenharmony_cistatic void sparx5_config_port_stats(struct sparx5 *sparx5, int portno) 117062306a36Sopenharmony_ci{ 117162306a36Sopenharmony_ci /* Clear Queue System counters */ 117262306a36Sopenharmony_ci spx5_wr(XQS_STAT_CFG_STAT_VIEW_SET(portno) | 117362306a36Sopenharmony_ci XQS_STAT_CFG_STAT_CLEAR_SHOT_SET(3), sparx5, 117462306a36Sopenharmony_ci XQS_STAT_CFG); 117562306a36Sopenharmony_ci 117662306a36Sopenharmony_ci /* Use counter for port policer drop count */ 117762306a36Sopenharmony_ci spx5_rmw(ANA_AC_PORT_STAT_CFG_CFG_CNT_FRM_TYPE_SET(1) | 117862306a36Sopenharmony_ci ANA_AC_PORT_STAT_CFG_CFG_CNT_BYTE_SET(0) | 117962306a36Sopenharmony_ci ANA_AC_PORT_STAT_CFG_CFG_PRIO_MASK_SET(0xff), 118062306a36Sopenharmony_ci ANA_AC_PORT_STAT_CFG_CFG_CNT_FRM_TYPE | 118162306a36Sopenharmony_ci ANA_AC_PORT_STAT_CFG_CFG_CNT_BYTE | 118262306a36Sopenharmony_ci ANA_AC_PORT_STAT_CFG_CFG_PRIO_MASK, 118362306a36Sopenharmony_ci sparx5, ANA_AC_PORT_STAT_CFG(portno, SPX5_PORT_POLICER_DROPS)); 118462306a36Sopenharmony_ci} 118562306a36Sopenharmony_ci 118662306a36Sopenharmony_cistatic int sparx5_get_ts_info(struct net_device *dev, 118762306a36Sopenharmony_ci struct ethtool_ts_info *info) 118862306a36Sopenharmony_ci{ 118962306a36Sopenharmony_ci struct sparx5_port *port = netdev_priv(dev); 119062306a36Sopenharmony_ci struct sparx5 *sparx5 = port->sparx5; 119162306a36Sopenharmony_ci struct sparx5_phc *phc; 119262306a36Sopenharmony_ci 119362306a36Sopenharmony_ci if (!sparx5->ptp) 119462306a36Sopenharmony_ci return ethtool_op_get_ts_info(dev, info); 119562306a36Sopenharmony_ci 119662306a36Sopenharmony_ci phc = &sparx5->phc[SPARX5_PHC_PORT]; 119762306a36Sopenharmony_ci 119862306a36Sopenharmony_ci info->phc_index = phc->clock ? ptp_clock_index(phc->clock) : -1; 119962306a36Sopenharmony_ci if (info->phc_index == -1) { 120062306a36Sopenharmony_ci info->so_timestamping |= SOF_TIMESTAMPING_TX_SOFTWARE | 120162306a36Sopenharmony_ci SOF_TIMESTAMPING_RX_SOFTWARE | 120262306a36Sopenharmony_ci SOF_TIMESTAMPING_SOFTWARE; 120362306a36Sopenharmony_ci return 0; 120462306a36Sopenharmony_ci } 120562306a36Sopenharmony_ci info->so_timestamping |= SOF_TIMESTAMPING_TX_SOFTWARE | 120662306a36Sopenharmony_ci SOF_TIMESTAMPING_RX_SOFTWARE | 120762306a36Sopenharmony_ci SOF_TIMESTAMPING_SOFTWARE | 120862306a36Sopenharmony_ci SOF_TIMESTAMPING_TX_HARDWARE | 120962306a36Sopenharmony_ci SOF_TIMESTAMPING_RX_HARDWARE | 121062306a36Sopenharmony_ci SOF_TIMESTAMPING_RAW_HARDWARE; 121162306a36Sopenharmony_ci info->tx_types = BIT(HWTSTAMP_TX_OFF) | BIT(HWTSTAMP_TX_ON) | 121262306a36Sopenharmony_ci BIT(HWTSTAMP_TX_ONESTEP_SYNC); 121362306a36Sopenharmony_ci info->rx_filters = BIT(HWTSTAMP_FILTER_NONE) | 121462306a36Sopenharmony_ci BIT(HWTSTAMP_FILTER_ALL); 121562306a36Sopenharmony_ci 121662306a36Sopenharmony_ci return 0; 121762306a36Sopenharmony_ci} 121862306a36Sopenharmony_ci 121962306a36Sopenharmony_ciconst struct ethtool_ops sparx5_ethtool_ops = { 122062306a36Sopenharmony_ci .get_sset_count = sparx5_get_sset_count, 122162306a36Sopenharmony_ci .get_strings = sparx5_get_sset_strings, 122262306a36Sopenharmony_ci .get_ethtool_stats = sparx5_get_sset_data, 122362306a36Sopenharmony_ci .get_link_ksettings = sparx5_get_link_settings, 122462306a36Sopenharmony_ci .set_link_ksettings = sparx5_set_link_settings, 122562306a36Sopenharmony_ci .get_link = ethtool_op_get_link, 122662306a36Sopenharmony_ci .get_eth_phy_stats = sparx5_get_eth_phy_stats, 122762306a36Sopenharmony_ci .get_eth_mac_stats = sparx5_get_eth_mac_stats, 122862306a36Sopenharmony_ci .get_eth_ctrl_stats = sparx5_get_eth_mac_ctrl_stats, 122962306a36Sopenharmony_ci .get_rmon_stats = sparx5_get_eth_rmon_stats, 123062306a36Sopenharmony_ci .get_ts_info = sparx5_get_ts_info, 123162306a36Sopenharmony_ci}; 123262306a36Sopenharmony_ci 123362306a36Sopenharmony_ciint sparx_stats_init(struct sparx5 *sparx5) 123462306a36Sopenharmony_ci{ 123562306a36Sopenharmony_ci char queue_name[32]; 123662306a36Sopenharmony_ci int portno; 123762306a36Sopenharmony_ci 123862306a36Sopenharmony_ci sparx5->stats_layout = sparx5_stats_layout; 123962306a36Sopenharmony_ci sparx5->num_stats = spx5_stats_count; 124062306a36Sopenharmony_ci sparx5->num_ethtool_stats = ARRAY_SIZE(sparx5_stats_layout); 124162306a36Sopenharmony_ci sparx5->stats = devm_kcalloc(sparx5->dev, 124262306a36Sopenharmony_ci SPX5_PORTS_ALL * sparx5->num_stats, 124362306a36Sopenharmony_ci sizeof(u64), GFP_KERNEL); 124462306a36Sopenharmony_ci if (!sparx5->stats) 124562306a36Sopenharmony_ci return -ENOMEM; 124662306a36Sopenharmony_ci 124762306a36Sopenharmony_ci mutex_init(&sparx5->queue_stats_lock); 124862306a36Sopenharmony_ci sparx5_config_stats(sparx5); 124962306a36Sopenharmony_ci for (portno = 0; portno < SPX5_PORTS; portno++) 125062306a36Sopenharmony_ci if (sparx5->ports[portno]) 125162306a36Sopenharmony_ci sparx5_config_port_stats(sparx5, portno); 125262306a36Sopenharmony_ci 125362306a36Sopenharmony_ci snprintf(queue_name, sizeof(queue_name), "%s-stats", 125462306a36Sopenharmony_ci dev_name(sparx5->dev)); 125562306a36Sopenharmony_ci sparx5->stats_queue = create_singlethread_workqueue(queue_name); 125662306a36Sopenharmony_ci if (!sparx5->stats_queue) 125762306a36Sopenharmony_ci return -ENOMEM; 125862306a36Sopenharmony_ci 125962306a36Sopenharmony_ci INIT_DELAYED_WORK(&sparx5->stats_work, sparx5_check_stats_work); 126062306a36Sopenharmony_ci queue_delayed_work(sparx5->stats_queue, &sparx5->stats_work, 126162306a36Sopenharmony_ci SPX5_STATS_CHECK_DELAY); 126262306a36Sopenharmony_ci 126362306a36Sopenharmony_ci return 0; 126462306a36Sopenharmony_ci} 1265