From patchwork Fri Feb 17 11:02:07 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rakesh Sankaranarayanan X-Patchwork-Id: 58492 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp822914wrn; Fri, 17 Feb 2023 03:04:07 -0800 (PST) X-Google-Smtp-Source: AK7set9L+8AgnwFomn4TRxwa6RD/2NYNFQa6SaSfMhxwvL8AJR3M/WYUjAnVB/g71el+KgMCUnUT X-Received: by 2002:a17:907:c685:b0:87c:ee05:a5de with SMTP id ue5-20020a170907c68500b0087cee05a5demr4865224ejc.1.1676631846969; Fri, 17 Feb 2023 03:04:06 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1676631846; cv=none; d=google.com; s=arc-20160816; b=wzXJfPFp3KwaN0XGuEjdO2I/pfat66aHBmEZ9b2F2T8ijCgGqcVClXRNvr4aLqDvvD ILeT6YcT+YCUVrkKNbbi0qoQzFFSDtUVo6a2p4FyyU73pcOAt3Ps7aJKhIsq4YZ0iZW1 IuCVNMUW9k4WCoc7T0hFUImp3WzeO4cj7BKdBRCfsXuFNbGA2m4ZSPINdJxirzfjx5wc gvPOCD6Xd2xpyzpj/L2OsR0u6OBvH3sQRlGjiiSBJ/jhmq9MPy9Bw9oAWcmvNzsAklSf FhQPKh0XW+RtRQlCvnGRueVw9k4wq96E6lM1t0RrV+fe8tunsiPzIVNpMNk0Xx2TRBnE MaQw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=F1u7WiJQxlpUvOPmf/SXgrVAiWirK7gztYXVzEX32Zg=; b=gXKxdku2V7pbqecYvGeaj5t1Fxi4e8J+FH9Mf6J7M0GW+nIoIOnW0X2B+Hs2GMiHWG NhPCiFbZQTAhu/rqHk9FS1n6YqlM1CQPlumYVisyJm46/iHCei8YVw+9csc734z/UVhv HrHoiwGS70obblZqYNLHPst2Bus1FpmJyvnwlEAhLGlCsKEMLf3gE6kP20xFPYDa95fq TPpVWypFm65Y+SpL+zDWLE1C1+JJVrZD+wOKdVT2/q1fuAuPW6NuhHLVLiKAAjJVJDbD t0BnGM0GyIWEL+kY/E+ZGU7KquN4GTRHJVnqqL+0PeY22B72Ib0o0m4gEG1uIstlEzo1 gE7Q== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@microchip.com header.s=mchp header.b=nTisAfsA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=microchip.com Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id uo40-20020a170907cc2800b008b1318fe98bsi4476726ejc.206.2023.02.17.03.03.43; Fri, 17 Feb 2023 03:04:06 -0800 (PST) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@microchip.com header.s=mchp header.b=nTisAfsA; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=QUARANTINE sp=QUARANTINE dis=NONE) header.from=microchip.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229724AbjBQLC0 (ORCPT + 99 others); Fri, 17 Feb 2023 06:02:26 -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 X-Spam-Status: No, score=-4.4 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_MED, RCVD_IN_MSPIKE_H2,SPF_HELO_PASS,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1758075915928697725?= X-GMAIL-MSGID: =?utf-8?q?1758075915928697725?= Add support for ethtool standard device statistics grouping. Support rmon statistics grouping using rmon groups parameter in ethtool command. rmon provides packet size based range grouping. Common mib parameters are used 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 change, common range used across all KSZ series, but used upto only upto 1024-1522 for KSZ8830. Co-developed-by: Thangaraj Samynathan Signed-off-by: Rakesh Sankaranarayanan Signed-off-by: must always be that of the developer submitting the patch. --- 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) += ksz_switch.o ksz_switch-objs := ksz_common.o +ksz_switch-objs += ksz_ethtool.o ksz_switch-objs += ksz9477.o ksz_switch-objs += ksz8795.o ksz_switch-objs += lan937x_main.o diff --git a/drivers/net/dsa/microchip/ksz_common.c b/drivers/net/dsa/microchip/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 #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 = { .freeze_mib = ksz8_freeze_mib, .port_init_cnt = ksz8_port_init_cnt, .fdb_dump = ksz8_fdb_dump, + .get_rmon_stats = ksz8_get_rmon_stats, .mdb_add = ksz8_mdb_add, .mdb_del = ksz8_mdb_del, .vlan_filtering = ksz8_port_vlan_filtering, @@ -241,6 +243,7 @@ static const struct ksz_dev_ops ksz9477_dev_ops = { .r_mib_stat64 = ksz_r_mib_stats64, .freeze_mib = ksz9477_freeze_mib, .port_init_cnt = ksz9477_port_init_cnt, + .get_rmon_stats = ksz9477_get_rmon_stats, .vlan_filtering = ksz9477_port_vlan_filtering, .vlan_add = ksz9477_port_vlan_add, .vlan_del = ksz9477_port_vlan_del, @@ -277,6 +280,7 @@ static const struct ksz_dev_ops lan937x_dev_ops = { .r_mib_stat64 = ksz_r_mib_stats64, .freeze_mib = ksz9477_freeze_mib, .port_init_cnt = ksz9477_port_init_cnt, + .get_rmon_stats = ksz9477_get_rmon_stats, .vlan_filtering = ksz9477_port_vlan_filtering, .vlan_add = ksz9477_port_vlan_add, .vlan_del = ksz9477_port_vlan_del, @@ -1730,6 +1734,16 @@ static void ksz_get_pause_stats(struct dsa_switch *ds, int port, spin_unlock(&mib->stats64_lock); } +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 = 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 = { .port_mirror_del = ksz_port_mirror_del, .get_stats64 = ksz_get_stats64, .get_pause_stats = ksz_get_pause_stats, + .get_rmon_stats = ksz_get_rmon_stats, .port_change_mtu = ksz_change_mtu, .port_max_mtu = ksz_max_mtu, .get_ts_info = ksz_get_ts_info, diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/microchip/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); }; 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/microchip/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[] = { + { 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 = &dev->ports[port].mib; + + mutex_lock(&mib->cnt_mutex); + + cnt = &mib->counters[KSZ8_RX_UNDERSIZE]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ8_RX_UNDERSIZE, NULL, cnt); + rmon_stats->undersize_pkts = *cnt; + + cnt = &mib->counters[KSZ8_RX_OVERSIZE]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ8_RX_OVERSIZE, NULL, cnt); + rmon_stats->oversize_pkts = *cnt; + + cnt = &mib->counters[KSZ8_RX_FRAGMENTS]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ8_RX_FRAGMENTS, NULL, cnt); + rmon_stats->fragments = *cnt; + + cnt = &mib->counters[KSZ8_RX_JABBERS]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ8_RX_JABBERS, NULL, cnt); + rmon_stats->jabbers = *cnt; + + for (i = 0; i < KSZ8_HIST_LEN; i++) { + cnt = &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] = *cnt; + } + + mutex_unlock(&mib->cnt_mutex); + + *ranges = 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 = &dev->ports[port].mib; + + mutex_lock(&mib->cnt_mutex); + + cnt = &mib->counters[KSZ9477_RX_UNDERSIZE]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ9477_RX_UNDERSIZE, NULL, cnt); + rmon_stats->undersize_pkts = *cnt; + + cnt = &mib->counters[KSZ9477_RX_OVERSIZE]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ9477_RX_OVERSIZE, NULL, cnt); + rmon_stats->oversize_pkts = *cnt; + + cnt = &mib->counters[KSZ9477_RX_FRAGMENTS]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ9477_RX_FRAGMENTS, NULL, cnt); + rmon_stats->fragments = *cnt; + + cnt = &mib->counters[KSZ9477_RX_JABBERS]; + dev->dev_ops->r_mib_pkt(dev, port, KSZ9477_RX_JABBERS, NULL, cnt); + rmon_stats->jabbers = *cnt; + + for (i = 0; i < KSZ9477_HIST_LEN; i++) { + cnt = &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] = *cnt; + } + + mutex_unlock(&mib->cnt_mutex); + + *ranges = ksz_rmon_ranges; +} diff --git a/drivers/net/dsa/microchip/ksz_ethtool.h b/drivers/net/dsa/microchip/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