162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* Copyright (c) 2018-2019, Vladimir Oltean <olteanv@gmail.com> 362306a36Sopenharmony_ci */ 462306a36Sopenharmony_ci#include "sja1105.h" 562306a36Sopenharmony_ci 662306a36Sopenharmony_cienum sja1105_counter_index { 762306a36Sopenharmony_ci __SJA1105_COUNTER_UNUSED, 862306a36Sopenharmony_ci /* MAC */ 962306a36Sopenharmony_ci N_RUNT, 1062306a36Sopenharmony_ci N_SOFERR, 1162306a36Sopenharmony_ci N_ALIGNERR, 1262306a36Sopenharmony_ci N_MIIERR, 1362306a36Sopenharmony_ci TYPEERR, 1462306a36Sopenharmony_ci SIZEERR, 1562306a36Sopenharmony_ci TCTIMEOUT, 1662306a36Sopenharmony_ci PRIORERR, 1762306a36Sopenharmony_ci NOMASTER, 1862306a36Sopenharmony_ci MEMOV, 1962306a36Sopenharmony_ci MEMERR, 2062306a36Sopenharmony_ci INVTYP, 2162306a36Sopenharmony_ci INTCYOV, 2262306a36Sopenharmony_ci DOMERR, 2362306a36Sopenharmony_ci PCFBAGDROP, 2462306a36Sopenharmony_ci SPCPRIOR, 2562306a36Sopenharmony_ci AGEPRIOR, 2662306a36Sopenharmony_ci PORTDROP, 2762306a36Sopenharmony_ci LENDROP, 2862306a36Sopenharmony_ci BAGDROP, 2962306a36Sopenharmony_ci POLICEERR, 3062306a36Sopenharmony_ci DRPNONA664ERR, 3162306a36Sopenharmony_ci SPCERR, 3262306a36Sopenharmony_ci AGEDRP, 3362306a36Sopenharmony_ci /* HL1 */ 3462306a36Sopenharmony_ci N_N664ERR, 3562306a36Sopenharmony_ci N_VLANERR, 3662306a36Sopenharmony_ci N_UNRELEASED, 3762306a36Sopenharmony_ci N_SIZEERR, 3862306a36Sopenharmony_ci N_CRCERR, 3962306a36Sopenharmony_ci N_VLNOTFOUND, 4062306a36Sopenharmony_ci N_CTPOLERR, 4162306a36Sopenharmony_ci N_POLERR, 4262306a36Sopenharmony_ci N_RXFRM, 4362306a36Sopenharmony_ci N_RXBYTE, 4462306a36Sopenharmony_ci N_TXFRM, 4562306a36Sopenharmony_ci N_TXBYTE, 4662306a36Sopenharmony_ci /* HL2 */ 4762306a36Sopenharmony_ci N_QFULL, 4862306a36Sopenharmony_ci N_PART_DROP, 4962306a36Sopenharmony_ci N_EGR_DISABLED, 5062306a36Sopenharmony_ci N_NOT_REACH, 5162306a36Sopenharmony_ci __MAX_SJA1105ET_PORT_COUNTER, 5262306a36Sopenharmony_ci /* P/Q/R/S only */ 5362306a36Sopenharmony_ci /* ETHER */ 5462306a36Sopenharmony_ci N_DROPS_NOLEARN = __MAX_SJA1105ET_PORT_COUNTER, 5562306a36Sopenharmony_ci N_DROPS_NOROUTE, 5662306a36Sopenharmony_ci N_DROPS_ILL_DTAG, 5762306a36Sopenharmony_ci N_DROPS_DTAG, 5862306a36Sopenharmony_ci N_DROPS_SOTAG, 5962306a36Sopenharmony_ci N_DROPS_SITAG, 6062306a36Sopenharmony_ci N_DROPS_UTAG, 6162306a36Sopenharmony_ci N_TX_BYTES_1024_2047, 6262306a36Sopenharmony_ci N_TX_BYTES_512_1023, 6362306a36Sopenharmony_ci N_TX_BYTES_256_511, 6462306a36Sopenharmony_ci N_TX_BYTES_128_255, 6562306a36Sopenharmony_ci N_TX_BYTES_65_127, 6662306a36Sopenharmony_ci N_TX_BYTES_64, 6762306a36Sopenharmony_ci N_TX_MCAST, 6862306a36Sopenharmony_ci N_TX_BCAST, 6962306a36Sopenharmony_ci N_RX_BYTES_1024_2047, 7062306a36Sopenharmony_ci N_RX_BYTES_512_1023, 7162306a36Sopenharmony_ci N_RX_BYTES_256_511, 7262306a36Sopenharmony_ci N_RX_BYTES_128_255, 7362306a36Sopenharmony_ci N_RX_BYTES_65_127, 7462306a36Sopenharmony_ci N_RX_BYTES_64, 7562306a36Sopenharmony_ci N_RX_MCAST, 7662306a36Sopenharmony_ci N_RX_BCAST, 7762306a36Sopenharmony_ci __MAX_SJA1105PQRS_PORT_COUNTER, 7862306a36Sopenharmony_ci}; 7962306a36Sopenharmony_ci 8062306a36Sopenharmony_cistruct sja1105_port_counter { 8162306a36Sopenharmony_ci enum sja1105_stats_area area; 8262306a36Sopenharmony_ci const char name[ETH_GSTRING_LEN]; 8362306a36Sopenharmony_ci int offset; 8462306a36Sopenharmony_ci int start; 8562306a36Sopenharmony_ci int end; 8662306a36Sopenharmony_ci bool is_64bit; 8762306a36Sopenharmony_ci}; 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_cistatic const struct sja1105_port_counter sja1105_port_counters[] = { 9062306a36Sopenharmony_ci /* MAC-Level Diagnostic Counters */ 9162306a36Sopenharmony_ci [N_RUNT] = { 9262306a36Sopenharmony_ci .area = MAC, 9362306a36Sopenharmony_ci .name = "n_runt", 9462306a36Sopenharmony_ci .offset = 0, 9562306a36Sopenharmony_ci .start = 31, 9662306a36Sopenharmony_ci .end = 24, 9762306a36Sopenharmony_ci }, 9862306a36Sopenharmony_ci [N_SOFERR] = { 9962306a36Sopenharmony_ci .area = MAC, 10062306a36Sopenharmony_ci .name = "n_soferr", 10162306a36Sopenharmony_ci .offset = 0x0, 10262306a36Sopenharmony_ci .start = 23, 10362306a36Sopenharmony_ci .end = 16, 10462306a36Sopenharmony_ci }, 10562306a36Sopenharmony_ci [N_ALIGNERR] = { 10662306a36Sopenharmony_ci .area = MAC, 10762306a36Sopenharmony_ci .name = "n_alignerr", 10862306a36Sopenharmony_ci .offset = 0x0, 10962306a36Sopenharmony_ci .start = 15, 11062306a36Sopenharmony_ci .end = 8, 11162306a36Sopenharmony_ci }, 11262306a36Sopenharmony_ci [N_MIIERR] = { 11362306a36Sopenharmony_ci .area = MAC, 11462306a36Sopenharmony_ci .name = "n_miierr", 11562306a36Sopenharmony_ci .offset = 0x0, 11662306a36Sopenharmony_ci .start = 7, 11762306a36Sopenharmony_ci .end = 0, 11862306a36Sopenharmony_ci }, 11962306a36Sopenharmony_ci /* MAC-Level Diagnostic Flags */ 12062306a36Sopenharmony_ci [TYPEERR] = { 12162306a36Sopenharmony_ci .area = MAC, 12262306a36Sopenharmony_ci .name = "typeerr", 12362306a36Sopenharmony_ci .offset = 0x1, 12462306a36Sopenharmony_ci .start = 27, 12562306a36Sopenharmony_ci .end = 27, 12662306a36Sopenharmony_ci }, 12762306a36Sopenharmony_ci [SIZEERR] = { 12862306a36Sopenharmony_ci .area = MAC, 12962306a36Sopenharmony_ci .name = "sizeerr", 13062306a36Sopenharmony_ci .offset = 0x1, 13162306a36Sopenharmony_ci .start = 26, 13262306a36Sopenharmony_ci .end = 26, 13362306a36Sopenharmony_ci }, 13462306a36Sopenharmony_ci [TCTIMEOUT] = { 13562306a36Sopenharmony_ci .area = MAC, 13662306a36Sopenharmony_ci .name = "tctimeout", 13762306a36Sopenharmony_ci .offset = 0x1, 13862306a36Sopenharmony_ci .start = 25, 13962306a36Sopenharmony_ci .end = 25, 14062306a36Sopenharmony_ci }, 14162306a36Sopenharmony_ci [PRIORERR] = { 14262306a36Sopenharmony_ci .area = MAC, 14362306a36Sopenharmony_ci .name = "priorerr", 14462306a36Sopenharmony_ci .offset = 0x1, 14562306a36Sopenharmony_ci .start = 24, 14662306a36Sopenharmony_ci .end = 24, 14762306a36Sopenharmony_ci }, 14862306a36Sopenharmony_ci [NOMASTER] = { 14962306a36Sopenharmony_ci .area = MAC, 15062306a36Sopenharmony_ci .name = "nomaster", 15162306a36Sopenharmony_ci .offset = 0x1, 15262306a36Sopenharmony_ci .start = 23, 15362306a36Sopenharmony_ci .end = 23, 15462306a36Sopenharmony_ci }, 15562306a36Sopenharmony_ci [MEMOV] = { 15662306a36Sopenharmony_ci .area = MAC, 15762306a36Sopenharmony_ci .name = "memov", 15862306a36Sopenharmony_ci .offset = 0x1, 15962306a36Sopenharmony_ci .start = 22, 16062306a36Sopenharmony_ci .end = 22, 16162306a36Sopenharmony_ci }, 16262306a36Sopenharmony_ci [MEMERR] = { 16362306a36Sopenharmony_ci .area = MAC, 16462306a36Sopenharmony_ci .name = "memerr", 16562306a36Sopenharmony_ci .offset = 0x1, 16662306a36Sopenharmony_ci .start = 21, 16762306a36Sopenharmony_ci .end = 21, 16862306a36Sopenharmony_ci }, 16962306a36Sopenharmony_ci [INVTYP] = { 17062306a36Sopenharmony_ci .area = MAC, 17162306a36Sopenharmony_ci .name = "invtyp", 17262306a36Sopenharmony_ci .offset = 0x1, 17362306a36Sopenharmony_ci .start = 19, 17462306a36Sopenharmony_ci .end = 19, 17562306a36Sopenharmony_ci }, 17662306a36Sopenharmony_ci [INTCYOV] = { 17762306a36Sopenharmony_ci .area = MAC, 17862306a36Sopenharmony_ci .name = "intcyov", 17962306a36Sopenharmony_ci .offset = 0x1, 18062306a36Sopenharmony_ci .start = 18, 18162306a36Sopenharmony_ci .end = 18, 18262306a36Sopenharmony_ci }, 18362306a36Sopenharmony_ci [DOMERR] = { 18462306a36Sopenharmony_ci .area = MAC, 18562306a36Sopenharmony_ci .name = "domerr", 18662306a36Sopenharmony_ci .offset = 0x1, 18762306a36Sopenharmony_ci .start = 17, 18862306a36Sopenharmony_ci .end = 17, 18962306a36Sopenharmony_ci }, 19062306a36Sopenharmony_ci [PCFBAGDROP] = { 19162306a36Sopenharmony_ci .area = MAC, 19262306a36Sopenharmony_ci .name = "pcfbagdrop", 19362306a36Sopenharmony_ci .offset = 0x1, 19462306a36Sopenharmony_ci .start = 16, 19562306a36Sopenharmony_ci .end = 16, 19662306a36Sopenharmony_ci }, 19762306a36Sopenharmony_ci [SPCPRIOR] = { 19862306a36Sopenharmony_ci .area = MAC, 19962306a36Sopenharmony_ci .name = "spcprior", 20062306a36Sopenharmony_ci .offset = 0x1, 20162306a36Sopenharmony_ci .start = 15, 20262306a36Sopenharmony_ci .end = 12, 20362306a36Sopenharmony_ci }, 20462306a36Sopenharmony_ci [AGEPRIOR] = { 20562306a36Sopenharmony_ci .area = MAC, 20662306a36Sopenharmony_ci .name = "ageprior", 20762306a36Sopenharmony_ci .offset = 0x1, 20862306a36Sopenharmony_ci .start = 11, 20962306a36Sopenharmony_ci .end = 8, 21062306a36Sopenharmony_ci }, 21162306a36Sopenharmony_ci [PORTDROP] = { 21262306a36Sopenharmony_ci .area = MAC, 21362306a36Sopenharmony_ci .name = "portdrop", 21462306a36Sopenharmony_ci .offset = 0x1, 21562306a36Sopenharmony_ci .start = 6, 21662306a36Sopenharmony_ci .end = 6, 21762306a36Sopenharmony_ci }, 21862306a36Sopenharmony_ci [LENDROP] = { 21962306a36Sopenharmony_ci .area = MAC, 22062306a36Sopenharmony_ci .name = "lendrop", 22162306a36Sopenharmony_ci .offset = 0x1, 22262306a36Sopenharmony_ci .start = 5, 22362306a36Sopenharmony_ci .end = 5, 22462306a36Sopenharmony_ci }, 22562306a36Sopenharmony_ci [BAGDROP] = { 22662306a36Sopenharmony_ci .area = MAC, 22762306a36Sopenharmony_ci .name = "bagdrop", 22862306a36Sopenharmony_ci .offset = 0x1, 22962306a36Sopenharmony_ci .start = 4, 23062306a36Sopenharmony_ci .end = 4, 23162306a36Sopenharmony_ci }, 23262306a36Sopenharmony_ci [POLICEERR] = { 23362306a36Sopenharmony_ci .area = MAC, 23462306a36Sopenharmony_ci .name = "policeerr", 23562306a36Sopenharmony_ci .offset = 0x1, 23662306a36Sopenharmony_ci .start = 3, 23762306a36Sopenharmony_ci .end = 3, 23862306a36Sopenharmony_ci }, 23962306a36Sopenharmony_ci [DRPNONA664ERR] = { 24062306a36Sopenharmony_ci .area = MAC, 24162306a36Sopenharmony_ci .name = "drpnona664err", 24262306a36Sopenharmony_ci .offset = 0x1, 24362306a36Sopenharmony_ci .start = 2, 24462306a36Sopenharmony_ci .end = 2, 24562306a36Sopenharmony_ci }, 24662306a36Sopenharmony_ci [SPCERR] = { 24762306a36Sopenharmony_ci .area = MAC, 24862306a36Sopenharmony_ci .name = "spcerr", 24962306a36Sopenharmony_ci .offset = 0x1, 25062306a36Sopenharmony_ci .start = 1, 25162306a36Sopenharmony_ci .end = 1, 25262306a36Sopenharmony_ci }, 25362306a36Sopenharmony_ci [AGEDRP] = { 25462306a36Sopenharmony_ci .area = MAC, 25562306a36Sopenharmony_ci .name = "agedrp", 25662306a36Sopenharmony_ci .offset = 0x1, 25762306a36Sopenharmony_ci .start = 0, 25862306a36Sopenharmony_ci .end = 0, 25962306a36Sopenharmony_ci }, 26062306a36Sopenharmony_ci /* High-Level Diagnostic Counters */ 26162306a36Sopenharmony_ci [N_N664ERR] = { 26262306a36Sopenharmony_ci .area = HL1, 26362306a36Sopenharmony_ci .name = "n_n664err", 26462306a36Sopenharmony_ci .offset = 0xF, 26562306a36Sopenharmony_ci .start = 31, 26662306a36Sopenharmony_ci .end = 0, 26762306a36Sopenharmony_ci }, 26862306a36Sopenharmony_ci [N_VLANERR] = { 26962306a36Sopenharmony_ci .area = HL1, 27062306a36Sopenharmony_ci .name = "n_vlanerr", 27162306a36Sopenharmony_ci .offset = 0xE, 27262306a36Sopenharmony_ci .start = 31, 27362306a36Sopenharmony_ci .end = 0, 27462306a36Sopenharmony_ci }, 27562306a36Sopenharmony_ci [N_UNRELEASED] = { 27662306a36Sopenharmony_ci .area = HL1, 27762306a36Sopenharmony_ci .name = "n_unreleased", 27862306a36Sopenharmony_ci .offset = 0xD, 27962306a36Sopenharmony_ci .start = 31, 28062306a36Sopenharmony_ci .end = 0, 28162306a36Sopenharmony_ci }, 28262306a36Sopenharmony_ci [N_SIZEERR] = { 28362306a36Sopenharmony_ci .area = HL1, 28462306a36Sopenharmony_ci .name = "n_sizeerr", 28562306a36Sopenharmony_ci .offset = 0xC, 28662306a36Sopenharmony_ci .start = 31, 28762306a36Sopenharmony_ci .end = 0, 28862306a36Sopenharmony_ci }, 28962306a36Sopenharmony_ci [N_CRCERR] = { 29062306a36Sopenharmony_ci .area = HL1, 29162306a36Sopenharmony_ci .name = "n_crcerr", 29262306a36Sopenharmony_ci .offset = 0xB, 29362306a36Sopenharmony_ci .start = 31, 29462306a36Sopenharmony_ci .end = 0, 29562306a36Sopenharmony_ci }, 29662306a36Sopenharmony_ci [N_VLNOTFOUND] = { 29762306a36Sopenharmony_ci .area = HL1, 29862306a36Sopenharmony_ci .name = "n_vlnotfound", 29962306a36Sopenharmony_ci .offset = 0xA, 30062306a36Sopenharmony_ci .start = 31, 30162306a36Sopenharmony_ci .end = 0, 30262306a36Sopenharmony_ci }, 30362306a36Sopenharmony_ci [N_CTPOLERR] = { 30462306a36Sopenharmony_ci .area = HL1, 30562306a36Sopenharmony_ci .name = "n_ctpolerr", 30662306a36Sopenharmony_ci .offset = 0x9, 30762306a36Sopenharmony_ci .start = 31, 30862306a36Sopenharmony_ci .end = 0, 30962306a36Sopenharmony_ci }, 31062306a36Sopenharmony_ci [N_POLERR] = { 31162306a36Sopenharmony_ci .area = HL1, 31262306a36Sopenharmony_ci .name = "n_polerr", 31362306a36Sopenharmony_ci .offset = 0x8, 31462306a36Sopenharmony_ci .start = 31, 31562306a36Sopenharmony_ci .end = 0, 31662306a36Sopenharmony_ci }, 31762306a36Sopenharmony_ci [N_RXFRM] = { 31862306a36Sopenharmony_ci .area = HL1, 31962306a36Sopenharmony_ci .name = "n_rxfrm", 32062306a36Sopenharmony_ci .offset = 0x6, 32162306a36Sopenharmony_ci .start = 31, 32262306a36Sopenharmony_ci .end = 0, 32362306a36Sopenharmony_ci .is_64bit = true, 32462306a36Sopenharmony_ci }, 32562306a36Sopenharmony_ci [N_RXBYTE] = { 32662306a36Sopenharmony_ci .area = HL1, 32762306a36Sopenharmony_ci .name = "n_rxbyte", 32862306a36Sopenharmony_ci .offset = 0x4, 32962306a36Sopenharmony_ci .start = 31, 33062306a36Sopenharmony_ci .end = 0, 33162306a36Sopenharmony_ci .is_64bit = true, 33262306a36Sopenharmony_ci }, 33362306a36Sopenharmony_ci [N_TXFRM] = { 33462306a36Sopenharmony_ci .area = HL1, 33562306a36Sopenharmony_ci .name = "n_txfrm", 33662306a36Sopenharmony_ci .offset = 0x2, 33762306a36Sopenharmony_ci .start = 31, 33862306a36Sopenharmony_ci .end = 0, 33962306a36Sopenharmony_ci .is_64bit = true, 34062306a36Sopenharmony_ci }, 34162306a36Sopenharmony_ci [N_TXBYTE] = { 34262306a36Sopenharmony_ci .area = HL1, 34362306a36Sopenharmony_ci .name = "n_txbyte", 34462306a36Sopenharmony_ci .offset = 0x0, 34562306a36Sopenharmony_ci .start = 31, 34662306a36Sopenharmony_ci .end = 0, 34762306a36Sopenharmony_ci .is_64bit = true, 34862306a36Sopenharmony_ci }, 34962306a36Sopenharmony_ci [N_QFULL] = { 35062306a36Sopenharmony_ci .area = HL2, 35162306a36Sopenharmony_ci .name = "n_qfull", 35262306a36Sopenharmony_ci .offset = 0x3, 35362306a36Sopenharmony_ci .start = 31, 35462306a36Sopenharmony_ci .end = 0, 35562306a36Sopenharmony_ci }, 35662306a36Sopenharmony_ci [N_PART_DROP] = { 35762306a36Sopenharmony_ci .area = HL2, 35862306a36Sopenharmony_ci .name = "n_part_drop", 35962306a36Sopenharmony_ci .offset = 0x2, 36062306a36Sopenharmony_ci .start = 31, 36162306a36Sopenharmony_ci .end = 0, 36262306a36Sopenharmony_ci }, 36362306a36Sopenharmony_ci [N_EGR_DISABLED] = { 36462306a36Sopenharmony_ci .area = HL2, 36562306a36Sopenharmony_ci .name = "n_egr_disabled", 36662306a36Sopenharmony_ci .offset = 0x1, 36762306a36Sopenharmony_ci .start = 31, 36862306a36Sopenharmony_ci .end = 0, 36962306a36Sopenharmony_ci }, 37062306a36Sopenharmony_ci [N_NOT_REACH] = { 37162306a36Sopenharmony_ci .area = HL2, 37262306a36Sopenharmony_ci .name = "n_not_reach", 37362306a36Sopenharmony_ci .offset = 0x0, 37462306a36Sopenharmony_ci .start = 31, 37562306a36Sopenharmony_ci .end = 0, 37662306a36Sopenharmony_ci }, 37762306a36Sopenharmony_ci /* Ether Stats */ 37862306a36Sopenharmony_ci [N_DROPS_NOLEARN] = { 37962306a36Sopenharmony_ci .area = ETHER, 38062306a36Sopenharmony_ci .name = "n_drops_nolearn", 38162306a36Sopenharmony_ci .offset = 0x16, 38262306a36Sopenharmony_ci .start = 31, 38362306a36Sopenharmony_ci .end = 0, 38462306a36Sopenharmony_ci }, 38562306a36Sopenharmony_ci [N_DROPS_NOROUTE] = { 38662306a36Sopenharmony_ci .area = ETHER, 38762306a36Sopenharmony_ci .name = "n_drops_noroute", 38862306a36Sopenharmony_ci .offset = 0x15, 38962306a36Sopenharmony_ci .start = 31, 39062306a36Sopenharmony_ci .end = 0, 39162306a36Sopenharmony_ci }, 39262306a36Sopenharmony_ci [N_DROPS_ILL_DTAG] = { 39362306a36Sopenharmony_ci .area = ETHER, 39462306a36Sopenharmony_ci .name = "n_drops_ill_dtag", 39562306a36Sopenharmony_ci .offset = 0x14, 39662306a36Sopenharmony_ci .start = 31, 39762306a36Sopenharmony_ci .end = 0, 39862306a36Sopenharmony_ci }, 39962306a36Sopenharmony_ci [N_DROPS_DTAG] = { 40062306a36Sopenharmony_ci .area = ETHER, 40162306a36Sopenharmony_ci .name = "n_drops_dtag", 40262306a36Sopenharmony_ci .offset = 0x13, 40362306a36Sopenharmony_ci .start = 31, 40462306a36Sopenharmony_ci .end = 0, 40562306a36Sopenharmony_ci }, 40662306a36Sopenharmony_ci [N_DROPS_SOTAG] = { 40762306a36Sopenharmony_ci .area = ETHER, 40862306a36Sopenharmony_ci .name = "n_drops_sotag", 40962306a36Sopenharmony_ci .offset = 0x12, 41062306a36Sopenharmony_ci .start = 31, 41162306a36Sopenharmony_ci .end = 0, 41262306a36Sopenharmony_ci }, 41362306a36Sopenharmony_ci [N_DROPS_SITAG] = { 41462306a36Sopenharmony_ci .area = ETHER, 41562306a36Sopenharmony_ci .name = "n_drops_sitag", 41662306a36Sopenharmony_ci .offset = 0x11, 41762306a36Sopenharmony_ci .start = 31, 41862306a36Sopenharmony_ci .end = 0, 41962306a36Sopenharmony_ci }, 42062306a36Sopenharmony_ci [N_DROPS_UTAG] = { 42162306a36Sopenharmony_ci .area = ETHER, 42262306a36Sopenharmony_ci .name = "n_drops_utag", 42362306a36Sopenharmony_ci .offset = 0x10, 42462306a36Sopenharmony_ci .start = 31, 42562306a36Sopenharmony_ci .end = 0, 42662306a36Sopenharmony_ci }, 42762306a36Sopenharmony_ci [N_TX_BYTES_1024_2047] = { 42862306a36Sopenharmony_ci .area = ETHER, 42962306a36Sopenharmony_ci .name = "n_tx_bytes_1024_2047", 43062306a36Sopenharmony_ci .offset = 0x0F, 43162306a36Sopenharmony_ci .start = 31, 43262306a36Sopenharmony_ci .end = 0, 43362306a36Sopenharmony_ci }, 43462306a36Sopenharmony_ci [N_TX_BYTES_512_1023] = { 43562306a36Sopenharmony_ci .area = ETHER, 43662306a36Sopenharmony_ci .name = "n_tx_bytes_512_1023", 43762306a36Sopenharmony_ci .offset = 0x0E, 43862306a36Sopenharmony_ci .start = 31, 43962306a36Sopenharmony_ci .end = 0, 44062306a36Sopenharmony_ci }, 44162306a36Sopenharmony_ci [N_TX_BYTES_256_511] = { 44262306a36Sopenharmony_ci .area = ETHER, 44362306a36Sopenharmony_ci .name = "n_tx_bytes_256_511", 44462306a36Sopenharmony_ci .offset = 0x0D, 44562306a36Sopenharmony_ci .start = 31, 44662306a36Sopenharmony_ci .end = 0, 44762306a36Sopenharmony_ci }, 44862306a36Sopenharmony_ci [N_TX_BYTES_128_255] = { 44962306a36Sopenharmony_ci .area = ETHER, 45062306a36Sopenharmony_ci .name = "n_tx_bytes_128_255", 45162306a36Sopenharmony_ci .offset = 0x0C, 45262306a36Sopenharmony_ci .start = 31, 45362306a36Sopenharmony_ci .end = 0, 45462306a36Sopenharmony_ci }, 45562306a36Sopenharmony_ci [N_TX_BYTES_65_127] = { 45662306a36Sopenharmony_ci .area = ETHER, 45762306a36Sopenharmony_ci .name = "n_tx_bytes_65_127", 45862306a36Sopenharmony_ci .offset = 0x0B, 45962306a36Sopenharmony_ci .start = 31, 46062306a36Sopenharmony_ci .end = 0, 46162306a36Sopenharmony_ci }, 46262306a36Sopenharmony_ci [N_TX_BYTES_64] = { 46362306a36Sopenharmony_ci .area = ETHER, 46462306a36Sopenharmony_ci .name = "n_tx_bytes_64", 46562306a36Sopenharmony_ci .offset = 0x0A, 46662306a36Sopenharmony_ci .start = 31, 46762306a36Sopenharmony_ci .end = 0, 46862306a36Sopenharmony_ci }, 46962306a36Sopenharmony_ci [N_TX_MCAST] = { 47062306a36Sopenharmony_ci .area = ETHER, 47162306a36Sopenharmony_ci .name = "n_tx_mcast", 47262306a36Sopenharmony_ci .offset = 0x09, 47362306a36Sopenharmony_ci .start = 31, 47462306a36Sopenharmony_ci .end = 0, 47562306a36Sopenharmony_ci }, 47662306a36Sopenharmony_ci [N_TX_BCAST] = { 47762306a36Sopenharmony_ci .area = ETHER, 47862306a36Sopenharmony_ci .name = "n_tx_bcast", 47962306a36Sopenharmony_ci .offset = 0x08, 48062306a36Sopenharmony_ci .start = 31, 48162306a36Sopenharmony_ci .end = 0, 48262306a36Sopenharmony_ci }, 48362306a36Sopenharmony_ci [N_RX_BYTES_1024_2047] = { 48462306a36Sopenharmony_ci .area = ETHER, 48562306a36Sopenharmony_ci .name = "n_rx_bytes_1024_2047", 48662306a36Sopenharmony_ci .offset = 0x07, 48762306a36Sopenharmony_ci .start = 31, 48862306a36Sopenharmony_ci .end = 0, 48962306a36Sopenharmony_ci }, 49062306a36Sopenharmony_ci [N_RX_BYTES_512_1023] = { 49162306a36Sopenharmony_ci .area = ETHER, 49262306a36Sopenharmony_ci .name = "n_rx_bytes_512_1023", 49362306a36Sopenharmony_ci .offset = 0x06, 49462306a36Sopenharmony_ci .start = 31, 49562306a36Sopenharmony_ci .end = 0, 49662306a36Sopenharmony_ci }, 49762306a36Sopenharmony_ci [N_RX_BYTES_256_511] = { 49862306a36Sopenharmony_ci .area = ETHER, 49962306a36Sopenharmony_ci .name = "n_rx_bytes_256_511", 50062306a36Sopenharmony_ci .offset = 0x05, 50162306a36Sopenharmony_ci .start = 31, 50262306a36Sopenharmony_ci .end = 0, 50362306a36Sopenharmony_ci }, 50462306a36Sopenharmony_ci [N_RX_BYTES_128_255] = { 50562306a36Sopenharmony_ci .area = ETHER, 50662306a36Sopenharmony_ci .name = "n_rx_bytes_128_255", 50762306a36Sopenharmony_ci .offset = 0x04, 50862306a36Sopenharmony_ci .start = 31, 50962306a36Sopenharmony_ci .end = 0, 51062306a36Sopenharmony_ci }, 51162306a36Sopenharmony_ci [N_RX_BYTES_65_127] = { 51262306a36Sopenharmony_ci .area = ETHER, 51362306a36Sopenharmony_ci .name = "n_rx_bytes_65_127", 51462306a36Sopenharmony_ci .offset = 0x03, 51562306a36Sopenharmony_ci .start = 31, 51662306a36Sopenharmony_ci .end = 0, 51762306a36Sopenharmony_ci }, 51862306a36Sopenharmony_ci [N_RX_BYTES_64] = { 51962306a36Sopenharmony_ci .area = ETHER, 52062306a36Sopenharmony_ci .name = "n_rx_bytes_64", 52162306a36Sopenharmony_ci .offset = 0x02, 52262306a36Sopenharmony_ci .start = 31, 52362306a36Sopenharmony_ci .end = 0, 52462306a36Sopenharmony_ci }, 52562306a36Sopenharmony_ci [N_RX_MCAST] = { 52662306a36Sopenharmony_ci .area = ETHER, 52762306a36Sopenharmony_ci .name = "n_rx_mcast", 52862306a36Sopenharmony_ci .offset = 0x01, 52962306a36Sopenharmony_ci .start = 31, 53062306a36Sopenharmony_ci .end = 0, 53162306a36Sopenharmony_ci }, 53262306a36Sopenharmony_ci [N_RX_BCAST] = { 53362306a36Sopenharmony_ci .area = ETHER, 53462306a36Sopenharmony_ci .name = "n_rx_bcast", 53562306a36Sopenharmony_ci .offset = 0x00, 53662306a36Sopenharmony_ci .start = 31, 53762306a36Sopenharmony_ci .end = 0, 53862306a36Sopenharmony_ci }, 53962306a36Sopenharmony_ci}; 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_cistatic int sja1105_port_counter_read(struct sja1105_private *priv, int port, 54262306a36Sopenharmony_ci enum sja1105_counter_index idx, u64 *ctr) 54362306a36Sopenharmony_ci{ 54462306a36Sopenharmony_ci const struct sja1105_port_counter *c = &sja1105_port_counters[idx]; 54562306a36Sopenharmony_ci size_t size = c->is_64bit ? 8 : 4; 54662306a36Sopenharmony_ci u8 buf[8] = {0}; 54762306a36Sopenharmony_ci u64 regs; 54862306a36Sopenharmony_ci int rc; 54962306a36Sopenharmony_ci 55062306a36Sopenharmony_ci regs = priv->info->regs->stats[c->area][port]; 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_ci rc = sja1105_xfer_buf(priv, SPI_READ, regs + c->offset, buf, size); 55362306a36Sopenharmony_ci if (rc) 55462306a36Sopenharmony_ci return rc; 55562306a36Sopenharmony_ci 55662306a36Sopenharmony_ci sja1105_unpack(buf, ctr, c->start, c->end, size); 55762306a36Sopenharmony_ci 55862306a36Sopenharmony_ci return 0; 55962306a36Sopenharmony_ci} 56062306a36Sopenharmony_ci 56162306a36Sopenharmony_civoid sja1105_get_ethtool_stats(struct dsa_switch *ds, int port, u64 *data) 56262306a36Sopenharmony_ci{ 56362306a36Sopenharmony_ci struct sja1105_private *priv = ds->priv; 56462306a36Sopenharmony_ci enum sja1105_counter_index max_ctr, i; 56562306a36Sopenharmony_ci int rc, k = 0; 56662306a36Sopenharmony_ci 56762306a36Sopenharmony_ci if (priv->info->device_id == SJA1105E_DEVICE_ID || 56862306a36Sopenharmony_ci priv->info->device_id == SJA1105T_DEVICE_ID) 56962306a36Sopenharmony_ci max_ctr = __MAX_SJA1105ET_PORT_COUNTER; 57062306a36Sopenharmony_ci else 57162306a36Sopenharmony_ci max_ctr = __MAX_SJA1105PQRS_PORT_COUNTER; 57262306a36Sopenharmony_ci 57362306a36Sopenharmony_ci for (i = 0; i < max_ctr; i++) { 57462306a36Sopenharmony_ci rc = sja1105_port_counter_read(priv, port, i, &data[k++]); 57562306a36Sopenharmony_ci if (rc) { 57662306a36Sopenharmony_ci dev_err(ds->dev, 57762306a36Sopenharmony_ci "Failed to read port %d counters: %d\n", 57862306a36Sopenharmony_ci port, rc); 57962306a36Sopenharmony_ci break; 58062306a36Sopenharmony_ci } 58162306a36Sopenharmony_ci } 58262306a36Sopenharmony_ci} 58362306a36Sopenharmony_ci 58462306a36Sopenharmony_civoid sja1105_get_strings(struct dsa_switch *ds, int port, 58562306a36Sopenharmony_ci u32 stringset, u8 *data) 58662306a36Sopenharmony_ci{ 58762306a36Sopenharmony_ci struct sja1105_private *priv = ds->priv; 58862306a36Sopenharmony_ci enum sja1105_counter_index max_ctr, i; 58962306a36Sopenharmony_ci char *p = data; 59062306a36Sopenharmony_ci 59162306a36Sopenharmony_ci if (stringset != ETH_SS_STATS) 59262306a36Sopenharmony_ci return; 59362306a36Sopenharmony_ci 59462306a36Sopenharmony_ci if (priv->info->device_id == SJA1105E_DEVICE_ID || 59562306a36Sopenharmony_ci priv->info->device_id == SJA1105T_DEVICE_ID) 59662306a36Sopenharmony_ci max_ctr = __MAX_SJA1105ET_PORT_COUNTER; 59762306a36Sopenharmony_ci else 59862306a36Sopenharmony_ci max_ctr = __MAX_SJA1105PQRS_PORT_COUNTER; 59962306a36Sopenharmony_ci 60062306a36Sopenharmony_ci for (i = 0; i < max_ctr; i++) { 60162306a36Sopenharmony_ci strscpy(p, sja1105_port_counters[i].name, ETH_GSTRING_LEN); 60262306a36Sopenharmony_ci p += ETH_GSTRING_LEN; 60362306a36Sopenharmony_ci } 60462306a36Sopenharmony_ci} 60562306a36Sopenharmony_ci 60662306a36Sopenharmony_ciint sja1105_get_sset_count(struct dsa_switch *ds, int port, int sset) 60762306a36Sopenharmony_ci{ 60862306a36Sopenharmony_ci struct sja1105_private *priv = ds->priv; 60962306a36Sopenharmony_ci enum sja1105_counter_index max_ctr, i; 61062306a36Sopenharmony_ci int sset_count = 0; 61162306a36Sopenharmony_ci 61262306a36Sopenharmony_ci if (sset != ETH_SS_STATS) 61362306a36Sopenharmony_ci return -EOPNOTSUPP; 61462306a36Sopenharmony_ci 61562306a36Sopenharmony_ci if (priv->info->device_id == SJA1105E_DEVICE_ID || 61662306a36Sopenharmony_ci priv->info->device_id == SJA1105T_DEVICE_ID) 61762306a36Sopenharmony_ci max_ctr = __MAX_SJA1105ET_PORT_COUNTER; 61862306a36Sopenharmony_ci else 61962306a36Sopenharmony_ci max_ctr = __MAX_SJA1105PQRS_PORT_COUNTER; 62062306a36Sopenharmony_ci 62162306a36Sopenharmony_ci for (i = 0; i < max_ctr; i++) { 62262306a36Sopenharmony_ci if (!strlen(sja1105_port_counters[i].name)) 62362306a36Sopenharmony_ci continue; 62462306a36Sopenharmony_ci 62562306a36Sopenharmony_ci sset_count++; 62662306a36Sopenharmony_ci } 62762306a36Sopenharmony_ci 62862306a36Sopenharmony_ci return sset_count; 62962306a36Sopenharmony_ci} 630