From nobody Sun Feb 8 13:39:49 2026 Received: from SN4PR2101CU001.outbound.protection.outlook.com (mail-southcentralusazon11012046.outbound.protection.outlook.com [40.93.195.46]) (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 83DF5279DB3; Thu, 5 Feb 2026 18:47:58 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.195.46 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770317279; cv=fail; b=iGJiEUr14jLMQu7XHppjx8B5dIxU/FBm359sXL/cCsU8JnI+ZbOjNtr9YY0/AS4io1lGykVi5dvie300ko8D/si7epkR/4Ff8+KFkMMeD+TK4UJrmWaoIMCYUcINO1uopJrvO+QV2sUXqoEZLH8EqN8lAc05u3uJ2JjGAlbnMuU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770317279; c=relaxed/simple; bh=7/MY/SpolqCbr3p3hiQ0xed1D7J/T3vooM49DUh4Iu0=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=aVfhDhK/ioF+CPOPFi9wtxohv2MPhuS2cQ+fbxFyp0gaU45JZMDAzT7c8Jp3qN/Qd8JPZIdLG7DKox7mg3nRLsJuSNFJste6IIKkfBOtzN4tIwUpyf+s/8IaJ+lgjsQ5hv+lSj9sDARRyR+WZyzZXPVIh984djUnAvDeu1GdqUo= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=CxNA6Jpb; arc=fail smtp.client-ip=40.93.195.46 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="CxNA6Jpb" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=rRjMBKD1v+fLRTpyNygKCF4gp8HsEM+8T0/42qHJut0uF0X8szY7aGFARGpemJuMTt8MpDSF7MJ8nLKXgws+MvGXlLgZswvlOKbkWzGdg/yimHoa40m3O2YSS4hPVo6gBrZvyWyiQNK7TvmahxzhtL0LYbuKXWQUrx1slCnlihuFvnE0sfLFJTlVUsJCUvvsyVPkXgcKHeKknXPgpw/U3zUjW2tk8WJyokGrj+s/Chfm3m7Cg9xWPq66O+Gg0hddeW6bMtsAGOT1TwtlxqvsBQk3+h/dNyRL3yALrsJjSiRd/0rGjdp7cxEaH38juoG2zHWVxEHX2sqBWtcRzqufSw== 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=IWGUeFxoys/infEXqHSzOTQJqRP0iqfGwc6aXdKIYVY=; b=v2lp8fPfmi6bKbOO/bcSTMcr6dR8mUMZKC5ODHswKGk1pT0dFUmfhQLO+DAZR8xIpVqKOJQYJc6HGFB7COzdvCFUHXT04lQcCfnHjud2A+z5VC9HiBFpXgG/aIBgSBIhfw74VfjgDmypuGntWzAk7H9wkLWa6fw69T11rCttmjymeapJXsdyRMhsVG5dr88wuYOWI/MfCZ5jA8KaNz1mOoA8fyXENkT0pSasVx3SJlAdSHTJDXywkE/WSjJ3ot7yI/pFnmIZVLNnJ2fvyyZz99hawuao0GbRpckqq7ITVRm2/4hIsYV2YLVIKj8SpzHQsKI+Kpf5HmFqbgSHbdJ3EQ== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.23.195) smtp.rcpttodomain=linux.dev smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=IWGUeFxoys/infEXqHSzOTQJqRP0iqfGwc6aXdKIYVY=; b=CxNA6Jpb10M7UnBEQD2CqcNqOW4+AtuPE1TWynabNArbJcW79AvXQnPVd3qenZ73LgDXEtDI+9Hcw2Zt9wc4Tk7p61KDvB14CWXCIVmpAa847YYvZcCjpnmMsN59TdYFDKfeMktlHWEVkapZwDYi7aJkEm71gJmWAG0VoVbP4Rk= Received: from SJ0PR03CA0108.namprd03.prod.outlook.com (2603:10b6:a03:333::23) by LV8PR10MB7942.namprd10.prod.outlook.com (2603:10b6:408:209::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.11; Thu, 5 Feb 2026 18:47:55 +0000 Received: from CO1PEPF00012E60.namprd05.prod.outlook.com (2603:10b6:a03:333:cafe::1d) by SJ0PR03CA0108.outlook.office365.com (2603:10b6:a03:333::23) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9587.13 via Frontend Transport; Thu, 5 Feb 2026 18:47:52 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.23.195) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.23.195 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.23.195; helo=lewvzet201.ext.ti.com; pr=C Received: from lewvzet201.ext.ti.com (198.47.23.195) by CO1PEPF00012E60.mail.protection.outlook.com (10.167.249.69) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9587.10 via Frontend Transport; Thu, 5 Feb 2026 18:47:55 +0000 Received: from DLEE202.ent.ti.com (157.170.170.77) by lewvzet201.ext.ti.com (10.4.14.104) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 5 Feb 2026 12:47:54 -0600 Received: from DLEE215.ent.ti.com (157.170.170.118) by DLEE202.ent.ti.com (157.170.170.77) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 5 Feb 2026 12:47:54 -0600 Received: from lelvem-mr06.itg.ti.com (10.180.75.8) by DLEE215.ent.ti.com (157.170.170.118) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20 via Frontend Transport; Thu, 5 Feb 2026 12:47:54 -0600 Received: from fllv0122.itg.ti.com (fllv0122.itg.ti.com [10.247.120.72]) by lelvem-mr06.itg.ti.com (8.18.1/8.18.1) with ESMTP id 615IlsIt3483079; Thu, 5 Feb 2026 12:47:54 -0600 Received: from localhost (meghana-pc.dhcp.ti.com [10.24.69.13] (may be forged)) by fllv0122.itg.ti.com (8.14.7/8.14.7) with ESMTP id 615IlrBg028681; Thu, 5 Feb 2026 12:47:53 -0600 From: Meghana Malladi To: , , , , , , , , , , , , , , CC: , , , , Vignesh Raghavendra Subject: [PATCH net-next v3 1/2] net: ti: icssg-prueth: Add Frame Preemption MAC Merge support Date: Fri, 6 Feb 2026 00:17:46 +0530 Message-ID: <20260205184747.2451816-2-m-malladi@ti.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260205184747.2451816-1-m-malladi@ti.com> References: <20260205184747.2451816-1-m-malladi@ti.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1PEPF00012E60:EE_|LV8PR10MB7942:EE_ X-MS-Office365-Filtering-Correlation-Id: 3558db5d-47d9-43c4-a62f-08de64e7131d X-LD-Processed: e5b49634-450b-4709-8abb-1e2b19b982b7,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|36860700013|82310400026|1800799024|7416014|376014|7053199007|13003099007|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?TbMMaGpOqu+bxNcwnUYJYJ+rWfxSMpndqgHzSDlBGUHt4TOOFpmr+Ge2dqVg?= =?us-ascii?Q?oMjeRInlUE+QZnI3RDhSzqkHBu/kJ2PYQrMy1NWepC/kzhN1+9hQ4yLVZqCt?= =?us-ascii?Q?FF/j+x+xOZIqG7pI9/+a1fJz9b19BrMoSA4IxE4wLUXPQ5ROFyGhdeujP2XY?= =?us-ascii?Q?FB51YueGQnz/gAqlkg24yDjlbSEqvMP2zVspXtsjTZxMbtWQSOV3jIsG5F+u?= =?us-ascii?Q?X6HmoJwK424DfR6TCGir9tV8iKQ0etfovQqRG4lkcSQPiFpgyQYVUf7ulDlv?= =?us-ascii?Q?7SLzwPTznyu1ASkWjid1nylmOikeR7acQb/qhhlVmJAkXEZ6NfsEhjmqUk53?= =?us-ascii?Q?NEb0eeXoIXwtHzsULEO1lhRVK6cj3gdZHNyPloms5b7c4rDAAdT5/xlKswnC?= =?us-ascii?Q?xZLjBRGc+SacMF8N4Sv1Xkt8SA6WDDndJulDhdxJdmcyklgDvvxznMeYziS1?= =?us-ascii?Q?G/vjt5Wk/+HXsjG7a0Hmco5pIsw/J/iVcKH+d2xiMYmTlfrZ+cYZ9pAuZ9SG?= =?us-ascii?Q?XRy/nT787lsqvDIOMhaWv1BjI0B9r6UenhrDgXyV6V/Oo3ohcG51rQ4J8uWx?= =?us-ascii?Q?Tf4fLgeK3X76h+8PC6aIJZ5GKmpc1fIAhuUQJKG+Y/M/lepn/UXOGGJaiLp9?= =?us-ascii?Q?iAXH0obcDQv+fUW1goVeUITF3T1n5melzokewnAbYCc5ev+2x4SYVEJ4dVVJ?= =?us-ascii?Q?T6My8EBAlcJE5dNefPgJaqzSMWvMyTDmwNy2HzU0HcMXk3eUArhP2N9ioMOE?= =?us-ascii?Q?ODSQlr6pmQvXC3GDOhq7r0k7uRn6J8P5sIN3UafBIp+N+5BO6oJj297bSPfC?= =?us-ascii?Q?lMS3M88A5c2U45Tv3ji32laf9+MyJMEPuLXRFIsCplMQan1T/oqwl96llnct?= =?us-ascii?Q?h46EaGs/FrdQkhgGJWghyjA8rf/SAMWgvnIjY6cBS9XP9cC1BeD1oqhLcJ/V?= =?us-ascii?Q?MHDebjn6yvUDGdpDsvc2w4gvPDlGTuYAZXev40rvdqQOlNzcDajXUPp0CHd0?= =?us-ascii?Q?b+bCEblEyuc5mEHi+uaypKy5ZXIxli+ykL7jvALOA/8LXCa18Nfqt4CnMXxr?= =?us-ascii?Q?Bd9+spfQdycMrJACFi6sIcdaAeJpbwhZQrD68WjIuDzPCdW+Gu9GriRadiZi?= =?us-ascii?Q?5vyMgd7b7ePOeI/T1KxLEF3haC782UtOHIfNE5blUC3I8+LML4mQ1U4F9vdL?= =?us-ascii?Q?zsNGL/X2gz4p/V0bVH4vWTlBWcw8P9pT03A7RAZjakRhIw6iMMElRLMhpOD6?= =?us-ascii?Q?l/UwsLyxQf3EhcKu4Mspb19NmrWNRAAiDWDJb2X0entER7fgcxlPWJa21ti3?= =?us-ascii?Q?wbNQBDGXheJx0cVvPcU5tTF8Q5g4FvLvPoYdlEUFRurFnEoy1D6SISM49opN?= =?us-ascii?Q?FBCLJST7fXtP8rU8cis4FZ2eUQcGTC3rkvrdOIpHe/XgQOdTemQVZX3PR3Z8?= =?us-ascii?Q?31tgFsEmQplW0cAuTjFRgXcidip22dka+bsq0bHBhtTxA769LqCmUOLgwqfF?= =?us-ascii?Q?aFHwcClVCR/eDtcJAkelerCoBMGmlrBcTFF4lQZSvUBvAB63Sp09LEAy8lBS?= =?us-ascii?Q?0J9tbh3PtMcwCSspkaTxJpXqUycXI8ztACPk8Q8AuWvu+4sObr9kKoQI2iGB?= =?us-ascii?Q?ogQGqbd0IkVva+ePij9YoCY=3D?= X-Forefront-Antispam-Report: CIP:198.47.23.195;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:lewvzet201.ext.ti.com;PTR:InfoDomainNonexistent;CAT:NONE;SFS:(13230040)(36860700013)(82310400026)(1800799024)(7416014)(376014)(7053199007)(13003099007)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: b8Thbe9ixn+7aQ0vF1zRk34Ulh3Xg8zf4kB74lx8YhnrpAy2/lFHsVTYzcFQUTn3j3cYNPK4Gd631Quie7Jw1QdHz8DCBTy1Q2hUwWhuf0u48SiZVrGW4rNHPDZBjBR7E/UG+4dd3er8RrOgbF96sXeuJvYSLjV20jsqapKfGLw46D3j9peVM2quq4YWIABZTuIlZD0iDQh6ypRlcXQ+dBAfVYA40Dvk9GNlgCnAPin7o1tP4K6WRreqtmX/LWiiM9UmdZI1Q8CZhhlJBn1zVDPOk0q+K4Gp7ul5r2Q92SVwfqOp8THToKE0G+7iSkxzCdEHnUYAQ6dMZK9X/gvIgHkqszis0GdMuD4VePsGGCQb0HDJ4yXSQtVjMYBItB0FfBir+oJplQ5LgkGMa2JwgWFntfwDDXKzI4r2flvv25igmN2dgV96jHQ/kZn5Alcp X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Feb 2026 18:47:55.2409 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 3558db5d-47d9-43c4-a62f-08de64e7131d X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7;Ip=[198.47.23.195];Helo=[lewvzet201.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: CO1PEPF00012E60.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: LV8PR10MB7942 Content-Type: text/plain; charset="utf-8" From: MD Danish Anwar This patch introduces qos support for the icssg driver. This includes adding support to configure mqprio qdisc and IET FPE. By default all the queues are marked as express which can be overwritten by the mqprio tc mask passed by tc qdisc. icssg_config_ietfpe() work thread takes care of configuring IET FPE in the firmware and triggering the verify state machine based on the MAC Merge sublayer parameters set by the ethtool. The firmware handles the cleanup after successful mac verification. And in case the remote peer fails to respond to verify command before the timeout (5secs), then FPE is disabled by firmware. During link up/down, verify state machine gets triggered again based on the state of fpe_enabled and fpe_active. Signed-off-by: MD Danish Anwar Signed-off-by: Meghana Malladi --- v3-v1: - Move icssg_qos_link_up/down() to if-statement right above as suggested by Vadim Fedorenko - Fix p_mqprio dereference without initialization as flagged by Simon Horma= n - Following changes as suggested by Vladimir Oltean : * Provide more detailed commit message * Fix the ordering of the functions to avoid forward declarations * Fix the bug w.r.t scheduling work: fpe_config_task without initialising it * Fix the logic for icssg_iet_set_preempt_mask() - configure the queues bas= ed on user requests only. * Remove prueth_mqprio_validate() as this duplicates what "caps->validate_q= ueue_counts =3D true" does. * Remove clearing PRE_EMPTION_ENABLE_TX on failure which is irrelevant - AC= TIVE status never transitions to true. * Fix handling of these flags: iet->configured<->iet->fpe_enabled and iet->= fpe_enabled<->iet->fpe_active * Schedule asynchronous work without waiting for any timeout * Remove cancel_fpe_config argument from prueth_qos_iet structure - no read= er * Remove mentioning "priv flags" in the comments for prueth_qos_iet struct drivers/net/ethernet/ti/Makefile | 2 +- drivers/net/ethernet/ti/icssg/icssg_config.h | 9 - drivers/net/ethernet/ti/icssg/icssg_prueth.c | 5 + drivers/net/ethernet/ti/icssg/icssg_prueth.h | 2 + drivers/net/ethernet/ti/icssg/icssg_qos.c | 216 +++++++++++++++++++ drivers/net/ethernet/ti/icssg/icssg_qos.h | 58 +++++ 6 files changed, 282 insertions(+), 10 deletions(-) create mode 100644 drivers/net/ethernet/ti/icssg/icssg_qos.c create mode 100644 drivers/net/ethernet/ti/icssg/icssg_qos.h diff --git a/drivers/net/ethernet/ti/Makefile b/drivers/net/ethernet/ti/Mak= efile index 6da50f4b7c2e..6893baf47d46 100644 --- a/drivers/net/ethernet/ti/Makefile +++ b/drivers/net/ethernet/ti/Makefile @@ -35,7 +35,7 @@ ti-am65-cpsw-nuss-$(CONFIG_TI_K3_AM65_CPSW_SWITCHDEV) += =3D am65-cpsw-switchdev.o obj-$(CONFIG_TI_K3_AM65_CPTS) +=3D am65-cpts.o =20 obj-$(CONFIG_TI_ICSSG_PRUETH) +=3D icssg-prueth.o icssg.o -icssg-prueth-y :=3D icssg/icssg_prueth.o icssg/icssg_switchdev.o +icssg-prueth-y :=3D icssg/icssg_prueth.o icssg/icssg_switchdev.o icssg/ics= sg_qos.o =20 obj-$(CONFIG_TI_ICSSG_PRUETH_SR1) +=3D icssg-prueth-sr1.o icssg.o icssg-prueth-sr1-y :=3D icssg/icssg_prueth_sr1.o diff --git a/drivers/net/ethernet/ti/icssg/icssg_config.h b/drivers/net/eth= ernet/ti/icssg/icssg_config.h index 60d69744ffae..1ac202f855ed 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_config.h +++ b/drivers/net/ethernet/ti/icssg/icssg_config.h @@ -323,13 +323,4 @@ struct prueth_fdb_slot { u8 fid; u8 fid_c2; } __packed; - -enum icssg_ietfpe_verify_states { - ICSSG_IETFPE_STATE_UNKNOWN =3D 0, - ICSSG_IETFPE_STATE_INITIAL, - ICSSG_IETFPE_STATE_VERIFYING, - ICSSG_IETFPE_STATE_SUCCEEDED, - ICSSG_IETFPE_STATE_FAILED, - ICSSG_IETFPE_STATE_DISABLED -}; #endif /* __NET_TI_ICSSG_CONFIG_H */ diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.c b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.c index f65041662173..1e4bc5fd636e 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.c +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.c @@ -374,9 +374,11 @@ static void emac_adjust_link(struct net_device *ndev) spin_unlock_irqrestore(&emac->lock, flags); icssg_config_set_speed(emac); icssg_set_port_state(emac, ICSSG_EMAC_PORT_FORWARD); + icssg_qos_link_up(ndev); =20 } else { icssg_set_port_state(emac, ICSSG_EMAC_PORT_DISABLE); + icssg_qos_link_down(ndev); } } =20 @@ -967,6 +969,8 @@ static int emac_ndo_open(struct net_device *ndev) if (ret) goto destroy_rxq; =20 + icssg_qos_init(ndev); + /* start PHY */ phy_start(ndev->phydev); =20 @@ -1421,6 +1425,7 @@ static const struct net_device_ops emac_netdev_ops = =3D { .ndo_hwtstamp_get =3D icssg_ndo_get_ts_config, .ndo_hwtstamp_set =3D icssg_ndo_set_ts_config, .ndo_xsk_wakeup =3D prueth_xsk_wakeup, + .ndo_setup_tc =3D icssg_qos_ndo_setup_tc, }; =20 static int prueth_netdev_init(struct prueth *prueth, diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.h b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.h index 10eadd356650..7a586038adf8 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.h +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.h @@ -44,6 +44,7 @@ #include "icssg_config.h" #include "icss_iep.h" #include "icssg_switch_map.h" +#include "icssg_qos.h" =20 #define PRUETH_MAX_MTU (2000 - ETH_HLEN - ETH_FCS_LEN) #define PRUETH_MIN_PKT_SIZE (VLAN_ETH_ZLEN) @@ -255,6 +256,7 @@ struct prueth_emac { struct bpf_prog *xdp_prog; struct xdp_attachment_info xdpi; int xsk_qid; + struct prueth_qos qos; }; =20 /* The buf includes headroom compatible with both skb and xdpf */ diff --git a/drivers/net/ethernet/ti/icssg/icssg_qos.c b/drivers/net/ethern= et/ti/icssg/icssg_qos.c new file mode 100644 index 000000000000..8d17b28357f8 --- /dev/null +++ b/drivers/net/ethernet/ti/icssg/icssg_qos.c @@ -0,0 +1,216 @@ +// SPDX-License-Identifier: GPL-2.0 +/* Texas Instruments ICSSG PRUETH QoS submodule + * Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#include "icssg_prueth.h" +#include "icssg_switch_map.h" + +static void icssg_iet_set_preempt_mask(struct prueth_emac *emac, u8 preemp= tible_tcs) +{ + void __iomem *config =3D emac->dram.va + ICSSG_CONFIG_OFFSET; + struct prueth_qos_mqprio *p_mqprio =3D &emac->qos.mqprio; + struct tc_mqprio_qopt *qopt =3D &p_mqprio->mqprio.qopt; + int prempt_mask =3D 0, i; + u8 tc; + + /* Configure the queues based on the preemptible tc map set by the user */ + for (tc =3D 0; tc < p_mqprio->mqprio.qopt.num_tc; tc++) { + /* check if the tc is preemptive or not */ + if (preemptible_tcs & BIT(tc)) { + for (i =3D qopt->offset[tc]; i < qopt->offset[tc] + qopt->count[tc]; i+= +) { + /* Set all the queues in this tc as preemptive queues */ + writeb(BIT(4), config + EXPRESS_PRE_EMPTIVE_Q_MAP + i); + prempt_mask &=3D ~BIT(i); + } + } else { + /* Set all the queues in this tc as express queues */ + for (i =3D qopt->offset[tc]; i < qopt->offset[tc] + qopt->count[tc]; i+= +) { + writeb(0, config + EXPRESS_PRE_EMPTIVE_Q_MAP + i); + prempt_mask |=3D BIT(i); + } + } + writeb(prempt_mask, config + EXPRESS_PRE_EMPTIVE_Q_MASK); + netdev_set_tc_queue(emac->ndev, tc, qopt->count[tc], qopt->offset[tc]); + } +} + +static void icssg_config_ietfpe(struct work_struct *work) +{ + struct prueth_qos_iet *iet =3D + container_of(work, struct prueth_qos_iet, fpe_config_task); + void __iomem *config =3D iet->emac->dram.va + ICSSG_CONFIG_OFFSET; + struct prueth_qos_mqprio *p_mqprio =3D &iet->emac->qos.mqprio; + bool enable =3D !!atomic_read(&iet->enable_fpe_config); + int ret; + u8 val; + + if (!netif_running(iet->emac->ndev)) + return; + + /* Update FPE Tx enable bit (PRE_EMPTION_ACTIVE_TX) if + * fpe_enabled is set to enable MM in Tx direction + */ + writeb(enable ? 1 : 0, config + PRE_EMPTION_ENABLE_TX); + + /* If FPE is to be enabled, first configure MAC Verify state + * machine in firmware as firmware kicks the Verify process + * as soon as ICSSG_EMAC_PORT_PREMPT_TX_ENABLE command is + * received. + */ + if (enable && iet->mac_verify_configure) { + writeb(1, config + PRE_EMPTION_ENABLE_VERIFY); + writew(iet->tx_min_frag_size, config + PRE_EMPTION_ADD_FRAG_SIZE_LOCAL); + writel(iet->verify_time_ms, config + PRE_EMPTION_VERIFY_TIME); + } + + /* Send command to enable FPE Tx side. Rx is always enabled */ + ret =3D icssg_set_port_state(iet->emac, + enable ? ICSSG_EMAC_PORT_PREMPT_TX_ENABLE : + ICSSG_EMAC_PORT_PREMPT_TX_DISABLE); + if (ret) { + netdev_err(iet->emac->ndev, "TX preempt %s command failed\n", + str_enable_disable(enable)); + writeb(0, config + PRE_EMPTION_ENABLE_VERIFY); + iet->verify_status =3D ICSSG_IETFPE_STATE_DISABLED; + return; + } + + if (enable && iet->mac_verify_configure) { + ret =3D readb_poll_timeout(config + PRE_EMPTION_VERIFY_STATUS, iet->veri= fy_status, + (iet->verify_status =3D=3D ICSSG_IETFPE_STATE_SUCCEEDED), + USEC_PER_MSEC, 5 * USEC_PER_SEC); + if (ret) { + iet->verify_status =3D ICSSG_IETFPE_STATE_FAILED; + netdev_err(iet->emac->ndev, + "timeout for MAC Verify: status %x\n", + iet->verify_status); + return; + } + } else if (enable) { + /* Give f/w some time to update PRE_EMPTION_ACTIVE_TX state */ + usleep_range(100, 200); + } + + if (enable) { + val =3D readb(config + PRE_EMPTION_ACTIVE_TX); + if (val !=3D 1) { + netdev_err(iet->emac->ndev, + "F/w fails to activate IET/FPE\n"); + return; + } + iet->fpe_active =3D true; + } else { + iet->fpe_active =3D false; + } + + netdev_info(iet->emac->ndev, "IET FPE %s successfully\n", + str_enable_disable(iet->fpe_active)); + icssg_iet_set_preempt_mask(iet->emac, p_mqprio->preemptible_tcs); +} + +void icssg_qos_init(struct net_device *ndev) +{ + struct prueth_emac *emac =3D netdev_priv(ndev); + struct prueth_qos_iet *iet =3D &emac->qos.iet; + + /* Init work queue for IET MAC verify process */ + iet->emac =3D emac; + INIT_WORK(&iet->fpe_config_task, icssg_config_ietfpe); +} + +static int emac_tc_query_caps(struct net_device *ndev, void *type_data) +{ + struct tc_query_caps_base *base =3D type_data; + + switch (base->type) { + case TC_SETUP_QDISC_MQPRIO: { + struct tc_mqprio_caps *caps =3D base->caps; + + caps->validate_queue_counts =3D true; + return 0; + } + default: + return -EOPNOTSUPP; + } +} + +static int emac_tc_setup_mqprio(struct net_device *ndev, void *type_data) +{ + struct tc_mqprio_qopt_offload *mqprio =3D type_data; + struct prueth_emac *emac =3D netdev_priv(ndev); + struct tc_mqprio_qopt *qopt =3D &mqprio->qopt; + struct prueth_qos_mqprio *p_mqprio; + u8 num_tc =3D mqprio->qopt.num_tc; + int tc, offset, count; + + p_mqprio =3D &emac->qos.mqprio; + + if (!num_tc) { + netdev_reset_tc(ndev); + p_mqprio->preemptible_tcs =3D 0; + goto reset_tcs; + } + + memcpy(&p_mqprio->mqprio, mqprio, sizeof(*mqprio)); + p_mqprio->preemptible_tcs =3D mqprio->preemptible_tcs; + netdev_set_num_tc(ndev, mqprio->qopt.num_tc); + + for (tc =3D 0; tc < num_tc; tc++) { + count =3D qopt->count[tc]; + offset =3D qopt->offset[tc]; + netdev_set_tc_queue(ndev, tc, count, offset); + } + +reset_tcs: + icssg_iet_set_preempt_mask(emac, p_mqprio->preemptible_tcs); + + return 0; +} + +int icssg_qos_ndo_setup_tc(struct net_device *ndev, enum tc_setup_type typ= e, + void *type_data) +{ + switch (type) { + case TC_QUERY_CAPS: + return emac_tc_query_caps(ndev, type_data); + case TC_SETUP_QDISC_MQPRIO: + return emac_tc_setup_mqprio(ndev, type_data); + default: + return -EOPNOTSUPP; + } +} +EXPORT_SYMBOL_GPL(icssg_qos_ndo_setup_tc); + +void icssg_qos_link_up(struct net_device *ndev) +{ + struct prueth_emac *emac =3D netdev_priv(ndev); + struct prueth_qos_iet *iet =3D &emac->qos.iet; + + /* Enable FPE if not active but fpe_enabled is true + * and disable FPE if active but fpe_enabled is false + */ + if (!iet->fpe_active && iet->fpe_enabled) { + /* Schedule IET FPE IET FPE enable */ + atomic_set(&iet->enable_fpe_config, 1); + } else if (iet->fpe_active && !iet->fpe_enabled) { + /* Schedule IET FPE IET FPE disable */ + atomic_set(&iet->enable_fpe_config, 0); + } else { + return; + } + schedule_work(&iet->fpe_config_task); +} + +void icssg_qos_link_down(struct net_device *ndev) +{ + struct prueth_emac *emac =3D netdev_priv(ndev); + struct prueth_qos_iet *iet =3D &emac->qos.iet; + + /* disable FPE if active during link down */ + if (iet->fpe_active) { + /* Schedule IET FPE IET FPE disable */ + atomic_set(&iet->enable_fpe_config, 0); + schedule_work(&iet->fpe_config_task); + } +} diff --git a/drivers/net/ethernet/ti/icssg/icssg_qos.h b/drivers/net/ethern= et/ti/icssg/icssg_qos.h new file mode 100644 index 000000000000..8aa79b68ad54 --- /dev/null +++ b/drivers/net/ethernet/ti/icssg/icssg_qos.h @@ -0,0 +1,58 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* Copyright (C) 2023 Texas Instruments Incorporated - http://www.ti.com/ + */ + +#ifndef __NET_TI_ICSSG_QOS_H +#define __NET_TI_ICSSG_QOS_H + +#include +#include +#include + +enum icssg_ietfpe_verify_states { + ICSSG_IETFPE_STATE_UNKNOWN =3D 0, + ICSSG_IETFPE_STATE_INITIAL, + ICSSG_IETFPE_STATE_VERIFYING, + ICSSG_IETFPE_STATE_SUCCEEDED, + ICSSG_IETFPE_STATE_FAILED, + ICSSG_IETFPE_STATE_DISABLED +}; + +struct prueth_qos_mqprio { + struct tc_mqprio_qopt_offload mqprio; + u8 preemptible_tcs; +}; + +struct prueth_qos_iet { + struct work_struct fpe_config_task; + struct prueth_emac *emac; + atomic_t enable_fpe_config; + /* Set when IET frame preemption is enabled via ethtool */ + bool fpe_enabled; + /* Set when the IET MAC Verify state machine is enabled + * via ethtool + */ + bool mac_verify_configure; + /* Min TX fragment size, set via ethtool */ + u32 tx_min_frag_size; + /* wait time between verification attempts in ms (according to clause + * 30.14.1.6 aMACMergeVerifyTime), set via ethtool + */ + u32 verify_time_ms; + /* Set if IET FPE is active */ + bool fpe_active; + /* State of verification state machine */ + enum icssg_ietfpe_verify_states verify_status; +}; + +struct prueth_qos { + struct prueth_qos_iet iet; + struct prueth_qos_mqprio mqprio; +}; + +void icssg_qos_init(struct net_device *ndev); +void icssg_qos_link_up(struct net_device *ndev); +void icssg_qos_link_down(struct net_device *ndev); +int icssg_qos_ndo_setup_tc(struct net_device *ndev, enum tc_setup_type typ= e, + void *type_data); +#endif /* __NET_TI_ICSSG_QOS_H */ --=20 2.43.0 From nobody Sun Feb 8 13:39:49 2026 Received: from SA9PR02CU001.outbound.protection.outlook.com (mail-southcentralusazon11013044.outbound.protection.outlook.com [40.93.196.44]) (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 F0A8CEACE; Thu, 5 Feb 2026 18:48:02 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.93.196.44 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770317283; cv=fail; b=TYwBZjbB/btxOXWP9zsyC1mq9UQ5ZVmh1K342TyrGCWngG53xIAago8UyQvgGGmC1soo1QL5bpZTU1VGpzvc1EOFM6wh8gwSE2sS4ax+NwumSpmHdqIKhtXdcLf+WHy3J0QwtjV+SN3rrSXPLEmehZdMa7EeZ0TimCvLojuDWZw= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1770317283; c=relaxed/simple; bh=oD+jpQqwhG5OiaygLBZ7VpNT4QQYldd41oRbPY9GHSo=; h=From:To:CC:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=UMj85MblMo4sCXQ+Xd4kgu/NiUlIredYBK709ozPF1l1oeKrAu8K/IZZSV48yT9vV1HrdIEnss+8W7OyuoRmrMSB7hac8VIaRQdHQc3W12DLFDEXtoyHrb81JP4ImG+aMGwgdpktBkRMizM7eehHfV/49cSRGtxDbyRossc+VK8= ARC-Authentication-Results: i=2; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com; spf=pass smtp.mailfrom=ti.com; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b=gbmieBj8; arc=fail smtp.client-ip=40.93.196.44 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=ti.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=ti.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (1024-bit key) header.d=ti.com header.i=@ti.com header.b="gbmieBj8" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=O2TrPhhNpHt7rf1dhLn4eCBmv3CIU/RQjvAyes9OS8vtu3n8gRL95dbkWWTI8aNhYp0khoXYNRWFGwgC2+15TuZnByDWRSWoFjAvISA3VI376puM3IqbvpykD4wNjuEv1thhsaNasIODCPVA9yHYUVYWPQyua9mNgGRWZIjdWgT+CgFlJewDNrG8CokJu3a2nOvABVy/8p1YK5CjrESxM0cH09HS5t3zRKIT2MrS83iEghZ3IXe4ueEGk8mG2nFhia8/bJNkeCokCsDPGMnW8aIWnTiL4jUfhk4P3oE1IDgmN75pcx+ZyaCGJL6iHWt0C9azBaraFTal5Dt/igCXSQ== 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=6KITCf7MerN31744upCXntDMHW1AnR5ZC0XJZtL1dl0=; b=qZYgHwVmJqq8pV4DgmrTq9W13qHyLIQP3m/a+vWMg48JAEyXL6bp3g/jy/SZK6qZDHheGT0nmuXSmnQl0c3jsuhasXHnm8SbcmL8Xrw6VhokUHJ+Pn7IZGjKKOf0SGDQXQfdGRRwc/3J7ngHvY7O+s3OGU6r8FZmlmtcscucYwEF9S979EhsOhHvwIBU0PBgZj38nbw7ZG3GivnqKad8mnMGzb9ubogh/OL5Wdlv1Q64UrLk/tNU9zFwUFqL+HiSwn7iUQKtBC0/jAWdcvicZ1gSPMGBI1C3Tu/v5jZobg5qNptXHP1yfA8TEsAiOqary6cgCSJUgpugke68NsLakw== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass (sender ip is 198.47.21.194) smtp.rcpttodomain=linux.dev smtp.mailfrom=ti.com; dmarc=pass (p=quarantine sp=none pct=100) action=none header.from=ti.com; dkim=none (message not signed); arc=none (0) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ti.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=6KITCf7MerN31744upCXntDMHW1AnR5ZC0XJZtL1dl0=; b=gbmieBj8chIdctuEl6UdY/dymIkEpcJDIofrLLpCH6fUbN4Sno+AG7mJVjABP38bSLTtOsMntyU6vYp/Lf3efCqMOi4btw/3++XydoxTKX/epP6rtERNgDZQURoFnVFE7d2Kb8yThHR52fE7m+QWJoRybrRkPfINn+QgKUoJQBE= Received: from BYAPR04CA0018.namprd04.prod.outlook.com (2603:10b6:a03:40::31) by SA1PR10MB6613.namprd10.prod.outlook.com (2603:10b6:806:2be::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9564.16; Thu, 5 Feb 2026 18:48:00 +0000 Received: from CO1PEPF000066EA.namprd05.prod.outlook.com (2603:10b6:a03:40:cafe::53) by BYAPR04CA0018.outlook.office365.com (2603:10b6:a03:40::31) with Microsoft SMTP Server (version=TLS1_3, cipher=TLS_AES_256_GCM_SHA384) id 15.20.9587.14 via Frontend Transport; Thu, 5 Feb 2026 18:47:59 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 198.47.21.194) smtp.mailfrom=ti.com; dkim=none (message not signed) header.d=none;dmarc=pass action=none header.from=ti.com; Received-SPF: Pass (protection.outlook.com: domain of ti.com designates 198.47.21.194 as permitted sender) receiver=protection.outlook.com; client-ip=198.47.21.194; helo=flwvzet200.ext.ti.com; pr=C Received: from flwvzet200.ext.ti.com (198.47.21.194) by CO1PEPF000066EA.mail.protection.outlook.com (10.167.249.5) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9587.10 via Frontend Transport; Thu, 5 Feb 2026 18:47:57 +0000 Received: from DFLE201.ent.ti.com (10.64.6.59) by flwvzet200.ext.ti.com (10.248.192.31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 5 Feb 2026 12:47:57 -0600 Received: from DFLE213.ent.ti.com (10.64.6.71) by DFLE201.ent.ti.com (10.64.6.59) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20; Thu, 5 Feb 2026 12:47:56 -0600 Received: from fllvem-mr07.itg.ti.com (10.64.41.89) by DFLE213.ent.ti.com (10.64.6.71) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.2.2562.20 via Frontend Transport; Thu, 5 Feb 2026 12:47:56 -0600 Received: from fllv0122.itg.ti.com (fllv0122.itg.ti.com [10.247.120.72]) by fllvem-mr07.itg.ti.com (8.18.1/8.18.1) with ESMTP id 615Ilu8h694413; Thu, 5 Feb 2026 12:47:56 -0600 Received: from localhost (meghana-pc.dhcp.ti.com [10.24.69.13] (may be forged)) by fllv0122.itg.ti.com (8.14.7/8.14.7) with ESMTP id 615IltrX028686; Thu, 5 Feb 2026 12:47:56 -0600 From: Meghana Malladi To: , , , , , , , , , , , , , , CC: , , , , Vignesh Raghavendra Subject: [PATCH net-next v3 2/2] net: ti: icssg-prueth: Add ethtool ops for Frame Preemption MAC Merge Date: Fri, 6 Feb 2026 00:17:47 +0530 Message-ID: <20260205184747.2451816-3-m-malladi@ti.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260205184747.2451816-1-m-malladi@ti.com> References: <20260205184747.2451816-1-m-malladi@ti.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-C2ProcessedOrg: 333ef613-75bf-4e12-a4b1-8e3623f5dcea X-EOPAttributedMessage: 0 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: CO1PEPF000066EA:EE_|SA1PR10MB6613:EE_ X-MS-Office365-Filtering-Correlation-Id: 80971913-0e41-4195-7e08-08de64e71488 X-LD-Processed: e5b49634-450b-4709-8abb-1e2b19b982b7,ExtAddr X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|7416014|36860700013|376014|82310400026|1800799024|921020; X-Microsoft-Antispam-Message-Info: =?us-ascii?Q?G4fpzkdRWDF6q1xA4qDQT+WXR8HtgedX416SnSY+lNFGMqX83SbjqZn4cob0?= =?us-ascii?Q?2NN51xYSDM17+mMNw8XNY0p+bV35xG1v3RvhTnTzMvREhbp6gNdrENzODc59?= =?us-ascii?Q?xwgMv7wvbsSNW1K5eQu8S0Jk84WRLhuPeuLDmTm2JO9HH11JE3nro1BWAcnY?= =?us-ascii?Q?HunrI8pIoa/rcdMSuuoJfJy/0PrwNOdjOvyFggFchRxx7AbnxsPrvOWvbwsZ?= =?us-ascii?Q?8yxVoS0LhPjZ2mQa3L5VY0YDRJsYbS932rphTzFrvBLkGmZJZcSWtaXMrNmg?= =?us-ascii?Q?EZKLeQoORZyTY/zVM+dW1HByw/AvFEbh+1S0Tq+0DhPiV7sH0jFBf9NrDvoY?= =?us-ascii?Q?1mWcaRSSOraGGLi6Ek1HCb2992ZSmqvcQoPHEScQHCwBUkJOGweeBgvuh7JE?= =?us-ascii?Q?/Tw0KprJc+DOfl4J59+DCOMC0Lx0Xr9Q/lkVMg6vXgNg7hTTcQUAEAfGwP/V?= =?us-ascii?Q?rZx5jkMJD9gT3Xh+Cq8Ka4nOxxYXO8zEBmhfdbd00v4wEEieIY6Oy6QG+/5I?= =?us-ascii?Q?ECQBTSd5ODHd8F5blzPHIvY+xHBqt3JYrxmyuoiDbhBnXrMGtIb7bUN2bfHE?= =?us-ascii?Q?YRr14BFr4ULRRNtRYKVsd/pv4R1zxoJS5SUA/vvsW/i4cpjpGPNufnpRGwuM?= =?us-ascii?Q?G2WSztGgHx7sr1ybcvLf+wfJTjXdm2v4aXE0DNrpLnqTCY9Jk7Ym893YcN0q?= =?us-ascii?Q?j+yGI0DP1tEmYkdVLhDpt/vQjjNp1pkqLLIuNsoir4VmoT9hqUYIJa/Q1rAM?= =?us-ascii?Q?SOXZEjeawWGLFNRhXK/tk/vz0wLkHDvAr814u+/G9Q5ZqpSqp7JWOMJNm+H5?= =?us-ascii?Q?sMGvliOCkyqk0N8m/bBel0TZRz4MBDVicE450gQSuUS3zoTZv4yM8CSK+hoX?= =?us-ascii?Q?nPCobtFC3DCIASCBiXtbmJrg2J3m8ihDyX8uF1o8yOdQlXJivuctYcOF3zPa?= =?us-ascii?Q?ElLdrGz6+nx8ekXqXiHfzJLZw2hm5qCv+ie3GpAzNjSZC2rBHiZhVTSd2fW8?= =?us-ascii?Q?pw4UuLzJ7V1dUFkA+7Mt5B2Ye1fSDy7RYy0W00Uvs60CmfyFbfNxtgq7AS3H?= =?us-ascii?Q?JesqyzYSRUFp6k7mkdTspGXomCCALw5VCWMuOfe4JPqdTwwFTs0hBW82z8Nv?= =?us-ascii?Q?6vAcgVNnfNAGn97Budj1tvZMB+yGe1hFgnuwGDi1NBpDyuzgsF1Ee68/qZEq?= =?us-ascii?Q?gOl3tLlW4lQhZe6rUS8pXiroGiusvHyA2L+emcqYy8YCcq1TW43PUP6oKEVT?= =?us-ascii?Q?Ru/pSiDcPuq9kAQ55oG0sfikDeFSDKxP9zWaVwRROA5SeVAa/cgL5yRDeChp?= =?us-ascii?Q?ByVfVVUwrAYXt71VSZvdnZ2yrsilTTFDqRg2E3xgRmGWsob5JmNWg0jqNwoa?= =?us-ascii?Q?mqoXuR9vmFItbxow6h7ii4+O7pP/eE7xdyZmnnjBsPyFMsY2lPXTRdhS5ujP?= =?us-ascii?Q?lEnuKLnFfBLVJ1v53sjeJVoUzdkbrhgmtgrAVT0Mn67R6dRj+fP+1MMnsLvk?= =?us-ascii?Q?L/vYboC5JJFJJQbzHNYPjbLO8AuUo1Z7e1cQg+WGOwGehfNhAdMWfzbWgh5G?= =?us-ascii?Q?dKnc1FBb0ETuiaO87h5uZAZcPw8bQbrGLlWKnnR2nJ2315XK3iQOyTCO1PJf?= =?us-ascii?Q?vEH5AdTEYYMUNk/hvKFWpiJoGjzBn4/wgSiFJMJ3grbTsXlJtMqKRPpuuseY?= =?us-ascii?Q?/+h40CfcLI1R9X4E2Y9PI8Trf3M=3D?= X-Forefront-Antispam-Report: CIP:198.47.21.194;CTRY:US;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:flwvzet200.ext.ti.com;PTR:ErrorRetry;CAT:NONE;SFS:(13230040)(7416014)(36860700013)(376014)(82310400026)(1800799024)(921020);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: qPmHbTekEHMyv2hLjEabDLuhyMnIdwM7WnyWKQ0piZ0JBVa488MMFnD5CwXn2+aoUnc98Gbckn0bexbNlaPjyOoXhvFgSE827vrdgGaYCsGziGukWXM0sKmFTAw859gDj/BaesLQfM6hPUTDGakScbT2bd7WMdT/oWF2eNIQ4xpC77prwtdTx92wUUgqvneoKqu2iDKgLhmiTKuSAFB/x0fsL0dWHK6NuJYvwVKH0UXHL5HtKOTxNVF0Kmg09SVL/RuPYFgP4smstPK3/a4yqizfT1xxUJwo+CKF9QE6+2rgyWQKRfUIaw93YBnc5yUxHZOH2960GwYprf1qT/X//jWM4zDWQVBv4ReOM2ftLevNhuChllaoB+wPW81Px8PPrQPisv43QmTONCbdiSgTGeLD5143CWByTdNiRTunZNhKf0MwYkD13Tn83nsdN0QP X-OriginatorOrg: ti.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 05 Feb 2026 18:47:57.6586 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 80971913-0e41-4195-7e08-08de64e71488 X-MS-Exchange-CrossTenant-Id: e5b49634-450b-4709-8abb-1e2b19b982b7 X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=e5b49634-450b-4709-8abb-1e2b19b982b7;Ip=[198.47.21.194];Helo=[flwvzet200.ext.ti.com] X-MS-Exchange-CrossTenant-AuthSource: CO1PEPF000066EA.namprd05.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: SA1PR10MB6613 Content-Type: text/plain; charset="utf-8" From: MD Danish Anwar Add driver support for viewing / changing the MAC Merge sublayer parameters and dump the Mac Merge stats via ethtool ops: .set_mm(), .get_mm() and .get_mm_stats(). The minimum size of non-final mPacket fragments supported by the firmware without leading errors is 64 Bytes (in octets). Add a check to ensure user passed tx_min_frag_size argument via ethtool, honors this . Add pa stats registers to check statistics for preemption, which can be dumped using ethtool ops. Signed-off-by: MD Danish Anwar Signed-off-by: Meghana Malladi --- v3-v2: - Fixed build warning raised by kernel test bot v2-v1: - Following changes have been done as suggested by Vladimir Oltean * Add sanity check to ensure valid min_frag_size is requested by the user. * Add comments wherever applicable w.r.t min_frag_size. * Make it uniform to return all valures from the driver for .get_mm() * Use ETHTOOL_MM_MAX_VERIFY_TIME_MS macro for 128 * Use NL_SET_ERR_MSG_MOD() wherever applicable * Re-schedule the iet work thread whenever there .set_mm() get called based on fpe_enabled flag. drivers/net/ethernet/ti/icssg/icssg_ethtool.c | 86 ++++++++++++++++++- drivers/net/ethernet/ti/icssg/icssg_prueth.h | 5 +- drivers/net/ethernet/ti/icssg/icssg_qos.h | 20 +++++ drivers/net/ethernet/ti/icssg/icssg_stats.c | 1 - drivers/net/ethernet/ti/icssg/icssg_stats.h | 5 ++ .../net/ethernet/ti/icssg/icssg_switch_map.h | 5 ++ 6 files changed, 118 insertions(+), 4 deletions(-) diff --git a/drivers/net/ethernet/ti/icssg/icssg_ethtool.c b/drivers/net/et= hernet/ti/icssg/icssg_ethtool.c index b715af21d23a..3c4ff154f6d1 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_ethtool.c +++ b/drivers/net/ethernet/ti/icssg/icssg_ethtool.c @@ -6,7 +6,6 @@ */ =20 #include "icssg_prueth.h" -#include "icssg_stats.h" =20 static void emac_get_drvinfo(struct net_device *ndev, struct ethtool_drvinfo *info) @@ -294,6 +293,88 @@ static int emac_set_per_queue_coalesce(struct net_devi= ce *ndev, u32 queue, return 0; } =20 +static int emac_get_mm(struct net_device *ndev, struct ethtool_mm_state *s= tate) +{ + struct prueth_emac *emac =3D netdev_priv(ndev); + struct prueth_qos_iet *iet =3D &emac->qos.iet; + + state->tx_enabled =3D iet->fpe_enabled; + state->pmac_enabled =3D true; + state->tx_min_frag_size =3D iet->tx_min_frag_size; + /* 64Bytes is the minimum fragment size supported + * by the firmware. <64B leads to min frame errors + */ + state->rx_min_frag_size =3D 64; + state->tx_active =3D iet->fpe_active; + state->verify_enabled =3D iet->mac_verify_configure; + state->verify_time =3D iet->verify_time_ms; + + switch (iet->verify_status) { + case ICSSG_IETFPE_STATE_DISABLED: + state->verify_status =3D ETHTOOL_MM_VERIFY_STATUS_DISABLED; + break; + case ICSSG_IETFPE_STATE_SUCCEEDED: + state->verify_status =3D ETHTOOL_MM_VERIFY_STATUS_SUCCEEDED; + break; + case ICSSG_IETFPE_STATE_FAILED: + state->verify_status =3D ETHTOOL_MM_VERIFY_STATUS_FAILED; + break; + default: + state->verify_status =3D ETHTOOL_MM_VERIFY_STATUS_UNKNOWN; + break; + } + + /* 802.3-2018 clause 30.14.1.6, says that the aMACMergeVerifyTime + * variable has a range between 1 and 128 ms inclusive. Limit to that. + */ + state->max_verify_time =3D ETHTOOL_MM_MAX_VERIFY_TIME_MS; + + return 0; +} + +static int emac_set_mm(struct net_device *ndev, struct ethtool_mm_cfg *cfg, + struct netlink_ext_ack *extack) +{ + struct prueth_emac *emac =3D netdev_priv(ndev); + struct prueth_qos_iet *iet =3D &emac->qos.iet; + int err; + + if (!cfg->pmac_enabled) + NL_SET_ERR_MSG_MOD(extack, "preemptible MAC is always enabled"); + + err =3D icssg_qos_frag_size_min_to_add(cfg->tx_min_frag_size, extack); + if (err) + return err; + + iet->verify_time_ms =3D cfg->verify_time; + iet->tx_min_frag_size =3D cfg->tx_min_frag_size; + + iet->fpe_enabled =3D cfg->tx_enabled; + iet->mac_verify_configure =3D cfg->verify_enabled; + + /* Re-trigger the state machine to incorporate the updated configuration = */ + if (iet->fpe_enabled) + atomic_set(&iet->enable_fpe_config, 1); + else + atomic_set(&iet->enable_fpe_config, 0); + + schedule_work(&iet->fpe_config_task); + + return 0; +} + +static void emac_get_mm_stats(struct net_device *ndev, + struct ethtool_mm_stats *s) +{ + struct prueth_emac *emac =3D netdev_priv(ndev); + + s->MACMergeFrameAssOkCount =3D emac_get_stat_by_name(emac, "FW_PREEMPT_AS= SEMBLY_OK"); + s->MACMergeFrameAssErrorCount =3D emac_get_stat_by_name(emac, "FW_PREEMPT= _ASSEMBLY_ERR"); + s->MACMergeFragCountRx =3D emac_get_stat_by_name(emac, "FW_PREEMPT_FRAG_C= NT_RX"); + s->MACMergeFragCountTx =3D emac_get_stat_by_name(emac, "FW_PREEMPT_FRAG_C= NT_TX"); + s->MACMergeFrameSmdErrorCount =3D emac_get_stat_by_name(emac, "FW_PREEMPT= _BAD_FRAG"); +} + const struct ethtool_ops icssg_ethtool_ops =3D { .get_drvinfo =3D emac_get_drvinfo, .get_msglevel =3D emac_get_msglevel, @@ -317,5 +398,8 @@ const struct ethtool_ops icssg_ethtool_ops =3D { .set_eee =3D emac_set_eee, .nway_reset =3D emac_nway_reset, .get_rmon_stats =3D emac_get_rmon_stats, + .get_mm =3D emac_get_mm, + .set_mm =3D emac_set_mm, + .get_mm_stats =3D emac_get_mm_stats, }; EXPORT_SYMBOL_GPL(icssg_ethtool_ops); diff --git a/drivers/net/ethernet/ti/icssg/icssg_prueth.h b/drivers/net/eth= ernet/ti/icssg/icssg_prueth.h index 7a586038adf8..5271a013df64 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_prueth.h +++ b/drivers/net/ethernet/ti/icssg/icssg_prueth.h @@ -45,6 +45,7 @@ #include "icss_iep.h" #include "icssg_switch_map.h" #include "icssg_qos.h" +#include "icssg_stats.h" =20 #define PRUETH_MAX_MTU (2000 - ETH_HLEN - ETH_FCS_LEN) #define PRUETH_MIN_PKT_SIZE (VLAN_ETH_ZLEN) @@ -58,8 +59,8 @@ =20 #define ICSSG_MAX_RFLOWS 8 /* per slice */ =20 -#define ICSSG_NUM_PA_STATS 32 -#define ICSSG_NUM_MIIG_STATS 60 +#define ICSSG_NUM_PA_STATS ARRAY_SIZE(icssg_all_pa_stats) +#define ICSSG_NUM_MIIG_STATS ARRAY_SIZE(icssg_all_miig_stats) /* Number of ICSSG related stats */ #define ICSSG_NUM_STATS (ICSSG_NUM_MIIG_STATS + ICSSG_NUM_PA_STATS) #define ICSSG_NUM_STANDARD_STATS 31 diff --git a/drivers/net/ethernet/ti/icssg/icssg_qos.h b/drivers/net/ethern= et/ti/icssg/icssg_qos.h index 8aa79b68ad54..b18a93f9181a 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_qos.h +++ b/drivers/net/ethernet/ti/icssg/icssg_qos.h @@ -55,4 +55,24 @@ void icssg_qos_link_up(struct net_device *ndev); void icssg_qos_link_down(struct net_device *ndev); int icssg_qos_ndo_setup_tc(struct net_device *ndev, enum tc_setup_type typ= e, void *type_data); +static inline int icssg_qos_frag_size_min_to_add(u32 min_frag_size, + struct netlink_ext_ack *extack) +{ + /* The minimum size of the non-final mPacket supported + * by the firmware is 64B and multiples of 64B. + */ + if (min_frag_size < 64) { + NL_SET_ERR_MSG_MOD(extack, + "tx_min_frag_size must be at least 64 bytes"); + return -EINVAL; + } + + if (min_frag_size % (ETH_ZLEN + ETH_FCS_LEN)) { + NL_SET_ERR_MSG_MOD(extack, + "tx_min_frag_size must be a multiple of 64 bytes"); + return -EINVAL; + } + + return 0; +} #endif /* __NET_TI_ICSSG_QOS_H */ diff --git a/drivers/net/ethernet/ti/icssg/icssg_stats.c b/drivers/net/ethe= rnet/ti/icssg/icssg_stats.c index 7159baa0155c..d27e1c48976f 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_stats.c +++ b/drivers/net/ethernet/ti/icssg/icssg_stats.c @@ -6,7 +6,6 @@ */ =20 #include "icssg_prueth.h" -#include "icssg_stats.h" #include =20 #define ICSSG_TX_PACKET_OFFSET 0xA0 diff --git a/drivers/net/ethernet/ti/icssg/icssg_stats.h b/drivers/net/ethe= rnet/ti/icssg/icssg_stats.h index 5ec0b38e0c67..f35ae1b4f846 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_stats.h +++ b/drivers/net/ethernet/ti/icssg/icssg_stats.h @@ -189,6 +189,11 @@ static const struct icssg_pa_stats icssg_all_pa_stats[= ] =3D { ICSSG_PA_STATS(FW_INF_DROP_PRIOTAGGED), ICSSG_PA_STATS(FW_INF_DROP_NOTAG), ICSSG_PA_STATS(FW_INF_DROP_NOTMEMBER), + ICSSG_PA_STATS(FW_PREEMPT_BAD_FRAG), + ICSSG_PA_STATS(FW_PREEMPT_ASSEMBLY_ERR), + ICSSG_PA_STATS(FW_PREEMPT_FRAG_CNT_TX), + ICSSG_PA_STATS(FW_PREEMPT_ASSEMBLY_OK), + ICSSG_PA_STATS(FW_PREEMPT_FRAG_CNT_RX), ICSSG_PA_STATS(FW_RX_EOF_SHORT_FRMERR), ICSSG_PA_STATS(FW_RX_B0_DROP_EARLY_EOF), ICSSG_PA_STATS(FW_TX_JUMBO_FRM_CUTOFF), diff --git a/drivers/net/ethernet/ti/icssg/icssg_switch_map.h b/drivers/net= /ethernet/ti/icssg/icssg_switch_map.h index 7e053b8af3ec..855fd4ed0b3f 100644 --- a/drivers/net/ethernet/ti/icssg/icssg_switch_map.h +++ b/drivers/net/ethernet/ti/icssg/icssg_switch_map.h @@ -256,6 +256,11 @@ #define FW_INF_DROP_PRIOTAGGED 0x0148 #define FW_INF_DROP_NOTAG 0x0150 #define FW_INF_DROP_NOTMEMBER 0x0158 +#define FW_PREEMPT_BAD_FRAG 0x0160 +#define FW_PREEMPT_ASSEMBLY_ERR 0x0168 +#define FW_PREEMPT_FRAG_CNT_TX 0x0170 +#define FW_PREEMPT_ASSEMBLY_OK 0x0178 +#define FW_PREEMPT_FRAG_CNT_RX 0x0180 #define FW_RX_EOF_SHORT_FRMERR 0x0188 #define FW_RX_B0_DROP_EARLY_EOF 0x0190 #define FW_TX_JUMBO_FRM_CUTOFF 0x0198 --=20 2.43.0