From nobody Mon Jun 15 19:03:11 2026 Received: from OSPPR02CU001.outbound.protection.outlook.com (mail-norwayeastazon11013049.outbound.protection.outlook.com [40.107.159.49]) (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 9B27139A05A; Mon, 13 Apr 2026 07:51:04 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=40.107.159.49 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776066666; cv=fail; b=hVvXiF5jFHkR44vA7Vrd42qpC1lVYx6RxNJ73wnrzLWVPWZSOUswf8BBt39+oiGAu6jtYWo5yfyJTw287B39M2E4PfLTb6hLGDF81G1+5ZDQa8aHu/u3nXQ6pGY5o0RwUq8N73vHuCHgoqlOu8OtbceHw+qQBcBnB1oJEtNa424= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776066666; c=relaxed/simple; bh=dCXJsdkLfzF2IqG/STFJCXBpvaiUMxI+IcU1ksZBY5Y=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=FE7TdSTsYdojFBPyGsGaxgCqLoNdoEdTbBkTBmivTihu7HAzLbK4V+3E4g3fXPmXFiQpfoGXhTJ6HtFBywlh+f/ZxLs1+GJSNd/2xrEGpUJ42Ko5yLX051IHRG2kMqXrT5M8L2erQbiDnrPxXBx1MAGfeMv3JTFd2EpEpvoouns= 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=YNGCaWcn; arc=fail smtp.client-ip=40.107.159.49 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="YNGCaWcn" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=Vatks7fuaEbxN1OqDdum4S3ihiVzDBaAptlIawwE2waHZYQmnEOVH1G0vRLuZrmWYic0NrwoJ/XooaElFsoJW38v1OQSn3FW8yvYCLD/THM8peorvVHcufHezsAbOh4RHciQIyVkuwMBhS1buLlGbKCPQEdUgfxnLJNivNEFmW3fjUbNdcosrn4qkABv7EQu7JzUh1l+AJv0z7eNk/8s3FbGZ48gcawkrG+v163N/cmWjq0kunnzrYFPkKjzsT+g6a1FcUTstcvdQjBH6nG+qOQuvNCM0wzT24XaTaLcKZ/+5LzkCijq5xw751h9bU5Gab9VJ8LsDxe93E9IFpv5rQ== 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=5fmphqKwb0TwqBXKtyWbZh8v9y5oBNjn1xeHgIQJZ7k=; b=XL+c4oZ6j2GaJrU7S59ZissHgcDe9BsWOpfQRxfiGH5l8hxlI6a3lQ18ZXaAam3KL1F00l+l+O/+LFMTcVxhuDCcNl5vyFmnEwg7JUEFiuoMMGbKq7zw2U0Hl3Rjq2k+jXJYntwUJKmY66q54Hu++X/HFgmFJGRuGkxoNrsgsIb43rRYC0QJ94FYATHSNaE5VJRN11TLzoctPNN5LmjfG88SZg8gThwP/BTgoI+Ls1+dFrVN23cxmF48a+xOdA4k7r7PwLe6Fg4KX5GXwK8dxOMW2fuY2GcsdMSohz3dTFL98fddkaVik1NMIj4af1QsVussXaLA+9I0bFZH0Lpp6g== 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=5fmphqKwb0TwqBXKtyWbZh8v9y5oBNjn1xeHgIQJZ7k=; b=YNGCaWcnHz809fqWWa0sv+VSOEo3+iGrAZduHecJ7HQehAZHjbUY7aBfwiOWceIVD4nHDdB69B2k+nUx2WjH6ktxxbbtd5KRWnW2RVSYDOQAU/zc3HN3let0EIVpFGu/CStc/AwbEzC4Q8BwPQR5131sZOSFw3cvQxaByKmIG2bQqaibtigC8FK0hph7MQ1iEtldKmrPyVjf0WJNxpJ7bZqeUWiNUrGjkTXDCHPxLlNg/34uCTUOzhcuNTxIJd0RitEHV5TrOWJI7aptQQqDlhttp3DF/oi3TniPyLU5NvkkLVdvjys8uai/UilYCv7nG7yFGSva4ESb6++KZNZ1Cw== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM8PR04MB7284.eurprd04.prod.outlook.com (2603:10a6:20b:1dc::8) by DBAPR04MB7463.eurprd04.prod.outlook.com (2603:10a6:10:1ad::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.15; Mon, 13 Apr 2026 07:51:01 +0000 Received: from AM8PR04MB7284.eurprd04.prod.outlook.com ([fe80::9cd6:51bd:82b:98dc]) by AM8PR04MB7284.eurprd04.prod.outlook.com ([fe80::9cd6:51bd:82b:98dc%5]) with mapi id 15.20.9769.046; Mon, 13 Apr 2026 07:51:01 +0000 From: Wei Fang To: claudiu.manoil@nxp.com, vladimir.oltean@nxp.com, xiaoning.wang@nxp.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, chleroy@kernel.org Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, linuxppc-dev@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH net 1/2] net: enetc: correct the command BD ring consumer index Date: Mon, 13 Apr 2026 15:52:49 +0800 Message-Id: <20260413075250.281653-2-wei.fang@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260413075250.281653-1-wei.fang@nxp.com> References: <20260413075250.281653-1-wei.fang@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MA5P287CA0236.INDP287.PROD.OUTLOOK.COM (2603:1096:a01:1b1::10) To AM8PR04MB7284.eurprd04.prod.outlook.com (2603:10a6:20b:1dc::8) 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: AM8PR04MB7284:EE_|DBAPR04MB7463:EE_ X-MS-Office365-Filtering-Correlation-Id: 35c7608c-acce-4e0e-92c2-08de99316789 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|7416014|376014|1800799024|366016|19092799006|38350700014|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: MUIjxBD6XM5U/ZK46K0DsVa8A3P7u0ZCM8k6UGLzcvye0AkCVW4+8D3fD5PPBNPOMjC1HPkHbwTNlFvTpbfZIftcvfWppLQfSyYBJJBIN7tKn3SknaxhVVsPea/RRkZpOfyogZLRWVhvsZjWTneRi6wCMFSYFjD8+mlkFIG20Yi213DMPwsOqpPspJSBBb6ApmRCg/kfEHlQr7Zjx41dzfwpwwvUaUesrWEaGmqrChOuS4bsJk45zW3Fd2033jySOHPPThDGtMr4TndUEiCZGIQEae8DPU4amcJ0R0vK4A8YtsV+NyGOYrNam60PIqd2YFQIvCMWBW5ZUOGFStq/CSWK74r2V+swLnQzzg4vlWjwkUXf6WqXa6xh45HykN/bzzyQs8M2TbuxDXy+XsfTHi5+5uQ5Wx97+DOT8b77KVwMacDsgfvabhxk0oNauY40Gwm4csDBvbNKMr+EjleN4G6ci+85og7baAnBaZwhQtkV0nup42YEacZgZaRpopiuj7EV3RgNasTBkZHgoiqY5ZFBbth5CrwvDRzEKigUyhS40ceJzXWVCGGHHtrWDY1jiUMj6yvd1JVldHpRbcrypwBOBaTtoM9pw+m96hJ82bbrHpIVqBylmo8YfyENH7dqC+G9ajKhQD/IRuOT+d8pv1hmnyH+HUR4IAbM5hxO4GqK45Hko0GGkDcF9ZxtbL6d7GJ+RerHsIdG6UQI3Hzjj4OWpS+uCy6GMRjJ3dbj6lxlyvwbgXkB+ymBB7JTKUP1IND9LBwZ47TIVESM5ZD2ZgwUgVSTO/xa/6fTmJYXGy8= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM8PR04MB7284.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(7416014)(376014)(1800799024)(366016)(19092799006)(38350700014)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?TBt4xwYqJpBJ3eZgmBRKmmBTvFuRBayXnzonsfzFnsBrtiyE9IgTZE7WFGjc?= =?us-ascii?Q?D7GPR4jZ9EfRKdZ9n3e6bpmlp1UfDvNUggXDTR21AuD6K+IwqlZsNrBtXTOJ?= =?us-ascii?Q?Idwxfr8xvoXL7UCAsP/Ibb7QFwT2YP6iJxkHG07kfPWmtOnd8LIkXi+i4jdf?= =?us-ascii?Q?2Bqwk6YepWygH42ozYnTALOiTmI/llvd1Snj2fpzVX5JKnXSlG3c8pJJJ06J?= =?us-ascii?Q?aQNrDR8X0GU/t8kLum0YZAnqYWL3ggmb5L8CPXmrvk6WeU0nQaZ0lQkFQZ8/?= =?us-ascii?Q?RUwDEEFnFk2Ofx0s6+oWYJ3cX5RaNv9dFvXHHUebXr28gDrhW0BixXoWarsC?= =?us-ascii?Q?buC9xOU4H1Xp0X2RzvugDpDSdIznQDvirpdopkdO5FAm9p2QXSBMKwDKiPhp?= =?us-ascii?Q?xfgU6O/Q4CzUZeJea78rFUEKGbcu8UZYrSm0pDhN/N5mdtVAKg8ZHRIgzXmC?= =?us-ascii?Q?yI/V5W0c9QzwjznILTn9FlHgeYhZdLtHUaAEMNDMJMYZxhcnZheDbijbbBL0?= =?us-ascii?Q?cNGys7czRAEkIF3kJKOKcv2pP0WoYTWLXasnvrGHsF3Xz0I/swfJqigwdhyB?= =?us-ascii?Q?zHvebMj4whRnAg4adQIL2DW6irTpQCeNWc3aOM0Sreyll+tkeaZLJe5PALDC?= =?us-ascii?Q?Pq0NMfZfAr2cR4xmegu6/d70CH98Ds2Oq39S2oBL4sNKvLxvCt+KzGvvd8sM?= =?us-ascii?Q?eZ1yVrsstVNgbOhmqlovTssRFbcjrZzgvQR1lW1JGTvy7jAyWKmBLXzWHpOi?= =?us-ascii?Q?1+MU/Rnl64DsafKzUCSnpklbvOC3lyXipRycEb+AucKU4hxyyREZO57e+axH?= =?us-ascii?Q?7DHWlF8VCKIdnQKoVFXxKRHcoSuTlJ4CBqaPulKgrRjalRSCE2nMPaeH2mq/?= =?us-ascii?Q?+7SRLodsCW9PNRBvvFsdiclqRfyHdUXvvGU25JUT/v2oXNvpPpfE8wK/OCv6?= =?us-ascii?Q?kdXmFxGcph/ienSJwRuQThh5JJu4a9dmtNYOL8+G/dqs0fI/LX6r6TJ6m7cT?= =?us-ascii?Q?HydMROmx/9+437mT2oVmRWxHgqLTFukH8g7d7+m5L+x9UTJR6qhO5hjHysak?= =?us-ascii?Q?fM9Re+pNWZoT1CyFxyeyUduqEwFMGvMGQJKSEZXwGPHwygSrzEyHTdqC6Uk/?= =?us-ascii?Q?EI3sqfNfPW+DmFqFpXFs9lXoskZgRb2k49UuwptI+7lq1O+HkuLwUYjWDggF?= =?us-ascii?Q?tR120JCJdsQrzb8PiEB1RZpVA5BYrykaILwpiAYdzJb2/Oc2iM49aWxBcqLJ?= =?us-ascii?Q?8eNA6eVqfGnjLxdr6NorIN3Fon8RaZCSN1KzhhJyNEj83kXHZnyljHCWyUa0?= =?us-ascii?Q?1iLAr1hcALgU/ZfiUFR39HEimgTG7+Y7xLI2GNEKJOeuuT0fgbyxtCJ0aZM3?= =?us-ascii?Q?u+0zS7WAGcAEzkRn8nzP+MVdSTLyRjXWk6+rOqYeBNkdeMVmxlbZ86sxQ83S?= =?us-ascii?Q?9rXJTXWdo4hjpjpkFZx12xU6+7c1YgOHBY2MQGZuxC/Gy5D/r7BHWKWnZmng?= =?us-ascii?Q?STbvcKXQZpNjKNsEtEK+7OpBHuDOdF5ul92Ms0WmxplaqNLU0yiWMAjLxYdC?= =?us-ascii?Q?xBtPkAlGM/C9URUyuvrfDcV545/l2/nNloZKuV6b3px1YfFfxbJhchnNqvZ9?= =?us-ascii?Q?/jJ/naFiHnHLp5U9IkECTlPybFHjYDMByty5fVAqhFC/b9AVUjR9ya/TPg8I?= =?us-ascii?Q?/3KnqWHPSw48snJE/35WcgG4BkStgLvgaqI1D3Yk5WHhF+inCd9DcKwcMIxB?= =?us-ascii?Q?07GoFpz0bw=3D=3D?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 35c7608c-acce-4e0e-92c2-08de99316789 X-MS-Exchange-CrossTenant-AuthSource: AM8PR04MB7284.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Apr 2026 07:51:01.0253 (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: v0opaxWxupVaOXKrb0imnGX0DPTrKxvgkMP6K2I3+kudLu5SJKyGnKywjbL3XXs//02Ky7jZ6gHf338niwP5Aw== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBAPR04MB7463 Content-Type: text/plain; charset="utf-8" The command BD ring cousumer index register has the consumer index as the lower 10 bits, and the bit 31 is SBE, which indicates whether a system bus error occurred during execution of the CBD command. So if a system bus error occurs, reading the register will get the SBE bit set. However, the current implementation directly uses the register value as the consumer index without masking it. Therefore, if a system bus error occurs, an incorrect consumer index will be obtained, causing errors in the processing of the command BD ring. Thus, we need to mask out the other bits to obtain the correct consumer index. Fixes: 4701073c3deb ("net: enetc: add initial netc-lib driver to support NT= MP") Signed-off-by: Wei Fang --- drivers/net/ethernet/freescale/enetc/ntmp.c | 7 ++++--- drivers/net/ethernet/freescale/enetc/ntmp_private.h | 1 + 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/net/ethernet/freescale/enetc/ntmp.c b/drivers/net/ethe= rnet/freescale/enetc/ntmp.c index 0c1d343253bf..1b1ff0446d0a 100644 --- a/drivers/net/ethernet/freescale/enetc/ntmp.c +++ b/drivers/net/ethernet/freescale/enetc/ntmp.c @@ -55,7 +55,7 @@ int ntmp_init_cbdr(struct netc_cbdr *cbdr, struct device = *dev, spin_lock_init(&cbdr->ring_lock); =20 cbdr->next_to_use =3D netc_read(cbdr->regs.pir); - cbdr->next_to_clean =3D netc_read(cbdr->regs.cir); + cbdr->next_to_clean =3D netc_read(cbdr->regs.cir) & NETC_CBDRCIR_INDEX; =20 /* Step 1: Configure the base address of the Control BD Ring */ netc_write(cbdr->regs.bar0, lower_32_bits(cbdr->dma_base_align)); @@ -98,7 +98,7 @@ static void ntmp_clean_cbdr(struct netc_cbdr *cbdr) int i; =20 i =3D cbdr->next_to_clean; - while (netc_read(cbdr->regs.cir) !=3D i) { + while ((netc_read(cbdr->regs.cir) & NETC_CBDRCIR_INDEX) !=3D i) { cbd =3D ntmp_get_cbd(cbdr, i); memset(cbd, 0, sizeof(*cbd)); i =3D (i + 1) % cbdr->bd_num; @@ -135,7 +135,8 @@ static int netc_xmit_ntmp_cmd(struct ntmp_user *user, u= nion netc_cbd *cbd) cbdr->next_to_use =3D i; netc_write(cbdr->regs.pir, i); =20 - err =3D read_poll_timeout_atomic(netc_read, val, val =3D=3D i, + err =3D read_poll_timeout_atomic(netc_read, val, + (val & NETC_CBDRCIR_INDEX) =3D=3D i, NETC_CBDR_DELAY_US, NETC_CBDR_TIMEOUT, true, cbdr->regs.cir); if (unlikely(err)) diff --git a/drivers/net/ethernet/freescale/enetc/ntmp_private.h b/drivers/= net/ethernet/freescale/enetc/ntmp_private.h index 34394e40fddd..7a53db8740db 100644 --- a/drivers/net/ethernet/freescale/enetc/ntmp_private.h +++ b/drivers/net/ethernet/freescale/enetc/ntmp_private.h @@ -12,6 +12,7 @@ =20 #define NTMP_EID_REQ_LEN 8 #define NETC_CBDR_BD_NUM 256 +#define NETC_CBDRCIR_INDEX GENMASK(9, 0) =20 union netc_cbd { struct { --=20 2.34.1 From nobody Mon Jun 15 19:03:11 2026 Received: from AM0PR83CU005.outbound.protection.outlook.com (mail-westeuropeazon11010034.outbound.protection.outlook.com [52.101.69.34]) (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 54F2E3A16A7; Mon, 13 Apr 2026 07:51:09 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=fail smtp.client-ip=52.101.69.34 ARC-Seal: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776066671; cv=fail; b=P/B1y15KP/HPAXGT7Pye48UMBc3uY9IibK/kVBX77ujMTKBnvraAk7ZmI5s20MrvzOAxXrPhkWqcbdx03mpDnUFul0ewY/LNxDSedqT/ot9vkcH1+CLMxUK7RlWnI88/KHlaRCnBGuR40nUDU3yyOng9FnBHtPno3vf3ECSFZJU= ARC-Message-Signature: i=2; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1776066671; c=relaxed/simple; bh=Bu5j7wryZ1dBL2PMdYPlM14y7q5+QS9WusgfseeBCtA=; h=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References: Content-Type:MIME-Version; b=QU2Ey5C0yLI2BNNZRo0AXpaM5SbhNlkQGAdZPWvZo9DbOURO9S4e3/lkesR6ubXDpSVgRrPQ5BINFM+Sw34XodNgkR9hKKnMH996OK3SSho6asQ8EVEuFJtmO66BYZYVI1PxO3anDk2hA0m4gdFrCMVvV3Ckx6A6EbSEIgcdJs8= 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=O6Ql6WQn; arc=fail smtp.client-ip=52.101.69.34 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="O6Ql6WQn" ARC-Seal: i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none; b=slWHGO7t/DSdzFuiQVLbTOa92NWqkI21VZSZRcsJ67Z7SBsTrmsT3OjaiwGMVhfRc/Bj5U1riWPrSjEI69L58jYjJzDtg84CIYFMigPWjlGsERbuQo9LzPUvpP7RqcKxrYhIEkW+TfECu1MGtSSX8H8kQXheGPqLc37mkp1en+l79/SWgngQEeMnhw8ZMBkGD5QQE/Wm0gmREyLPPrr35EWkRFN3wTy9ICqfU/DRcQkoGUXfkBN6+xaDFDSac2uyCX3stRPIPX5aa0hFslNya2FwLguEDcFqMo5c3yTWi8wZ/dtrz0axAnEmtMSAhkIG59SCjrulmge76TX4uC4/Kw== 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=NVlcMmeLWEJsMVz/tTFkQ2TLrqhq+YR2GJPfI66YfDM=; b=Rk1NH9QyghZKS6GSqh75yaorWg2raWvh+j+f+7giu+P80q6rVM166kN8eUdyY32otkaDu4TDHgbYef2x8Zs05lNTjWAb5yRcaQ0mWk+URVsExdv+Shz8x46GkJ55efuQqIx/Ni9tBTvPmsU7Fe+TCHlRExmVLPzGxO+2oR5V1lQYb5OokmOnQR2oiy79uGfYBdPbjFxNXruoQpUuUCrSq5pV5a474E98XPyLJPpjY8Qz26O4C+mbvsJZEOLYjip7XEKONyPVWJ2QrQ2KVBRA3fYSKSkKtKpIShzzsWtyTpYI0XF0cTiyT3Nfcw3BEHtYRAs8azKRzwXxQg7cpRPdcw== 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=NVlcMmeLWEJsMVz/tTFkQ2TLrqhq+YR2GJPfI66YfDM=; b=O6Ql6WQnS3hxd7ZFdnBs7FpNhejziXnMIJrymV9SM3u+UOk8DmAf/IyV3m0Q0lsZD1rsWq1CkW/4VOnMJ9agimgzmtru/E/FhnrJiCeh93dlwcl27H7eaMmr6oDwZdDvtrx3BaDPx8ndaBbH1X0hMTh6uYCrbGHlp/0cUeDXQV/fi97zqaLyndHCPxQCdNFUOV8UYPVLJbYtR0hPUak1EccHEKjsPgMSTxeG5DlZxpFo5nWyIL6Krtndk8pIiMmT6J9o9oLv5zpRUjbJj+rhhp0aqIbh5hk903zJf+oCzH8cBi3dE7EjTwoPOtQx7i56GG+EB4KrL/r812b3OCfvog== Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=nxp.com; Received: from AM8PR04MB7284.eurprd04.prod.outlook.com (2603:10a6:20b:1dc::8) by DBAPR04MB7463.eurprd04.prod.outlook.com (2603:10a6:10:1ad::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.15; Mon, 13 Apr 2026 07:51:06 +0000 Received: from AM8PR04MB7284.eurprd04.prod.outlook.com ([fe80::9cd6:51bd:82b:98dc]) by AM8PR04MB7284.eurprd04.prod.outlook.com ([fe80::9cd6:51bd:82b:98dc%5]) with mapi id 15.20.9769.046; Mon, 13 Apr 2026 07:51:06 +0000 From: Wei Fang To: claudiu.manoil@nxp.com, vladimir.oltean@nxp.com, xiaoning.wang@nxp.com, andrew+netdev@lunn.ch, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, chleroy@kernel.org Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, imx@lists.linux.dev, linuxppc-dev@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org Subject: [PATCH net 2/2] net: enetc: fix NTMP DMA use-after-free issue Date: Mon, 13 Apr 2026 15:52:50 +0800 Message-Id: <20260413075250.281653-3-wei.fang@nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260413075250.281653-1-wei.fang@nxp.com> References: <20260413075250.281653-1-wei.fang@nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: MA5P287CA0236.INDP287.PROD.OUTLOOK.COM (2603:1096:a01:1b1::10) To AM8PR04MB7284.eurprd04.prod.outlook.com (2603:10a6:20b:1dc::8) 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: AM8PR04MB7284:EE_|DBAPR04MB7463:EE_ X-MS-Office365-Filtering-Correlation-Id: 09f9cf77-5439-4df1-7e8a-08de99316ab6 X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0;ARA:13230040|52116014|7416014|376014|1800799024|366016|19092799006|38350700014|56012099003|22082099003|18002099003; X-Microsoft-Antispam-Message-Info: q9gJKUBvfzfmAJ05O7exqnRLWDRdh7l9IiG2Ndt9f1/ZXUztRgaRbHNN2U2lnrv4pb1zt5KyK53PeVN9pTqIO8L0KxFBZxYtwFdTsYMswjqicsoJZBe0ll2O75DFiaXzttpWcxtDCF4YZJVjlb6KeQqx65W2MdzoM4fNeUK1javrbI2Z6FKj1Uz8BlQz9Zu9JZ8sCYEW55G1OtU1rcOEATkg1I4uSa9PmQVtpKLatwvGHVeHrzb4MX9mLvHSxgVN4MxggXNl0FmJcuvm7BVm9oHPSN5TKoqqDAaOa7PcyBs60Lu/A5aGCemw8ukQBmmZc7vNFWypx1KGPEm7IHbHadYCQKVcrBFTb6KlrwM1E11L07NTP+Bd5XSHUDLzix6KS194VnjW1xq9tZTOliGLEjNR9iXNSGjjza+ewLcNAHz2gSFLjhbKrfwBfkUrkygEgYmeoDkKcqIqd2ZWigIAuqafVpYOMdNBwmvoWBx9IxG0emzfMFUmtL0lLFCIg/Jv9Oki3ahpXeW9lJ2vKjvoLz2Dv5fH81sWj2dRg+D+sMcxRV/gmsoZzs7B8uOW+e0r4kDyYWoicMJJpgh6dTPOHSd6Uo8Lca/HuigUDMHHBBgD9fvuUIxLkOJUeNP51a11cvTLGHKBOYC9yIj/f84bZ4nHrm/+8owdBT4jYOhxMdr0MpVsXVDzksaCT/wFP/hoqdE7GlJz7ycIx0Uvn/+w2OSYa/7hxtJvP9yD5ikPPn2DJAa/Kfpqi6ZiztQAuJUn99wcBD8QTnZTVhDoIfJvTQtsqhuoA1g+LVdChz/Y50I= X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM8PR04MB7284.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(52116014)(7416014)(376014)(1800799024)(366016)(19092799006)(38350700014)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?jtFlF6fD/i1NxwvOyWHzDbCn10QfxyWB/CVG9P1R4gubrLYggo8iiQ2Adbn/?= =?us-ascii?Q?lhanFqhPb7inF5SfEn6TIJjTeKaPqcqQOrmHZaFp1hB46vVmhk5qFursF3cM?= =?us-ascii?Q?ygA/uXUc8XvqVJN8eByBwjuiKbsU6Q/hLnWmkGZTOhtfrGB4FmC2sO/QQ5oV?= =?us-ascii?Q?33Dit7Uth8QAbSViaAPjkDK++v2Z7TN2qz/mxq3YIZcM5WtTlyMaZGtx+RMd?= =?us-ascii?Q?RjPe4UjHmoc378bICgTaXBuMyTFlEKHgiCOFkjf7hhFUaiO5moqbEdYqjkIK?= =?us-ascii?Q?FaiOE2XlRjZ3vJchUIBOdbZHRiXsLg+1UEb1ubgvI7NzwuC6fYq/to7J2tPR?= =?us-ascii?Q?lWzfj6ymbqswbmU/9xVQMdp4zLBWUKbuMmgqSM4jIXER+Xo+eFT4ZwPXv6Xv?= =?us-ascii?Q?sa2js3iByB1Hj/oZ0N1btF6x0AP4SxPP+0DMnVg0BxkXwaMXbPsWfH8Hvorj?= =?us-ascii?Q?dD0S1sG1JIHdWK68FSgvWcwKSV5+/AmG12lrR1KaraPya5ww33uUynQ+zYQC?= =?us-ascii?Q?0fLcD1YoioIpLZOU4vmFd50j8BNWe3+ynsw1UQhrw4yh2b6ZJ+KKOG9P2m6f?= =?us-ascii?Q?+K3yjsCaM4t9e6kgkGVObossDPflAGdHEflK5Y0bBrouId73kQTZ5PIvjBEz?= =?us-ascii?Q?FW8ZB1kfnE5SahqrujFIE5mu68qC+N8R19VPBBG5CyHpz6FJAdYHTYaf61N1?= =?us-ascii?Q?x2zPpGyE1dPQi1krEX5a2A8HjvvGEonXJaQ7nBHUv9aQ13H/DjBs2VLid40M?= =?us-ascii?Q?hxd9kiroTV7qOYkpYkFKkJZ0D+jDUON07PHMpdGoPLTt4L6asjhOazyXkUXP?= =?us-ascii?Q?9D3lKI7z6bK+lZ6TkJNkZEEzRy4Wgt2mr4+YqK0DffdXREGtHZDS9/zG+A6u?= =?us-ascii?Q?0BBhiFtMRkL8U3sKD0n256EG2ayuFAjENin49KbWKZzQcEre+k2uCULR25Tf?= =?us-ascii?Q?ugzSx0vJjeQNp0LF4P/UC+Z50mTPL6G6Y3VY6tIQVOlu8HPo04qf3qasG10n?= =?us-ascii?Q?Dr5dcWUfqHGHZUGrrA447dy0CevQGhavqZWIqrnQODw1iii1N5k5AD2bSUp0?= =?us-ascii?Q?pvZivblfzz7XdnC8ESMbzkbICNyqyWCe5P5/eHdLa6R/94h7hJmR9Z6MzMIq?= =?us-ascii?Q?3gYnyGYvDCsrXwdkbpuaHnYNKbssnLuX4AYVB8Bl1dRplUgyjVEw+w3ObH7r?= =?us-ascii?Q?d3wzOMkeu0NB+a/VUMXhqperqiIhWdk/H3b/DRBFxks1ohClCPzLOgZg9ExN?= =?us-ascii?Q?D9WhaYX0HVkdT5tQPcweBA3PyIQYGxj8QkYVZxuAyYnxfuIATUiXTzgGbhgl?= =?us-ascii?Q?bx8pOAM+9Nrn2g/VDWu4Mt5HopQQK2nesW5RhKHTrpHP4kJPRSJPCncFDbbY?= =?us-ascii?Q?vI196PCRiGo/9kKeXcBInN9kL70sTgEA3HOp4s9lMeR5fmhr2SX2kNLBFVwM?= =?us-ascii?Q?k4GV8iSKscmcQU/yHOToFhf1kfmevxgFfOHkWsE0yA85vntGtW8Q9tFqCbTr?= =?us-ascii?Q?+njYlfZ6Ry0D8kSs6MXvaoJ13rdL5eFFAHt4kuM03OfigyzmeyGBo4mJtN0i?= =?us-ascii?Q?1pHUAwOf0bG1GuDjr31pu2gP6AXdLFuM6kg6ZxU4qez5ppOPle8BuMYob/yy?= =?us-ascii?Q?U9VhzwBrzv6LTWyCeJPlpKZfVBovHHd3uP/+AKAR7ToOWxtHx+8SZNQleePm?= =?us-ascii?Q?ckD662Ox4xCtWQPnCGjUAYIAuPjyxoeFbFbG3Hdzwq8WpkQPLzyhAiSvLr3X?= =?us-ascii?Q?D6loQgVTNg=3D=3D?= X-OriginatorOrg: nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 09f9cf77-5439-4df1-7e8a-08de99316ab6 X-MS-Exchange-CrossTenant-AuthSource: AM8PR04MB7284.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 13 Apr 2026 07:51:05.9991 (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: cs7LsRBhwOZHrKKHkzE77RIFmGXBC0rklh01aTQ0ExGbDvDhA2KWF5DM36uJZ0Ve56q0RqJ+EdtzpPoGkIqHvQ== X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBAPR04MB7463 Content-Type: text/plain; charset="utf-8" The AI-generated review reported a potential DMA use-after-free issue [1]. If netc_xmit_ntmp_cmd() times out and returns an error, the pending command is not explicitly aborted, while ntmp_free_data_mem() unconditionally frees the DMA buffer. If the buffer has already been reallocated elsewhere, this may lead to silent memory corruption. Because the hardware eventually processes the pending command and perform a DMA write of the response to the physical address of the freed buffer. To resolve this issue, this patch does the following modifications: 1. Convert cbdr->ring_lock from a spinlock to a mutex The lock was originally a spinlock in case NTMP operations might be invoked from atomic context. After downstream support for all NTMP tables, no such usage has materialized. A mutex lock is now required because the driver now needs to reclaim used BDs and release associated DMA memory within the lock's context, while dma_free_coherent() might sleep. 2. Introduce software command BD (struct netc_swcbd) The hardware write-back overwrites the addr and len fields of the BD, so the driver cannot rely on the hardware BD to free the associated DMA memory. The driver now maintains a software shadow BD storing the DMA buffer pointer, DMA address, and size. And netc_xmit_ntmp_cmd() only reclaims older BDs when the number of used BDs reaches NETC_CBDR_CLEAN_WORK (16). The software BD enables correct DMA memory release. With this, struct ntmp_dma_buf and ntmp_free_data_mem() are no longer needed and are removed. These changes eliminate the DMA use-after-free condition and ensure safe and consistent BD reclamation and DMA buffer lifecycle management. Fixes: 4701073c3deb ("net: enetc: add initial netc-lib driver to support NT= MP") Link: https://lore.kernel.org/netdev/20260403011729.1795413-1-kuba@kernel.o= rg/ # [1] Signed-off-by: Wei Fang --- drivers/net/ethernet/freescale/enetc/ntmp.c | 158 ++++++++++-------- .../ethernet/freescale/enetc/ntmp_private.h | 8 +- include/linux/fsl/ntmp.h | 9 +- 3 files changed, 93 insertions(+), 82 deletions(-) diff --git a/drivers/net/ethernet/freescale/enetc/ntmp.c b/drivers/net/ethe= rnet/freescale/enetc/ntmp.c index 1b1ff0446d0a..3efc65443113 100644 --- a/drivers/net/ethernet/freescale/enetc/ntmp.c +++ b/drivers/net/ethernet/freescale/enetc/ntmp.c @@ -7,6 +7,7 @@ #include #include #include +#include =20 #include "ntmp_private.h" =20 @@ -42,6 +43,12 @@ int ntmp_init_cbdr(struct netc_cbdr *cbdr, struct device= *dev, if (!cbdr->addr_base) return -ENOMEM; =20 + cbdr->swcbd =3D vcalloc(cbd_num, sizeof(struct netc_swcbd)); + if (!cbdr->swcbd) { + dma_free_coherent(dev, size, cbdr->addr_base, cbdr->dma_base); + return -ENOMEM; + } + cbdr->dma_size =3D size; cbdr->bd_num =3D cbd_num; cbdr->regs =3D *regs; @@ -52,7 +59,7 @@ int ntmp_init_cbdr(struct netc_cbdr *cbdr, struct device = *dev, cbdr->addr_base_align =3D PTR_ALIGN(cbdr->addr_base, NTMP_BASE_ADDR_ALIGN); =20 - spin_lock_init(&cbdr->ring_lock); + mutex_init(&cbdr->ring_lock); =20 cbdr->next_to_use =3D netc_read(cbdr->regs.pir); cbdr->next_to_clean =3D netc_read(cbdr->regs.cir) & NETC_CBDRCIR_INDEX; @@ -71,10 +78,25 @@ int ntmp_init_cbdr(struct netc_cbdr *cbdr, struct devic= e *dev, } EXPORT_SYMBOL_GPL(ntmp_init_cbdr); =20 +static void ntmp_free_data_mem(struct device *dev, struct netc_swcbd *swcb= d) +{ + dma_free_coherent(dev, swcbd->size + NTMP_DATA_ADDR_ALIGN, + swcbd->buf, swcbd->dma); +} + void ntmp_free_cbdr(struct netc_cbdr *cbdr) { /* Disable the Control BD Ring */ netc_write(cbdr->regs.mr, 0); + + for (int i =3D 0; i < cbdr->bd_num; i++) { + struct netc_swcbd *swcbd =3D &cbdr->swcbd[i]; + + if (swcbd->dma) + ntmp_free_data_mem(cbdr->dev, swcbd); + } + + vfree(cbdr->swcbd); dma_free_coherent(cbdr->dev, cbdr->dma_size, cbdr->addr_base, cbdr->dma_base); memset(cbdr, 0, sizeof(*cbdr)); @@ -94,24 +116,28 @@ static union netc_cbd *ntmp_get_cbd(struct netc_cbdr *= cbdr, int index) =20 static void ntmp_clean_cbdr(struct netc_cbdr *cbdr) { - union netc_cbd *cbd; - int i; + int i =3D cbdr->next_to_clean; =20 - i =3D cbdr->next_to_clean; while ((netc_read(cbdr->regs.cir) & NETC_CBDRCIR_INDEX) !=3D i) { - cbd =3D ntmp_get_cbd(cbdr, i); + union netc_cbd *cbd =3D ntmp_get_cbd(cbdr, i); + struct netc_swcbd *swcbd =3D &cbdr->swcbd[i]; + + ntmp_free_data_mem(cbdr->dev, swcbd); + memset(swcbd, 0, sizeof(*swcbd)); memset(cbd, 0, sizeof(*cbd)); i =3D (i + 1) % cbdr->bd_num; } =20 + dma_wmb(); cbdr->next_to_clean =3D i; } =20 -static int netc_xmit_ntmp_cmd(struct ntmp_user *user, union netc_cbd *cbd) +static int netc_xmit_ntmp_cmd(struct ntmp_user *user, union netc_cbd *cbd, + struct netc_swcbd *swcbd) { union netc_cbd *cur_cbd; struct netc_cbdr *cbdr; - int i, err; + int i, err, used_bds; u16 status; u32 val; =20 @@ -120,14 +146,21 @@ static int netc_xmit_ntmp_cmd(struct ntmp_user *user,= union netc_cbd *cbd) */ cbdr =3D &user->ring[0]; =20 - spin_lock_bh(&cbdr->ring_lock); + mutex_lock(&cbdr->ring_lock); =20 - if (unlikely(!ntmp_get_free_cbd_num(cbdr))) + used_bds =3D cbdr->bd_num - ntmp_get_free_cbd_num(cbdr); + if (unlikely(used_bds >=3D NETC_CBDR_CLEAN_WORK)) { ntmp_clean_cbdr(cbdr); + if (unlikely(!ntmp_get_free_cbd_num(cbdr))) { + err =3D -EBUSY; + goto cbdr_unlock; + } + } =20 i =3D cbdr->next_to_use; cur_cbd =3D ntmp_get_cbd(cbdr, i); *cur_cbd =3D *cbd; + cbdr->swcbd[i] =3D *swcbd; dma_wmb(); =20 /* Update producer index of both software and hardware */ @@ -135,10 +168,9 @@ static int netc_xmit_ntmp_cmd(struct ntmp_user *user, = union netc_cbd *cbd) cbdr->next_to_use =3D i; netc_write(cbdr->regs.pir, i); =20 - err =3D read_poll_timeout_atomic(netc_read, val, - (val & NETC_CBDRCIR_INDEX) =3D=3D i, - NETC_CBDR_DELAY_US, NETC_CBDR_TIMEOUT, - true, cbdr->regs.cir); + err =3D read_poll_timeout(netc_read, val, (val & NETC_CBDRCIR_INDEX) =3D= =3D i, + NETC_CBDR_DELAY_US, NETC_CBDR_TIMEOUT, + true, cbdr->regs.cir); if (unlikely(err)) goto cbdr_unlock; =20 @@ -155,36 +187,28 @@ static int netc_xmit_ntmp_cmd(struct ntmp_user *user,= union netc_cbd *cbd) dev_err(user->dev, "Command BD error: 0x%04x\n", status); } =20 - ntmp_clean_cbdr(cbdr); - dma_wmb(); - cbdr_unlock: - spin_unlock_bh(&cbdr->ring_lock); + mutex_unlock(&cbdr->ring_lock); =20 return err; } =20 -static int ntmp_alloc_data_mem(struct ntmp_dma_buf *data, void **buf_align) +static int ntmp_alloc_data_mem(struct device *dev, struct netc_swcbd *swcb= d, + void **buf_align) { void *buf; =20 - buf =3D dma_alloc_coherent(data->dev, data->size + NTMP_DATA_ADDR_ALIGN, - &data->dma, GFP_KERNEL); + buf =3D dma_alloc_coherent(dev, swcbd->size + NTMP_DATA_ADDR_ALIGN, + &swcbd->dma, GFP_KERNEL); if (!buf) return -ENOMEM; =20 - data->buf =3D buf; + swcbd->buf =3D buf; *buf_align =3D PTR_ALIGN(buf, NTMP_DATA_ADDR_ALIGN); =20 return 0; } =20 -static void ntmp_free_data_mem(struct ntmp_dma_buf *data) -{ - dma_free_coherent(data->dev, data->size + NTMP_DATA_ADDR_ALIGN, - data->buf, data->dma); -} - static void ntmp_fill_request_hdr(union netc_cbd *cbd, dma_addr_t dma, int len, int table_id, int cmd, int access_method) @@ -235,37 +259,36 @@ static int ntmp_delete_entry_by_id(struct ntmp_user *= user, int tbl_id, u8 tbl_ver, u32 entry_id, u32 req_len, u32 resp_len) { - struct ntmp_dma_buf data =3D { - .dev =3D user->dev, + struct netc_swcbd swcbd =3D { .size =3D max(req_len, resp_len), }; struct ntmp_req_by_eid *req; union netc_cbd cbd; int err; =20 - err =3D ntmp_alloc_data_mem(&data, (void **)&req); + err =3D ntmp_alloc_data_mem(user->dev, &swcbd, (void **)&req); if (err) return err; =20 ntmp_fill_crd_eid(req, tbl_ver, 0, 0, entry_id); - ntmp_fill_request_hdr(&cbd, data.dma, NTMP_LEN(req_len, resp_len), + ntmp_fill_request_hdr(&cbd, swcbd.dma, NTMP_LEN(req_len, resp_len), tbl_id, NTMP_CMD_DELETE, NTMP_AM_ENTRY_ID); =20 - err =3D netc_xmit_ntmp_cmd(user, &cbd); + err =3D netc_xmit_ntmp_cmd(user, &cbd, &swcbd); if (err) dev_err(user->dev, "Failed to delete entry 0x%x of %s, err: %pe", entry_id, ntmp_table_name(tbl_id), ERR_PTR(err)); =20 - ntmp_free_data_mem(&data); - return err; } =20 static int ntmp_query_entry_by_id(struct ntmp_user *user, int tbl_id, - u32 len, struct ntmp_req_by_eid *req, - dma_addr_t dma, bool compare_eid) + struct ntmp_req_by_eid *req, + struct netc_swcbd *swcbd, + bool compare_eid) { + u32 len =3D NTMP_LEN(sizeof(*req), swcbd->size); struct ntmp_cmn_resp_query *resp; int cmd =3D NTMP_CMD_QUERY; union netc_cbd cbd; @@ -277,8 +300,9 @@ static int ntmp_query_entry_by_id(struct ntmp_user *use= r, int tbl_id, cmd =3D NTMP_CMD_QU; =20 /* Request header */ - ntmp_fill_request_hdr(&cbd, dma, len, tbl_id, cmd, NTMP_AM_ENTRY_ID); - err =3D netc_xmit_ntmp_cmd(user, &cbd); + ntmp_fill_request_hdr(&cbd, swcbd->dma, len, tbl_id, cmd, + NTMP_AM_ENTRY_ID); + err =3D netc_xmit_ntmp_cmd(user, &cbd, swcbd); if (err) { dev_err(user->dev, "Failed to query entry 0x%x of %s, err: %pe\n", @@ -306,15 +330,14 @@ static int ntmp_query_entry_by_id(struct ntmp_user *u= ser, int tbl_id, int ntmp_maft_add_entry(struct ntmp_user *user, u32 entry_id, struct maft_entry_data *maft) { - struct ntmp_dma_buf data =3D { - .dev =3D user->dev, + struct netc_swcbd swcbd =3D { .size =3D sizeof(struct maft_req_add), }; struct maft_req_add *req; union netc_cbd cbd; int err; =20 - err =3D ntmp_alloc_data_mem(&data, (void **)&req); + err =3D ntmp_alloc_data_mem(user->dev, &swcbd, (void **)&req); if (err) return err; =20 @@ -323,15 +346,13 @@ int ntmp_maft_add_entry(struct ntmp_user *user, u32 e= ntry_id, req->keye =3D maft->keye; req->cfge =3D maft->cfge; =20 - ntmp_fill_request_hdr(&cbd, data.dma, NTMP_LEN(data.size, 0), + ntmp_fill_request_hdr(&cbd, swcbd.dma, NTMP_LEN(swcbd.size, 0), NTMP_MAFT_ID, NTMP_CMD_ADD, NTMP_AM_ENTRY_ID); - err =3D netc_xmit_ntmp_cmd(user, &cbd); + err =3D netc_xmit_ntmp_cmd(user, &cbd, &swcbd); if (err) dev_err(user->dev, "Failed to add MAFT entry 0x%x, err: %pe\n", entry_id, ERR_PTR(err)); =20 - ntmp_free_data_mem(&data); - return err; } EXPORT_SYMBOL_GPL(ntmp_maft_add_entry); @@ -339,33 +360,27 @@ EXPORT_SYMBOL_GPL(ntmp_maft_add_entry); int ntmp_maft_query_entry(struct ntmp_user *user, u32 entry_id, struct maft_entry_data *maft) { - struct ntmp_dma_buf data =3D { - .dev =3D user->dev, + struct netc_swcbd swcbd =3D { .size =3D sizeof(struct maft_resp_query), }; struct maft_resp_query *resp; struct ntmp_req_by_eid *req; int err; =20 - err =3D ntmp_alloc_data_mem(&data, (void **)&req); + err =3D ntmp_alloc_data_mem(user->dev, &swcbd, (void **)&req); if (err) return err; =20 ntmp_fill_crd_eid(req, user->tbl.maft_ver, 0, 0, entry_id); - err =3D ntmp_query_entry_by_id(user, NTMP_MAFT_ID, - NTMP_LEN(sizeof(*req), data.size), - req, data.dma, true); + err =3D ntmp_query_entry_by_id(user, NTMP_MAFT_ID, req, &swcbd, true); if (err) - goto end; + return err; =20 resp =3D (struct maft_resp_query *)req; maft->keye =3D resp->keye; maft->cfge =3D resp->cfge; =20 -end: - ntmp_free_data_mem(&data); - - return err; + return 0; } EXPORT_SYMBOL_GPL(ntmp_maft_query_entry); =20 @@ -379,8 +394,8 @@ EXPORT_SYMBOL_GPL(ntmp_maft_delete_entry); int ntmp_rsst_update_entry(struct ntmp_user *user, const u32 *table, int count) { - struct ntmp_dma_buf data =3D {.dev =3D user->dev}; struct rsst_req_update *req; + struct netc_swcbd swcbd; union netc_cbd cbd; int err, i; =20 @@ -388,8 +403,8 @@ int ntmp_rsst_update_entry(struct ntmp_user *user, cons= t u32 *table, /* HW only takes in a full 64 entry table */ return -EINVAL; =20 - data.size =3D struct_size(req, groups, count); - err =3D ntmp_alloc_data_mem(&data, (void **)&req); + swcbd.size =3D struct_size(req, groups, count); + err =3D ntmp_alloc_data_mem(user->dev, &swcbd, (void **)&req); if (err) return err; =20 @@ -399,24 +414,22 @@ int ntmp_rsst_update_entry(struct ntmp_user *user, co= nst u32 *table, for (i =3D 0; i < count; i++) req->groups[i] =3D (u8)(table[i]); =20 - ntmp_fill_request_hdr(&cbd, data.dma, NTMP_LEN(data.size, 0), + ntmp_fill_request_hdr(&cbd, swcbd.dma, NTMP_LEN(swcbd.size, 0), NTMP_RSST_ID, NTMP_CMD_UPDATE, NTMP_AM_ENTRY_ID); =20 - err =3D netc_xmit_ntmp_cmd(user, &cbd); + err =3D netc_xmit_ntmp_cmd(user, &cbd, &swcbd); if (err) dev_err(user->dev, "Failed to update RSST entry, err: %pe\n", ERR_PTR(err)); =20 - ntmp_free_data_mem(&data); - return err; } EXPORT_SYMBOL_GPL(ntmp_rsst_update_entry); =20 int ntmp_rsst_query_entry(struct ntmp_user *user, u32 *table, int count) { - struct ntmp_dma_buf data =3D {.dev =3D user->dev}; struct ntmp_req_by_eid *req; + struct netc_swcbd swcbd; union netc_cbd cbd; int err, i; u8 *group; @@ -425,21 +438,21 @@ int ntmp_rsst_query_entry(struct ntmp_user *user, u32= *table, int count) /* HW only takes in a full 64 entry table */ return -EINVAL; =20 - data.size =3D NTMP_ENTRY_ID_SIZE + RSST_STSE_DATA_SIZE(count) + - RSST_CFGE_DATA_SIZE(count); - err =3D ntmp_alloc_data_mem(&data, (void **)&req); + swcbd.size =3D NTMP_ENTRY_ID_SIZE + RSST_STSE_DATA_SIZE(count) + + RSST_CFGE_DATA_SIZE(count); + err =3D ntmp_alloc_data_mem(user->dev, &swcbd, (void **)&req); if (err) return err; =20 /* Set the request data buffer */ ntmp_fill_crd_eid(req, user->tbl.rsst_ver, 0, 0, 0); - ntmp_fill_request_hdr(&cbd, data.dma, NTMP_LEN(sizeof(*req), data.size), + ntmp_fill_request_hdr(&cbd, swcbd.dma, NTMP_LEN(sizeof(*req), swcbd.size), NTMP_RSST_ID, NTMP_CMD_QUERY, NTMP_AM_ENTRY_ID); - err =3D netc_xmit_ntmp_cmd(user, &cbd); + err =3D netc_xmit_ntmp_cmd(user, &cbd, &swcbd); if (err) { dev_err(user->dev, "Failed to query RSST entry, err: %pe\n", ERR_PTR(err)); - goto end; + return err; } =20 group =3D (u8 *)req; @@ -447,10 +460,7 @@ int ntmp_rsst_query_entry(struct ntmp_user *user, u32 = *table, int count) for (i =3D 0; i < count; i++) table[i] =3D group[i]; =20 -end: - ntmp_free_data_mem(&data); - - return err; + return 0; } EXPORT_SYMBOL_GPL(ntmp_rsst_query_entry); =20 diff --git a/drivers/net/ethernet/freescale/enetc/ntmp_private.h b/drivers/= net/ethernet/freescale/enetc/ntmp_private.h index 7a53db8740db..5ae6f8b92700 100644 --- a/drivers/net/ethernet/freescale/enetc/ntmp_private.h +++ b/drivers/net/ethernet/freescale/enetc/ntmp_private.h @@ -13,6 +13,7 @@ #define NTMP_EID_REQ_LEN 8 #define NETC_CBDR_BD_NUM 256 #define NETC_CBDRCIR_INDEX GENMASK(9, 0) +#define NETC_CBDR_CLEAN_WORK 16 =20 union netc_cbd { struct { @@ -55,13 +56,6 @@ union netc_cbd { } resp_hdr; /* NTMP Response Message Header Format */ }; =20 -struct ntmp_dma_buf { - struct device *dev; - size_t size; - void *buf; - dma_addr_t dma; -}; - struct ntmp_cmn_req_data { __le16 update_act; u8 dbg_opt; diff --git a/include/linux/fsl/ntmp.h b/include/linux/fsl/ntmp.h index 916dc4fe7de3..83a449b4d6ec 100644 --- a/include/linux/fsl/ntmp.h +++ b/include/linux/fsl/ntmp.h @@ -31,6 +31,12 @@ struct netc_tbl_vers { u8 rsst_ver; }; =20 +struct netc_swcbd { + void *buf; + dma_addr_t dma; + size_t size; +}; + struct netc_cbdr { struct device *dev; struct netc_cbdr_regs regs; @@ -44,9 +50,10 @@ struct netc_cbdr { void *addr_base_align; dma_addr_t dma_base; dma_addr_t dma_base_align; + struct netc_swcbd *swcbd; =20 /* Serialize the order of command BD ring */ - spinlock_t ring_lock; + struct mutex ring_lock; }; =20 struct ntmp_user { --=20 2.34.1