From patchwork Wed Nov 30 20:08:04 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Jerry Ray X-Patchwork-Id: 27963 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:f944:0:0:0:0:0 with SMTP id q4csp1127814wrr; Wed, 30 Nov 2022 12:10:19 -0800 (PST) X-Google-Smtp-Source: AA0mqf5kWdWbI/6tJBL1uyfEusRHddELuret8XcMWwQkHtRaFG1RoXDFmkek2YLHwirvKblA4GTs X-Received: by 2002:a17:907:c20d:b0:7b8:882d:43fc with SMTP id ti13-20020a170907c20d00b007b8882d43fcmr36159785ejc.0.1669839019737; Wed, 30 Nov 2022 12:10:19 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1669839019; cv=none; d=google.com; s=arc-20160816; b=dchwuGgfPkWohlnFcwFsHrEJzZf5AfY09HrXDnJnGJ97IY6MFU/X0Pl6q7wvTwiZNl 3KwQgur5xyLOHNkjO1eiSeXjs5lztzG0R/ZhnMAKqqxdNlhYtnIXXcE3ViaYN68lqkNg r9pfSQuvZ2JebDBeD28oN7DV71hQNFcWWJf3lhXKqOgm5FBgXniUOBry5AtAYbznUlEY bKQX+Hl4HvimCrKQjpwbY4Pa3Xdz5PrsccC2q65x/tVckhjNXGA9Y05pAH1POVahxKat KJQ0DC1et9eX2qMXmS1G5ynS3DSbT13oPPhRPehP+4e50AYNRvfX1BYIXzkmooxR/oxB gPEA== 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 :message-id:date:subject:to:from:dkim-signature; bh=f69ay4Ut0kNPmCM42Jb0XqkJZ776JDVwgALFQDcXziE=; b=thpFIhoDmlTQWUG0XFNl56RgvDyo8j4wxqhL1SHbzzZ0fUNsbj5/abpUQPhF5IwXML 1k4mbaW3zJHIIh3tHawJtC9gIZpifMa50/Z7nO1g/nonCz1wy4mh0R24/Yts15FJuBWj Cq3v1qV85hn43QBJfgyQ3S/0KdRk+3qb5+EKj20JchAeUJW+H0Pn6ZYMD7chlMR6UpOk rtxVMVppOMbNi/E/fNV4E1LHp6QhYzTW3dspSS2TMwHBOBazJ4Q6PXS3xUm7abbgJGEV SdyuF9lmhtmgGFoMcCoR/b0jpcqS+wH+MOvsMqyUz1Cu0N9Xt6Y8ZG2aSeavazNvqGvD iULg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@microchip.com header.s=mchp header.b="U4yK5oV/"; 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 g22-20020a056402321600b0045d4b7ad162si1899246eda.546.2022.11.30.12.09.55; Wed, 30 Nov 2022 12:10:19 -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="U4yK5oV/"; 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 S229796AbiK3UIN (ORCPT + 99 others); Wed, 30 Nov 2022 15:08:13 -0500 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:41868 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229794AbiK3UIK (ORCPT ); Wed, 30 Nov 2022 15:08:10 -0500 Received: from esa.microchip.iphmx.com (esa.microchip.iphmx.com [68.232.153.233]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 6BF0F711A4; Wed, 30 Nov 2022 12:08:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=microchip.com; i=@microchip.com; q=dns/txt; s=mchp; t=1669838888; x=1701374888; h=from:to:subject:date:message-id:mime-version: content-transfer-encoding; bh=8guv5jwcaPQnC7by4n9uUpuRQSBkVBi41RgNbjLZ4lI=; b=U4yK5oV/5RhUvxKCPmIKeqqghxdMagcYu6pgMXYmbWUMj8sgRPc1PyjH RqNWy17a390Cnvl5OuFfHIp9FvnkE29GXXSD7lD6I/4piLGMqZDuC3N+2 I42p17uwvAc21pONyaoQDlsReTiKzAeAe8qxbp0uxdBzES1c2HuSzog4I eexBv68elP2GqqfPC0+LXZUj+vQyTCGS68A6oRMhJj7rdlf+t3DSvBe0C xrWXnY3eB+tgOsLjrYWvN8rgQlRmkd3u1fQ54hrEsPgUCLIuo8rXHuMiW uEy8pC8QgZDmtYTSlCGWG+aQG+yOKKLSstXZECMJCW8l30Do5SgWk+nQ3 g==; X-IronPort-AV: E=Sophos;i="5.96,207,1665471600"; d="scan'208";a="202086423" Received: from unknown (HELO email.microchip.com) ([170.129.1.10]) by esa1.microchip.iphmx.com with ESMTP/TLS/AES256-SHA256; 30 Nov 2022 13:08:07 -0700 Received: from chn-vm-ex04.mchp-main.com (10.10.85.152) by chn-vm-ex02.mchp-main.com (10.10.85.144) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.12; Wed, 30 Nov 2022 13:08:07 -0700 Received: from AUS-LT-C33025.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.12 via Frontend Transport; Wed, 30 Nov 2022 13:08:05 -0700 From: Jerry Ray To: Andrew Lunn , Florian Fainelli , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , "Paolo Abeni" , , , Jerry Ray Subject: [PATCH net-next v4] dsa: lan9303: Add 3 ethtool stats Date: Wed, 30 Nov 2022 14:08:04 -0600 Message-ID: <20221130200804.21778-1-jerry.ray@microchip.com> X-Mailer: git-send-email 2.17.1 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?1750953120187792111?= X-GMAIL-MSGID: =?utf-8?q?1750953120187792111?= Adding Buffer Manager and Switch Engine counters to the reported statistics. As these stats are kept by the switch rather than the port instance, they are indexed differently. These statistics are maintained by the switch and count the packets dropped due to buffer limits. Note that the rtnl_link_stats: rx_dropped statistic does not include dropped packets due to buffer exhaustion and as such, part of this counter would more appropriately fall under the rx_missed_errors. Migrating to phylink will be a pre-requisite for adding the stats64 API, at which point the rtnl_link_stats will come into play. Signed-off-by: Jerry Ray --- v3->v4: added returning stat of 0 if there is a device read failure. removed unrelated change. v2->v3: Isolating this patch to include only the added counters. Renamed the new statsistic labels to better identify them. Added the SWE Filtered counter to the reported statistics. Added comments to explain the added counters. v1->v2: Split patch into 2 pieces. Removed the adding of a module number to the driver. --- drivers/net/dsa/lan9303-core.c | 57 +++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/drivers/net/dsa/lan9303-core.c b/drivers/net/dsa/lan9303-core.c index 80f07bd20593..93c2a3c549cb 100644 --- a/drivers/net/dsa/lan9303-core.c +++ b/drivers/net/dsa/lan9303-core.c @@ -176,11 +176,14 @@ # define LAN9303_SWE_PORT_MIRROR_DISABLED 0 #define LAN9303_SWE_INGRESS_PORT_TYPE 0x1847 #define LAN9303_SWE_INGRESS_PORT_TYPE_VLAN 3 +#define LAN9303_SWE_FILTERED_CNT_SRC_0 0x1850 #define LAN9303_BM_CFG 0x1c00 +#define LAN9303_BM_DRP_CNT_SRC_0 0x1c05 #define LAN9303_BM_EGRSS_PORT_TYPE 0x1c0c # define LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT2 (BIT(17) | BIT(16)) # define LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT1 (BIT(9) | BIT(8)) # define LAN9303_BM_EGRSS_PORT_TYPE_SPECIAL_TAG_PORT0 (BIT(1) | BIT(0)) +#define LAN9303_BM_RATE_DRP_CNT_SRC_0 0x1c16 #define LAN9303_SWITCH_PORT_REG(port, reg0) (0x400 * (port) + (reg0)) @@ -978,10 +981,33 @@ static const struct lan9303_mib_desc lan9303_mib[] = { { .offset = LAN9303_MAC_TX_LATECOL_0, .name = "TxLateCol", }, }; +/* Buffer Management Statistics (indexed by port) */ +/* Switch Engine Statistics (indexed by port) */ +static const struct lan9303_mib_desc lan9303_switch_mib[] = { + { .offset = LAN9303_BM_DRP_CNT_SRC_0, .name = "TotalDropped", }, + { .offset = LAN9303_BM_RATE_DRP_CNT_SRC_0, .name = "LimitDropped", }, + { .offset = LAN9303_SWE_FILTERED_CNT_SRC_0, .name = "SweFiltered", }, +}; + +/* TotalDropped: This register counts the total number of packets dropped + * by the Buffer Manager that were received on the given port. This count + * includes packets dropped due to buffer space limits and ingress rate limit + * discarding (Red and random Yellow dropping). + * + * LimitDropped: This register counts the number of packets received on a + * port that were dropped by the Buffer Manager solely due to ingress rate + * limiting (discarding packets due to Red and random Yellow dropping). + * + * SweFiltered: This counter contains the number of packets filtered by + * the Switch Engine at ingress for a given port. The count includes packets + * filtered due to broadcast throttling, but does not include packets dropped + * due to ingress rate limiting. + */ + static void lan9303_get_strings(struct dsa_switch *ds, int port, u32 stringset, uint8_t *data) { - unsigned int u; + unsigned int i, u; if (stringset != ETH_SS_STATS) return; @@ -990,26 +1016,49 @@ static void lan9303_get_strings(struct dsa_switch *ds, int port, strncpy(data + u * ETH_GSTRING_LEN, lan9303_mib[u].name, ETH_GSTRING_LEN); } + for (i = 0; i < ARRAY_SIZE(lan9303_switch_mib); i++) { + strncpy(data + (u + i) * ETH_GSTRING_LEN, + lan9303_switch_mib[i].name, ETH_GSTRING_LEN); + } } static void lan9303_get_ethtool_stats(struct dsa_switch *ds, int port, uint64_t *data) { struct lan9303 *chip = ds->priv; - unsigned int u; + unsigned int i, u; for (u = 0; u < ARRAY_SIZE(lan9303_mib); u++) { u32 reg; int ret; + /* Read Port-based MIB stats. */ ret = lan9303_read_switch_port( chip, port, lan9303_mib[u].offset, ®); - if (ret) + if (ret) { dev_warn(chip->dev, "Reading status port %d reg %u failed\n", port, lan9303_mib[u].offset); + reg = 0; + } data[u] = reg; } + for (i = 0; i < ARRAY_SIZE(lan9303_switch_mib); i++) { + u32 reg; + int ret; + + /* Read Switch stats indexed by port. */ + ret = lan9303_read_switch_reg(chip, + (lan9303_switch_mib[i].offset + + port), ®); + + if (ret) { + dev_warn(chip->dev, "Reading status port %d reg %u failed\n", + port, lan9303_switch_mib[i].offset + port); + reg = 0; + } + data[i + u] = reg; + } } static int lan9303_get_sset_count(struct dsa_switch *ds, int port, int sset) @@ -1017,7 +1066,7 @@ static int lan9303_get_sset_count(struct dsa_switch *ds, int port, int sset) if (sset != ETH_SS_STATS) return 0; - return ARRAY_SIZE(lan9303_mib); + return ARRAY_SIZE(lan9303_mib) + ARRAY_SIZE(lan9303_switch_mib); } static int lan9303_phy_read(struct dsa_switch *ds, int phy, int regnum)