From nobody Fri Apr 3 20:56:52 2026 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013008.outbound.protection.outlook.com [40.107.159.8]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A969C39B483; Mon, 23 Mar 2026 11:50:47 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.8 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774266650; cv=fail; b=PhHO5YH+2D4XFctZ3CRxSFOaNQ/qKvMqM3IB2A17RiHfiAtulbUpZDJfoKg+pNGJZrSxvAZqUZXBDvBsB3ilnFePE+D3xuy4QUNS+fs/v8SdVDD4O/HhhzKO7lZMGWOovskYf9aR+JDlOVwPX+LqqYbqSZ8ezA6auvcWpVQhV1s= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774266650; c=relaxed/simple; bh=JwmWHNUG0ejIN6E47tmBB3mqKzj99+7YraQoHuOGUZA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=TKR3LG0PcdRzJBIW3yPdB4cByjONUZib4gfNxNxwWrzPWw/GextYnupt8Z0UcjcZajGLeSwT3BEW7JMNvNOHsO60dKc+iOBpcSxz8AX4yEF2IGr4rZCwuI4CQt+rqY79akpfVzR36vQ6cY8n28/h5oFJjc6lqQnlWwMynSbbFWI= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=bWrWnuO1; arc=fail smtp.client-ip=40.107.159.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="bWrWnuO1" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=oU2YvY4Mv7QCw9BPIBOI7WycjzL7Z1w8TgvHy1HDR0kWhlfgScxwu/YEcol7sjMfjnfg2e3gH54WJEJwhCEAjiwWh3zJqgzASt8WVb++OiL1fglcC3wT7z+tsxK2ZSTtEBuUcb9Tx2IYtSzuxyec/a44sSX+3WqSiU+2VfEpQ0YlMKA2TsVOFk0mZDQEempYv76AGn//eqKsizpmf0Q8zLYa5QFoZcrhKhtj/6fusg1YEP+ubgzPIh23ml4vjZc2m+Jz6QfXNEuZteWPb/pHulSJYMILHaw4I4v/pNBvuzt2pGhzK8HSCs57dw0hAqnNADkOmrKC217MKSJGjicHdQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=yxzdS8AH8XMFJFm93Zb8qnceoBpqQcQEr6N7cPpA7mI=; b=PF/4c3F4hp9cRkrg938TiG0omFsX3F8wOCW5UfNL72vsiB+wUBA+SZTLO0jhosnka9bUuDPJA3wXGLDe4KZr9iq9oYRbajGAwgQiSaRVV+wPbie8u951HcklmNqsx7x0xOPaZi5YSadqLwbuaHdGRaqn3xw2kPiVC3Ma4YeHSn6i8iLaimBWi+r35+oJGYWzt8gEVhRonu2S/11QPwKpt78pdepCEGQlpqyv1JZjIZU6aL398c2VJ1vYzMSi38Ma77duJ0DP5NSkcPPfWcSK4K9RPy2gqRb1KJMwRk9rVw5NpalfW83w3ovb1AvNKijuKfD2SsPxF5PafDGkr1hr8Q== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=yxzdS8AH8XMFJFm93Zb8qnceoBpqQcQEr6N7cPpA7mI=; b=bWrWnuO1k1kQmXyzAFhdq+/tvEj9IgPh8gI7yVZtTWruKERzH/zTcr7KlniWNVNMT0i+p6zH9HuVQyg8QVLFat7+kD7LOc8MHSpkNu4P1qzFCFESJQYzrkv4Lw3a6TS1959SkhepHcryAkvb9APgRN04GDoSqgYKhLeQRQ6/H6MqAkpkd/PdVQkHzWVFtWMYEFuntZwBRU6gON8bn767HBfuaSQJUpWxxdxQKhu4UbPS/ikFd+pwK03PvZeJ4wiS4xpYUDVbrOipq8ki09sMyZqOuDKFPKQSPIyPHp7izsKPaYZaze0YOlfX1rao7aiWCjxcoQguEBoBYhKkKEPt4g== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from PAXPR04MB8253.eurprd04.prod.outlook.com (2603:10a6:102:1bf::7) by AS5PR04MB9924.eurprd04.prod.outlook.com (2603:10a6:20b:67e::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9723.25; Mon, 23 Mar 2026 11:50:40 +0000 Received: from PAXPR04MB8253.eurprd04.prod.outlook.com ([fe80::2b4e:8130:4419:d633]) by PAXPR04MB8253.eurprd04.prod.outlook.com ([fe80::2b4e:8130:4419:d633%3]) with mapi id 15.20.9723.022; Mon, 23 Mar 2026 11:50:45 +0000 From: Ioana Ciornei To: netdev@vger.kernel.org Cc: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , linux-kernel@vger.kernel.org Subject: [PATCH net-next v5 1/3] net: dpaa2-mac: extend APIs related to statistics Date: Mon, 23 Mar 2026 13:50:37 +0200 Message-Id: <20260323115039.3932600-2-ioana.ciornei@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260323115039.3932600-1-ioana.ciornei@nxp.com> References: <20260323115039.3932600-1-ioana.ciornei@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4PR10CA0006.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:5dc::6) To PAXPR04MB8253.eurprd04.prod.outlook.com (2603:10a6:102:1bf::7) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PAXPR04MB8253:EE_|AS5PR04MB9924:EE_ X-MS-Office365-Filtering-Correlation-Id: e2ecbeb9-9eca-4c52-b7b8-08de88d26aca X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|19092799006|376014|18002099003|22082099003|56012099003; X-Microsoft-Antispam-Message-Info: CM1CspttlFgsDC5aquuedpJaf4qfrk3V5WR3dEYoPsjEBVFxXtBSGhT5eaVl9/j8vTiB9nOrie6kUvMMpZhmCLL/+80dmByxWYGLLZQeMsfFN1NueJfI1JDT1NtXOm47l3XFuXjpVofVzRm2cobu+nQRzQrVTODYuYoXHnlRDdulYHfHSkc/2jqY91F2b9x094W4WeBpYE58Jn50TzhSq2LqouLaw8GJuUwGT1RrgVFs278YYaH+MMt6RYWslu0wdQ+HVaPyn8+nxlS8qmUZPwKo8P1P0PnuL5Stnovsch49xamzAa1+hXODmGxFvmkiWNGgEi/FasNIydfjbNBHiv20xcPOKz8N8OfANt0P1aRWi6YeraS5alNRyzF0R0hFLUWFD+omkm1W/Q8belezyjkFdNZv4w0y086yyhPXvgnIrpV4tL37Ma+IW/7d6pA9ZYoFFWYfdsS9M2Ho1YTqd6mVUDQyR8G6+uxQ4s0tuMW9kWpikmT3AK38W0IoFkdmoQCeRaMTcYm84TBEOq1Oy45H6gkiSHJeLxb3/f+7zwAdHN0j013WFwZgHlxXRAstnpP8o2KEp2HcwhAPLw5GXpw9rZkKiokE2vZHw9t8Ph1PWCuBgmbzwCfI4J8vUY9jAK2Q8VMxdrUYZjejM3WnCrV1f+w6L2Ns2DbgIEEagldFrWNHEVkocerbCb2FGlND0h/SHg+OF4eCtPEMFKoTooadCQWr7jYz05lHH9ToVT4= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXPR04MB8253.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(19092799006)(376014)(18002099003)(22082099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?5aPhI293LcPXR9rarfJS2w+FUt7ZRvI1IpGubUD8ryTi6vE/cFzVRzurk5Io?= =?us-ascii?Q?HBlEDCh/Ul7FqtikInNZu+ibsQmHt3ixYD5PHA1nQmZWVgNsDzmceypF8Nim?= =?us-ascii?Q?h8GA+ObuLzcKSL2FcuoW/XmciOrUXapKL9cVaDe2LEe8CyD+BcsRZcckRHf6?= =?us-ascii?Q?YmWdXJEy4kQa8nNTmz9VxOE7pVqCYvEUKnyU6Ruh9f99xctOgAV3SqVF7D5e?= =?us-ascii?Q?kTJD1jilndAq2KlWKN7OCTOR/XRZz267zvp/km6kMFncErSA8ocZDjusQf/U?= =?us-ascii?Q?cQS6cxs8j4YfuvJCmfFqFGGdQxflM000UGP65q7NUgn5PIv6d5H35MqhF6F1?= =?us-ascii?Q?gf7TBJEIFd60YGeemxez+jCUEsXJIADtnuY3i6y1Qm/RC3OwJ/vFhKl1Ui+0?= =?us-ascii?Q?rtmuZeXWs+e3JqLY6LpkvVQZuc4thmn+ePm62rC75N+gcj27Wvi2tI4gCmsO?= =?us-ascii?Q?t6y7hmlbcwLXsmq8Tdm3CN8+Kz/49vCGQPKk8j7RWRkNdI5xMrdlP8wbA9oz?= =?us-ascii?Q?3tY8JpxUtRKQv0u1gNF+WxHkNf5Qh++sRW5DISmBetSLI0slB2LpHZkxdoNQ?= =?us-ascii?Q?F7alKCohV89B/48AKvbQITwo8N0g+kSlPzN/X3fbZOsFfWrvREdERne/Uy+o?= =?us-ascii?Q?S+GzIYiseFehpn0A/Hos8/4JMvV+OoDTJ2d9kHLeUKDtUsXLSk5jqxtVG09a?= =?us-ascii?Q?pJZ3l4x7zTojgAB3XanVvrhIPpz37saFxeBcBO+z+0HxwZxlBqzFnmK3HYaR?= =?us-ascii?Q?rlwQ/nv3Kffr4MPv3bxz0KpD8PO5COMJohTzZu4SWTcKRy/vU8ek0Zk9Xgw9?= =?us-ascii?Q?iJMuc7Pq52iDk9LGa9EfoWwRUkRbLrAI2B6hlNO1TR9t1r2HnGB255uML6hH?= =?us-ascii?Q?AOXDHrRSfqhdAKepQ7altQc1Vto0liUNDYvH3et+9otPzmyxLfYgBliY/Q3t?= =?us-ascii?Q?6i/nt1psu3Ls+Im66hLHYR0jQRuTs/2EDsXztyLgtxgbAGQdiXZc9ln1iVsp?= =?us-ascii?Q?QGNXaLVy8BJdBBmtkv5bjxY2oW0W1u5+Nw7NHSIDETbNv5okOiRAtES5TvK2?= =?us-ascii?Q?N0Mf03LS6NmxOCjAUH3+80JXBEHaNg/S3kZBgRt2rf3ZCgtyglqTTuiE8+yn?= =?us-ascii?Q?XN1HdA/1sT7sWJQz8i/cxGHH5CH+pj637sip8+5dQbHo/mwleNQhIZ5+w2Ks?= =?us-ascii?Q?TECi5XkrrmWmd8Ffi6cAi3UBweJiV+RmyDKcQ5m/gf2ob3a+cZqyBZpF/cmK?= =?us-ascii?Q?XxM4/yywtlM3LZBXWvIRQf4B7we6PNgvTkoMEJ72zg92bgxEBmJUdAyv6Qz7?= =?us-ascii?Q?au7qJ72XXtXJP+VVqk+QQgZR4+5dt0YLPT+UewOHoHsx/SvvzbPb0FxF5v6N?= =?us-ascii?Q?sWoZgxNhvyFgYdljeZafuAk3Kq/Li6FcfUi57jNfzjACfjZGnbihWKLHKOa/?= =?us-ascii?Q?fMKX8sCtqalTy8tzAboSChbUcGl03KLCyCjVBdlmjaPmmfiK1IgRfPj69M15?= =?us-ascii?Q?Vo6I8RbZDXKdB6sy1Sb1BYyVhtSEmWorxCmZKXcgVxfKpENwr0rxgUg62V9R?= =?us-ascii?Q?uTLzqOXU1Vg5RHwGRp5LE6bqjPdCXo0kHrJOf9S2AIjuO9ZTPizEOovKH2To?= =?us-ascii?Q?WPHvbZEtExGPPigyl76neukfTnlpte9PZFKukWxCISXicq3pzI3kiVpnLm9m?= =?us-ascii?Q?4oO9Njn/G6TjKPrLzL78WYNkmnnNKegUktp8MWL0LwnI9qkA9CDfb7MtIcai?= =?us-ascii?Q?Rqh0gxYVaQ=3D=3D?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: e2ecbeb9-9eca-4c52-b7b8-08de88d26aca X-MS-Exchange-CrossTenant-AuthSource: PAXPR04MB8253.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Mar 2026 11:50:45.1667 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: D0th9LAzDIl9rwgzrg1TeK9k6BpaI0VWkbsO3hCq0EmkBS1BJOp82lM69sO8PoDdEI4Xwb+8D1BuyH+N87W8aw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS5PR04MB9924 Content-Type: text/plain; charset="utf-8" Extend the dpmac_counter_id enum with the newly added counters which can be interrogated through the MC firmware. Also add the dpmac_get_statistics() API which can be used to retrieve multiple MAC counters through a single firmware command. Signed-off-by: Ioana Ciornei --- Changes in v5: - none Changes in v4: - none Changes in v3: - limit the documentation entries to 80 chars Changes in v2: - none .../net/ethernet/freescale/dpaa2/dpmac-cmd.h | 11 ++- drivers/net/ethernet/freescale/dpaa2/dpmac.c | 31 +++++- drivers/net/ethernet/freescale/dpaa2/dpmac.h | 94 ++++++++++++++++++- 3 files changed, 132 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/freescale/dpaa2/dpmac-cmd.h b/drivers/net= /ethernet/freescale/dpaa2/dpmac-cmd.h index e9ac2ecef3be..a864a99a0f75 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpmac-cmd.h +++ b/drivers/net/ethernet/freescale/dpaa2/dpmac-cmd.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */ /* Copyright 2013-2016 Freescale Semiconductor Inc. - * Copyright 2019 NXP + * Copyright 2019, 2024-2026 NXP */ #ifndef _FSL_DPMAC_CMD_H #define _FSL_DPMAC_CMD_H @@ -28,6 +28,8 @@ =20 #define DPMAC_CMDID_SET_PROTOCOL DPMAC_CMD(0x0c7) =20 +#define DPMAC_CMDID_GET_STATISTICS DPMAC_CMD(0x0c8) + /* Macros for accessing command fields smaller than 1byte */ #define DPMAC_MASK(field) \ GENMASK(DPMAC_##field##_SHIFT + DPMAC_##field##_SIZE - 1, \ @@ -82,4 +84,11 @@ struct dpmac_rsp_get_api_version { struct dpmac_cmd_set_protocol { u8 eth_if; }; + +struct dpmac_cmd_get_statistics { + __le64 iova_cnt; + __le64 iova_values; + __le32 num_cnt; +}; + #endif /* _FSL_DPMAC_CMD_H */ diff --git a/drivers/net/ethernet/freescale/dpaa2/dpmac.c b/drivers/net/eth= ernet/freescale/dpaa2/dpmac.c index f440a4c3b70c..efb9864d051f 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpmac.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpmac.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) /* Copyright 2013-2016 Freescale Semiconductor Inc. - * Copyright 2019 NXP + * Copyright 2019, 2024-2026 NXP */ #include #include "dpmac.h" @@ -235,3 +235,32 @@ int dpmac_set_protocol(struct fsl_mc_io *mc_io, u32 cm= d_flags, u16 token, =20 return mc_send_command(mc_io, &cmd); } + +/** + * dpmac_get_statistics() - Get MAC statistics + * @mc_io: Pointer to opaque I/O object + * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_' + * @token: Token of DPMAC object + * @iova_cnt: IOVA containing the requested MAC counters formatted as an + * array of __le32 representing the dpmac_counter_id. + * @iova_values: IOVA containing the values for all the requested counters + * formatted as an array of __le64. + * @num_cnt: Number of counters requested + * + * Return: '0' on Success; Error code otherwise. + */ +int dpmac_get_statistics(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, + u64 iova_cnt, u64 iova_values, u32 num_cnt) +{ + struct dpmac_cmd_get_statistics *cmd_params; + struct fsl_mc_command cmd =3D { 0 }; + + cmd.header =3D mc_encode_cmd_header(DPMAC_CMDID_GET_STATISTICS, + cmd_flags, token); + cmd_params =3D (struct dpmac_cmd_get_statistics *)cmd.params; + cmd_params->iova_cnt =3D cpu_to_le64(iova_cnt); + cmd_params->iova_values =3D cpu_to_le64(iova_values); + cmd_params->num_cnt =3D cpu_to_le32(num_cnt); + + return mc_send_command(mc_io, &cmd); +} diff --git a/drivers/net/ethernet/freescale/dpaa2/dpmac.h b/drivers/net/eth= ernet/freescale/dpaa2/dpmac.h index 17488819ef68..b5276168b869 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpmac.h +++ b/drivers/net/ethernet/freescale/dpaa2/dpmac.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */ /* Copyright 2013-2016 Freescale Semiconductor Inc. - * Copyright 2019 NXP + * Copyright 2019, 2024-2026 NXP */ #ifndef __FSL_DPMAC_H #define __FSL_DPMAC_H @@ -170,6 +170,58 @@ int dpmac_set_link_state(struct fsl_mc_io *mc_io, * pause frames. * @DPMAC_CNT_EGR_GOOD_FRAME: counts frames transmitted without error, inc= luding * pause frames. + * @DPMAC_CNT_EGR_FRAME_64: counts transmitted 64-bytes frames, good or ba= d. + * @DPMAC_CNT_EGR_FRAME_127: counts transmitted 65 to 127-bytes frames, go= od or + * bad. + * @DPMAC_CNT_EGR_FRAME_255: counts transmitted 128 to 255-bytes frames, g= ood + * or bad. + * @DPMAC_CNT_EGR_FRAME_511: counts transmitted 256 to 511-bytes frames, g= ood + * or bad. + * @DPMAC_CNT_EGR_FRAME_1023: counts transmitted 512 to 1023-bytes frames,= good + * or bad. + * @DPMAC_CNT_EGR_FRAME_1518: counts transmitted 1024 to 1518-bytes frames, + * good or bad. + * @DPMAC_CNT_EGR_FRAME_1519_MAX: counts transmitted 1519-bytes frames and + * larger (up to max frame length specified), + * good or bad. + * @DPMAC_CNT_ING_ALL_BYTE: counts bytes received in both good and bad pac= kets + * @DPMAC_CNT_ING_FCS_ERR: counts frames received with a CRC-32 error but = the + * frame is otherwise of correct length + * @DPMAC_CNT_ING_VLAN_FRAME: counts the received VLAN tagged frames which= are + * valid. + * @DPMAC_CNT_ING_UNDERSIZED: counts received frames which were less than = 64 + * bytes long and with a good CRC. + * @DPMAC_CNT_ING_CONTROL_FRAME: counts received control frames (type 0x88= 08) + * but not pause frames. + * @DPMAC_CNT_ING_FRAME_DISCARD_NOT_TRUNC: counts the fully dropped frames= (not + * truncated) due to internal errors of + * the MAC client. Occurs when a + * receive FIFO overflows. + * @DPMAC_CNT_EGR_ALL_BYTE: counts transmitted bytes in both good and bad + * packets. + * @DPMAC_CNT_EGR_FCS_ERR: counts trasmitted frames with a CRC-32 error ex= cept + * for underflows. + * @DPMAC_CNT_EGR_VLAN_FRAME: counts the transmitted VLAN tagged frames wh= ich + * are valid. + * @DPMAC_CNT_EGR_ALL_FRAME: counts all trasmitted frames, good or bad. + * @DPMAC_CNT_EGR_CONTROL_FRAME: counts transmitted control frames (type + * 0x8808) but not pause frames. + * @DPMAC_CNT_ING_PFC0: number of PFC frames received for class 0. + * @DPMAC_CNT_ING_PFC1: number of PFC frames received for class 1. + * @DPMAC_CNT_ING_PFC2: number of PFC frames received for class 2. + * @DPMAC_CNT_ING_PFC3: number of PFC frames received for class 3. + * @DPMAC_CNT_ING_PFC4: number of PFC frames received for class 4. + * @DPMAC_CNT_ING_PFC5: number of PFC frames received for class 5. + * @DPMAC_CNT_ING_PFC6: number of PFC frames received for class 6. + * @DPMAC_CNT_ING_PFC7: number of PFC frames received for class 7. + * @DPMAC_CNT_EGR_PFC0: number of PFC frames transmitted for class 0. + * @DPMAC_CNT_EGR_PFC1: number of PFC frames transmitted for class 1. + * @DPMAC_CNT_EGR_PFC2: number of PFC frames transmitted for class 2. + * @DPMAC_CNT_EGR_PFC3: number of PFC frames transmitted for class 3. + * @DPMAC_CNT_EGR_PFC4: number of PFC frames transmitted for class 4. + * @DPMAC_CNT_EGR_PFC5: number of PFC frames transmitted for class 5. + * @DPMAC_CNT_EGR_PFC6: number of PFC frames transmitted for class 6. + * @DPMAC_CNT_EGR_PFC7: number of PFC frames transmitted for class 7. */ enum dpmac_counter_id { DPMAC_CNT_ING_FRAME_64, @@ -199,7 +251,41 @@ enum dpmac_counter_id { DPMAC_CNT_EGR_UCAST_FRAME, DPMAC_CNT_EGR_ERR_FRAME, DPMAC_CNT_ING_GOOD_FRAME, - DPMAC_CNT_EGR_GOOD_FRAME + DPMAC_CNT_EGR_GOOD_FRAME, + DPMAC_CNT_EGR_FRAME_64, + DPMAC_CNT_EGR_FRAME_127, + DPMAC_CNT_EGR_FRAME_255, + DPMAC_CNT_EGR_FRAME_511, + DPMAC_CNT_EGR_FRAME_1023, + DPMAC_CNT_EGR_FRAME_1518, + DPMAC_CNT_EGR_FRAME_1519_MAX, + DPMAC_CNT_ING_ALL_BYTE, + DPMAC_CNT_ING_FCS_ERR, + DPMAC_CNT_ING_VLAN_FRAME, + DPMAC_CNT_ING_UNDERSIZED, + DPMAC_CNT_ING_CONTROL_FRAME, + DPMAC_CNT_ING_FRAME_DISCARD_NOT_TRUNC, + DPMAC_CNT_EGR_ALL_BYTE, + DPMAC_CNT_EGR_FCS_ERR, + DPMAC_CNT_EGR_VLAN_FRAME, + DPMAC_CNT_EGR_ALL_FRAME, + DPMAC_CNT_EGR_CONTROL_FRAME, + DPMAC_CNT_ING_PFC0, + DPMAC_CNT_ING_PFC1, + DPMAC_CNT_ING_PFC2, + DPMAC_CNT_ING_PFC3, + DPMAC_CNT_ING_PFC4, + DPMAC_CNT_ING_PFC5, + DPMAC_CNT_ING_PFC6, + DPMAC_CNT_ING_PFC7, + DPMAC_CNT_EGR_PFC0, + DPMAC_CNT_EGR_PFC1, + DPMAC_CNT_EGR_PFC2, + DPMAC_CNT_EGR_PFC3, + DPMAC_CNT_EGR_PFC4, + DPMAC_CNT_EGR_PFC5, + DPMAC_CNT_EGR_PFC6, + DPMAC_CNT_EGR_PFC7, }; =20 int dpmac_get_counter(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, @@ -210,4 +296,8 @@ int dpmac_get_api_version(struct fsl_mc_io *mc_io, u32 = cmd_flags, =20 int dpmac_set_protocol(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, enum dpmac_eth_if protocol); + +int dpmac_get_statistics(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token, + u64 iova_cnt, u64 iova_values, u32 num_cnt); + #endif /* __FSL_DPMAC_H */ --=20 2.25.1 From nobody Fri Apr 3 20:56:52 2026 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013008.outbound.protection.outlook.com [40.107.159.8]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id B4DDD39B96F; Mon, 23 Mar 2026 11:50:50 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.8 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774266654; cv=fail; b=YpS8Hc6o3pdJgv7cIUEf8GMN/zClWvArcM2VdDvqrD7YlgsiLxoEVI9P+85JDM4mjnEHyfyVWtTXEUshRAxfiHIbvThNyHAXSV+u6Oql/JDyqmNn034OsrPigD783y5zEeKfAitOot1se17uhGWrXyS2Ifchluh1N3j+mxXjF7I= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774266654; c=relaxed/simple; bh=0/1hqXoQ6pMrmkM1991wDmGKnfABCwf1mcHJSPu6mbk=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=XOZD2nJkGoTDJIVU6r+l/miENIVX5DtBw0gD1Xc+8oHaeLukDwx2MEcgIVojXel0pedZ79EI5WH2ENhFjyYIiERVkFNxzXidThghbpregao+M5/Db2M4CBGxzdvMN0v5UMtOVCfgQnBuR92Z74ZQK8uEN0weYYnioA0hHB3dQAc= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=Xrs5nD0z; arc=fail smtp.client-ip=40.107.159.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="Xrs5nD0z" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=WHOw+CvLUNfq+NeA2JtUI01YCHHfP3jG+nkFoPTmXY3qenK5uTCuI+imvPnXvPApIu1O98tyMB+MtaxuxlkLcuABVIpJtwtthpw8vsQmwpX3N2RVIeY6oBc2E0THHEGpJB/i93b9r0Tn4MmizreQhV+vbx/Tj0vcxJcpUTmwjGOIandswRtGJ+Ib5YDMc9qrklo0HqEKL1iRmXRfk9FPfMB1IVEIno1Hrqny1J8S7giGnQmlHNMOPzJFviZoRmpSAm9uo3MIjZxqRbwvqiI6bV+5J7/MvEEAllil1HaaGdTv3fd5yKO+EZRHXqLRSnZn039Xt3Ygand4AHp1AI9jkg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=ye5A91M5Yd/9W8GauM53gChZcyrPkzPAwIZMFzP+/6o=; b=b82vIO02G1qYZI9wI3yTvES/f2I0BVJf5jL3lYffwYMQ2ysr0clBkclMB67DS4lfBLSqiueD36dzG8r0RzDpFz59VCIq8805nubg+POPXd1URRCYkQBLg607UTcgUCHXoJwpsWQTGeyMhHhU05TcxIItnXgKKK4EVw+vDoe7zKvSm+NqCWknVIWGWx1bmIzY9CfPeVai6SQJOUMcmopW+fqKckS9/wPW6SBH6UjZFP6t+EmJZHyRKq4ftiGiEjOPM+4qEGjpA7dNoQEZO5+KdNfjbkzjMZrYS6la3eKcLIcJNqwDWM6MlOqFOyfgtQb5ZhaevIcHwPVofHenVjPtUg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=ye5A91M5Yd/9W8GauM53gChZcyrPkzPAwIZMFzP+/6o=; b=Xrs5nD0zfv7V39UbCW7xwPcnDfvUplm4wShrjiLw82efkLbQCFCPElV7zz9bb53gyOOuRr1wTgwNJ0LFhPwXYO7Rmr1uUblv15d26WaLXvbgFmpcXpmOiJ4E7qnzSglBlGPge4tykS/zTrzt95KZ8xV3dcVgPdA6KuX+fh6kGvlktvrPpOaQvXLAmF2m99iI9zzpEmtz8pKXgWY+suwbl1sFAoOMWkHejuyIgB/1D9tTikVxbXcJsv5+fbIgMGBPZSFxco3JskL/oDXK0WAfNsE3/RWt+JaZB3XgRVpTfsizVcwyUtluvucBG8c1XCCaMrvwH3Abf0dGgc2MsLiuNw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from PAXPR04MB8253.eurprd04.prod.outlook.com (2603:10a6:102:1bf::7) by AS5PR04MB9924.eurprd04.prod.outlook.com (2603:10a6:20b:67e::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9723.25; Mon, 23 Mar 2026 11:50:43 +0000 Received: from PAXPR04MB8253.eurprd04.prod.outlook.com ([fe80::2b4e:8130:4419:d633]) by PAXPR04MB8253.eurprd04.prod.outlook.com ([fe80::2b4e:8130:4419:d633%3]) with mapi id 15.20.9723.022; Mon, 23 Mar 2026 11:50:48 +0000 From: Ioana Ciornei To: netdev@vger.kernel.org Cc: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , linux-kernel@vger.kernel.org Subject: [PATCH net-next v5 2/3] net: dpaa2-mac: retrieve MAC statistics in one firmware command Date: Mon, 23 Mar 2026 13:50:38 +0200 Message-Id: <20260323115039.3932600-3-ioana.ciornei@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260323115039.3932600-1-ioana.ciornei@nxp.com> References: <20260323115039.3932600-1-ioana.ciornei@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4PR10CA0006.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:5dc::6) To PAXPR04MB8253.eurprd04.prod.outlook.com (2603:10a6:102:1bf::7) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PAXPR04MB8253:EE_|AS5PR04MB9924:EE_ X-MS-Office365-Filtering-Correlation-Id: 36fba0cd-922e-429c-6a78-08de88d26c80 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|19092799006|376014|18002099003|22082099003|56012099003; X-Microsoft-Antispam-Message-Info: spxbnhBA6BtaU8njDrbAYoRJxN0CkFsDH1DrrLyXkDjbvlTipfc8hkPCd8v3f25BnMkN2vFi8JSRUsJxpFQu4xmgADcPlaZfEB7I+KrIpdJdpX1m10hnirf78wbmYIrj/CFXdOzRaloTv4CfPdIzayLT2H3Vimm+dGT2CmEIFhVAwNCPDEz7pE0iu4RhNgubWD9Bl3bcn9KTBxBzrlXRvs6lSCccCo6GZ8F3eIHuvZ42h3sMnnCBQPc6FNjHp/d8OEZAVTpqCELcqPGwOB769V8dp8urtURkDjmD1ijsivonb3FtrcO3Qfr0CNMxKwAvUg0Uk8HRERVQx7VRxXGEdaDzKtaBOFWrlf4rxyYtIx9XBIqms/WF6TRB2YV/wivwMIXOx9RDo6W4srIinkGZRXVNG0w1VKyL2yN0+Jmnnvcke2Y1OknYu1cgJqBBoqoW2mxbFNYfmYH7O1x0lZsWMiWp+A85hNucwib2KU7C4M392j7Rxr64H6xldkJJOIL9KP4BKx6UucwRKTQjwCuPYQHZG0NfYeWEADm796ysmD+acuL/HoXjH7v68jxbHtMnnQJ6z50n0fYVLp71SNFzp1jYqssvt1+2FTjXj9hZIwfPEYs4Nw/kMW7TQka8jES6npi3YF7oYKGwyjkcaMvJFaunduVNPuE4qUg4ulWeDAmmpOBE7QK4/8CL94XQbwKH9Eph1cYuk57+mZb4vJDkrI8xsZ9Bxbe8RAfjzsrPjHw= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXPR04MB8253.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(19092799006)(376014)(18002099003)(22082099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?IZPbvvVkZaFIRsVOgMWGZohKQRNeuKo00NHchkAxE/OAVzBab5MiKMFOeWoh?= =?us-ascii?Q?ryXc9YVDmak3ybTRyPFdHCqPYKaK9399+tgPjf4L5O90fsT62sCUPu0pg3os?= =?us-ascii?Q?/7tATIBjfA/utWeWgXJpLwHcIfjAS1CyXWNmeBaVZa0k5D08QwCoqkZH8Qxe?= =?us-ascii?Q?2h9NMI+fTKjJ4UdGO+1PJjmMOjWyMl2kSXpxUEq18P6567xFfrLJyFtdOr63?= =?us-ascii?Q?JtSJgalH1xpJWLi3qpSrniHvkB8vFTcb9l9J6ollDYZ06LuPTEDjBnQsgbMh?= =?us-ascii?Q?Ig7U/68NiKNu/4zFXaKJsc6ioEQYcVI79Vaf2jiUvr8wAu6feg6YIQYik3DC?= =?us-ascii?Q?r4a2lfl9a9Z+GuGAT1JXiy60RjplWjDkSJXYtICFj6SVbWgvtI9VWCLAE7Bo?= =?us-ascii?Q?AojGBDJovu2YEoIX5IZoh7Gx/YdCsYmlGjuqhAMz0AT+uf8gMz4qRiR+A9iJ?= =?us-ascii?Q?owAQhGG8AJsizsH4ARMxkuXBdrGdnt4GxcDH3O55r1IR/MtaIb0/NE+Wp83S?= =?us-ascii?Q?5+Tl/rn8Rir5bG9fDaAMYvTdl9rjocTBLqKPDYlhuagh3OZ+E28C94IPKQLc?= =?us-ascii?Q?3xWQs5w9/kI+zIXfV4Kk+yCWXc5AVIgZuGUGSBlInubsN7BSp8DtztjeqGvI?= =?us-ascii?Q?YkhOhNsQk6X/wyaqK5oNCkn3t/5vqfJ7u0fk5GYxnTgDMl2mGrg6GGoc8T5e?= =?us-ascii?Q?TfI3PaNgF6EFhEju35ruFTfRGD0wWkhcXP8Mh9gq8Il6FAVJRtTwWIZr/oMq?= =?us-ascii?Q?+pxdSScFQCkQCO7iy2GUpGZOweuBRVksNMRspBNvaeyOKR11R02yKHaLeb7f?= =?us-ascii?Q?Kt7yld6xD14/G0JRksdLTF1eGJQZjx9abrXa3RWcc5+iDHpssmt9jEMTh+Bl?= =?us-ascii?Q?DLVq8c5RfMmmar/g5+tE9ra/qJe8UTQOejDwsFjkwEkxzWWkTJphps60tffJ?= =?us-ascii?Q?jhLNM0BeIwhsMTYmSCGV4CzMly04BChJK+8qCrHVZH0qVhuEcyCUATRSfIN9?= =?us-ascii?Q?BLtTh5HwjUFk9TCKzdyecuwMgoQPmOTtuNpuNX6Cns5S1qyaysRfEKhoBEIL?= =?us-ascii?Q?FazfoTQ9OhhHO9cRxoOCb5Cv9a4eDjVisSwaKsZqvXeV1mW89HJ+Gsmb+9re?= =?us-ascii?Q?1hPhKoZazTexTFxPUHnKIdCrR1oLIoVEWrTPYlhYHzs/iOtM7D8VCdVS4sDJ?= =?us-ascii?Q?UneUaGOCO0CK29m8vjll0TzeXzobtrw4b+a8XqNPrXvo0Ks4V4X6L7omDMKN?= =?us-ascii?Q?e8l+amtTDsaoVaeL4Uxa5eYmxeQhIdAncAcN3qIFFNHMKPGxBZ1MScqsovge?= =?us-ascii?Q?0bY7aG57uDFECmvT/3jG4v6pVNqpcknzKmy65lYUCuF2RiEoqHfxBEPn7y9s?= =?us-ascii?Q?DrZ/6DW6687JYfJ2SwRlFiRS1S/gAtSG8dqH3tk4OPz5MhTZOk0ZiKKhVZ3w?= =?us-ascii?Q?/Y/frIKHQm9QtR7Qf+fLrjqFaTB02bfSZ8jGfnX6NntxSEpklZEbP1NoRWu6?= =?us-ascii?Q?R3ii+xL6wJ5I8kkIk+ufjIaAJXGi+4e5EgCzC0k8P/O4CUWREvnFXuvmQK3i?= =?us-ascii?Q?L2GWeP92IE/VbcpVTE7XkgSby8FecsMHVBVGG6wl5W5spIuMDvmomr/CNs+J?= =?us-ascii?Q?WjRFpmy8/sKjGNxVArlEYZJHbnSQl0w7zXCyc6PWmJUS+WZTAVs7+5dwxwO2?= =?us-ascii?Q?nMw10//xBMuAI6UDyKQe9tWYjj/qonNPMRBXquvy9VvxUlBhD5VnVVVhLdNJ?= =?us-ascii?Q?8Q7X6L1rSg=3D=3D?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 36fba0cd-922e-429c-6a78-08de88d26c80 X-MS-Exchange-CrossTenant-AuthSource: PAXPR04MB8253.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Mar 2026 11:50:48.0018 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: i71SgPbBdsAajaWBWRWROdyjYBXm1fWra1U9KiwC8/2h0CBvlkqptgVi/mjzRjBPYIHRx5BScXWAMS8ypDNtWA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS5PR04MB9924 Content-Type: text/plain; charset="utf-8" The latest MC firmware version added a new command to retrieve all DPMAC counters in a single firmware call. Use this new command, when possible, in dpaa2-mac as well. In order to use the dpmac_get_statistics() API, two DMA memory areas are used: one to transmit what counters the driver is requesting and one to receive the values of those counters. These memory areas are allocated and DMA mapped at probe time so that we don't waste time at runtime. And since we are planning to add rmon, eth-ctrl and other standard statistics using the same infrastructure, make the setup and cleanup processes as generic as possibile through the dpaa2_mac_setup_stats() and dpaa2_mac_clear_stats() functions. Signed-off-by: Ioana Ciornei --- Changes in v5: - none Changes in v4: - fix dma_sync call and memory leak in the cleanup Changes in v3: - use dma_alloc_noncoherent() instead of kcalloc + dma_map_single - reduce the number of lines that have more than 80 chars Changes in v2: - fix fallback usecase by using dpaa2_mac_ethtool_stats[i].id - use the __le32/__le64 types for cnt_idx, cnt_values etc .../net/ethernet/freescale/dpaa2/dpaa2-mac.c | 201 ++++++++++++++---- .../net/ethernet/freescale/dpaa2/dpaa2-mac.h | 10 +- 2 files changed, 171 insertions(+), 40 deletions(-) diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c b/drivers/net= /ethernet/freescale/dpaa2/dpaa2-mac.c index 422ce13a7c94..5a7fda6a2012 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c @@ -1,5 +1,5 @@ // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) -/* Copyright 2019 NXP */ +/* Copyright 2019, 2024-2026 NXP */ =20 #include #include @@ -15,7 +15,118 @@ #define DPMAC_PROTOCOL_CHANGE_VER_MAJOR 4 #define DPMAC_PROTOCOL_CHANGE_VER_MINOR 8 =20 +#define DPMAC_STATS_BUNDLE_VER_MAJOR 4 +#define DPMAC_STATS_BUNDLE_VER_MINOR 10 + #define DPAA2_MAC_FEATURE_PROTOCOL_CHANGE BIT(0) +#define DPAA2_MAC_FEATURE_STATS_BUNDLE BIT(1) + +struct dpmac_counter { + enum dpmac_counter_id id; + const char *name; +}; + +#define DPMAC_UNSTRUCTURED_COUNTER(counter_id, counter_name) \ + { \ + .id =3D counter_id, \ + .name =3D counter_name, \ + } + +static const struct dpmac_counter dpaa2_mac_ethtool_stats[] =3D { + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_ALL_FRAME, "[mac] rx all frames= "), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_GOOD_FRAME, "[mac] rx frames ok= "), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_ERR_FRAME, "[mac] rx frame error= s"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_FRAME_DISCARD, "[mac] rx frame d= iscards"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_UCAST_FRAME, "[mac] rx u-cast"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_BCAST_FRAME, "[mac] rx b-cast"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_MCAST_FRAME, "[mac] rx m-cast"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_FRAME_64, "[mac] rx 64 bytes"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_FRAME_127, "[mac] rx 65-127 byte= s"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_FRAME_255, "[mac] rx 128-255 byt= es"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_FRAME_511, "[mac] rx 256-511 byt= es"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_FRAME_1023, "[mac] rx 512-1023 b= ytes"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_FRAME_1518, "[mac] rx 1024-1518 = bytes"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_FRAME_1519_MAX, "[mac] rx 1519-m= ax bytes"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_FRAG, "[mac] rx frags"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_JABBER, "[mac] rx jabber"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_ALIGN_ERR, "[mac] rx align error= s"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_OVERSIZED, "[mac] rx oversized"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_VALID_PAUSE_FRAME, "[mac] rx pau= se"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_BYTE, "[mac] rx bytes"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_EGR_GOOD_FRAME, "[mac] tx frames ok"= ), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_EGR_UCAST_FRAME, "[mac] tx u-cast"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_EGR_MCAST_FRAME, "[mac] tx m-cast"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_EGR_BCAST_FRAME, "[mac] tx b-cast"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_EGR_ERR_FRAME, "[mac] tx frame error= s"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_EGR_UNDERSIZED, "[mac] tx undersized= "), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_EGR_VALID_PAUSE_FRAME, "[mac] tx b-p= ause"), + DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_EGR_BYTE, "[mac] tx bytes"), +}; + +#define DPAA2_MAC_NUM_ETHTOOL_STATS ARRAY_SIZE(dpaa2_mac_ethtool_stats) + +static void dpaa2_mac_setup_stats(struct dpaa2_mac *mac, + struct dpaa2_mac_stats *stats, + size_t num_stats, + const struct dpmac_counter *counters) +{ + struct device *dev =3D mac->net_dev->dev.parent; + size_t size_idx, size_values; + __le32 *cnt_idx; + + size_idx =3D num_stats * sizeof(u32); + stats->idx_dma_mem =3D dma_alloc_noncoherent(dev, size_idx, + &stats->idx_iova, + DMA_TO_DEVICE, + GFP_KERNEL); + if (!stats->idx_dma_mem) + goto out; + + size_values =3D num_stats * sizeof(u64); + stats->values_dma_mem =3D dma_alloc_noncoherent(dev, size_values, + &stats->values_iova, + DMA_FROM_DEVICE, + GFP_KERNEL); + if (!stats->values_dma_mem) + goto err_alloc_values; + + cnt_idx =3D stats->idx_dma_mem; + for (size_t i =3D 0; i < num_stats; i++) + *cnt_idx++ =3D cpu_to_le32((u32)(counters[i].id)); + + dma_sync_single_for_device(dev, stats->idx_iova, size_idx, + DMA_TO_DEVICE); + + return; + +err_alloc_values: + dma_free_noncoherent(dev, num_stats * sizeof(u32), stats->idx_dma_mem, + stats->idx_iova, DMA_TO_DEVICE); +out: + stats->idx_dma_mem =3D NULL; + stats->values_dma_mem =3D NULL; +} + +static void dpaa2_mac_clear_stats(struct dpaa2_mac *mac, + struct dpaa2_mac_stats *stats, + size_t num_stats) +{ + struct device *dev =3D mac->net_dev->dev.parent; + + if (stats->idx_dma_mem) { + dma_free_noncoherent(dev, num_stats * sizeof(u32), + stats->idx_dma_mem, + stats->idx_iova, DMA_TO_DEVICE); + stats->idx_dma_mem =3D NULL; + } + + if (stats->values_dma_mem) { + dma_free_noncoherent(dev, num_stats * sizeof(u64), + stats->values_dma_mem, + stats->values_iova, DMA_FROM_DEVICE); + stats->values_dma_mem =3D NULL; + } +} =20 static int dpaa2_mac_cmp_ver(struct dpaa2_mac *mac, u16 ver_major, u16 ver_minor) @@ -32,6 +143,10 @@ static void dpaa2_mac_detect_features(struct dpaa2_mac = *mac) if (dpaa2_mac_cmp_ver(mac, DPMAC_PROTOCOL_CHANGE_VER_MAJOR, DPMAC_PROTOCOL_CHANGE_VER_MINOR) >=3D 0) mac->features |=3D DPAA2_MAC_FEATURE_PROTOCOL_CHANGE; + + if (dpaa2_mac_cmp_ver(mac, DPMAC_STATS_BUNDLE_VER_MAJOR, + DPMAC_STATS_BUNDLE_VER_MINOR) >=3D 0) + mac->features |=3D DPAA2_MAC_FEATURE_STATS_BUNDLE; } =20 static int phy_mode(enum dpmac_eth_if eth_if, phy_interface_t *if_mode) @@ -504,6 +619,11 @@ int dpaa2_mac_open(struct dpaa2_mac *mac) mac->fw_node =3D fw_node; net_dev->dev.of_node =3D to_of_node(mac->fw_node); =20 + if (mac->features & DPAA2_MAC_FEATURE_STATS_BUNDLE) + dpaa2_mac_setup_stats(mac, &mac->ethtool_stats, + DPAA2_MAC_NUM_ETHTOOL_STATS, + dpaa2_mac_ethtool_stats); + return 0; =20 err_close_dpmac: @@ -515,66 +635,69 @@ void dpaa2_mac_close(struct dpaa2_mac *mac) { struct fsl_mc_device *dpmac_dev =3D mac->mc_dev; =20 + if (mac->features & DPAA2_MAC_FEATURE_STATS_BUNDLE) + dpaa2_mac_clear_stats(mac, &mac->ethtool_stats, + DPAA2_MAC_NUM_ETHTOOL_STATS); + dpmac_close(mac->mc_io, 0, dpmac_dev->mc_handle); if (mac->fw_node) fwnode_handle_put(mac->fw_node); } =20 -static char dpaa2_mac_ethtool_stats[][ETH_GSTRING_LEN] =3D { - [DPMAC_CNT_ING_ALL_FRAME] =3D "[mac] rx all frames", - [DPMAC_CNT_ING_GOOD_FRAME] =3D "[mac] rx frames ok", - [DPMAC_CNT_ING_ERR_FRAME] =3D "[mac] rx frame errors", - [DPMAC_CNT_ING_FRAME_DISCARD] =3D "[mac] rx frame discards", - [DPMAC_CNT_ING_UCAST_FRAME] =3D "[mac] rx u-cast", - [DPMAC_CNT_ING_BCAST_FRAME] =3D "[mac] rx b-cast", - [DPMAC_CNT_ING_MCAST_FRAME] =3D "[mac] rx m-cast", - [DPMAC_CNT_ING_FRAME_64] =3D "[mac] rx 64 bytes", - [DPMAC_CNT_ING_FRAME_127] =3D "[mac] rx 65-127 bytes", - [DPMAC_CNT_ING_FRAME_255] =3D "[mac] rx 128-255 bytes", - [DPMAC_CNT_ING_FRAME_511] =3D "[mac] rx 256-511 bytes", - [DPMAC_CNT_ING_FRAME_1023] =3D "[mac] rx 512-1023 bytes", - [DPMAC_CNT_ING_FRAME_1518] =3D "[mac] rx 1024-1518 bytes", - [DPMAC_CNT_ING_FRAME_1519_MAX] =3D "[mac] rx 1519-max bytes", - [DPMAC_CNT_ING_FRAG] =3D "[mac] rx frags", - [DPMAC_CNT_ING_JABBER] =3D "[mac] rx jabber", - [DPMAC_CNT_ING_ALIGN_ERR] =3D "[mac] rx align errors", - [DPMAC_CNT_ING_OVERSIZED] =3D "[mac] rx oversized", - [DPMAC_CNT_ING_VALID_PAUSE_FRAME] =3D "[mac] rx pause", - [DPMAC_CNT_ING_BYTE] =3D "[mac] rx bytes", - [DPMAC_CNT_EGR_GOOD_FRAME] =3D "[mac] tx frames ok", - [DPMAC_CNT_EGR_UCAST_FRAME] =3D "[mac] tx u-cast", - [DPMAC_CNT_EGR_MCAST_FRAME] =3D "[mac] tx m-cast", - [DPMAC_CNT_EGR_BCAST_FRAME] =3D "[mac] tx b-cast", - [DPMAC_CNT_EGR_ERR_FRAME] =3D "[mac] tx frame errors", - [DPMAC_CNT_EGR_UNDERSIZED] =3D "[mac] tx undersized", - [DPMAC_CNT_EGR_VALID_PAUSE_FRAME] =3D "[mac] tx b-pause", - [DPMAC_CNT_EGR_BYTE] =3D "[mac] tx bytes", -}; - -#define DPAA2_MAC_NUM_STATS ARRAY_SIZE(dpaa2_mac_ethtool_stats) - int dpaa2_mac_get_sset_count(void) { - return DPAA2_MAC_NUM_STATS; + return DPAA2_MAC_NUM_ETHTOOL_STATS; } =20 void dpaa2_mac_get_strings(u8 **data) { int i; =20 - for (i =3D 0; i < DPAA2_MAC_NUM_STATS; i++) - ethtool_puts(data, dpaa2_mac_ethtool_stats[i]); + for (i =3D 0; i < DPAA2_MAC_NUM_ETHTOOL_STATS; i++) + ethtool_puts(data, dpaa2_mac_ethtool_stats[i].name); } =20 void dpaa2_mac_get_ethtool_stats(struct dpaa2_mac *mac, u64 *data) { + size_t values_size =3D DPAA2_MAC_NUM_ETHTOOL_STATS * sizeof(u64); + struct device *dev =3D mac->net_dev->dev.parent; struct fsl_mc_device *dpmac_dev =3D mac->mc_dev; + __le64 *cnt_values; int i, err; u64 value; =20 - for (i =3D 0; i < DPAA2_MAC_NUM_STATS; i++) { + if (!(mac->features & DPAA2_MAC_FEATURE_STATS_BUNDLE)) + goto fallback; + + if (!mac->ethtool_stats.idx_dma_mem || + !mac->ethtool_stats.values_dma_mem) + goto fallback; + + dma_sync_single_for_device(dev, mac->ethtool_stats.values_iova, + values_size, DMA_FROM_DEVICE); + + err =3D dpmac_get_statistics(mac->mc_io, 0, dpmac_dev->mc_handle, + mac->ethtool_stats.idx_iova, + mac->ethtool_stats.values_iova, + DPAA2_MAC_NUM_ETHTOOL_STATS); + if (err) + goto fallback; + + dma_sync_single_for_cpu(dev, mac->ethtool_stats.values_iova, + values_size, DMA_FROM_DEVICE); + + cnt_values =3D mac->ethtool_stats.values_dma_mem; + for (i =3D 0; i < DPAA2_MAC_NUM_ETHTOOL_STATS; i++) + *(data + i) =3D le64_to_cpu(*cnt_values++); + + return; + +fallback: + + /* Fallback and retrieve each counter one by one */ + for (i =3D 0; i < DPAA2_MAC_NUM_ETHTOOL_STATS; i++) { err =3D dpmac_get_counter(mac->mc_io, 0, dpmac_dev->mc_handle, - i, &value); + dpaa2_mac_ethtool_stats[i].id, &value); if (err) { netdev_err_once(mac->net_dev, "dpmac_get_counter error %d\n", err); diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.h b/drivers/net= /ethernet/freescale/dpaa2/dpaa2-mac.h index 53f8d106d11e..6f4981627961 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.h +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.h @@ -1,5 +1,5 @@ /* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */ -/* Copyright 2019 NXP */ +/* Copyright 2019, 2024-2026 NXP */ #ifndef DPAA2_MAC_H #define DPAA2_MAC_H =20 @@ -11,6 +11,12 @@ #include "dpmac.h" #include "dpmac-cmd.h" =20 +struct dpaa2_mac_stats { + __le32 *idx_dma_mem; + __le64 *values_dma_mem; + dma_addr_t idx_iova, values_iova; +}; + struct dpaa2_mac { struct fsl_mc_device *mc_dev; struct dpmac_link_state state; @@ -28,6 +34,8 @@ struct dpaa2_mac { struct fwnode_handle *fw_node; =20 struct phy *serdes_phy; + + struct dpaa2_mac_stats ethtool_stats; }; =20 static inline bool dpaa2_mac_is_type_phy(struct dpaa2_mac *mac) --=20 2.25.1 From nobody Fri Apr 3 20:56:52 2026 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013008.outbound.protection.outlook.com [40.107.159.8]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 56A1F39B951; Mon, 23 Mar 2026 11:50:54 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.8 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774266657; cv=fail; b=UohI6ujrEZ/KW5I965y7HvS+r9UUvU23iXRC26juwi7n9oqsSSC5nHu5a0tVD0igAy0ZmoF6Vm4rfoMg9cMz9ilWhsR8kwqjpNzrmARuPZN9u7D7EUEYWngJTvIvkVU/b2BqFXUjLIEIy9z1wwrz5ICS7YcCzrla45HqnbTgVg4= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1774266657; c=relaxed/simple; bh=pvp6QbB3ELf0mIMfDx0Bq0CFtUB5yi9WgcRprjFCfxM=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=APvqpBuybd2yaZWi3KPdgGPXwW+8Lch+cNu8ZYYjQvmaDoGs39x5XuqEELSOhLgtEZ7PU2HFFLS/nx49rulay80jqzPeISLV3AXOnpMEn6Nj5bYKCQN7VDSyyfiWp9UYOuikb3m8WkqBoEHuxmr7N48eU7E2QvR4nDFY7sKHeG4= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com; spf=pass smtp.mailfrom=nxp.com; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b=Wmz1qQx6; arc=fail smtp.client-ip=40.107.159.8 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=nxp.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=nxp.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=nxp.com header.i=@nxp.com header.b="Wmz1qQx6" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=l45efW74fOBIzyQq4OQ3aUWYCM6Z2HncoylKcc9zbqAHXlPC8Q+ASCuwjsioYljInjiX074pj7GwL0LxnAHLz5/qTDHtS2L7Ew/ABQ9eiYSDVCEddc26z1/0nEv2zjcRpl8ww0n1hRDGZmWxoNl7Ti9f4Hf83kH1ikgxYFqyW+RJNQhQqgvrr9U3LRDslhEjVxMMdX4TkyxCV/38HLUqftrtDhEU1yMtRu+8U86RsGavqiMqRLSd0lGyfxNHj36a8nQHSNsCcLlBGtK8XEVKfdB66Yb4eRO8Ri27Hlc2cs6y9xnnWVyFnIeAk/15d3rnNqTfWQ8C/LwjSaMMF8ta7A== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector10001; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=/dPGme3Ar7tIWGonVbCdHZIrtCY6l19//dF9AhZj3p8=; b=umAcvVn986wVKRSfmSO8sFnGI1cPVvYJSNqQk4vnT+uMHSHWvEbo1Jbdb3F1Ph/tN4iec0QRPbXZVJin6GAy7jQ9xC8OK97YBwuQ1MTnVHyi4gfclKu3ObQmgvItl3IePcLm+take9Cy2TgvcUI+saPzDzCowuInsQ9wnclUdGPjtJn06UjzFKAdUHIjKzgExw6IEd9dVfIsm7ZarFruZDwidk8w6oNshhhZOo8/YBxvfGDuxN/TZBtaypSgm59bQb1+wxzCOZ8u8lffWFe4dMER3xhYjIWvaJyQPwla8GJZYlVR22QCGJ7MTNWeOm0+A5xzO2QazR7OzjtZ3FZiHA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass header.d=nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=/dPGme3Ar7tIWGonVbCdHZIrtCY6l19//dF9AhZj3p8=; b=Wmz1qQx6Oj5kXT9PZ79DhX5HJLR45GeJS22z1hTTSI0AbevA/o2Ryv/BKo9Lby5+pd75u1/Up2Mk5kh6fKUwbsz9AfrFpc1BOHBZeVL1yM6IDZ48e8c1FIVli+4ZolMGt1WgeyyjEvHVDJ2Pva00xfZmA226ihE/W3dWRWuWUnq8BZPg5P6MfRWGKu58kyAKPhv4D97lTNV2JkzQnXxRa9A5f2d4UTfnZTAIUZPvGn1b8R4Gur/710L1Hc85X23m/wFbKUHGf16GGDx7maP5T9LWraT15lmEYmwRaiTi+YAhTkHGYirf0Gueg9eSvnE9Y7oqfVOtdRU6mQAZx0zsMQ== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from PAXPR04MB8253.eurprd04.prod.outlook.com (2603:10a6:102:1bf::7) by AS5PR04MB9924.eurprd04.prod.outlook.com (2603:10a6:20b:67e::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9723.25; Mon, 23 Mar 2026 11:50:45 +0000 Received: from PAXPR04MB8253.eurprd04.prod.outlook.com ([fe80::2b4e:8130:4419:d633]) by PAXPR04MB8253.eurprd04.prod.outlook.com ([fe80::2b4e:8130:4419:d633%3]) with mapi id 15.20.9723.022; Mon, 23 Mar 2026 11:50:50 +0000 From: Ioana Ciornei To: netdev@vger.kernel.org Cc: Andrew Lunn , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Simon Horman , linux-kernel@vger.kernel.org Subject: [PATCH net-next v5 3/3] net: dpaa2-mac: export standard statistics Date: Mon, 23 Mar 2026 13:50:39 +0200 Message-Id: <20260323115039.3932600-4-ioana.ciornei@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260323115039.3932600-1-ioana.ciornei@nxp.com> References: <20260323115039.3932600-1-ioana.ciornei@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AS4PR10CA0009.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:20b:5dc::12) To PAXPR04MB8253.eurprd04.prod.outlook.com (2603:10a6:102:1bf::7) Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: PAXPR04MB8253:EE_|AS5PR04MB9924:EE_ X-MS-Office365-Filtering-Correlation-Id: 2351bf2b-1105-4388-4a45-08de88d26e0d X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|1800799024|366016|19092799006|376014|18002099003|22082099003|56012099003; X-Microsoft-Antispam-Message-Info: ofkYqgzbA4oRmUu2giZ9HNi4senPfoakTc9JrlXWgp//RLoVPyf397KXOqy8F3IQYXTYv4vyjwmIzzT1ovZjf3ED5EfNJbtoWZ2W14Etx51CbZ4G0iAhyBGm0KJDeC8zDrjL9yei+UploSnSlgKXaQeGbkWzCnFm0qM9kiHmI3G7K0VYjRm80LLmBEJ5msGy+bxAVOcJi7EIRmYL/Eb50LghgWzIxbbHSo+x5JaYcS0ns4CvqYIVP+XFmbG7Kg4ZTcSKymcgzdcMpBtjFJ0wrBvXC7OSiFjWKJ0MMscc6KY0UZdRGzfQxqlRO2Cdoq74RC7TKYEbQ27c8g1Cw7JB3nF2zX8z1snZnckOm1qvP2Fntop7F7zzROMPYope1Mdt90KpjubKBj1fcWKFklrIIhrcNJeSU3abBuARBH16cHtXjvhzz0mbaJhiG8BYomrDf+eKZeo9GrLQIjryL12AJi7+IMwqyaAV2mTXWkmejl4J5Y/RPMxguPleoRlA4o4/NY6mzDGTrKQTlztYzUzef48JEmcBV/9+Fx7AVePDVYrlJ7xpfeBpEexDBYRfw2+2ogCoAAG7hS2HBVMT/FJ/ppOpTEGrlOjrp1CU5A+tbizuotfAks99599Bq/VBam9ferTmQY3DOi0nHecrAn3TmA8HDXHght4EdC2KPBETmlQVYMR9s4Lew7S8xOXs3prdeQfFG6+vR+mUwLbuWuaFKFwY4v8MtdSWY9e9SHvSoHM= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:PAXPR04MB8253.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(19092799006)(376014)(18002099003)(22082099003)(56012099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?EMITXIeIkY6l0h4jjqRcoTT8U2m8a2CWn5vPol4DE3H70K0GBgaL5Lu/iJNf?= =?us-ascii?Q?78RKmyiKqtgweKw+kpicmByZdVXevd3IP+QJ+ezFvxM9/waOfwA1z5KLbWY+?= =?us-ascii?Q?RTVctaW6B3usR1rMGf/3IBLV1QMP0vGCbSqm012HBMtLizUCj/V2Xf9kKnbG?= =?us-ascii?Q?n0WLfn4Tjb77Qi0rKKpnK1V+WYgUAt6RS7H6DfAK3ZzzViOJB7Jf8nCa0Mzg?= =?us-ascii?Q?bj/514t3xqx73ZPQKGKhLTjKubfFVZkZ+RpxgqCq915YKu6WcuKtK8FFeLwG?= =?us-ascii?Q?IoapRhcyybQEUxvHCyuKdb2Ba+Lpg8rZke27Mhj+Jr6K1knsx/qAZFXlS9zw?= =?us-ascii?Q?TEhPHChqz0fdoCxRnEyXX5KcvfosRjjP7FL9SRffYMvBP3adlWtmY///zMuz?= =?us-ascii?Q?RDL216bbbWNUF0OUvibZHKQ+horo8x1xQdxJ3+WK7aaOhjby/sCIl2Baokjy?= =?us-ascii?Q?LybWZonky1KjDqcMadhFcQ1j4LDYBlaItKo6hX+vmsXoYjjGJ+XceANMcXxL?= =?us-ascii?Q?iGZsw7y9sui+Ap1CNYfvNPBAssLcl1SFpktv4SQugmIDskXr6UdIZz8f05eE?= =?us-ascii?Q?8dDA/RZokHLPg98UuMpQrk/DqmWdtjsiY7kssowmVP6Xqc7eR89Mh7lswSnx?= =?us-ascii?Q?FdYaJgKbm/WDXiu2ORBHhpDR8v4xZaQ7sQTQBGkGfE4tDfXsf6JiGKMjp9BB?= =?us-ascii?Q?vFZy0Xi/507V7SIKnyIdI0JAKMwBwGD/dQ3RZYF9QCUhZlVPDS9+CMRXI2lS?= =?us-ascii?Q?RrcjGv38MDRMxU30/wZB+T+MZKI3zHzNkbPmuRmmKmUdnYT81uIFjNb6I/XH?= =?us-ascii?Q?eiz4sPrP5QAmQbv6vWnsjaBQ8rason2qh5/29YchjM3SnBizgXGqEKBxL+ET?= =?us-ascii?Q?3jpJxO1hERsKOmu2oVkHDZs/pXY1JyJLWAqns2iyfdelcJDMvwMGcN7ffLoZ?= =?us-ascii?Q?nyAwWy8yKuM9xTgBAcqMMjF+uWUL5P1KCnFucCAsMnWdwqTwXCn+YrHVMpIx?= =?us-ascii?Q?F+AbQQkU7NcFTZ9MUPYdbs3W+mQ4qdZHbiVWa2oZfaBCDfvA8L8B/WCOl1ja?= =?us-ascii?Q?ZvwwbxaYUzFR7lPLjxbxBfeUy9s/Xvxw2NMV4fkPUGTZ75BrZlvLTM8BJFoR?= =?us-ascii?Q?qf7hlUsT+Eosv6n9Zs26edg8Xlq51b+TnI2c3i6e6Dx2f2hp3fRJBdpeo48E?= =?us-ascii?Q?BhSRtf57IjFobNm9pKKme8a+h/HO13dG54vizbisXMfQ500/Ouu2+ln2EcQu?= =?us-ascii?Q?JlU3FA07YFSLclhOPfxChZWGTJGZN595OMQMnk2pXB6EbHESXpC5wcpE9Je7?= =?us-ascii?Q?wnfqm4fMhyLWl60bgzy9RHJhQ1TLdLA8imIdATRvRfXsZ1Ll7SzWDhmQqLKu?= =?us-ascii?Q?zRqLP26dOlIBSTuloWybNq4wsdwvDyVNmNIfFHdnuWgI0v+mNHChtu+pwO6H?= =?us-ascii?Q?oy4Ko0h76pb2KfV/62/Mxks4UrLpH55XxLh9oHh9FPxSCrMLAFDBLFcHUqXH?= =?us-ascii?Q?kB5YXPnA4SicIDbUSpAz5TWesJCD4gj3dwbjOJ1EL2c2sz9MZipmnAO2ViRL?= =?us-ascii?Q?AOdEs+YGrECE6lny2N1BBKcHZ6ji5M+7aPV7NjL7BkXpIddJzYb9r+WEOQAZ?= =?us-ascii?Q?FWQ6/ocqWTc9bdQYitzBjHMgfEFqbuhaWE6TAV1yrz13W3i2ncqXOx4VSNKm?= =?us-ascii?Q?oe9v4cvIW8kODboGmD6Sww28bMzZxWQgKbnuU5L05ug5HuGvrgCGyf+V/KJB?= =?us-ascii?Q?hImjB4qOSQ=3D=3D?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 2351bf2b-1105-4388-4a45-08de88d26e0d X-MS-Exchange-CrossTenant-AuthSource: PAXPR04MB8253.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Mar 2026 11:50:50.5836 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 686ea1d3-bc2b-4c6f-a92c-d99c5c301635 X-MS-Exchange-CrossTenant-MailboxType: HOSTED X-MS-Exchange-CrossTenant-UserPrincipalName: kmTC8LNt74DciOhaFWSO7JrX/9RNu5eMmHckEe7tY5uTMYbjx2Ojh3PAF7H7eWh8+4p0WlhHqkfhAFsQNsd9OA== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AS5PR04MB9924 Content-Type: text/plain; charset="utf-8" Take advantage of all the newly added MAC counters available through the MC API and export them through the standard statistics structures - rmon, eth-ctrl, eth-mac and pause. A new version based feature is added into dpaa2-mac - DPAA2_MAC_FEATURE_STANDARD_STATS - and based on the two memory zones needed for gathering the MAC counters are setup for each statistics group. The dpmac_counter structure is extended with a new field - size_t offset - which is being used to instruct the dpaa2_mac_transfer_stats() function where exactly to store a counter value inside the standard statistics structure. The newly added support is used both in the dpaa2-eth driver as well as the dpaa2-switch one. Signed-off-by: Ioana Ciornei --- Changes in v5: - use DPMAC_CNT_ING_UNDERSIZED for the rmon etherStatsUndersizePkts counter Changes in v4: - add dma_sync_single_for_device before calling the MC API Changes in v3: - reduce the number of lines that have more than 80 chars Changes in v2: - none .../ethernet/freescale/dpaa2/dpaa2-ethtool.c | 61 ++++- .../net/ethernet/freescale/dpaa2/dpaa2-mac.c | 214 ++++++++++++++++++ .../net/ethernet/freescale/dpaa2/dpaa2-mac.h | 17 ++ .../freescale/dpaa2/dpaa2-switch-ethtool.c | 48 +++- 4 files changed, 338 insertions(+), 2 deletions(-) diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c b/drivers= /net/ethernet/freescale/dpaa2/dpaa2-ethtool.c index baab4f1c908d..59f5c778df38 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-ethtool.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) /* Copyright 2014-2016 Freescale Semiconductor Inc. - * Copyright 2016-2022 NXP + * Copyright 2016-2022, 2024-2026 NXP */ =20 #include @@ -938,6 +938,61 @@ static void dpaa2_eth_get_channels(struct net_device *= net_dev, channels->other_count; } =20 +static void +dpaa2_eth_get_rmon_stats(struct net_device *net_dev, + struct ethtool_rmon_stats *rmon_stats, + const struct ethtool_rmon_hist_range **ranges) +{ + struct dpaa2_eth_priv *priv =3D netdev_priv(net_dev); + + mutex_lock(&priv->mac_lock); + + if (dpaa2_eth_has_mac(priv)) + dpaa2_mac_get_rmon_stats(priv->mac, rmon_stats, ranges); + + mutex_unlock(&priv->mac_lock); +} + +static void dpaa2_eth_get_pause_stats(struct net_device *net_dev, + struct ethtool_pause_stats *pause_stats) +{ + struct dpaa2_eth_priv *priv =3D netdev_priv(net_dev); + + mutex_lock(&priv->mac_lock); + + if (dpaa2_eth_has_mac(priv)) + dpaa2_mac_get_pause_stats(priv->mac, pause_stats); + + mutex_unlock(&priv->mac_lock); +} + +static void dpaa2_eth_get_ctrl_stats(struct net_device *net_dev, + struct ethtool_eth_ctrl_stats *ctrl_stats) +{ + struct dpaa2_eth_priv *priv =3D netdev_priv(net_dev); + + mutex_lock(&priv->mac_lock); + + if (dpaa2_eth_has_mac(priv)) + dpaa2_mac_get_ctrl_stats(priv->mac, ctrl_stats); + + mutex_unlock(&priv->mac_lock); +} + +static void +dpaa2_eth_get_eth_mac_stats(struct net_device *net_dev, + struct ethtool_eth_mac_stats *eth_mac_stats) +{ + struct dpaa2_eth_priv *priv =3D netdev_priv(net_dev); + + mutex_lock(&priv->mac_lock); + + if (dpaa2_eth_has_mac(priv)) + dpaa2_mac_get_eth_mac_stats(priv->mac, eth_mac_stats); + + mutex_unlock(&priv->mac_lock); +} + const struct ethtool_ops dpaa2_ethtool_ops =3D { .supported_coalesce_params =3D ETHTOOL_COALESCE_RX_USECS | ETHTOOL_COALESCE_USE_ADAPTIVE_RX, @@ -962,4 +1017,8 @@ const struct ethtool_ops dpaa2_ethtool_ops =3D { .get_coalesce =3D dpaa2_eth_get_coalesce, .set_coalesce =3D dpaa2_eth_set_coalesce, .get_channels =3D dpaa2_eth_get_channels, + .get_rmon_stats =3D dpaa2_eth_get_rmon_stats, + .get_pause_stats =3D dpaa2_eth_get_pause_stats, + .get_eth_ctrl_stats =3D dpaa2_eth_get_ctrl_stats, + .get_eth_mac_stats =3D dpaa2_eth_get_eth_mac_stats, }; diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c b/drivers/net= /ethernet/freescale/dpaa2/dpaa2-mac.c index 5a7fda6a2012..ad812ebf3139 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.c @@ -18,20 +18,43 @@ #define DPMAC_STATS_BUNDLE_VER_MAJOR 4 #define DPMAC_STATS_BUNDLE_VER_MINOR 10 =20 +#define DPMAC_STANDARD_STATS_VER_MAJOR 4 +#define DPMAC_STANDARD_STATS_VER_MINOR 11 + #define DPAA2_MAC_FEATURE_PROTOCOL_CHANGE BIT(0) #define DPAA2_MAC_FEATURE_STATS_BUNDLE BIT(1) +#define DPAA2_MAC_FEATURE_STANDARD_STATS BIT(2) =20 struct dpmac_counter { enum dpmac_counter_id id; + size_t offset; const char *name; }; =20 +#define DPMAC_COUNTER(counter_id, struct_name, struct_offset) \ + { \ + .id =3D counter_id, \ + .offset =3D offsetof(struct_name, struct_offset), \ + } + #define DPMAC_UNSTRUCTURED_COUNTER(counter_id, counter_name) \ { \ .id =3D counter_id, \ .name =3D counter_name, \ } =20 +#define DPMAC_RMON_COUNTER(counter_id, struct_offset) \ + DPMAC_COUNTER(counter_id, struct ethtool_rmon_stats, struct_offset) + +#define DPMAC_PAUSE_COUNTER(counter_id, struct_offset) \ + DPMAC_COUNTER(counter_id, struct ethtool_pause_stats, struct_offset) + +#define DPMAC_CTRL_COUNTER(counter_id, struct_offset) \ + DPMAC_COUNTER(counter_id, struct ethtool_eth_ctrl_stats, struct_offset) + +#define DPMAC_MAC_COUNTER(counter_id, struct_offset) \ + DPMAC_COUNTER(counter_id, struct ethtool_eth_mac_stats, struct_offset) + static const struct dpmac_counter dpaa2_mac_ethtool_stats[] =3D { DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_ALL_FRAME, "[mac] rx all frames= "), DPMAC_UNSTRUCTURED_COUNTER(DPMAC_CNT_ING_GOOD_FRAME, "[mac] rx frames ok= "), @@ -65,6 +88,60 @@ static const struct dpmac_counter dpaa2_mac_ethtool_stat= s[] =3D { =20 #define DPAA2_MAC_NUM_ETHTOOL_STATS ARRAY_SIZE(dpaa2_mac_ethtool_stats) =20 +static const struct dpmac_counter dpaa2_mac_rmon_stats[] =3D { + DPMAC_RMON_COUNTER(DPMAC_CNT_ING_FRAME_64, hist[0]), + DPMAC_RMON_COUNTER(DPMAC_CNT_ING_FRAME_127, hist[1]), + DPMAC_RMON_COUNTER(DPMAC_CNT_ING_FRAME_255, hist[2]), + DPMAC_RMON_COUNTER(DPMAC_CNT_ING_FRAME_511, hist[3]), + DPMAC_RMON_COUNTER(DPMAC_CNT_ING_FRAME_1023, hist[4]), + DPMAC_RMON_COUNTER(DPMAC_CNT_ING_FRAME_1518, hist[5]), + DPMAC_RMON_COUNTER(DPMAC_CNT_ING_FRAME_1519_MAX, hist[6]), + DPMAC_RMON_COUNTER(DPMAC_CNT_EGR_FRAME_64, hist_tx[0]), + DPMAC_RMON_COUNTER(DPMAC_CNT_EGR_FRAME_127, hist_tx[1]), + DPMAC_RMON_COUNTER(DPMAC_CNT_EGR_FRAME_255, hist_tx[2]), + DPMAC_RMON_COUNTER(DPMAC_CNT_EGR_FRAME_511, hist_tx[3]), + DPMAC_RMON_COUNTER(DPMAC_CNT_EGR_FRAME_1023, hist_tx[4]), + DPMAC_RMON_COUNTER(DPMAC_CNT_EGR_FRAME_1518, hist_tx[5]), + DPMAC_RMON_COUNTER(DPMAC_CNT_EGR_FRAME_1519_MAX, hist_tx[6]), + DPMAC_RMON_COUNTER(DPMAC_CNT_ING_UNDERSIZED, undersize_pkts), + DPMAC_RMON_COUNTER(DPMAC_CNT_ING_OVERSIZED, oversize_pkts), + DPMAC_RMON_COUNTER(DPMAC_CNT_ING_FRAG, fragments), + DPMAC_RMON_COUNTER(DPMAC_CNT_ING_JABBER, jabbers), +}; + +#define DPAA2_MAC_NUM_RMON_STATS ARRAY_SIZE(dpaa2_mac_rmon_stats) + +static const struct dpmac_counter dpaa2_mac_pause_stats[] =3D { + DPMAC_PAUSE_COUNTER(DPMAC_CNT_ING_VALID_PAUSE_FRAME, rx_pause_frames), + DPMAC_PAUSE_COUNTER(DPMAC_CNT_EGR_VALID_PAUSE_FRAME, tx_pause_frames), +}; + +#define DPAA2_MAC_NUM_PAUSE_STATS ARRAY_SIZE(dpaa2_mac_pause_stats) + +static const struct dpmac_counter dpaa2_mac_eth_ctrl_stats[] =3D { + DPMAC_CTRL_COUNTER(DPMAC_CNT_ING_CONTROL_FRAME, MACControlFramesReceived), + DPMAC_CTRL_COUNTER(DPMAC_CNT_EGR_CONTROL_FRAME, MACControlFramesTransmitt= ed), +}; + +#define DPAA2_MAC_NUM_ETH_CTRL_STATS ARRAY_SIZE(dpaa2_mac_eth_ctrl_stats) + +static const struct dpmac_counter dpaa2_mac_eth_mac_stats[] =3D { + DPMAC_MAC_COUNTER(DPMAC_CNT_EGR_GOOD_FRAME, FramesTransmittedOK), + DPMAC_MAC_COUNTER(DPMAC_CNT_ING_GOOD_FRAME, FramesReceivedOK), + DPMAC_MAC_COUNTER(DPMAC_CNT_ING_FCS_ERR, FrameCheckSequenceErrors), + DPMAC_MAC_COUNTER(DPMAC_CNT_ING_ALIGN_ERR, AlignmentErrors), + DPMAC_MAC_COUNTER(DPMAC_CNT_EGR_ALL_BYTE, OctetsTransmittedOK), + DPMAC_MAC_COUNTER(DPMAC_CNT_EGR_ERR_FRAME, FramesLostDueToIntMACXmitError= ), + DPMAC_MAC_COUNTER(DPMAC_CNT_ING_ALL_BYTE, OctetsReceivedOK), + DPMAC_MAC_COUNTER(DPMAC_CNT_ING_FRAME_DISCARD_NOT_TRUNC, FramesLostDueToI= ntMACRcvError), + DPMAC_MAC_COUNTER(DPMAC_CNT_EGR_MCAST_FRAME, MulticastFramesXmittedOK), + DPMAC_MAC_COUNTER(DPMAC_CNT_EGR_BCAST_FRAME, BroadcastFramesXmittedOK), + DPMAC_MAC_COUNTER(DPMAC_CNT_ING_MCAST_FRAME, MulticastFramesReceivedOK), + DPMAC_MAC_COUNTER(DPMAC_CNT_ING_BCAST_FRAME, BroadcastFramesReceivedOK), +}; + +#define DPAA2_MAC_NUM_ETH_MAC_STATS ARRAY_SIZE(dpaa2_mac_eth_mac_stats) + static void dpaa2_mac_setup_stats(struct dpaa2_mac *mac, struct dpaa2_mac_stats *stats, size_t num_stats, @@ -147,6 +224,10 @@ static void dpaa2_mac_detect_features(struct dpaa2_mac= *mac) if (dpaa2_mac_cmp_ver(mac, DPMAC_STATS_BUNDLE_VER_MAJOR, DPMAC_STATS_BUNDLE_VER_MINOR) >=3D 0) mac->features |=3D DPAA2_MAC_FEATURE_STATS_BUNDLE; + + if (dpaa2_mac_cmp_ver(mac, DPMAC_STANDARD_STATS_VER_MAJOR, + DPMAC_STANDARD_STATS_VER_MINOR) >=3D 0) + mac->features |=3D DPAA2_MAC_FEATURE_STANDARD_STATS; } =20 static int phy_mode(enum dpmac_eth_if eth_if, phy_interface_t *if_mode) @@ -624,6 +705,24 @@ int dpaa2_mac_open(struct dpaa2_mac *mac) DPAA2_MAC_NUM_ETHTOOL_STATS, dpaa2_mac_ethtool_stats); =20 + if (mac->features & DPAA2_MAC_FEATURE_STANDARD_STATS) { + dpaa2_mac_setup_stats(mac, &mac->rmon_stats, + DPAA2_MAC_NUM_RMON_STATS, + dpaa2_mac_rmon_stats); + + dpaa2_mac_setup_stats(mac, &mac->pause_stats, + DPAA2_MAC_NUM_PAUSE_STATS, + dpaa2_mac_pause_stats); + + dpaa2_mac_setup_stats(mac, &mac->eth_ctrl_stats, + DPAA2_MAC_NUM_ETH_CTRL_STATS, + dpaa2_mac_eth_ctrl_stats); + + dpaa2_mac_setup_stats(mac, &mac->eth_mac_stats, + DPAA2_MAC_NUM_ETH_MAC_STATS, + dpaa2_mac_eth_mac_stats); + } + return 0; =20 err_close_dpmac: @@ -639,11 +738,126 @@ void dpaa2_mac_close(struct dpaa2_mac *mac) dpaa2_mac_clear_stats(mac, &mac->ethtool_stats, DPAA2_MAC_NUM_ETHTOOL_STATS); =20 + if (mac->features & DPAA2_MAC_FEATURE_STANDARD_STATS) { + dpaa2_mac_clear_stats(mac, &mac->rmon_stats, + DPAA2_MAC_NUM_RMON_STATS); + dpaa2_mac_clear_stats(mac, &mac->pause_stats, + DPAA2_MAC_NUM_PAUSE_STATS); + dpaa2_mac_clear_stats(mac, &mac->eth_ctrl_stats, + DPAA2_MAC_NUM_ETH_CTRL_STATS); + dpaa2_mac_clear_stats(mac, &mac->eth_mac_stats, + DPAA2_MAC_NUM_ETH_MAC_STATS); + } + dpmac_close(mac->mc_io, 0, dpmac_dev->mc_handle); if (mac->fw_node) fwnode_handle_put(mac->fw_node); } =20 +static void dpaa2_mac_transfer_stats(const struct dpmac_counter *counters, + size_t num_counters, void *s, + __le64 *cnt_values) +{ + for (size_t i =3D 0; i < num_counters; i++) { + u64 *p =3D s + counters[i].offset; + + *p =3D le64_to_cpu(cnt_values[i]); + } +} + +static const struct ethtool_rmon_hist_range dpaa2_mac_rmon_ranges[] =3D { + { 64, 64 }, + { 65, 127 }, + { 128, 255 }, + { 256, 511 }, + { 512, 1023 }, + { 1024, 1518 }, + { 1519, DPAA2_ETH_MFL }, + {}, +}; + +static void dpaa2_mac_get_standard_stats(struct dpaa2_mac *mac, + struct dpaa2_mac_stats *stats, + size_t num_cnt, + const struct dpmac_counter *counters, + void *s) +{ + struct device *dev =3D mac->net_dev->dev.parent; + struct fsl_mc_device *dpmac_dev =3D mac->mc_dev; + size_t values_size =3D num_cnt * sizeof(u64); + int err; + + if (!(mac->features & DPAA2_MAC_FEATURE_STANDARD_STATS)) + return; + + if (!stats->idx_dma_mem || !stats->values_dma_mem) + return; + + dma_sync_single_for_device(dev, stats->values_iova, values_size, + DMA_FROM_DEVICE); + + err =3D dpmac_get_statistics(mac->mc_io, 0, dpmac_dev->mc_handle, + stats->idx_iova, stats->values_iova, + num_cnt); + if (err) { + netdev_err(mac->net_dev, "%s: dpmac_get_statistics() =3D %d\n", + __func__, err); + return; + } + + dma_sync_single_for_cpu(dev, stats->values_iova, values_size, + DMA_FROM_DEVICE); + + dpaa2_mac_transfer_stats(counters, num_cnt, s, stats->values_dma_mem); +} + +void dpaa2_mac_get_rmon_stats(struct dpaa2_mac *mac, + struct ethtool_rmon_stats *s, + const struct ethtool_rmon_hist_range **ranges) +{ + if (s->src !=3D ETHTOOL_MAC_STATS_SRC_AGGREGATE) + return; + + dpaa2_mac_get_standard_stats(mac, &mac->rmon_stats, + DPAA2_MAC_NUM_RMON_STATS, + dpaa2_mac_rmon_stats, s); + + *ranges =3D dpaa2_mac_rmon_ranges; +} + +void dpaa2_mac_get_pause_stats(struct dpaa2_mac *mac, + struct ethtool_pause_stats *s) +{ + if (s->src !=3D ETHTOOL_MAC_STATS_SRC_AGGREGATE) + return; + + dpaa2_mac_get_standard_stats(mac, &mac->pause_stats, + DPAA2_MAC_NUM_PAUSE_STATS, + dpaa2_mac_pause_stats, s); +} + +void dpaa2_mac_get_ctrl_stats(struct dpaa2_mac *mac, + struct ethtool_eth_ctrl_stats *s) +{ + if (s->src !=3D ETHTOOL_MAC_STATS_SRC_AGGREGATE) + return; + + dpaa2_mac_get_standard_stats(mac, &mac->eth_ctrl_stats, + DPAA2_MAC_NUM_ETH_CTRL_STATS, + dpaa2_mac_eth_ctrl_stats, s); +} + +void dpaa2_mac_get_eth_mac_stats(struct dpaa2_mac *mac, + struct ethtool_eth_mac_stats *s) +{ + if (s->src !=3D ETHTOOL_MAC_STATS_SRC_AGGREGATE) + return; + + dpaa2_mac_get_standard_stats(mac, &mac->eth_mac_stats, + DPAA2_MAC_NUM_ETH_MAC_STATS, + dpaa2_mac_eth_mac_stats, s); +} + int dpaa2_mac_get_sset_count(void) { return DPAA2_MAC_NUM_ETHTOOL_STATS; diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.h b/drivers/net= /ethernet/freescale/dpaa2/dpaa2-mac.h index 6f4981627961..98c725f609e9 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.h +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-mac.h @@ -36,6 +36,10 @@ struct dpaa2_mac { struct phy *serdes_phy; =20 struct dpaa2_mac_stats ethtool_stats; + struct dpaa2_mac_stats rmon_stats; + struct dpaa2_mac_stats pause_stats; + struct dpaa2_mac_stats eth_ctrl_stats; + struct dpaa2_mac_stats eth_mac_stats; }; =20 static inline bool dpaa2_mac_is_type_phy(struct dpaa2_mac *mac) @@ -61,6 +65,19 @@ void dpaa2_mac_get_strings(u8 **data); =20 void dpaa2_mac_get_ethtool_stats(struct dpaa2_mac *mac, u64 *data); =20 +void dpaa2_mac_get_rmon_stats(struct dpaa2_mac *mac, + struct ethtool_rmon_stats *s, + const struct ethtool_rmon_hist_range **ranges); + +void dpaa2_mac_get_pause_stats(struct dpaa2_mac *mac, + struct ethtool_pause_stats *s); + +void dpaa2_mac_get_ctrl_stats(struct dpaa2_mac *mac, + struct ethtool_eth_ctrl_stats *s); + +void dpaa2_mac_get_eth_mac_stats(struct dpaa2_mac *mac, + struct ethtool_eth_mac_stats *s); + void dpaa2_mac_start(struct dpaa2_mac *mac); =20 void dpaa2_mac_stop(struct dpaa2_mac *mac); diff --git a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-ethtool.c b/= drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-ethtool.c index a888f6e6e9b0..f5d9321c7ef9 100644 --- a/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-ethtool.c +++ b/drivers/net/ethernet/freescale/dpaa2/dpaa2-switch-ethtool.c @@ -3,7 +3,7 @@ * DPAA2 Ethernet Switch ethtool support * * Copyright 2014-2016 Freescale Semiconductor Inc. - * Copyright 2017-2018 NXP + * Copyright 2017-2018, 2024-2026 NXP * */ =20 @@ -210,6 +210,49 @@ static void dpaa2_switch_ethtool_get_stats(struct net_= device *netdev, mutex_unlock(&port_priv->mac_lock); } =20 +static void +dpaa2_switch_get_rmon_stats(struct net_device *netdev, + struct ethtool_rmon_stats *rmon_stats, + const struct ethtool_rmon_hist_range **ranges) +{ + struct ethsw_port_priv *port_priv =3D netdev_priv(netdev); + + mutex_lock(&port_priv->mac_lock); + + if (dpaa2_switch_port_has_mac(port_priv)) + dpaa2_mac_get_rmon_stats(port_priv->mac, rmon_stats, ranges); + + mutex_unlock(&port_priv->mac_lock); +} + +static void +dpaa2_switch_get_ctrl_stats(struct net_device *net_dev, + struct ethtool_eth_ctrl_stats *ctrl_stats) +{ + struct ethsw_port_priv *port_priv =3D netdev_priv(net_dev); + + mutex_lock(&port_priv->mac_lock); + + if (dpaa2_switch_port_has_mac(port_priv)) + dpaa2_mac_get_ctrl_stats(port_priv->mac, ctrl_stats); + + mutex_unlock(&port_priv->mac_lock); +} + +static void +dpaa2_switch_get_eth_mac_stats(struct net_device *net_dev, + struct ethtool_eth_mac_stats *eth_mac_stats) +{ + struct ethsw_port_priv *port_priv =3D netdev_priv(net_dev); + + mutex_lock(&port_priv->mac_lock); + + if (dpaa2_switch_port_has_mac(port_priv)) + dpaa2_mac_get_eth_mac_stats(port_priv->mac, eth_mac_stats); + + mutex_unlock(&port_priv->mac_lock); +} + const struct ethtool_ops dpaa2_switch_port_ethtool_ops =3D { .get_drvinfo =3D dpaa2_switch_get_drvinfo, .get_link =3D ethtool_op_get_link, @@ -218,4 +261,7 @@ const struct ethtool_ops dpaa2_switch_port_ethtool_ops = =3D { .get_strings =3D dpaa2_switch_ethtool_get_strings, .get_ethtool_stats =3D dpaa2_switch_ethtool_get_stats, .get_sset_count =3D dpaa2_switch_ethtool_get_sset_count, + .get_rmon_stats =3D dpaa2_switch_get_rmon_stats, + .get_eth_ctrl_stats =3D dpaa2_switch_get_ctrl_stats, + .get_eth_mac_stats =3D dpaa2_switch_get_eth_mac_stats, }; --=20 2.25.1