Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

mlxsw: spectrum: Expose discard counters via ethtool

Expose packets discard counters via ethtool to help with debugging.

Signed-off-by: Shalom Toledo <shalomt@mellanox.com>
Reviewed-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: Ido Schimmel <idosch@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Shalom Toledo and committed by
David S. Miller
bae4e109 aa6daaca

+297
+142
drivers/net/ethernet/mellanox/mlxsw/reg.h
··· 4235 4235 4236 4236 enum mlxsw_reg_ppcnt_grp { 4237 4237 MLXSW_REG_PPCNT_IEEE_8023_CNT = 0x0, 4238 + MLXSW_REG_PPCNT_RFC_2863_CNT = 0x1, 4238 4239 MLXSW_REG_PPCNT_RFC_2819_CNT = 0x2, 4240 + MLXSW_REG_PPCNT_RFC_3635_CNT = 0x3, 4239 4241 MLXSW_REG_PPCNT_EXT_CNT = 0x5, 4242 + MLXSW_REG_PPCNT_DISCARD_CNT = 0x6, 4240 4243 MLXSW_REG_PPCNT_PRIO_CNT = 0x10, 4241 4244 MLXSW_REG_PPCNT_TC_CNT = 0x11, 4242 4245 MLXSW_REG_PPCNT_TC_CONG_TC = 0x13, ··· 4254 4251 * 0x2: RFC 2819 Counters 4255 4252 * 0x3: RFC 3635 Counters 4256 4253 * 0x5: Ethernet Extended Counters 4254 + * 0x6: Ethernet Discard Counters 4257 4255 * 0x8: Link Level Retransmission Counters 4258 4256 * 0x10: Per Priority Counters 4259 4257 * 0x11: Per Traffic Class Counters ··· 4398 4394 MLXSW_ITEM64(reg, ppcnt, a_pause_mac_ctrl_frames_transmitted, 4399 4395 MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x90, 0, 64); 4400 4396 4397 + /* Ethernet RFC 2863 Counter Group */ 4398 + 4399 + /* reg_ppcnt_if_in_discards 4400 + * Access: RO 4401 + */ 4402 + MLXSW_ITEM64(reg, ppcnt, if_in_discards, 4403 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x10, 0, 64); 4404 + 4405 + /* reg_ppcnt_if_out_discards 4406 + * Access: RO 4407 + */ 4408 + MLXSW_ITEM64(reg, ppcnt, if_out_discards, 4409 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x38, 0, 64); 4410 + 4411 + /* reg_ppcnt_if_out_errors 4412 + * Access: RO 4413 + */ 4414 + MLXSW_ITEM64(reg, ppcnt, if_out_errors, 4415 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x40, 0, 64); 4416 + 4401 4417 /* Ethernet RFC 2819 Counter Group */ 4418 + 4419 + /* reg_ppcnt_ether_stats_undersize_pkts 4420 + * Access: RO 4421 + */ 4422 + MLXSW_ITEM64(reg, ppcnt, ether_stats_undersize_pkts, 4423 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x30, 0, 64); 4424 + 4425 + /* reg_ppcnt_ether_stats_oversize_pkts 4426 + * Access: RO 4427 + */ 4428 + MLXSW_ITEM64(reg, ppcnt, ether_stats_oversize_pkts, 4429 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x38, 0, 64); 4430 + 4431 + /* reg_ppcnt_ether_stats_fragments 4432 + * Access: RO 4433 + */ 4434 + MLXSW_ITEM64(reg, ppcnt, ether_stats_fragments, 4435 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x40, 0, 64); 4402 4436 4403 4437 /* reg_ppcnt_ether_stats_pkts64octets 4404 4438 * Access: RO ··· 4498 4456 MLXSW_ITEM64(reg, ppcnt, ether_stats_pkts8192to10239octets, 4499 4457 MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0xA0, 0, 64); 4500 4458 4459 + /* Ethernet RFC 3635 Counter Group */ 4460 + 4461 + /* reg_ppcnt_dot3stats_fcs_errors 4462 + * Access: RO 4463 + */ 4464 + MLXSW_ITEM64(reg, ppcnt, dot3stats_fcs_errors, 4465 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x08, 0, 64); 4466 + 4467 + /* reg_ppcnt_dot3stats_symbol_errors 4468 + * Access: RO 4469 + */ 4470 + MLXSW_ITEM64(reg, ppcnt, dot3stats_symbol_errors, 4471 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x60, 0, 64); 4472 + 4473 + /* reg_ppcnt_dot3control_in_unknown_opcodes 4474 + * Access: RO 4475 + */ 4476 + MLXSW_ITEM64(reg, ppcnt, dot3control_in_unknown_opcodes, 4477 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x68, 0, 64); 4478 + 4479 + /* reg_ppcnt_dot3in_pause_frames 4480 + * Access: RO 4481 + */ 4482 + MLXSW_ITEM64(reg, ppcnt, dot3in_pause_frames, 4483 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x70, 0, 64); 4484 + 4501 4485 /* Ethernet Extended Counter Group Counters */ 4502 4486 4503 4487 /* reg_ppcnt_ecn_marked ··· 4531 4463 */ 4532 4464 MLXSW_ITEM64(reg, ppcnt, ecn_marked, 4533 4465 MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x08, 0, 64); 4466 + 4467 + /* Ethernet Discard Counter Group Counters */ 4468 + 4469 + /* reg_ppcnt_ingress_general 4470 + * Access: RO 4471 + */ 4472 + MLXSW_ITEM64(reg, ppcnt, ingress_general, 4473 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x00, 0, 64); 4474 + 4475 + /* reg_ppcnt_ingress_policy_engine 4476 + * Access: RO 4477 + */ 4478 + MLXSW_ITEM64(reg, ppcnt, ingress_policy_engine, 4479 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x08, 0, 64); 4480 + 4481 + /* reg_ppcnt_ingress_vlan_membership 4482 + * Access: RO 4483 + */ 4484 + MLXSW_ITEM64(reg, ppcnt, ingress_vlan_membership, 4485 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x10, 0, 64); 4486 + 4487 + /* reg_ppcnt_ingress_tag_frame_type 4488 + * Access: RO 4489 + */ 4490 + MLXSW_ITEM64(reg, ppcnt, ingress_tag_frame_type, 4491 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x18, 0, 64); 4492 + 4493 + /* reg_ppcnt_egress_vlan_membership 4494 + * Access: RO 4495 + */ 4496 + MLXSW_ITEM64(reg, ppcnt, egress_vlan_membership, 4497 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x20, 0, 64); 4498 + 4499 + /* reg_ppcnt_loopback_filter 4500 + * Access: RO 4501 + */ 4502 + MLXSW_ITEM64(reg, ppcnt, loopback_filter, 4503 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x28, 0, 64); 4504 + 4505 + /* reg_ppcnt_egress_general 4506 + * Access: RO 4507 + */ 4508 + MLXSW_ITEM64(reg, ppcnt, egress_general, 4509 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x30, 0, 64); 4510 + 4511 + /* reg_ppcnt_egress_hoq 4512 + * Access: RO 4513 + */ 4514 + MLXSW_ITEM64(reg, ppcnt, egress_hoq, 4515 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x40, 0, 64); 4516 + 4517 + /* reg_ppcnt_egress_policy_engine 4518 + * Access: RO 4519 + */ 4520 + MLXSW_ITEM64(reg, ppcnt, egress_policy_engine, 4521 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x50, 0, 64); 4522 + 4523 + /* reg_ppcnt_ingress_tx_link_down 4524 + * Access: RO 4525 + */ 4526 + MLXSW_ITEM64(reg, ppcnt, ingress_tx_link_down, 4527 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x58, 0, 64); 4528 + 4529 + /* reg_ppcnt_egress_stp_filter 4530 + * Access: RO 4531 + */ 4532 + MLXSW_ITEM64(reg, ppcnt, egress_stp_filter, 4533 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x60, 0, 64); 4534 + 4535 + /* reg_ppcnt_egress_sll 4536 + * Access: RO 4537 + */ 4538 + MLXSW_ITEM64(reg, ppcnt, egress_sll, 4539 + MLXSW_REG_PPCNT_COUNTERS_OFFSET + 0x70, 0, 64); 4534 4540 4535 4541 /* Ethernet Per Priority Group Counters */ 4536 4542
+155
drivers/net/ethernet/mellanox/mlxsw/spectrum.c
··· 1876 1876 1877 1877 #define MLXSW_SP_PORT_HW_STATS_LEN ARRAY_SIZE(mlxsw_sp_port_hw_stats) 1878 1878 1879 + static struct mlxsw_sp_port_hw_stats mlxsw_sp_port_hw_rfc_2863_stats[] = { 1880 + { 1881 + .str = "if_in_discards", 1882 + .getter = mlxsw_reg_ppcnt_if_in_discards_get, 1883 + }, 1884 + { 1885 + .str = "if_out_discards", 1886 + .getter = mlxsw_reg_ppcnt_if_out_discards_get, 1887 + }, 1888 + { 1889 + .str = "if_out_errors", 1890 + .getter = mlxsw_reg_ppcnt_if_out_errors_get, 1891 + }, 1892 + }; 1893 + 1894 + #define MLXSW_SP_PORT_HW_RFC_2863_STATS_LEN \ 1895 + ARRAY_SIZE(mlxsw_sp_port_hw_rfc_2863_stats) 1896 + 1879 1897 static struct mlxsw_sp_port_hw_stats mlxsw_sp_port_hw_rfc_2819_stats[] = { 1898 + { 1899 + .str = "ether_stats_undersize_pkts", 1900 + .getter = mlxsw_reg_ppcnt_ether_stats_undersize_pkts_get, 1901 + }, 1902 + { 1903 + .str = "ether_stats_oversize_pkts", 1904 + .getter = mlxsw_reg_ppcnt_ether_stats_oversize_pkts_get, 1905 + }, 1906 + { 1907 + .str = "ether_stats_fragments", 1908 + .getter = mlxsw_reg_ppcnt_ether_stats_fragments_get, 1909 + }, 1880 1910 { 1881 1911 .str = "ether_pkts64octets", 1882 1912 .getter = mlxsw_reg_ppcnt_ether_stats_pkts64octets_get, ··· 1951 1921 1952 1922 #define MLXSW_SP_PORT_HW_RFC_2819_STATS_LEN \ 1953 1923 ARRAY_SIZE(mlxsw_sp_port_hw_rfc_2819_stats) 1924 + 1925 + static struct mlxsw_sp_port_hw_stats mlxsw_sp_port_hw_rfc_3635_stats[] = { 1926 + { 1927 + .str = "dot3stats_fcs_errors", 1928 + .getter = mlxsw_reg_ppcnt_dot3stats_fcs_errors_get, 1929 + }, 1930 + { 1931 + .str = "dot3stats_symbol_errors", 1932 + .getter = mlxsw_reg_ppcnt_dot3stats_symbol_errors_get, 1933 + }, 1934 + { 1935 + .str = "dot3control_in_unknown_opcodes", 1936 + .getter = mlxsw_reg_ppcnt_dot3control_in_unknown_opcodes_get, 1937 + }, 1938 + { 1939 + .str = "dot3in_pause_frames", 1940 + .getter = mlxsw_reg_ppcnt_dot3in_pause_frames_get, 1941 + }, 1942 + }; 1943 + 1944 + #define MLXSW_SP_PORT_HW_RFC_3635_STATS_LEN \ 1945 + ARRAY_SIZE(mlxsw_sp_port_hw_rfc_3635_stats) 1946 + 1947 + static struct mlxsw_sp_port_hw_stats mlxsw_sp_port_hw_discard_stats[] = { 1948 + { 1949 + .str = "discard_ingress_general", 1950 + .getter = mlxsw_reg_ppcnt_ingress_general_get, 1951 + }, 1952 + { 1953 + .str = "discard_ingress_policy_engine", 1954 + .getter = mlxsw_reg_ppcnt_ingress_policy_engine_get, 1955 + }, 1956 + { 1957 + .str = "discard_ingress_vlan_membership", 1958 + .getter = mlxsw_reg_ppcnt_ingress_vlan_membership_get, 1959 + }, 1960 + { 1961 + .str = "discard_ingress_tag_frame_type", 1962 + .getter = mlxsw_reg_ppcnt_ingress_tag_frame_type_get, 1963 + }, 1964 + { 1965 + .str = "discard_egress_vlan_membership", 1966 + .getter = mlxsw_reg_ppcnt_egress_vlan_membership_get, 1967 + }, 1968 + { 1969 + .str = "discard_loopback_filter", 1970 + .getter = mlxsw_reg_ppcnt_loopback_filter_get, 1971 + }, 1972 + { 1973 + .str = "discard_egress_general", 1974 + .getter = mlxsw_reg_ppcnt_egress_general_get, 1975 + }, 1976 + { 1977 + .str = "discard_egress_hoq", 1978 + .getter = mlxsw_reg_ppcnt_egress_hoq_get, 1979 + }, 1980 + { 1981 + .str = "discard_egress_policy_engine", 1982 + .getter = mlxsw_reg_ppcnt_egress_policy_engine_get, 1983 + }, 1984 + { 1985 + .str = "discard_ingress_tx_link_down", 1986 + .getter = mlxsw_reg_ppcnt_ingress_tx_link_down_get, 1987 + }, 1988 + { 1989 + .str = "discard_egress_stp_filter", 1990 + .getter = mlxsw_reg_ppcnt_egress_stp_filter_get, 1991 + }, 1992 + { 1993 + .str = "discard_egress_sll", 1994 + .getter = mlxsw_reg_ppcnt_egress_sll_get, 1995 + }, 1996 + }; 1997 + 1998 + #define MLXSW_SP_PORT_HW_DISCARD_STATS_LEN \ 1999 + ARRAY_SIZE(mlxsw_sp_port_hw_discard_stats) 1954 2000 1955 2001 static struct mlxsw_sp_port_hw_stats mlxsw_sp_port_hw_prio_stats[] = { 1956 2002 { ··· 2080 1974 #define MLXSW_SP_PORT_HW_TC_STATS_LEN ARRAY_SIZE(mlxsw_sp_port_hw_tc_stats) 2081 1975 2082 1976 #define MLXSW_SP_PORT_ETHTOOL_STATS_LEN (MLXSW_SP_PORT_HW_STATS_LEN + \ 1977 + MLXSW_SP_PORT_HW_RFC_2863_STATS_LEN + \ 2083 1978 MLXSW_SP_PORT_HW_RFC_2819_STATS_LEN + \ 1979 + MLXSW_SP_PORT_HW_RFC_3635_STATS_LEN + \ 1980 + MLXSW_SP_PORT_HW_DISCARD_STATS_LEN + \ 2084 1981 (MLXSW_SP_PORT_HW_PRIO_STATS_LEN * \ 2085 1982 IEEE_8021QAZ_MAX_TCS) + \ 2086 1983 (MLXSW_SP_PORT_HW_TC_STATS_LEN * \ ··· 2124 2015 ETH_GSTRING_LEN); 2125 2016 p += ETH_GSTRING_LEN; 2126 2017 } 2018 + 2019 + for (i = 0; i < MLXSW_SP_PORT_HW_RFC_2863_STATS_LEN; i++) { 2020 + memcpy(p, mlxsw_sp_port_hw_rfc_2863_stats[i].str, 2021 + ETH_GSTRING_LEN); 2022 + p += ETH_GSTRING_LEN; 2023 + } 2024 + 2127 2025 for (i = 0; i < MLXSW_SP_PORT_HW_RFC_2819_STATS_LEN; i++) { 2128 2026 memcpy(p, mlxsw_sp_port_hw_rfc_2819_stats[i].str, 2027 + ETH_GSTRING_LEN); 2028 + p += ETH_GSTRING_LEN; 2029 + } 2030 + 2031 + for (i = 0; i < MLXSW_SP_PORT_HW_RFC_3635_STATS_LEN; i++) { 2032 + memcpy(p, mlxsw_sp_port_hw_rfc_3635_stats[i].str, 2033 + ETH_GSTRING_LEN); 2034 + p += ETH_GSTRING_LEN; 2035 + } 2036 + 2037 + for (i = 0; i < MLXSW_SP_PORT_HW_DISCARD_STATS_LEN; i++) { 2038 + memcpy(p, mlxsw_sp_port_hw_discard_stats[i].str, 2129 2039 ETH_GSTRING_LEN); 2130 2040 p += ETH_GSTRING_LEN; 2131 2041 } ··· 2191 2063 *p_hw_stats = mlxsw_sp_port_hw_stats; 2192 2064 *p_len = MLXSW_SP_PORT_HW_STATS_LEN; 2193 2065 break; 2066 + case MLXSW_REG_PPCNT_RFC_2863_CNT: 2067 + *p_hw_stats = mlxsw_sp_port_hw_rfc_2863_stats; 2068 + *p_len = MLXSW_SP_PORT_HW_RFC_2863_STATS_LEN; 2069 + break; 2194 2070 case MLXSW_REG_PPCNT_RFC_2819_CNT: 2195 2071 *p_hw_stats = mlxsw_sp_port_hw_rfc_2819_stats; 2196 2072 *p_len = MLXSW_SP_PORT_HW_RFC_2819_STATS_LEN; 2073 + break; 2074 + case MLXSW_REG_PPCNT_RFC_3635_CNT: 2075 + *p_hw_stats = mlxsw_sp_port_hw_rfc_3635_stats; 2076 + *p_len = MLXSW_SP_PORT_HW_RFC_3635_STATS_LEN; 2077 + break; 2078 + case MLXSW_REG_PPCNT_DISCARD_CNT: 2079 + *p_hw_stats = mlxsw_sp_port_hw_discard_stats; 2080 + *p_len = MLXSW_SP_PORT_HW_DISCARD_STATS_LEN; 2197 2081 break; 2198 2082 case MLXSW_REG_PPCNT_PRIO_CNT: 2199 2083 *p_hw_stats = mlxsw_sp_port_hw_prio_stats; ··· 2256 2116 data, data_index); 2257 2117 data_index = MLXSW_SP_PORT_HW_STATS_LEN; 2258 2118 2119 + /* RFC 2863 Counters */ 2120 + __mlxsw_sp_port_get_stats(dev, MLXSW_REG_PPCNT_RFC_2863_CNT, 0, 2121 + data, data_index); 2122 + data_index += MLXSW_SP_PORT_HW_RFC_2863_STATS_LEN; 2123 + 2259 2124 /* RFC 2819 Counters */ 2260 2125 __mlxsw_sp_port_get_stats(dev, MLXSW_REG_PPCNT_RFC_2819_CNT, 0, 2261 2126 data, data_index); 2262 2127 data_index += MLXSW_SP_PORT_HW_RFC_2819_STATS_LEN; 2128 + 2129 + /* RFC 3635 Counters */ 2130 + __mlxsw_sp_port_get_stats(dev, MLXSW_REG_PPCNT_RFC_3635_CNT, 0, 2131 + data, data_index); 2132 + data_index += MLXSW_SP_PORT_HW_RFC_3635_STATS_LEN; 2133 + 2134 + /* Discard Counters */ 2135 + __mlxsw_sp_port_get_stats(dev, MLXSW_REG_PPCNT_DISCARD_CNT, 0, 2136 + data, data_index); 2137 + data_index += MLXSW_SP_PORT_HW_DISCARD_STATS_LEN; 2263 2138 2264 2139 /* Per-Priority Counters */ 2265 2140 for (i = 0; i < IEEE_8021QAZ_MAX_TCS; i++) {