From nobody Thu Sep 11 18:24:14 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 97FDBC64ED6 for ; Fri, 17 Feb 2023 11:02:57 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229740AbjBQLC1 (ORCPT ); Fri, 17 Feb 2023 06:02:27 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:39062 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229525AbjBQLCC (ORCPT ); Fri, 17 Feb 2023 06:02:02 -0500 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.154.123]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 7516063BCD; Fri, 17 Feb 2023 03:02:00 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1676631720; x=1708167720; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ds+xcdqyuM0AGf3EleSMTk8z7ILujR2TSv0lkawhf5Q=; b=nTisAfsAfnY5JDN9PKV5dWpBPs099NqS/+o0mrQZyac8jDuH2X279Dew uhOokDJGkYlSVxr9CI4DPSXKozBackFXlgnQOwAm3ts6fqVMScQyqi18P 05Hf+DFOxNxsjK/t2mf+bNh0XntlxgKQb+uobEJ/5j+p6KRFFejvvzYbW dLyRXBOsoV/PST5VH+dmwzIfVLT4BrILs8SvZNYBP/cti9LIeUWL+Lgyk 1t9B5lTNi5Zho6XrOqWZRx4cQRDVeolv/Ako62qwq47KxNSLPTSAAS3f7 tSx1WOixoe499R8/ieoQgPDcz4Wy7Ror+WEN+Ik5XNlRxiJ0ZeFSKMnzN A==; X-IronPort-AV: E=Sophos;i="5.97,304,1669100400"; d="scan'208";a="137756684" Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa6.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 17 Feb 2023 04:01:59 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex03.mchp-main.com (10.10.85.151) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.16; Fri, 17 Feb 2023 04:01:59 -0700 Received: from che-lt-i67786lx.microchip.com (10.10.115.15) by chn-vm-ex04.mchp-main.com (10.10.85.152) with Microsoft SMTP Server id 15.1.2507.16 via Frontend Transport; Fri, 17 Feb 2023 04:01:55 -0700 From: Rakesh Sankaranarayanan To: , CC: , , , , , , , , , Thangaraj Samynathan Subject: [PATCH v2 net-next 1/5] net: dsa: microchip: add rmon grouping for ethtool statistics Date: Fri, 17 Feb 2023 16:32:07 +0530 Message-ID: <20230217110211.433505-2-rakesh.sankaranarayanan@microchip.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230217110211.433505-1-rakesh.sankaranarayanan@microchip.com> References: <20230217110211.433505-1-rakesh.sankaranarayanan@microchip.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add support for ethtool standard device statistics grouping. Support rm= on statistics grouping using rmon groups parameter in ethtool command. rmon provides packet size based range grouping. Common mib parameters are us= ed across all KSZ series swtches for packet size statistics, except for KSZ8830. KSZ series have mib counters for packets with size: - less than 64 Bytes, - 65 to 127 Bytes, - 128 to 255 Bytes, - 256 to 511 Bytes, - 512 to 1023 Bytes, - 1024 to 1522 Bytes, - 1523 to 2000 Bytes and - More than 2001 Bytes KSZ8830 have mib counters upto 1024-1522 range only. Since no other cha= nge, common range used across all KSZ series, but used upto only upto 1024-1= 522 for KSZ8830. Co-developed-by: Thangaraj Samynathan Signed-off-by: Rakesh Sankaranarayanan --- drivers/net/dsa/microchip/Makefile | 1 + drivers/net/dsa/microchip/ksz_common.c | 15 ++ drivers/net/dsa/microchip/ksz_common.h | 3 + drivers/net/dsa/microchip/ksz_ethtool.c | 180 ++++++++++++++++++++++++ drivers/net/dsa/microchip/ksz_ethtool.h | 18 +++ 5 files changed, 217 insertions(+) create mode 100644 drivers/net/dsa/microchip/ksz_ethtool.c create mode 100644 drivers/net/dsa/microchip/ksz_ethtool.h diff --git a/drivers/net/dsa/microchip/Makefile b/drivers/net/dsa/microchip= /Makefile index 48360cc9fc68..2b698ac39a1f 100644 --- a/drivers/net/dsa/microchip/Makefile +++ b/drivers/net/dsa/microchip/Makefile @@ -1,6 +1,7 @@ # SPDX-License-Identifier: GPL-2.0-only obj-$(CONFIG_NET_DSA_MICROCHIP_KSZ_COMMON) +=3D ksz_switch.o ksz_switch-objs :=3D ksz_common.o +ksz_switch-objs +=3D ksz_ethtool.o ksz_switch-objs +=3D ksz9477.o ksz_switch-objs +=3D ksz8795.o ksz_switch-objs +=3D lan937x_main.o diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/micro= chip/ksz_common.c index 729b36eeb2c4..61f4e23d8849 100644 --- a/drivers/net/dsa/microchip/ksz_common.c +++ b/drivers/net/dsa/microchip/ksz_common.c @@ -27,6 +27,7 @@ #include =20 #include "ksz_common.h" +#include "ksz_ethtool.h" #include "ksz_ptp.h" #include "ksz8.h" #include "ksz9477.h" @@ -204,6 +205,7 @@ static const struct ksz_dev_ops ksz8_dev_ops =3D { .freeze_mib =3D ksz8_freeze_mib, .port_init_cnt =3D ksz8_port_init_cnt, .fdb_dump =3D ksz8_fdb_dump, + .get_rmon_stats =3D ksz8_get_rmon_stats, .mdb_add =3D ksz8_mdb_add, .mdb_del =3D ksz8_mdb_del, .vlan_filtering =3D ksz8_port_vlan_filtering, @@ -241,6 +243,7 @@ static const struct ksz_dev_ops ksz9477_dev_ops =3D { .r_mib_stat64 =3D ksz_r_mib_stats64, .freeze_mib =3D ksz9477_freeze_mib, .port_init_cnt =3D ksz9477_port_init_cnt, + .get_rmon_stats =3D ksz9477_get_rmon_stats, .vlan_filtering =3D ksz9477_port_vlan_filtering, .vlan_add =3D ksz9477_port_vlan_add, .vlan_del =3D ksz9477_port_vlan_del, @@ -277,6 +280,7 @@ static const struct ksz_dev_ops lan937x_dev_ops =3D { .r_mib_stat64 =3D ksz_r_mib_stats64, .freeze_mib =3D ksz9477_freeze_mib, .port_init_cnt =3D ksz9477_port_init_cnt, + .get_rmon_stats =3D ksz9477_get_rmon_stats, .vlan_filtering =3D ksz9477_port_vlan_filtering, .vlan_add =3D ksz9477_port_vlan_add, .vlan_del =3D ksz9477_port_vlan_del, @@ -1730,6 +1734,16 @@ static void ksz_get_pause_stats(struct dsa_switch *d= s, int port, spin_unlock(&mib->stats64_lock); } =20 +static void ksz_get_rmon_stats(struct dsa_switch *ds, int port, + struct ethtool_rmon_stats *rmon_stats, + const struct ethtool_rmon_hist_range **ranges) +{ + struct ksz_device *dev =3D ds->priv; + + if (dev->dev_ops->get_rmon_stats) + dev->dev_ops->get_rmon_stats(dev, port, rmon_stats, ranges); +} + static void ksz_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t *buf) { @@ -3186,6 +3200,7 @@ static const struct dsa_switch_ops ksz_switch_ops =3D= { .port_mirror_del =3D ksz_port_mirror_del, .get_stats64 =3D ksz_get_stats64, .get_pause_stats =3D ksz_get_pause_stats, + .get_rmon_stats =3D ksz_get_rmon_stats, .port_change_mtu =3D ksz_change_mtu, .port_max_mtu =3D ksz_max_mtu, .get_ts_info =3D ksz_get_ts_info, diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/micro= chip/ksz_common.h index d2d5761d58e9..a4e53431218c 100644 --- a/drivers/net/dsa/microchip/ksz_common.h +++ b/drivers/net/dsa/microchip/ksz_common.h @@ -361,6 +361,9 @@ struct ksz_dev_ops { int (*reset)(struct ksz_device *dev); int (*init)(struct ksz_device *dev); void (*exit)(struct ksz_device *dev); + void (*get_rmon_stats)(struct ksz_device *dev, int port, + struct ethtool_rmon_stats *rmon_stats, + const struct ethtool_rmon_hist_range **ranges); }; =20 struct ksz_device *ksz_switch_alloc(struct device *base, void *priv); diff --git a/drivers/net/dsa/microchip/ksz_ethtool.c b/drivers/net/dsa/micr= ochip/ksz_ethtool.c new file mode 100644 index 000000000000..0f3f18545858 --- /dev/null +++ b/drivers/net/dsa/microchip/ksz_ethtool.c @@ -0,0 +1,180 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +/* + * Microchip KSZ series ethtool statistics + * + * Copyright (C) 2022 Microchip Technology Inc. + */ + +#include "ksz_common.h" +#include "ksz_ethtool.h" + +enum ksz8_mib_entry { + KSZ8_RX, + KSZ8_RX_HI, + KSZ8_RX_UNDERSIZE, + KSZ8_RX_FRAGMENTS, + KSZ8_RX_OVERSIZE, + KSZ8_RX_JABBERS, + KSZ8_RX_SYMBOL_ERR, + KSZ8_RX_CRC_ERR, + KSZ8_RX_ALIGN_ERR, + KSZ8_RX_MAC_CTL, + KSZ8_RX_PAUSE, + KSZ8_RX_BCAST, + KSZ8_RX_MCAST, + KSZ8_RX_UCAST, + KSZ8_RX_64_OR_LESS, + KSZ8_RX_65_127, + KSZ8_RX_128_255, + KSZ8_RX_256_511, + KSZ8_RX_512_1023, + KSZ8_RX_1024_1522, + KSZ8_TX, + KSZ8_TX_HI, + KSZ8_TX_LATE_COL, + KSZ8_TX_PAUSE, + KSZ8_TX_BCAST, + KSZ8_TX_MCAST, + KSZ8_TX_UCAST, + KSZ8_TX_DEFERRED, + KSZ8_TX_TOTAL_COL, + KSZ8_TX_EXC_COL, + KSZ8_TX_SINGLE_COL, + KSZ8_TX_MULT_COL, + KSZ8_RX_DISCARDS, + KSZ8_TX_DISCARDS, +}; + +enum ksz9477_mib_entry { + KSZ9477_RX_HI, + KSZ9477_RX_UNDERSIZE, + KSZ9477_RX_FRAGMENTS, + KSZ9477_RX_OVERSIZE, + KSZ9477_RX_JABBERS, + KSZ9477_RX_SYMBOL_ERR, + KSZ9477_RX_CRC_ERR, + KSZ9477_RX_ALIGN_ERR, + KSZ9477_RX_MAC_CTL, + KSZ9477_RX_PAUSE, + KSZ9477_RX_BCAST, + KSZ9477_RX_MCAST, + KSZ9477_RX_UCAST, + KSZ9477_RX_64_OR_LESS, + KSZ9477_RX_65_127, + KSZ9477_RX_128_255, + KSZ9477_RX_256_511, + KSZ9477_RX_512_1023, + KSZ9477_RX_1024_1522, + KSZ9477_RX_1523_2000, + KSZ9477_RX_2001, + KSZ9477_TX_HI, + KSZ9477_TX_LATE_COL, + KSZ9477_TX_PAUSE, + KSZ9477_TX_BCAST, + KSZ9477_TX_MCAST, + KSZ9477_TX_UCAST, + KSZ9477_TX_DEFERRED, + KSZ9477_TX_TOTAL_COL, + KSZ9477_TX_EXC_COL, + KSZ9477_TX_SINGLE_COL, + KSZ9477_TX_MULT_COL, + KSZ9477_RX_TOTAL, + KSZ9477_TX_TOTAL, + KSZ9477_RX_DISCARDS, + KSZ9477_TX_DISCARDS, +}; + +static const struct ethtool_rmon_hist_range ksz_rmon_ranges[] =3D { + { 0, 64 }, + { 65, 127 }, + { 128, 255 }, + { 256, 511 }, + { 512, 1023 }, + { 1024, 1522 }, + { 1523, 2000 }, + { 2001, 9000 }, + {} +}; + +#define KSZ8_HIST_LEN 6 +#define KSZ9477_HIST_LEN 8 + +void ksz8_get_rmon_stats(struct ksz_device *dev, int port, + struct ethtool_rmon_stats *rmon_stats, + const struct ethtool_rmon_hist_range **ranges) +{ + struct ksz_port_mib *mib; + u64 *cnt; + u8 i; + + mib =3D &dev->ports[port].mib; + + mutex_lock(&mib->cnt_mutex); + + cnt =3D &mib->counters[KSZ8_RX_UNDERSIZE]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ8_RX_UNDERSIZE, NULL, cnt); + rmon_stats->undersize_pkts =3D *cnt; + + cnt =3D &mib->counters[KSZ8_RX_OVERSIZE]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ8_RX_OVERSIZE, NULL, cnt); + rmon_stats->oversize_pkts =3D *cnt; + + cnt =3D &mib->counters[KSZ8_RX_FRAGMENTS]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ8_RX_FRAGMENTS, NULL, cnt); + rmon_stats->fragments =3D *cnt; + + cnt =3D &mib->counters[KSZ8_RX_JABBERS]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ8_RX_JABBERS, NULL, cnt); + rmon_stats->jabbers =3D *cnt; + + for (i =3D 0; i < KSZ8_HIST_LEN; i++) { + cnt =3D &mib->counters[KSZ8_RX_64_OR_LESS + i]; + dev->dev_ops->r_mib_pkt(dev, port, + (KSZ8_RX_64_OR_LESS + i), NULL, cnt); + rmon_stats->hist[i] =3D *cnt; + } + + mutex_unlock(&mib->cnt_mutex); + + *ranges =3D ksz_rmon_ranges; +} + +void ksz9477_get_rmon_stats(struct ksz_device *dev, int port, + struct ethtool_rmon_stats *rmon_stats, + const struct ethtool_rmon_hist_range **ranges) +{ + struct ksz_port_mib *mib; + u64 *cnt; + u8 i; + + mib =3D &dev->ports[port].mib; + + mutex_lock(&mib->cnt_mutex); + + cnt =3D &mib->counters[KSZ9477_RX_UNDERSIZE]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ9477_RX_UNDERSIZE, NULL, cnt); + rmon_stats->undersize_pkts =3D *cnt; + + cnt =3D &mib->counters[KSZ9477_RX_OVERSIZE]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ9477_RX_OVERSIZE, NULL, cnt); + rmon_stats->oversize_pkts =3D *cnt; + + cnt =3D &mib->counters[KSZ9477_RX_FRAGMENTS]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ9477_RX_FRAGMENTS, NULL, cnt); + rmon_stats->fragments =3D *cnt; + + cnt =3D &mib->counters[KSZ9477_RX_JABBERS]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ9477_RX_JABBERS, NULL, cnt); + rmon_stats->jabbers =3D *cnt; + + for (i =3D 0; i < KSZ9477_HIST_LEN; i++) { + cnt =3D &mib->counters[KSZ9477_RX_64_OR_LESS + i]; + dev->dev_ops->r_mib_pkt(dev, port, + (KSZ9477_RX_64_OR_LESS + i), NULL, cnt); + rmon_stats->hist[i] =3D *cnt; + } + + mutex_unlock(&mib->cnt_mutex); + + *ranges =3D ksz_rmon_ranges; +} diff --git a/drivers/net/dsa/microchip/ksz_ethtool.h b/drivers/net/dsa/micr= ochip/ksz_ethtool.h new file mode 100644 index 000000000000..6927e2f143f8 --- /dev/null +++ b/drivers/net/dsa/microchip/ksz_ethtool.h @@ -0,0 +1,18 @@ +/* SPDX-License-Identifier: GPL-2.0-or-later */ +/* + * Microchip KSZ series ethtool statistics + * + * Copyright (C) 2022 Microchip Technology Inc. + */ + +#ifndef __KSZ_ETHTOOL_H +#define __KSZ_ETHTOOL_H + +void ksz8_get_rmon_stats(struct ksz_device *dev, int port, + struct ethtool_rmon_stats *rmon_stats, + const struct ethtool_rmon_hist_range **ranges); + +void ksz9477_get_rmon_stats(struct ksz_device *dev, int port, + struct ethtool_rmon_stats *rmon_stats, + const struct ethtool_rmon_hist_range **ranges); +#endif --=20 2.34.1