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