From nobody Thu Dec 18 09:45:24 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 84DCDC71145 for ; Thu, 24 Aug 2023 09:17:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S235391AbjHXJRD (ORCPT ); Thu, 24 Aug 2023 05:17:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49542 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235761AbjHXJQy (ORCPT ); Thu, 24 Aug 2023 05:16:54 -0400 Received: from EUR03-AM7-obe.outbound.protection.outlook.com (mail-am7eur03on2060.outbound.protection.outlook.com [40.107.105.60]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 88EEEE67; Thu, 24 Aug 2023 02:16:52 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=d96RtTeURTrKVJCGdNyiOkbuyzDXGfMaKClztol2/So4OkkralBQHYgjo/ZyXac7AWp03FTk7PDUF7XHWO1T44/gfDyvpg+U5NaF0L0Y8laTf89tu1PZxGbMqYQO4JZc71E4AL0m2oR3MjmucrTlTdCExmeGiGPhK3VIUYP2Tdbesy0vmlEvBqGo5241r7w7iimW8B6+mREuCYiv1z99tyHtjcpZxAxR4SCvaWXJ3In0lKsWaMW25n3eEHDSO42/L/0HAgS8m6NkhM53sXs34TeV0MM1iqs8cP5h/9NQXDENk0oDmjEfk8UaoTbPBU9dGZ33nFMwXoP8zPS0WTMM4w== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=tgx0pUFZM7N0x0EXfoI1OD2JlPRCOyOFZ6OmvcuZ+tw=; b=clvE8/ZNFPj0/4gsbPD3cVZkl/3mA2yxiTyWyiETGHl0pnBN2cAhXjx+WJs0HBB3z4prQGW24yiKcatWLTTNHBb2y77MtuDYLvl/wxhPeA+5ZrdsSuBJcEo7LxmsSHkD1qBd7kNIXgwYy2d1dW+rZ/R2sNy3EmMxYVG6YWU4PFmITjbDOOaMvHfIcTH9Yy4SpKhNU/aharjwzxIwqNuqgzdu7TiGm0qQcp+xXMRlKsEAcWTmvefCP0kxfbMq8SnNtYR7DCAudarV5EFDggkO5hPd3NWC4ku+S0V80FJuaCx/Rk75a59wxN2nVTasO+fFX14pciAtnKFgQIfij6yYAA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector2-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=tgx0pUFZM7N0x0EXfoI1OD2JlPRCOyOFZ6OmvcuZ+tw=; b=fW0aVbZmPh8yB8LJkD0jLlHU3bHm3kN70vlNO3O/9OMofdEF9WIkKF0VzrYqC+LS2wOypT4e2uIf259hQyArS482hsQN4Lp5p2o50hx9uFmh86BWqCrczcz3DfuXwJlg4eHKIalO2BMcgws3L00Wkhi2Z5ab6gS1LAMXc5o43cA= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM9PR04MB8954.eurprd04.prod.outlook.com (2603:10a6:20b:409::7) by AM9PR04MB8260.eurprd04.prod.outlook.com (2603:10a6:20b:3e6::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6699.27; Thu, 24 Aug 2023 09:16:49 +0000 Received: from AM9PR04MB8954.eurprd04.prod.outlook.com ([fe80::2545:6d13:5905:bf50]) by AM9PR04MB8954.eurprd04.prod.outlook.com ([fe80::2545:6d13:5905:bf50%5]) with mapi id 15.20.6678.031; Thu, 24 Aug 2023 09:16:49 +0000 From: "Radu Pirea (NXP OSS)" To: andrew@lunn.ch, hkallweit1@gmail.com, linux@armlinux.org.uk, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, richardcochran@gmail.com, sd@queasysnail.net, sebastian.tobuschat@nxp.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, "Radu Pirea (NXP OSS)" Subject: [RFC net-next v2 1/5] net: macsec: documentation for macsec_context and macsec_ops Date: Thu, 24 Aug 2023 12:16:11 +0300 Message-Id: <20230824091615.191379-2-radu-nicolae.pirea@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230824091615.191379-1-radu-nicolae.pirea@oss.nxp.com> References: <20230824091615.191379-1-radu-nicolae.pirea@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0PR10CA0116.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:e6::33) To AM9PR04MB8954.eurprd04.prod.outlook.com (2603:10a6:20b:409::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM9PR04MB8954:EE_|AM9PR04MB8260:EE_ X-MS-Office365-Filtering-Correlation-Id: bc73f032-9cf3-4c15-c953-08dba482d8e2 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: FJAY/OdrQ9y4AwPvic847JtKHLa6DPlS3PeEU8wpGsYCUY+Fyg+OPH9ez71foUkeGQUoIeBhZ5jpukbZXVyLMh24eywZAQF2wZd+XgugztSn8e4whP757VQZipFUOd7ak3OAWH04RlvhPCE2BUPqRED4gVb4TwyguIqVrj1CxPq2yWP1yUlqfvJfUQFdki5tGmw96ocS5ZG983xOwN4U6Jlm9nxb7ZMy1Ufseza+ALsY6V86lQrpeHgORy8nUq0H/1KRlzjYYD5CALFJhPha48EdTm5cT+7rZTM5HCOz/w7u/qxZV9AERNpj7Ya4IyaGxpdzjaEIe+O+qadVnCd14DN0WUsdW1orWHZ9H8h9JG0NmfEfoIih1zdsH3O0+Co5G+DwhNnbBw2DJDheLRICUnuXm+fMYR9JElaIO5vhKXu+0xs7RWVNua2EFsGt4Tz7FiLfRocwyduJmhpSx3RUunBjXmz9mMb+y11M69PTkk8RClVjDwWYLt99jzaypp6Pq978w4OJ9VfUAiL2fqKLJdhK6qfR4QcMG05K3XILlHp8pRAUZEfMF+1V/ujEhZgpaRsvkMKdstI10b/cVqBF3UazmSAnv/H7AGnISfhzDtotC+YihvNUNmzfzvomMmS+TBZW00AR0EpzyjTuQe/bAA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM9PR04MB8954.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(136003)(346002)(396003)(39860400002)(376002)(366004)(451199024)(186009)(1800799009)(66556008)(66946007)(66476007)(316002)(478600001)(26005)(38350700002)(6666004)(921005)(38100700002)(41300700001)(52116002)(86362001)(6512007)(6486002)(2906002)(6506007)(4326008)(8676002)(8936002)(1076003)(2616005)(5660300002)(7416002)(83380400001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?SrdinqX+XJ6lq8q/KIdc6lui+RYMF/7OL/XRSSJGDzIuSEOZc2L9KoWt8hKY?= =?us-ascii?Q?6LQ5zPNT1QayETTGklUbNI1Zc/aJsaJ8XUVqcuVO6F8YhDHzCfDqCf4brs3D?= =?us-ascii?Q?GpQMpAqtkIlNGCFLF6qRz0H2Ejsm/MNP0ZE4XTvryLwMpa59lkQy3jfGeFW2?= =?us-ascii?Q?AH7kNHkkwm4TKHJLXP/D23t6QAAZ0INj+ouEgHosplzwLlUF5qhq/kXbKIKD?= =?us-ascii?Q?NQKrQ8BuIlgXMuHg+swSyQqpHbZdI7w4k0Ok8WtjM5b2MlR89T86Zr2LCMNu?= =?us-ascii?Q?oiQlGqFCke9BEFawAjWa2TU4yGXNChFbOSvMiXBjULI4pBszBPXeescDqw9W?= =?us-ascii?Q?yWf6zRejrfEJu5yNfo94/s8/qSDbVdTQXHf+DTMFlwooOouWEjgu6P0spXSY?= =?us-ascii?Q?FokZIWGQX0VwjiDEtpWIKC+6052WNCCwXAftBYPuQ38aSSPySxsqyxcDn5uM?= =?us-ascii?Q?Ptn8/W5tQlMEfjLG6IyW1RcRg8U3xIbmnyLM4q2FyHSxU+LSTd3KxnJrRNJt?= =?us-ascii?Q?znGcqq2aoS0P+uhYbxSroppIKGGjZCy6olLyfUCcChoKRsy1d+65ZcQyLGsE?= =?us-ascii?Q?s9Nm3Ev/9YW2xZ0420NoWMMRz2ifl9gzL8eqbIrPqpSAJlSF+zyQ9Y8W6aHm?= =?us-ascii?Q?zqAgx+5/ubKFnIEzkcyRczWJzc/TonXlVPuyYn3TMGY3X037jL3wVfRo45Wj?= =?us-ascii?Q?/Shg+DRC7vrCp83AKVvLRkr231J/IKHBX4JeKALg+NAOkksUaMQAd4iGC1XB?= =?us-ascii?Q?v2gx36+jtUZgho5o/gyKDE7bf4MveMd8y31qH3JoINP5/cSyuUq1aipYuic2?= =?us-ascii?Q?WnBIpUlfnWu4gIHMgn76QlIpZTJ66+FoIOQvGATtsPxqyh2tDWh2CVEYusTI?= =?us-ascii?Q?KmOIzVzg40dJ68f1R6DMkeyE574OTzOUfJa845tttocE3+dPae42525TCjIX?= =?us-ascii?Q?hlk2LukiHa9UxDjH0KvWPEw1/FiLwcIZuLT8uAAItssY7HS+h8JAisCPXPPL?= =?us-ascii?Q?UCM4PDun+kQSEdBaXUh1v8ReglWUpkvX7eESMj/FEq73M9PJHm6FyPG/diyH?= =?us-ascii?Q?2D6q5cHstD46mV2QRd1I1DRAp8U9P3bV9Lx9hycd/nVYZbbG7saY6YIMaeiG?= =?us-ascii?Q?LaRfM01KFVlwGeQXnjClGvL1EncK5/+IEppqgC8kvOyzYFYWZalo/iwVunHX?= =?us-ascii?Q?4GTe+wOnnXvk9+x9OACkdvvmwn3pfjkzIJDNzl+nmWw1LpXVtRIgEkcbv/e+?= =?us-ascii?Q?YcCIK4HqnoJo0sAm2Q46950px2zzntYLYqXC4V0LhebuQnCmOTZS9k3gb3gt?= =?us-ascii?Q?pCELlotQQ9lSMZH4TYcCDyUMUjqWN++Pg0i9e830GPB4mGCc0EcDdh00n7Xz?= =?us-ascii?Q?ldJ1sDPeQ4K64n9rAlg8ycsa/Guwp8B2T57KM/JCVA+mQYUhmITgHEcVZzYM?= =?us-ascii?Q?4NRqCPuTeks6P7bqasOfcbGnyF7B4zQqsWIZ3Bybx33O9TqEw4Dh1W1Q8LRt?= =?us-ascii?Q?QsbW3T8vfF7O72GOTK5kqHMxFaaruLWl7WlwGVENmQwtTJSf3VnRyWbHijTc?= =?us-ascii?Q?58lpg+iVkysL5mzEdgmuaLneopaotDlJxt85eGw5cFHBIHse7enWW20anWYH?= =?us-ascii?Q?rQ=3D=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: bc73f032-9cf3-4c15-c953-08dba482d8e2 X-MS-Exchange-CrossTenant-AuthSource: AM9PR04MB8954.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Aug 2023 09:16:49.6975 (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: LWWig6xyQZD9DN8EJ4/A3eP9j9GyXQ/ZShBsTcNQzgS24QVHIBOilIDAGy0bYQkIcsUB2PPH3a9z0IG1zMzBTpl96TEpl7rA0XJCDfilgb4= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR04MB8260 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add description for fields of struct macsec_context and struct macsec_ops. Signed-off-by: Radu Pirea (NXP OSS) --- include/net/macsec.h | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/include/net/macsec.h b/include/net/macsec.h index 441ed8fd4b5f..76f024727bb4 100644 --- a/include/net/macsec.h +++ b/include/net/macsec.h @@ -247,6 +247,20 @@ struct macsec_secy { =20 /** * struct macsec_context - MACsec context for hardware offloading + * @netdev: pointer to the netdev if the SecY is offloaded to a MAC + * @phydev: pointer to the phydev if the SecY is offloaded to a PHY + * @offload: MACsec offload status + * @secy: pointer to a MACsec SecY + * @rx_sc: pointer to a RX SC + * @assoc_num: association number of the target SA + * @key: key of the target SA + * @rx_sa: pointer to an RX SA if a RX SA is added/updated/removed + * @tx_sa: pointer to an TX SA if a TX SA is added/updated/removed + * @tx_sc_stats: pointer to TX SC stats structure + * @tx_sa_stats: pointer to TX SA stats structure + * @rx_sc_stats: pointer to TX SC stats structure + * @rx_sa_stats: pointer to RX SA stats structure + * @dev_stats: pointer to dev stats structure */ struct macsec_context { union { @@ -276,6 +290,28 @@ struct macsec_context { =20 /** * struct macsec_ops - MACsec offloading operations + * @mdo_dev_open: called when the MACsec interface transitions to the up s= tate + * @mdo_dev_stop: called when the MACsec interface transitions to the down + * state + * @mdo_add_secy: called when a new SecY is added + * @mdo_upd_secy: called when the SecY flags are changed or the MAC addres= s of + * the MACsec interface is changed + * @mdo_del_secy: called when the hw offload is disabled or the MACsec + * interface is removed + * @mdo_add_rxsc: called when a new RX SC is added + * @mdo_upd_rxsc: called when a certain RX SC is updated + * @mdo_del_rxsc: called when a certain RX SC is removed + * @mdo_add_rxsa: called when a new RX SA is added + * @mdo_upd_rxsa: called when a certain RX SA is updated + * @mdo_del_rxsa: called when a certain RX SA is removed + * @mdo_add_txsa: called when a new TX SA is added + * @mdo_upd_txsa: called when a certain TX SA is updated + * @mdo_del_txsa: called when a certain TX SA is removed + * @mdo_get_dev_stats: called when dev stats are read + * @mdo_get_tx_sc_stats: called when TX SC stats are read + * @mdo_get_tx_sa_stats: called when TX SA stats are read + * @mdo_get_rx_sc_stats: called when RX SC stats are read + * @mdo_get_rx_sa_stats: called when RX SA stats are read */ struct macsec_ops { /* Device wide */ --=20 2.34.1 From nobody Thu Dec 18 09:45:24 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id CA82AC83003 for ; Thu, 24 Aug 2023 09:17:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240602AbjHXJRJ (ORCPT ); Thu, 24 Aug 2023 05:17:09 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49548 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S235807AbjHXJQz (ORCPT ); Thu, 24 Aug 2023 05:16:55 -0400 Received: from EUR03-AM7-obe.outbound.protection.outlook.com (mail-am7eur03on2060.outbound.protection.outlook.com [40.107.105.60]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 8D64E10FA; Thu, 24 Aug 2023 02:16:53 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Ya5Wf/KtY2DmorBh8JiSvMnIgGl8hHocjhScuU7jMCoo6fLht44vLJzebSbGLlxqWskRtLMFTvwuh4mt9ZwSshHRNNrsuz1MSCuX4cwUHgNQ4RkLv5KEL2f0qm0PRkCwGFNt8lzSB7VXXyO4eqTKxdFvgiPPBga2MMnMXDjJCRXFeyUiCCmBAoG6jerit8ZGt2NGhGz6RvFvFG1wxp/76HuLJS2Eay/8F5eqqSb2WbTBHWpjk5r8uB+kTrAQLVhZpqDqij0T0FwZ457T7cGRgTpYEFiHXjcj1M6Ti7lq7bwY8RiygnvuWULpwvpY6mPmOR3G72U66iMedRtmqqxJsw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=mrBXvO1CeyVbXiCrvIumv5XwqqfCDIbbgamdkGLIRKo=; b=ZzcHM4CBpV+WbIWVhi3jVyMC2p6KBFDkCzqQ4nyUe6h+vS3s5Zbssiu7ZIEIEdp7t0e8i62BAgW0Peyz2bdXIavZAb0REIt6H8FzB7UdCM+VRnr4gsXDMPXleMuPiPqrGCFXwBRg9tcr98rbgn4uTfKLUhn0buu1a9SgDjZZYylHgRlnu4s+lkr16VvcByEL3QQx6BV+7iElfj1TvPykY5VA1pvQu8Hj7fFY9h3SeXD6eXqB9MqcPGrXcQdXiJubBCFj0wmxdGACd3a792+fEKDUKiZjtZYflihcyvXKQfcQ9cSU2Q/H3VZinEW8JVwQEqMjjLcJCdzwjbioWvoEfg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector2-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=mrBXvO1CeyVbXiCrvIumv5XwqqfCDIbbgamdkGLIRKo=; b=bIF4q1TMNet57yEZAzJKg3VEZXwnn73lMPtXurXvTXaRVgdMHCp9tFYSoiYf3byaiiEbN907DqWhOlDHcxgetLgVwhY5F5dW3RCi+7Zshjms45hEMUp8woR1eZyDviiHTLCcXGUNPWPqpl0QYQahgb3tiBiKUwmDdHDUE7fVdpI= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM9PR04MB8954.eurprd04.prod.outlook.com (2603:10a6:20b:409::7) by AM9PR04MB8260.eurprd04.prod.outlook.com (2603:10a6:20b:3e6::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6699.27; Thu, 24 Aug 2023 09:16:50 +0000 Received: from AM9PR04MB8954.eurprd04.prod.outlook.com ([fe80::2545:6d13:5905:bf50]) by AM9PR04MB8954.eurprd04.prod.outlook.com ([fe80::2545:6d13:5905:bf50%5]) with mapi id 15.20.6678.031; Thu, 24 Aug 2023 09:16:50 +0000 From: "Radu Pirea (NXP OSS)" To: andrew@lunn.ch, hkallweit1@gmail.com, linux@armlinux.org.uk, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, richardcochran@gmail.com, sd@queasysnail.net, sebastian.tobuschat@nxp.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, "Radu Pirea (NXP OSS)" Subject: [RFC net-next v2 2/5] net: macsec: introduce mdo_insert_tx_tag Date: Thu, 24 Aug 2023 12:16:12 +0300 Message-Id: <20230824091615.191379-3-radu-nicolae.pirea@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230824091615.191379-1-radu-nicolae.pirea@oss.nxp.com> References: <20230824091615.191379-1-radu-nicolae.pirea@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0PR10CA0116.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:e6::33) To AM9PR04MB8954.eurprd04.prod.outlook.com (2603:10a6:20b:409::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM9PR04MB8954:EE_|AM9PR04MB8260:EE_ X-MS-Office365-Filtering-Correlation-Id: 5bead965-79a7-4f0f-7f91-08dba482d982 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: oTn4vp6NRibPdwhaV2H4yO6h9nGFklcyt5tQ9PVR9OszIkXs9hX+cNRrtndhn+q9VQbWvxf1k7SNjnyEqkqmOrQG/QqwSu5CaierH47Ck5nfRBv+emuc8bzAv9mEtrpLgjMPDF0I1s/5ipFPFDSJvk6Wap+gjaPKc3A9dsnT7UF50+7L8Ah2Dr+FvgQmCqMInXkj9X7aZzGqj7Jitr4UHnJ6jVxBqIIU+xgXJCPvCQD9Z+Ai+q9X51PgN3ZYWLHiGKZX/Ec6xIflTwHw58LenY8gj56xGdeCOX0/N/iUWxzyVDg1KQgTxsnYCfaYcxfnAbe2B/VQwpLUjTlhPU9whftYluKoOlIY6PlyL2hV70oPj3vs286FE7LFFBQTWlzg4HcUAajRm9tnS5W7Fn1HEGsle0tjdYCWhhTYSHxmBbgWfRKtCBFMw9wNJ3oMj61igfwFfEZY4d9fF8ahJErlQ/5kaSPgWLZsyv5GLIfelcwfhBMfaKApNci8TtlknGxQReZaPN0MVaE1CAeeiXaB7/Zppw073vgGI2e+hS3cXT6Nds6GSsNefyDiBV8U9PT2wOnsy/vBAW/+7RCNf/5C/aaRy/D7pdl/6PClvYhw5jOc6cpvDql977DnwjlVT5sRuUXX4pbKlqHTbngsjOtNoA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM9PR04MB8954.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(136003)(346002)(396003)(39860400002)(376002)(366004)(451199024)(186009)(1800799009)(66556008)(66946007)(66476007)(316002)(478600001)(26005)(38350700002)(6666004)(921005)(38100700002)(41300700001)(52116002)(86362001)(6512007)(6486002)(2906002)(6506007)(4326008)(8676002)(8936002)(66899024)(1076003)(2616005)(5660300002)(7416002)(83380400001);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?6eOyO6xhwi7eG1mjw+Hhg81X7Mw5isJyJY2OwRBJOxvmtfqBIza7dCuFvW2M?= =?us-ascii?Q?rEyrjjCl0GYly/ovb5vOV4L5dUeJGi3a799T0FVCCjJKAwiN0W1cxFCnkpeZ?= =?us-ascii?Q?anB6j8DVJ9LcsqvlrP95IaUIH578UOd4IRijsGmMcwf5bbKY2hK0naxxo2MF?= =?us-ascii?Q?4QSY+pwmihXHeeV2UxDczAhgkq793SbTka2wt7SeTFEmqmbndCky6hs06u0N?= =?us-ascii?Q?u8xtaY/rvH8MKyAiFyvW9f/veBoxBW/mE0DFN+hgACWgigkXpQxDevnpNAEt?= =?us-ascii?Q?Jh/g9iVBhhwbZBK4cF9NaexzabO2siC+V36UguN5n95TMXCPtePLSZzy7T2Q?= =?us-ascii?Q?JiNHe43Ly/ambdBDiP40RXqlFyOB/010FEbcsaW7I7IPivNf6shhbaPCekVx?= =?us-ascii?Q?YSQdDsFw2UYF7iMBrBVutja+3dL+y+k0gYZXsX8l0AsJ6driqdtMbGSM/tO8?= =?us-ascii?Q?pQ6NeTOwpuCNuRrM4ve/JVsPTZXc1eZtADp1C8m97uPLJ3y59fFoIZn/IgFq?= =?us-ascii?Q?2a2F/P9aGK85p2HcI7S652haoMJXw7vmzjRFiYMDoo7g7AgWZjDiEdp4ZMRy?= =?us-ascii?Q?1bxYDw5EQJVHHhaNu2eCbF+m5UcESCHhPqNDRwDWT8Y7fHLd+sUyeoYbgp0W?= =?us-ascii?Q?z3JToJ+NaaPmTkpjca6xatMz20ib6xXIbSV4eznnLmk2RbH0LlqldRkOG9p6?= =?us-ascii?Q?mE46qP1BOWljXJGvOU5RXC0e6y8Kmt3a0d4CXeLqidgMYc+2pt+skybigTWZ?= =?us-ascii?Q?16HoIRKoHZBtaVYOMos5ZgjZg3RwgYdkwjF9IHNlEqrFb7ehOGR3bWJuBcy5?= =?us-ascii?Q?9bXNSk7Deka0cV0v5Oa5FUFpuf1Pgc/dmDFmeR0tgiJdWj7V2hxcjiCSB2qU?= =?us-ascii?Q?didCWRq/YfeN2H/BaovqSMx1v86lNIJKVPtknLrLhX4gtaZm3gvg87kgSorQ?= =?us-ascii?Q?pT9cGrrtikrIKhtWFbTIlZQp1/z1V/urd2AIxWHT6sO0eZYg7f3P+STRN7ml?= =?us-ascii?Q?qzGXKlcFM5bvQG+OU9UHRO0FLB0UkrnGN/vZmoLE3ou2cif/+Bp5TzYWzL/H?= =?us-ascii?Q?sf82Yk1/L5a1QYsUtZvI7706hZYiJj9usgWW2o/74nuqNI6n6/NCLk3KKFgq?= =?us-ascii?Q?TP1HFS1g9kqu0gLgi+IUJnpRalcwVs+yQrLlMSt2sqIE+VM0AfNU1rJXerW7?= =?us-ascii?Q?n5f6U1a1v347w2rwdrLi95OMCimxebjiHuiJ2/C5r2YPb6/12JTx+BTs73Xv?= =?us-ascii?Q?/FrViiMgEfK/+yoQlmZ9Sgv5FWw2oh8UHNCb1lt4Fu6P8Y/i2hPB6l7X++w8?= =?us-ascii?Q?ltahBnNZX6B/+pL2qSvZgYj9BKh+cI0VdGnD7QkiM8IfaFKDovbC62VAZ2Ch?= =?us-ascii?Q?DzO/c+nhhStfB13dM7brGoRIsix6HjF9SzjYONVOMH/tFDlnEpUeRRQET5vo?= =?us-ascii?Q?LkTBy92fQ2fwNtdkGAh/19XEri67c/29+NWOWFO3UoBkI7ObvuqmOOgdzd6E?= =?us-ascii?Q?1ENMMwZo88bcuBbZ/3HEVHklbCCqfb5E1QspQtrg8rxFzV1GKAdM1ptmrK3P?= =?us-ascii?Q?D5z8UStG4nx3CRnKXZQlzCJ9FpTvZV3c/QRshNE7yFkojX5HqKlzLxrTWGGq?= =?us-ascii?Q?Mw=3D=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 5bead965-79a7-4f0f-7f91-08dba482d982 X-MS-Exchange-CrossTenant-AuthSource: AM9PR04MB8954.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Aug 2023 09:16:50.6762 (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: VH8OTLaqMHer7juAN3X+0BdYQBwrgSGba6bWizr6aW3RlG9yNzwMBSYCf5PJxupTz4bPKZVJKK5uh6bGc1zWJzylCrDEeQpz71QZaX1de/A= X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM9PR04MB8260 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Offloading MACsec in PHYs requires inserting the SecTAG and the ICV in the ethernet frame. This operation will increase the frame size with up to 32 bytes. If the frames are sent at line rate, the PHY will not have enough room to insert the SecTAG and the ICV. Some PHYs use a hardware buffer to store a number of ethernet frames and, if it fills up, a pause frame is sent to the MAC to control the flow. This HW implementation does not need any modification in the stack. Other PHYs might offer to use a specific ethertype with some padding bytes present in the ethernet frame. This ethertype and its associated bytes will be replaced by the SecTAG and ICV. mdo_insert_tx_tag allows the PHY drivers to add any specific tag in the skb. Signed-off-by: Radu Pirea (NXP OSS) --- drivers/net/macsec.c | 96 +++++++++++++++++++++++++++++++++++++++++++- include/net/macsec.h | 10 +++++ 2 files changed, 105 insertions(+), 1 deletion(-) diff --git a/drivers/net/macsec.c b/drivers/net/macsec.c index ae60817ec5c2..5541aaced61f 100644 --- a/drivers/net/macsec.c +++ b/drivers/net/macsec.c @@ -93,6 +93,7 @@ struct pcpu_secy_stats { * @secys: linked list of SecY's on the underlying device * @gro_cells: pointer to the Generic Receive Offload cell * @offload: status of offloading on the MACsec device + * @insert_tx_tag: insert tx tag if true */ struct macsec_dev { struct macsec_secy secy; @@ -102,6 +103,7 @@ struct macsec_dev { struct list_head secys; struct gro_cells gro_cells; enum macsec_offload offload; + bool insert_tx_tag; }; =20 /** @@ -2582,6 +2584,33 @@ static bool macsec_is_configured(struct macsec_dev *= macsec) return false; } =20 +static bool macsec_can_insert_tx_tag(struct macsec_dev *macsec, + const struct macsec_ops *ops) +{ + return macsec->offload =3D=3D MACSEC_OFFLOAD_PHY && + ops->mdo_insert_tx_tag; +} + +static void macsec_adjust_room(struct net_device *dev, + const struct macsec_ops *ops) +{ + struct macsec_dev *macsec =3D macsec =3D macsec_priv(dev); + + if (macsec_is_offloaded(macsec)) { + dev->needed_headroom -=3D MACSEC_NEEDED_HEADROOM; + dev->needed_headroom +=3D ops->needed_headroom; + dev->needed_tailroom -=3D MACSEC_NEEDED_TAILROOM; + dev->needed_tailroom +=3D ops->needed_tailroom; + + return; + } + + dev->needed_headroom -=3D ops->needed_headroom; + dev->needed_headroom +=3D MACSEC_NEEDED_HEADROOM; + dev->needed_tailroom -=3D ops->needed_tailroom; + dev->needed_tailroom +=3D MACSEC_NEEDED_TAILROOM; +} + static int macsec_update_offload(struct net_device *dev, enum macsec_offlo= ad offload) { enum macsec_offload prev_offload; @@ -2619,9 +2648,15 @@ static int macsec_update_offload(struct net_device *= dev, enum macsec_offload off ctx.secy =3D &macsec->secy; ret =3D offload =3D=3D MACSEC_OFFLOAD_OFF ? macsec_offload(ops->mdo_del_s= ecy, &ctx) : macsec_offload(ops->mdo_add_secy, &ctx); - if (ret) + if (ret) { macsec->offload =3D prev_offload; + goto out; + } + + macsec_adjust_room(dev, ops); + macsec->insert_tx_tag =3D macsec_can_insert_tx_tag(macsec, ops); =20 +out: return ret; } =20 @@ -3378,6 +3413,55 @@ static struct genl_family macsec_fam __ro_after_init= =3D { .resv_start_op =3D MACSEC_CMD_UPD_OFFLOAD + 1, }; =20 +static struct sk_buff *insert_tx_tag(struct sk_buff *skb, + struct net_device *dev) +{ + struct macsec_dev *macsec =3D macsec_priv(dev); + const struct macsec_ops *ops; + struct phy_device *phydev; + struct macsec_context ctx; + int err; + + if (!macsec->insert_tx_tag) + return skb; + + ops =3D macsec_get_ops(macsec, &ctx); + phydev =3D macsec->real_dev->phydev; + + if (unlikely(skb_headroom(skb) < ops->needed_headroom || + skb_tailroom(skb) < ops->needed_tailroom)) { + struct sk_buff *nskb =3D skb_copy_expand(skb, + ops->needed_headroom, + ops->needed_tailroom, + GFP_ATOMIC); + if (likely(nskb)) { + consume_skb(skb); + skb =3D nskb; + } else { + err =3D -ENOMEM; + goto cleanup; + } + } else { + skb =3D skb_unshare(skb, GFP_ATOMIC); + if (!skb) + return ERR_PTR(-ENOMEM); + } + + err =3D ops->mdo_insert_tx_tag(phydev, skb); + if (unlikely(err)) + goto cleanup; + + if (unlikely(skb->len - ETH_HLEN > macsec_priv(dev)->real_dev->mtu)) { + err =3D -EINVAL; + goto cleanup; + } + + return skb; +cleanup: + kfree_skb(skb); + return ERR_PTR(err); +} + static netdev_tx_t macsec_start_xmit(struct sk_buff *skb, struct net_device *dev) { @@ -3392,6 +3476,13 @@ static netdev_tx_t macsec_start_xmit(struct sk_buff = *skb, skb_dst_drop(skb); dst_hold(&md_dst->dst); skb_dst_set(skb, &md_dst->dst); + + skb =3D insert_tx_tag(skb, dev); + if (IS_ERR(skb)) { + DEV_STATS_INC(dev, tx_dropped); + return NETDEV_TX_OK; + } + skb->dev =3D macsec->real_dev; return dev_queue_xmit(skb); } @@ -4125,6 +4216,9 @@ static int macsec_newlink(struct net *net, struct net= _device *dev, err =3D macsec_offload(ops->mdo_add_secy, &ctx); if (err) goto del_dev; + + macsec_adjust_room(dev, ops); + macsec->insert_tx_tag =3D macsec_can_insert_tx_tag(macsec, ops); } } =20 diff --git a/include/net/macsec.h b/include/net/macsec.h index 76f024727bb4..9577921897f9 100644 --- a/include/net/macsec.h +++ b/include/net/macsec.h @@ -312,6 +312,11 @@ struct macsec_context { * @mdo_get_tx_sa_stats: called when TX SA stats are read * @mdo_get_rx_sc_stats: called when RX SC stats are read * @mdo_get_rx_sa_stats: called when RX SA stats are read + * @mdo_insert_tx_tag: called to insert the TX offload tag + * @needed_headroom: number of bytes reserved at the beginning of the sk_b= uff + * for the TX Tag + * @needed_tailroom: number of bytes reserved at the end of the sk_buff fo= r the + * TX Tag */ struct macsec_ops { /* Device wide */ @@ -338,6 +343,11 @@ struct macsec_ops { int (*mdo_get_tx_sa_stats)(struct macsec_context *ctx); int (*mdo_get_rx_sc_stats)(struct macsec_context *ctx); int (*mdo_get_rx_sa_stats)(struct macsec_context *ctx); + /* Offload tag */ + int (*mdo_insert_tx_tag)(struct phy_device *phydev, + struct sk_buff *skb); + unsigned int needed_headroom; + unsigned int needed_tailroom; }; =20 void macsec_pn_wrapped(struct macsec_secy *secy, struct macsec_tx_sa *tx_s= a); --=20 2.34.1 From nobody Thu Dec 18 09:45:24 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 3933FC3DA6F for ; Thu, 24 Aug 2023 09:41:48 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240627AbjHXJRg (ORCPT ); Thu, 24 Aug 2023 05:17:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:56360 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234749AbjHXJRD (ORCPT ); Thu, 24 Aug 2023 05:17:03 -0400 Received: from EUR03-AM7-obe.outbound.protection.outlook.com (mail-am7eur03on2057.outbound.protection.outlook.com [40.107.105.57]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 00596198A; Thu, 24 Aug 2023 02:16:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=ADn+WGQh0IPYyKCtpx2UkustOi07HzlEmrHJfOmJLZtwqW9chr3f0TUg5TwIMf0ldaodNlbwNYNdbn3SxUir20nui4tTWHqDs2cO2dWmd6Lge2eHc7fraR9TzUZ3XhUouFz4DszPaNq/j0jx72hBM1tpUsG2ACVuoZZ3gY1q5KC8vz62XBuHoGu3zvHg5n6ef3W+yCn5g2u+nc91t0HFM0qQmk5GQvegnTwl8s+T973wd/XjMX8a7hkUNBys9t/OxBmMwTWZU+AtbRQJgQCf+vbSYD3jHVzlfmhlE1qslq+3sTKLNeAo/aEBDV1+y7awuoHcObhgSy61GNCvenkoqw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=GZqPLcnJRPBqhtz4EKxbRGl7EgrLTMasmN6EjnmfQj8=; b=KdcGbL5SO1hZE3u+0T/iJ/G0Lqf8Ndp+B6BuI3lcdcgRK/LsQDZkTERdHvMDJSUqmKjCDDrmIWbOF/LaJ9+EDn9HRQJ6sA8CNmIkS5+ZJLSYi3w7JagLxkKCIqNkTsyhrqJDLdN9aTfQspEvyQQcSmrHtFXL9kaIlnSPk0GVKhoZt/IlXJEu6lcewds5s/WDffzmRiwuyA/mZ8Cbq9mK3aOQfch+dtxzsVBkQkGRtAawMbuYQkyPssRj7/Qj4NcGcwFTkM/0qR6TAw0dV4881TmbnaAE4Xa7cG0bk8xyLUqXZrmcoLOC2GBeDRgYpbdusAt1h2DX9WxLeggY5hsYAg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector2-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=GZqPLcnJRPBqhtz4EKxbRGl7EgrLTMasmN6EjnmfQj8=; b=IJLv2LF/SHS6esVyj8NhFMnDHzDXvzuiEIAEqelLsV27Zd8xwHvdPsXeWhvXv47l7iXaFDNgM0DbZKCwNXb3niUWGVhrRC55nOz8uvA3uTbQy7ufdZ6dK1K/DxWMNT3Md1fwmKTmQY+f9+yEcsA9hcwmMA5r0GC4og9FCQF+lx0= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM9PR04MB8954.eurprd04.prod.outlook.com (2603:10a6:20b:409::7) by DBBPR04MB7675.eurprd04.prod.outlook.com (2603:10a6:10:207::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6699.27; Thu, 24 Aug 2023 09:16:51 +0000 Received: from AM9PR04MB8954.eurprd04.prod.outlook.com ([fe80::2545:6d13:5905:bf50]) by AM9PR04MB8954.eurprd04.prod.outlook.com ([fe80::2545:6d13:5905:bf50%5]) with mapi id 15.20.6678.031; Thu, 24 Aug 2023 09:16:51 +0000 From: "Radu Pirea (NXP OSS)" To: andrew@lunn.ch, hkallweit1@gmail.com, linux@armlinux.org.uk, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, richardcochran@gmail.com, sd@queasysnail.net, sebastian.tobuschat@nxp.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, "Radu Pirea (NXP OSS)" Subject: [RFC net-next v2 3/5] net: phy: nxp-c45-tja11xx add MACsec support Date: Thu, 24 Aug 2023 12:16:13 +0300 Message-Id: <20230824091615.191379-4-radu-nicolae.pirea@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230824091615.191379-1-radu-nicolae.pirea@oss.nxp.com> References: <20230824091615.191379-1-radu-nicolae.pirea@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0PR10CA0116.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:e6::33) To AM9PR04MB8954.eurprd04.prod.outlook.com (2603:10a6:20b:409::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM9PR04MB8954:EE_|DBBPR04MB7675:EE_ X-MS-Office365-Filtering-Correlation-Id: 6473f6d7-c948-46fc-acc7-08dba482da18 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 3hNTVe+goalEcJfp4EqxRHnNHAIkjS4oYI/XC2A7g+VXe2ZPArkyZiEqq3+6cbktZoTCG0J1Gx+EAQ850/hEtPfuZ88QeqrZ2nb9frgZU6QDuSky1CJFJjtj2BkVTeiS/SnVeE5oi5QCW1/LD8YTy0VjH58luKeT7ZHFbTRRmJdUy58BP+GgqhhwYiEEoK4RYUDva73+B3qzriEt+/P2xOmTGV/f+OahslrOX60xHvMd9K7wy9/pgmHM3VDU6RtqymF1THe8qBlV8YayrsL8ifF0qh2mkn4Cr9Y9lz+ZTajA+zPajbustZfeJLDP3GHyXn4BKtUx7r4tc8WZRtkoebh3IP+DcG/8ttB0cij518ngdmgt9BzsM0UIpTfHStjkI6Ntku0HiU4DXt7E5eR0L1tJ4buyeXQ9QCGQCNRgn75ZS90nlC+Y03EU1X0Q2D9FbLVG2SNMx4vRXQhkofHi3B9KrcxXDf0num18akrXHhiifxSJ3mBth60U2QxXexK+0cb4n1D4GCVYT47wRH7J1lZ8yI/AAGG40qqt1Uv+gUCLxae2ycOpQCTd3ZSw5K1HdUgCBJrAUXrwfPceKvgH+EblDZX9vKwTJBv0ul6Uk5+6u8A8FxjziJSU7c1xPGg8/I1zZSUtg1vMN4QknyFMbw== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM9PR04MB8954.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(376002)(39860400002)(346002)(366004)(136003)(396003)(186009)(1800799009)(451199024)(1076003)(2616005)(5660300002)(4326008)(8676002)(8936002)(30864003)(83380400001)(7416002)(26005)(38350700002)(921005)(6666004)(38100700002)(66946007)(66556008)(66476007)(316002)(478600001)(41300700001)(6512007)(2906002)(6506007)(86362001)(52116002)(6486002)(579004);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?A8e6oZZRwwLHkN3oT0lU4NXqdrJyl+hiip7g5LE7kFjxO0yY/vIc88f2uMgW?= =?us-ascii?Q?tiFQuXeWyjX5uglI2f4UN9yeqNZ7DowJ+4O4yfZIZDpIcV/V/LhV50m13AoZ?= =?us-ascii?Q?q7hcEEMdl+LYFDXgFGg2OhisPKDORkYW+pJz78Ht7HLs4rOhWFIXOgtcH/YE?= =?us-ascii?Q?sYjeVFcz3CvJN5MMvysx3q2hAH4nzjIMGocJ9DaijJbAwD6O6y8T08pGjECh?= =?us-ascii?Q?CNcTo96pbRld08fBEraeShJC6MwXLLKNu2TJoMD8if5PNFHjXgPeiPFY2i6l?= =?us-ascii?Q?HMhb2niEey19ws3qTM0dcnyRbhvsCESOd09/mkXcU3/vG6tCAizzFfLYaSgW?= =?us-ascii?Q?arpauflZcmCKQeS4/pAhtSNeFJMmJnOkAQJ9bifcfUe2eZWgKPp065e/fsfq?= =?us-ascii?Q?wIx38cmrfaMktXY8ZdWB/cxyTTO0FqxM1Z/OMCUpEMmTr7bqtgftRUcmTiAw?= =?us-ascii?Q?yIzt33pCpBuUdWcxVJDiRYLX7V8ie+a8pFsTC7lR4E+QL5U6HzxB+QYYyx70?= =?us-ascii?Q?Luolkp2yI8QFlwtCk44OKpK7grzt5QU6A57iL80LciP7zfvs85PtdNL4jaPz?= =?us-ascii?Q?MEPiRnHZACsLEbr1pnlAbKKhpAKwl2ERGzKQTq+qqGY7Up/d54d7Mv+jGpTz?= =?us-ascii?Q?Q90YiE7kHjAJ/dh6B9LXTwLFETa3LCXgB2KUm4Heq+FwXPYPT6NupiO9Kqef?= =?us-ascii?Q?AV+vvLE2s0u7+Vz7Agk2W+1oPb0XDNTL6bnPFbENZN/KtRtoBxKqQbknMQd8?= =?us-ascii?Q?xoo3NMIneYaAkWa/TlIdE8NBr6ywwTLreGOFP4Plhkn973AnlKBnphjvVvhF?= =?us-ascii?Q?P3qfAlzpfvFg+RTu3i/Ka4+6tFhVgBl54fAiX/Pq3GUmzfduBgbjwPxEKxsd?= =?us-ascii?Q?GY+9a7uzRPzWL2lK9K52eq83TUifcnA7S6wEGjjtqJFlZKTaKUghRYllMEwe?= =?us-ascii?Q?4xkIviQ3horISgorpsNiP2eBn9H+ZwbTp0Y5j1HgdHi8r3+uB/i9EYbnJrHj?= =?us-ascii?Q?r3+KkzCfkeikLbLFTOhiPatQozeO5CqDUhbFytVTXYfOyujoJdmMhag7VwxN?= =?us-ascii?Q?g4ESaESHptEhdjBdTkPSwQqisK1CUzgKcNgWR+N3TAt0RIe2bAl1IYWmqpRw?= =?us-ascii?Q?nmh4LSAchTG+jtcskIeCExzS4cQeOVsOx2lpbcfBq15p8VSBIhiOZ7fZeVqr?= =?us-ascii?Q?vXA+jPl/2/qoBAwOnoJUdgkaKhhpaejFFsB3mYVx5HBcM5C6UUfaSrChKu7T?= =?us-ascii?Q?8faP5Rksoz4pPh6U1Xt6beZ+YY45P/lAE6Kpp9jwDIQp7SZV3M10lNwaUOaZ?= =?us-ascii?Q?0RfNjHCYwkBpleGs9E9hmI9Xs2/qqKR4rYKJBxCCGLeC6WJ0DmGlwSgbrhLK?= =?us-ascii?Q?rmNRIIXLcyf4aLa4UzX0/OS5mb/wruWcBISQ0IvR0YV82wQmFwdlwyAlX0Of?= =?us-ascii?Q?N4tP5HuekHonyfio6sOQPjiTJX7Yz8sKTU1CyTE9UovbIq02JLdUjYocE0gY?= =?us-ascii?Q?qjQtCwXT6UbS925y0+9z6HlJVSmz04HzLcb6cbteT1mEYvsPRjMtYMPSmLuK?= =?us-ascii?Q?aLo0eYTUucAx3tWvPcu4i2usJF3LMC1kc7iQx35lys7Ck31Wo1kyiA1Emf+A?= =?us-ascii?Q?9w=3D=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6473f6d7-c948-46fc-acc7-08dba482da18 X-MS-Exchange-CrossTenant-AuthSource: AM9PR04MB8954.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Aug 2023 09:16:51.7326 (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: aGhFI/DKWPkLdfaOIszSBR+gfwP5UOpyQjpGb1RXLBsTdCUbPdftKcuffwNsqCvLZYn8WaSlj89h+VY7Q0zmbewvtPgK+pH1n/Nb+7N3Pxo= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR04MB7675 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add MACsec support. The MACsec block has four TX SCs and four RX SCs. The driver supports up to four SecY. Each SecY with one TX SC and one RX SC. The RX SCs can have two keys, key A and key B, written in hardware and enabled at the same time. The TX SCs can have two keys written in hardware, but only one can be active at a given time. On TX, the SC is selected using the MAC source address. Due of this selection mechanism, each offloaded netdev must have a unique MAC address. On RX, the SC is selected by SCI(found in SecTAG or calculated using MAC SA), or using RX SC 0 as implicit. Signed-off-by: Radu Pirea (NXP OSS) --- MAINTAINERS | 2 +- drivers/net/phy/Kconfig | 2 +- drivers/net/phy/Makefile | 4 + drivers/net/phy/nxp-c45-tja11xx-macsec.c | 1397 ++++++++++++++++++++++ drivers/net/phy/nxp-c45-tja11xx.c | 72 +- drivers/net/phy/nxp-c45-tja11xx.h | 55 + 6 files changed, 1501 insertions(+), 31 deletions(-) create mode 100644 drivers/net/phy/nxp-c45-tja11xx-macsec.c create mode 100644 drivers/net/phy/nxp-c45-tja11xx.h diff --git a/MAINTAINERS b/MAINTAINERS index 9cc15c50c2c6..3d1e2c9c278b 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -15173,7 +15173,7 @@ NXP C45 TJA11XX PHY DRIVER M: Radu Pirea L: netdev@vger.kernel.org S: Maintained -F: drivers/net/phy/nxp-c45-tja11xx.c +F: drivers/net/phy/nxp-c45-tja11xx* =20 NXP FSPI DRIVER M: Han Xu diff --git a/drivers/net/phy/Kconfig b/drivers/net/phy/Kconfig index 107880d13d21..79f54f773af2 100644 --- a/drivers/net/phy/Kconfig +++ b/drivers/net/phy/Kconfig @@ -306,7 +306,7 @@ config NXP_C45_TJA11XX_PHY depends on PTP_1588_CLOCK_OPTIONAL help Enable support for NXP C45 TJA11XX PHYs. - Currently supports the TJA1103 and TJA1120 PHYs. + Currently supports the TJA1103, TJA1104 and TJA1120 PHYs. =20 config NXP_TJA11XX_PHY tristate "NXP TJA11xx PHYs support" diff --git a/drivers/net/phy/Makefile b/drivers/net/phy/Makefile index c945ed9bd14b..ee53e2fdb968 100644 --- a/drivers/net/phy/Makefile +++ b/drivers/net/phy/Makefile @@ -83,6 +83,10 @@ obj-$(CONFIG_MICROSEMI_PHY) +=3D mscc/ obj-$(CONFIG_MOTORCOMM_PHY) +=3D motorcomm.o obj-$(CONFIG_NATIONAL_PHY) +=3D national.o obj-$(CONFIG_NCN26000_PHY) +=3D ncn26000.o +nxp-c45-tja11xx-objs +=3D nxp-c45-tja11xx.o +ifdef CONFIG_MACSEC +nxp-c45-tja11xx-objs +=3D nxp-c45-tja11xx-macsec.o +endif obj-$(CONFIG_NXP_C45_TJA11XX_PHY) +=3D nxp-c45-tja11xx.o obj-$(CONFIG_NXP_CBTX_PHY) +=3D nxp-cbtx.o obj-$(CONFIG_NXP_TJA11XX_PHY) +=3D nxp-tja11xx.o diff --git a/drivers/net/phy/nxp-c45-tja11xx-macsec.c b/drivers/net/phy/nxp= -c45-tja11xx-macsec.c new file mode 100644 index 000000000000..1567865b8de4 --- /dev/null +++ b/drivers/net/phy/nxp-c45-tja11xx-macsec.c @@ -0,0 +1,1397 @@ +// SPDX-License-Identifier: GPL-2.0 +/* NXP C45 PTP PHY driver interface + * Copyright 2023 NXP + * Author: Radu Pirea + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "nxp-c45-tja11xx.h" + +#define MACSEC_REG_SIZE 32 +#define TX_SC_MAX 4 + +#define TX_SC_BIT(secy_id) BIT(MACSEC_REG_SIZE - (secy_id) - 1) + +#define VEND1_MACSEC_BASE 0x9000 + +#define MACSEC_CFG 0x0000 +#define MACSEC_CFG_BYPASS BIT(1) +#define MACSEC_CFG_S0I BIT(0) + +#define MACSEC_TPNET 0x0044 +#define PN_WRAP_THRESHOLD 0xffffffff + +#define MACSEC_RXSCA 0x0080 +#define MACSEC_RXSCKA 0x0084 + +#define MACSEC_TXSCA 0x00C0 +#define MACSEC_TXSCKA 0x00C4 + +#define MACSEC_RXSC_SCI_1H 0x0100 +#define MACSEC_RXSC_SCI_2H 0x0104 + +#define MACSEC_RXSC_CFG 0x0128 +#define MACSEC_RXSC_CFG_XPN BIT(25) +#define MACSEC_RXSC_CFG_AES_256 BIT(24) +#define MACSEC_RXSC_CFG_SCI_EN BIT(11) +#define MACSEC_RXSC_CFG_RP BIT(10) +#define MACSEC_RXSC_CFG_VF_MASK GENMASK(9, 8) +#define MACSEC_RXSC_CFG_VF_OFF 8 + +#define MACSEC_RPW 0x012C + +#define MACSEC_RXSA_A_CS 0x0180 +#define MACSEC_RXSA_A_NPN 0x0184 +#define MACSEC_RXSA_A_XNPN 0x0188 +#define MACSEC_RXSA_A_LNPN 0x018C +#define MACSEC_RXSA_A_LXNPN 0x0190 + +#define MACSEC_RXSA_B_CS 0x01C0 +#define MACSEC_RXSA_B_NPN 0x01C4 +#define MACSEC_RXSA_B_XNPN 0x01C8 +#define MACSEC_RXSA_B_LNPN 0x01CC +#define MACSEC_RXSA_B_LXNPN 0x01D0 + +#define MACSEC_RXSA_CS_A BIT(31) +#define MACSEC_RXSA_CS_AN_OFF 1 +#define MACSEC_RXSA_CS_EN BIT(0) + +#define MACSEC_TXSC_SCI_1H 0x0200 +#define MACSEC_TXSC_SCI_2H 0x0204 +#define MACSEC_TXSC_CFG 0x0228 +#define MACSEC_TXSC_CFG_XPN BIT(25) +#define MACSEC_TXSC_CFG_AES_256 BIT(24) +#define MACSEC_TXSC_CFG_AN_MASK GENMASK(19, 18) +#define MACSEC_TXSC_CFG_AN_OFF 18 +#define MACSEC_TXSC_CFG_ASA BIT(17) +#define MACSEC_TXSC_CFG_SCE BIT(16) +#define MACSEC_TXSC_CFG_ENCRYPT BIT(4) +#define MACSEC_TXSC_CFG_PROTECT BIT(3) +#define MACSEC_TXSC_CFG_SEND_SCI BIT(2) +#define MACSEC_TXSC_CFG_END_STATION BIT(1) +#define MACSEC_TXSC_CFG_SCI BIT(0) + +#define MACSEC_TXSA_A_CS 0x0280 +#define MACSEC_TXSA_A_NPN 0x0284 +#define MACSEC_TXSA_A_XNPN 0x0288 + +#define MACSEC_TXSA_B_CS 0x02C0 +#define MACSEC_TXSA_B_NPN 0x02C4 +#define MACSEC_TXSA_B_XNPN 0x02C8 + +#define MACSEC_TXSA_CS_A BIT(31) + +#define MACSEC_EVR 0x0400 +#define MACSEC_EVER 0x0404 + +#define MACSEC_RXSA_A_KA 0x0700 +#define MACSEC_RXSA_A_SSCI 0x0720 +#define MACSEC_RXSA_A_SALT 0x0724 + +#define MACSEC_RXSA_B_KA 0x0740 +#define MACSEC_RXSA_B_SSCI 0x0760 +#define MACSEC_RXSA_B_SALT 0x0764 + +#define MACSEC_TXSA_A_KA 0x0780 +#define MACSEC_TXSA_A_SSCI 0x07A0 +#define MACSEC_TXSA_A_SALT 0x07A4 + +#define MACSEC_TXSA_B_KA 0x07C0 +#define MACSEC_TXSA_B_SSCI 0x07E0 +#define MACSEC_TXSA_B_SALT 0x07E4 + +#define MACSEC_UPFR0D2 0x0A08 +#define MACSEC_UPFR0M1 0x0A10 +#define MACSEC_OVP BIT(12) + +#define MACSEC_UPFR0M2 0x0A14 +#define ETYPE_MASK 0xffff + +#define MACSEC_UPFR0R 0x0A18 +#define MACSEC_UPFR_EN BIT(0) + +#define ADPTR_CNTRL 0x0F00 +#define ADPTR_CNTRL_CONFIG_EN BIT(14) +#define ADPTR_CNTRL_ADPTR_EN BIT(12) + +#define TX_SC_FLT_BASE 0x800 +#define TX_SC_FLT_SIZE 0x10 +#define TX_FLT_BASE(flt_id) (TX_SC_FLT_BASE + \ + TX_SC_FLT_SIZE * (flt_id)) + +#define TX_SC_FLT_OFF_MAC_DA_SA 0x04 +#define TX_SC_FLT_OFF_MAC_SA 0x08 +#define TX_SC_FLT_OFF_MAC_CFG 0x0C +#define TX_SC_FLT_BY_SA BIT(14) +#define TX_SC_FLT_EN BIT(8) + +#define TX_SC_FLT_MAC_DA_SA(base) ((base) + TX_SC_FLT_OFF_MAC_DA_SA) +#define TX_SC_FLT_MAC_SA(base) ((base) + TX_SC_FLT_OFF_MAC_SA) +#define TX_SC_FLT_MAC_CFG(base) ((base) + TX_SC_FLT_OFF_MAC_CFG) + +#define ADAPTER_EN BIT(6) +#define MACSEC_EN BIT(5) + +struct nxp_c45_rx_sc { + struct macsec_rx_sc *rx_sc; + struct macsec_rx_sa *rx_sa_a; + struct macsec_rx_sa *rx_sa_b; +}; + +struct nxp_c45_tx_sa { + struct macsec_tx_sa *tx_sa; + u8 key[MACSEC_MAX_KEY_LEN]; + u8 salt[MACSEC_SALT_LEN]; + u8 an; + u64 next_pn; + bool is_enabled; + bool is_key_a; +}; + +struct nxp_c45_secy { + struct macsec_secy *secy; + struct nxp_c45_tx_sa *tx_sa[MACSEC_NUM_AN]; + struct nxp_c45_rx_sc *rx_sc; + int enabled_an; + int secy_id; + bool tx_sa_key_a; + bool point_to_point; + struct list_head list; +}; + +struct nxp_c45_macsec { + struct list_head secy_list; + DECLARE_BITMAP(secy_bitmap, TX_SC_MAX); + DECLARE_BITMAP(tx_sc_bitmap, TX_SC_MAX); +}; + +struct nxp_c45_macsec_sa_regs { + u16 rxsa_cs; + u16 rxsa_npn; + u16 rxsa_xnpn; + u16 rxsa_lnpn; + u16 rxsa_lxnpn; + u16 txsa_cs; + u16 txsa_npn; + u16 txsa_xnpn; + u16 rxsa_ka; + u16 rxsa_ssci; + u16 rxsa_salt; + u16 txsa_ka; + u16 txsa_ssci; + u16 txsa_salt; +}; + +static const struct nxp_c45_macsec_sa_regs sa_a_regs =3D { + .rxsa_cs =3D MACSEC_RXSA_A_CS, + .rxsa_npn =3D MACSEC_RXSA_A_NPN, + .rxsa_xnpn =3D MACSEC_RXSA_A_XNPN, + .rxsa_lnpn =3D MACSEC_RXSA_A_LNPN, + .rxsa_lxnpn =3D MACSEC_RXSA_A_LXNPN, + .txsa_cs =3D MACSEC_TXSA_A_CS, + .txsa_npn =3D MACSEC_TXSA_A_NPN, + .txsa_xnpn =3D MACSEC_TXSA_A_XNPN, + .rxsa_ka =3D MACSEC_RXSA_A_KA, + .rxsa_ssci =3D MACSEC_RXSA_A_SSCI, + .rxsa_salt =3D MACSEC_RXSA_A_SALT, + .txsa_ka =3D MACSEC_TXSA_A_KA, + .txsa_ssci =3D MACSEC_TXSA_A_SSCI, + .txsa_salt =3D MACSEC_TXSA_A_SALT, +}; + +static const struct nxp_c45_macsec_sa_regs sa_b_regs =3D { + .rxsa_cs =3D MACSEC_RXSA_B_CS, + .rxsa_npn =3D MACSEC_RXSA_B_NPN, + .rxsa_xnpn =3D MACSEC_RXSA_B_XNPN, + .rxsa_lnpn =3D MACSEC_RXSA_B_LNPN, + .rxsa_lxnpn =3D MACSEC_RXSA_B_LXNPN, + .txsa_cs =3D MACSEC_TXSA_B_CS, + .txsa_npn =3D MACSEC_TXSA_B_NPN, + .txsa_xnpn =3D MACSEC_TXSA_B_XNPN, + .rxsa_ka =3D MACSEC_RXSA_B_KA, + .rxsa_ssci =3D MACSEC_RXSA_B_SSCI, + .rxsa_salt =3D MACSEC_RXSA_B_SALT, + .txsa_ka =3D MACSEC_TXSA_B_KA, + .txsa_ssci =3D MACSEC_TXSA_B_SSCI, + .txsa_salt =3D MACSEC_TXSA_B_SALT, +}; + +static const +struct nxp_c45_macsec_sa_regs *nxp_c45_get_macsec_sa_regs(bool key_a) +{ + if (key_a) + return &sa_a_regs; + + return &sa_b_regs; +} + +static int nxp_c45_macsec_write(struct phy_device *phydev, u16 reg, u32 va= l) +{ + WARN_ON_ONCE(reg % 4); + + reg =3D reg / 2; + phy_write_mmd(phydev, MDIO_MMD_VEND2, + VEND1_MACSEC_BASE + reg, val); + phy_write_mmd(phydev, MDIO_MMD_VEND2, + VEND1_MACSEC_BASE + reg + 1, val >> 16); + return 0; +} + +static int nxp_c45_macsec_read(struct phy_device *phydev, u16 reg, u32 *va= lue) +{ + u32 lvalue; + int ret; + + WARN_ON_ONCE(reg % 4); + + reg =3D reg / 2; + ret =3D phy_read_mmd(phydev, MDIO_MMD_VEND2, VEND1_MACSEC_BASE + reg); + if (ret < 0) + return ret; + + lvalue =3D (u32)ret & 0xffff; + + ret =3D phy_read_mmd(phydev, MDIO_MMD_VEND2, VEND1_MACSEC_BASE + reg + 1); + if (ret < 0) + return ret; + + lvalue |=3D (u32)ret << 16; + *value =3D lvalue; + + return 0; +} + +static void nxp_c45_select_secy(struct phy_device *phydev, u8 id) +{ + nxp_c45_macsec_write(phydev, MACSEC_RXSCA, id); + nxp_c45_macsec_write(phydev, MACSEC_RXSCKA, id); + nxp_c45_macsec_write(phydev, MACSEC_TXSCA, id); + nxp_c45_macsec_write(phydev, MACSEC_TXSCKA, id); +} + +void nxp_c45_macsec_config_init(struct phy_device *phydev) +{ + if (!phydev->macsec_ops) + return; + + phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, VEND1_PORT_FUNC_ENABLES, + MACSEC_EN | ADAPTER_EN); + + nxp_c45_macsec_write(phydev, ADPTR_CNTRL, ADPTR_CNTRL_CONFIG_EN | + ADPTR_CNTRL_ADPTR_EN); + nxp_c45_macsec_write(phydev, ADPTR_CNTRL, ADPTR_CNTRL_ADPTR_EN); + + nxp_c45_macsec_write(phydev, MACSEC_TPNET, PN_WRAP_THRESHOLD); + + /* Set MKA filter. */ + nxp_c45_macsec_write(phydev, MACSEC_UPFR0D2, ETH_P_PAE); + nxp_c45_macsec_write(phydev, MACSEC_UPFR0M1, MACSEC_OVP); + nxp_c45_macsec_write(phydev, MACSEC_UPFR0M2, ETYPE_MASK); + nxp_c45_macsec_write(phydev, MACSEC_UPFR0R, MACSEC_UPFR_EN); +} + +static void nxp_c45_macsec_cfg_ptp(struct phy_device *phydev, bool enable) +{ + u32 reg =3D 0; + + nxp_c45_macsec_read(phydev, MACSEC_CFG, ®); + if (enable) + reg |=3D MACSEC_CFG_S0I; + else + reg &=3D ~MACSEC_CFG_S0I; + nxp_c45_macsec_write(phydev, MACSEC_CFG, reg); +} + +static bool nxp_c45_mac_addr_free(struct macsec_context *ctx) +{ + struct nxp_c45_phy *priv =3D ctx->phydev->priv; + struct nxp_c45_secy *pos, *tmp; + + list_for_each_entry_safe(pos, tmp, &priv->macsec->secy_list, list) { + if (pos->secy =3D=3D ctx->secy) + continue; + + if (memcmp(pos->secy->netdev->dev_addr, + ctx->secy->netdev->dev_addr, ETH_ALEN) =3D=3D 0) + return false; + } + + return true; +} + +static bool nxp_c45_is_macsec_ptp_enabled(struct list_head *secy_list) +{ + struct nxp_c45_secy *pos, *tmp; + + list_for_each_entry_safe(pos, tmp, secy_list, list) + if (pos->point_to_point) + return pos->point_to_point; + + return false; +} + +static struct nxp_c45_secy *nxp_c45_find_secy(struct list_head *secy_list, + sci_t sci) +{ + struct nxp_c45_secy *pos, *tmp; + + list_for_each_entry_safe(pos, tmp, secy_list, list) + if (pos->secy->sci =3D=3D sci) + return pos; + + return ERR_PTR(-ENOENT); +} + +static void nxp_c45_rx_sc_en(struct phy_device *phydev, + struct nxp_c45_rx_sc *rx_sc, + bool en) +{ + u32 reg =3D 0; + + nxp_c45_macsec_read(phydev, MACSEC_RXSC_CFG, ®); + if (rx_sc->rx_sc->active && en) + reg |=3D MACSEC_RXSC_CFG_SCI_EN; + else + reg &=3D ~MACSEC_RXSC_CFG_SCI_EN; + nxp_c45_macsec_write(phydev, MACSEC_RXSC_CFG, reg); +} + +static int nxp_c45_tx_sc_en_flt(struct phy_device *phydev, int secy_id, bo= ol en) +{ + u32 tx_flt_base =3D TX_FLT_BASE(secy_id); + u32 reg =3D 0; + + nxp_c45_macsec_read(phydev, TX_SC_FLT_MAC_CFG(tx_flt_base), ®); + if (en) + reg |=3D TX_SC_FLT_EN; + else + reg &=3D ~TX_SC_FLT_EN; + nxp_c45_macsec_write(phydev, TX_SC_FLT_MAC_CFG(tx_flt_base), reg); + + return 0; +} + +static int nxp_c45_mdo_dev_open(struct macsec_context *ctx) +{ + struct nxp_c45_phy *priv =3D ctx->phydev->priv; + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_secy *phy_secy; + int any_bit_set; + u32 reg =3D 0; + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + nxp_c45_select_secy(phydev, phy_secy->secy_id); + + nxp_c45_tx_sc_en_flt(phydev, phy_secy->secy_id, true); + nxp_c45_macsec_cfg_ptp(phydev, phy_secy->point_to_point); + if (phy_secy->rx_sc) + nxp_c45_rx_sc_en(phydev, phy_secy->rx_sc, true); + + any_bit_set =3D find_first_bit(priv->macsec->secy_bitmap, TX_SC_MAX); + if (any_bit_set =3D=3D TX_SC_MAX) { + nxp_c45_macsec_read(phydev, MACSEC_CFG, ®); + reg |=3D MACSEC_CFG_BYPASS; + nxp_c45_macsec_write(phydev, MACSEC_CFG, reg); + } + + set_bit(phy_secy->secy_id, priv->macsec->secy_bitmap); + + return 0; +} + +static int nxp_c45_mdo_dev_stop(struct macsec_context *ctx) +{ + struct nxp_c45_phy *priv =3D ctx->phydev->priv; + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_secy *phy_secy; + int any_bit_set; + u32 reg =3D 0; + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + nxp_c45_select_secy(phydev, phy_secy->secy_id); + + nxp_c45_tx_sc_en_flt(phydev, phy_secy->secy_id, false); + if (phy_secy->rx_sc) + nxp_c45_rx_sc_en(phydev, phy_secy->rx_sc, false); + nxp_c45_macsec_cfg_ptp(phydev, false); + + clear_bit(phy_secy->secy_id, priv->macsec->secy_bitmap); + any_bit_set =3D find_first_bit(priv->macsec->secy_bitmap, TX_SC_MAX); + if (any_bit_set =3D=3D TX_SC_MAX) { + nxp_c45_macsec_read(phydev, MACSEC_CFG, ®); + reg &=3D ~MACSEC_CFG_BYPASS; + nxp_c45_macsec_write(phydev, MACSEC_CFG, reg); + } + + return 0; +} + +static int nxp_c45_tx_sc_set_flt(struct macsec_context *ctx, int secy_id) +{ + const u8 *dev_addr =3D ctx->secy->netdev->dev_addr; + u32 tx_flt_base =3D TX_FLT_BASE(secy_id); + u32 mac_sa; + + mac_sa =3D dev_addr[0] << 8 | dev_addr[1]; + nxp_c45_macsec_write(ctx->phydev, TX_SC_FLT_MAC_DA_SA(tx_flt_base), + mac_sa); + mac_sa =3D dev_addr[5] | dev_addr[4] << 8 | + dev_addr[3] << 16 | dev_addr[2] << 24; + + nxp_c45_macsec_write(ctx->phydev, TX_SC_FLT_MAC_SA(tx_flt_base), + mac_sa); + nxp_c45_macsec_write(ctx->phydev, TX_SC_FLT_MAC_CFG(tx_flt_base), + TX_SC_FLT_BY_SA | TX_SC_FLT_EN | secy_id); + + return 0; +} + +static bool nxp_c45_port_valid(struct nxp_c45_secy *phy_secy, u16 port) +{ + if (phy_secy->secy->tx_sc.end_station && + __be16_to_cpu((__force __be16)port) !=3D 1) + return false; + + return true; +} + +static bool nxp_c45_rx_sc_valid(struct nxp_c45_secy *phy_secy, + struct macsec_rx_sc *rx_sc) +{ + u16 port =3D (__force u64)rx_sc->sci >> (ETH_ALEN * 8); + + if (phy_secy->point_to_point && phy_secy->secy_id !=3D 0) + return false; + + return nxp_c45_port_valid(phy_secy, port); +} + +static bool nxp_c45_secy_cfg_valid(struct nxp_c45_secy *phy_secy, bool can= _ptp) +{ + u16 port =3D (__force u64)phy_secy->secy->sci >> (ETH_ALEN * 8); + + if (phy_secy->secy->tx_sc.scb) + return false; + + if (phy_secy->secy->tx_sc.send_sci && phy_secy->secy->tx_sc.end_station) + return false; + + if (!phy_secy->secy->tx_sc.send_sci && + !phy_secy->secy->tx_sc.end_station) { + if (!can_ptp) + return false; + + if (phy_secy->secy_id !=3D 0) + return false; + + phy_secy->point_to_point =3D true; + } else { + phy_secy->point_to_point =3D false; + } + + return nxp_c45_port_valid(phy_secy, port); +} + +static int nxp_c45_update_tx_sc_secy_cfg(struct phy_device *phydev, + struct nxp_c45_secy *phy_secy) +{ + u32 cfg =3D 0; + + nxp_c45_macsec_read(phydev, MACSEC_TXSC_CFG, &cfg); + + phydev_dbg(phydev, "XPN %s\n", phy_secy->secy->xpn ? "on" : "off"); + if (phy_secy->secy->xpn) + cfg |=3D MACSEC_TXSC_CFG_XPN; + else + cfg &=3D ~MACSEC_TXSC_CFG_XPN; + + phydev_dbg(phydev, "key len %u\n", phy_secy->secy->key_len); + if (phy_secy->secy->key_len =3D=3D 32) + cfg |=3D MACSEC_TXSC_CFG_AES_256; + else + cfg &=3D ~MACSEC_TXSC_CFG_AES_256; + + phydev_dbg(phydev, "encryption %s\n", + phy_secy->secy->tx_sc.encrypt ? "on" : "off"); + if (phy_secy->secy->tx_sc.encrypt) + cfg |=3D MACSEC_TXSC_CFG_ENCRYPT; + else + cfg &=3D ~MACSEC_TXSC_CFG_ENCRYPT; + + phydev_dbg(phydev, "protect frames %s\n", + phy_secy->secy->protect_frames ? "on" : "off"); + if (phy_secy->secy->protect_frames) + cfg |=3D MACSEC_TXSC_CFG_PROTECT; + else + cfg &=3D ~MACSEC_TXSC_CFG_PROTECT; + + phydev_dbg(phydev, "send sci %s\n", + phy_secy->secy->tx_sc.send_sci ? "on" : "off"); + if (phy_secy->secy->tx_sc.send_sci) + cfg |=3D MACSEC_TXSC_CFG_SEND_SCI; + else + cfg &=3D ~MACSEC_TXSC_CFG_SEND_SCI; + + phydev_dbg(phydev, "end station %s\n", + phy_secy->secy->tx_sc.end_station ? "on" : "off"); + if (phy_secy->secy->tx_sc.end_station) + cfg |=3D MACSEC_TXSC_CFG_END_STATION; + else + cfg &=3D ~MACSEC_TXSC_CFG_END_STATION; + + phydev_dbg(phydev, "scb %s\n", + phy_secy->secy->tx_sc.scb ? "on" : "off"); + if (phy_secy->secy->tx_sc.scb) + cfg |=3D MACSEC_TXSC_CFG_SCI; + else + cfg &=3D ~MACSEC_TXSC_CFG_SCI; + + nxp_c45_macsec_write(phydev, MACSEC_TXSC_CFG, cfg); + + return 0; +} + +static int nxp_c45_update_rx_sc_secy_cfg(struct phy_device *phydev, + struct nxp_c45_secy *phy_secy) +{ + struct nxp_c45_rx_sc *rx_sc =3D phy_secy->rx_sc; + struct nxp_c45_phy *priv =3D phydev->priv; + u32 cfg =3D 0; + + nxp_c45_macsec_read(phydev, MACSEC_RXSC_CFG, &cfg); + cfg &=3D ~MACSEC_RXSC_CFG_VF_MASK; + cfg =3D phy_secy->secy->validate_frames << MACSEC_RXSC_CFG_VF_OFF; + + phydev_dbg(phydev, "validate frames %u\n", + phy_secy->secy->validate_frames); + phydev_dbg(phydev, "replay_protect %s window %u\n", + phy_secy->secy->replay_protect ? "on" : "off", + phy_secy->secy->replay_window); + if (phy_secy->secy->replay_protect) { + cfg |=3D MACSEC_RXSC_CFG_RP; + if (cfg & MACSEC_RXSC_CFG_SCI_EN) { + phydev_dbg(phydev, "RX SC enabled, window will not be updated\n"); + } else { + phydev_dbg(phydev, "RX SC enabled, window will be updated\n"); + nxp_c45_macsec_write(phydev, MACSEC_RPW, + phy_secy->secy->replay_window); + } + } else { + cfg &=3D ~MACSEC_RXSC_CFG_RP; + } + + phydev_dbg(phydev, "rx_sc->active %s\n", + rx_sc->rx_sc->active ? "on" : "off"); + if (rx_sc->rx_sc->active && + test_bit(phy_secy->secy_id, priv->macsec->secy_bitmap)) + cfg |=3D MACSEC_RXSC_CFG_SCI_EN; + else + cfg &=3D ~MACSEC_RXSC_CFG_SCI_EN; + + phydev_dbg(phydev, "key len %u\n", phy_secy->secy->key_len); + if (phy_secy->secy->key_len =3D=3D 32) + cfg |=3D MACSEC_RXSC_CFG_AES_256; + else + cfg &=3D ~MACSEC_RXSC_CFG_AES_256; + + phydev_dbg(phydev, "XPN %s\n", phy_secy->secy->xpn ? "on" : "off"); + if (phy_secy->secy->xpn) + cfg |=3D MACSEC_RXSC_CFG_XPN; + else + cfg &=3D ~MACSEC_RXSC_CFG_XPN; + + nxp_c45_macsec_write(phydev, MACSEC_RXSC_CFG, cfg); + return 0; +} + +static int nxp_c45_update_key_status(struct phy_device *phydev, + struct nxp_c45_tx_sa *tx_sa) +{ + bool key_a =3D tx_sa->is_key_a; + u32 cfg =3D 0; + + nxp_c45_macsec_read(phydev, MACSEC_TXSC_CFG, &cfg); + + cfg &=3D ~MACSEC_TXSC_CFG_AN_MASK; + cfg |=3D tx_sa->an << MACSEC_TXSC_CFG_AN_OFF; + + if (!key_a) + cfg |=3D MACSEC_TXSC_CFG_ASA; + else + cfg &=3D ~MACSEC_TXSC_CFG_ASA; + + tx_sa->is_enabled =3D tx_sa->tx_sa->active; + if (tx_sa->tx_sa->active) + cfg |=3D MACSEC_TXSC_CFG_SCE; + else + cfg &=3D ~MACSEC_TXSC_CFG_SCE; + + nxp_c45_macsec_write(phydev, MACSEC_TXSC_CFG, cfg); + + return 0; +} + +static int nxp_c45_tx_sa_disable(struct phy_device *phydev, + struct nxp_c45_secy *phy_secy) +{ + u32 cfg =3D 0; + + nxp_c45_macsec_read(phydev, MACSEC_TXSC_CFG, &cfg); + cfg &=3D ~MACSEC_TXSC_CFG_SCE; + nxp_c45_macsec_write(phydev, MACSEC_TXSC_CFG, cfg); + + return 0; +} + +static int nxp_c45_txsa_set_pn(struct phy_device *phydev, + struct nxp_c45_tx_sa *tx_sa) +{ + const struct nxp_c45_macsec_sa_regs *sa_regs; + + sa_regs =3D nxp_c45_get_macsec_sa_regs(tx_sa->is_key_a); + + nxp_c45_macsec_write(phydev, sa_regs->txsa_npn, tx_sa->next_pn); + nxp_c45_macsec_write(phydev, sa_regs->txsa_xnpn, tx_sa->next_pn >> 32); + + return 0; +} + +static int nxp_c45_txsa_get_pn(struct phy_device *phydev, + struct nxp_c45_tx_sa *tx_sa) +{ + const struct nxp_c45_macsec_sa_regs *sa_regs; + u32 reg =3D 0; + + sa_regs =3D nxp_c45_get_macsec_sa_regs(tx_sa->is_key_a); + + nxp_c45_macsec_read(phydev, sa_regs->txsa_npn, ®); + tx_sa->next_pn =3D reg; + nxp_c45_macsec_read(phydev, sa_regs->txsa_xnpn, ®); + tx_sa->next_pn |=3D (u64)reg << 32; + + return 0; +} + +static int nxp_c45_set_rxsa_key_cfg(struct macsec_context *ctx, + bool key_a, bool upd) +{ + const struct nxp_c45_macsec_sa_regs *sa_regs; + u64 npn =3D ctx->sa.rx_sa->next_pn; + u32 cfg; + + sa_regs =3D nxp_c45_get_macsec_sa_regs(key_a); + + if (npn && !upd) { + nxp_c45_macsec_write(ctx->phydev, sa_regs->rxsa_npn, npn); + nxp_c45_macsec_write(ctx->phydev, sa_regs->rxsa_lnpn, npn); + if (ctx->secy->xpn) { + nxp_c45_macsec_write(ctx->phydev, sa_regs->rxsa_xnpn, + npn >> 32); + nxp_c45_macsec_write(ctx->phydev, sa_regs->rxsa_lxnpn, + npn >> 32); + } + } else if (npn && upd) { + if (npn > ctx->secy->replay_window) + npn -=3D ctx->secy->replay_window; + else + npn =3D 1; + + nxp_c45_macsec_write(ctx->phydev, sa_regs->rxsa_lnpn, npn); + if (ctx->secy->xpn) + nxp_c45_macsec_write(ctx->phydev, sa_regs->rxsa_lxnpn, + npn >> 32); + } + + cfg =3D MACSEC_RXSA_CS_A | (ctx->sa.assoc_num << MACSEC_RXSA_CS_AN_OFF); + cfg |=3D ctx->sa.rx_sa->active ? MACSEC_RXSA_CS_EN : 0; + nxp_c45_macsec_write(ctx->phydev, sa_regs->rxsa_cs, cfg); + + return 0; +} + +static int nxp_c45_txsa_set_key(struct macsec_context *ctx, + struct nxp_c45_tx_sa *tx_sa) +{ + const struct nxp_c45_macsec_sa_regs *sa_regs; + u32 ssci =3D (__force u32)tx_sa->tx_sa->ssci; + u32 key_size =3D ctx->secy->key_len / 4; + u32 salt_size =3D MACSEC_SALT_LEN / 4; + u32 *salt =3D (u32 *)tx_sa->salt; + u32 *key =3D (u32 *)tx_sa->key; + u32 reg; + int i; + + sa_regs =3D nxp_c45_get_macsec_sa_regs(tx_sa->is_key_a); + + for (i =3D 0; i < key_size; i++) { + reg =3D sa_regs->txsa_ka + i * 4; + nxp_c45_macsec_write(ctx->phydev, reg, + (__force u32)cpu_to_be32(key[i])); + } + + if (ctx->secy->xpn) { + for (i =3D 0; i < salt_size; i++) { + reg =3D sa_regs->txsa_salt + (2 - i) * 4; + nxp_c45_macsec_write(ctx->phydev, reg, + (__force u32)cpu_to_be32(salt[i])); + } + + nxp_c45_macsec_write(ctx->phydev, sa_regs->txsa_ssci, + (__force u32)cpu_to_be32(ssci)); + } + + nxp_c45_macsec_write(ctx->phydev, sa_regs->txsa_cs, MACSEC_TXSA_CS_A); + + return 0; +} + +static int nxp_c45_commit_rx_sc_cfg(struct phy_device *phydev, + struct nxp_c45_secy *phy_secy) +{ + struct nxp_c45_rx_sc *rx_sc =3D phy_secy->rx_sc; + u64 sci =3D (__force u64)rx_sc->rx_sc->sci; + + nxp_c45_macsec_write(phydev, MACSEC_RXSC_SCI_1H, + (__force u32)cpu_to_be32(sci)); + nxp_c45_macsec_write(phydev, MACSEC_RXSC_SCI_2H, + (__force u32)cpu_to_be32(sci >> 32)); + + return nxp_c45_update_rx_sc_secy_cfg(phydev, phy_secy); +} + +static int nxp_c45_disable_rxsa_key(struct phy_device *phydev, bool key_a) +{ + const struct nxp_c45_macsec_sa_regs *sa_regs; + u32 reg =3D 0; + + sa_regs =3D nxp_c45_get_macsec_sa_regs(key_a); + + nxp_c45_macsec_read(phydev, sa_regs->rxsa_cs, ®); + reg &=3D ~MACSEC_RXSA_CS_EN; + nxp_c45_macsec_write(phydev, sa_regs->rxsa_cs, reg); + + return 0; +} + +static int nxp_c45_rx_sc_del(struct phy_device *phydev, + struct nxp_c45_rx_sc *rx_sc) +{ + nxp_c45_macsec_write(phydev, MACSEC_RXSC_CFG, 0); + nxp_c45_macsec_write(phydev, MACSEC_RXSC_SCI_1H, 0); + nxp_c45_macsec_write(phydev, MACSEC_RXSC_SCI_2H, 0); + nxp_c45_macsec_write(phydev, MACSEC_RPW, 0); + + if (rx_sc->rx_sa_a) + nxp_c45_disable_rxsa_key(phydev, true); + + if (rx_sc->rx_sa_b) + nxp_c45_disable_rxsa_key(phydev, false); + + return 0; +} + +static int nxp_c45_set_rxsa_key(struct macsec_context *ctx, bool key_a) +{ + u32 *salt =3D (u32 *)ctx->sa.rx_sa->key.salt.bytes; + const struct nxp_c45_macsec_sa_regs *sa_regs; + u32 ssci =3D (__force u32)ctx->sa.rx_sa->ssci; + u32 key_size =3D ctx->secy->key_len / 4; + u32 salt_size =3D MACSEC_SALT_LEN / 4; + u32 *key =3D (u32 *)ctx->sa.key; + u32 reg; + int i; + + sa_regs =3D nxp_c45_get_macsec_sa_regs(key_a); + + for (i =3D 0; i < key_size; i++) { + reg =3D sa_regs->rxsa_ka + i * 4; + nxp_c45_macsec_write(ctx->phydev, reg, + (__force u32)cpu_to_be32(key[i])); + } + + if (ctx->secy->xpn) { + for (i =3D 0; i < salt_size; i++) { + reg =3D sa_regs->rxsa_salt + (2 - i) * 4; + nxp_c45_macsec_write(ctx->phydev, reg, + (__force u32)cpu_to_be32(salt[i])); + } + nxp_c45_macsec_write(ctx->phydev, sa_regs->rxsa_ssci, + (__force u32)cpu_to_be32(ssci)); + } + + nxp_c45_set_rxsa_key_cfg(ctx, key_a, false); + + return 0; +} + +static void nxp_c45_tx_sc_clear(struct nxp_c45_secy *phy_secy) +{ + struct nxp_c45_tx_sa **tx_sa; + u8 i; + + tx_sa =3D phy_secy->tx_sa; + for (i =3D 0; i < ARRAY_SIZE(phy_secy->tx_sa); i++) { + kfree(tx_sa[i]); + tx_sa[i] =3D NULL; + } +} + +static int nxp_c45_mdo_add_secy(struct macsec_context *ctx) +{ + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + u64 sci =3D (__force u64)ctx->secy->sci; + struct nxp_c45_secy *phy_secy; + bool can_ptp; + int idx; + u32 reg; + + phydev_dbg(ctx->phydev, "add secy SCI %llu\n", ctx->secy->sci); + + if (!nxp_c45_mac_addr_free(ctx)) + return -EBUSY; + + if (nxp_c45_is_macsec_ptp_enabled(&priv->macsec->secy_list)) + return -EBUSY; + + idx =3D find_first_zero_bit(priv->macsec->tx_sc_bitmap, TX_SC_MAX); + if (idx =3D=3D TX_SC_MAX) + return -EBUSY; + + phy_secy =3D kzalloc(sizeof(*phy_secy), GFP_KERNEL); + if (!phy_secy) + return -ENOMEM; + + phy_secy->secy =3D ctx->secy; + phy_secy->secy_id =3D idx; + phy_secy->enabled_an =3D ctx->secy->tx_sc.encoding_sa; + phy_secy->tx_sa_key_a =3D true; + + /* If the point to point mode should be enabled, we should have only + * one secy enabled, respectively the new one. + */ + can_ptp =3D list_count_nodes(&priv->macsec->secy_list) =3D=3D 0; + if (!nxp_c45_secy_cfg_valid(phy_secy, can_ptp)) { + kfree(phy_secy); + return -EINVAL; + } + + nxp_c45_select_secy(phydev, phy_secy->secy_id); + nxp_c45_macsec_write(phydev, MACSEC_TXSC_SCI_1H, + (__force u32)cpu_to_be32(sci)); + nxp_c45_macsec_write(phydev, MACSEC_TXSC_SCI_2H, + (__force u32)cpu_to_be32(sci >> 32)); + nxp_c45_tx_sc_set_flt(ctx, phy_secy->secy_id); + nxp_c45_update_tx_sc_secy_cfg(phydev, phy_secy); + if (phy_interrupt_is_valid(phydev)) { + nxp_c45_macsec_read(phydev, MACSEC_EVER, ®); + reg |=3D TX_SC_BIT(phy_secy->secy_id); + nxp_c45_macsec_write(phydev, MACSEC_EVER, reg); + } + set_bit(idx, priv->macsec->tx_sc_bitmap); + list_add_tail(&phy_secy->list, &priv->macsec->secy_list); + + return 0; +} + +static int nxp_c45_mdo_upd_secy(struct macsec_context *ctx) +{ + struct nxp_c45_tx_sa *new_tx_sa, *old_tx_sa; + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + struct nxp_c45_secy *phy_secy; + bool can_ptp; + + phydev_dbg(phydev, "update secy SCI %llu\n", ctx->secy->sci); + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + if (!nxp_c45_mac_addr_free(ctx)) + return -EBUSY; + + /* If the point to point mode should be enabled, we should have only + * one secy enabled, respectively the new one. + */ + can_ptp =3D list_count_nodes(&priv->macsec->secy_list) =3D=3D 1; + if (!nxp_c45_secy_cfg_valid(phy_secy, can_ptp)) + return -EINVAL; + + nxp_c45_select_secy(phydev, phy_secy->secy_id); + + nxp_c45_tx_sc_set_flt(ctx, phy_secy->secy_id); + nxp_c45_update_tx_sc_secy_cfg(phydev, phy_secy); + + if (phy_secy->enabled_an !=3D ctx->secy->tx_sc.encoding_sa) { + old_tx_sa =3D phy_secy->tx_sa[phy_secy->enabled_an]; + phy_secy->enabled_an =3D ctx->secy->tx_sc.encoding_sa; + new_tx_sa =3D phy_secy->tx_sa[phy_secy->enabled_an]; + if (!new_tx_sa) { + nxp_c45_tx_sa_disable(phydev, phy_secy); + goto disable_old_tx_sa; + } + + if (!new_tx_sa->tx_sa->active) { + nxp_c45_tx_sa_disable(phydev, phy_secy); + goto disable_old_tx_sa; + } + + new_tx_sa->is_key_a =3D phy_secy->tx_sa_key_a; + phy_secy->tx_sa_key_a =3D phy_secy->tx_sa_key_a; + nxp_c45_txsa_set_key(ctx, new_tx_sa); + nxp_c45_txsa_set_pn(phydev, new_tx_sa); + nxp_c45_update_key_status(phydev, new_tx_sa); + +disable_old_tx_sa: + if (old_tx_sa) { + old_tx_sa->is_enabled =3D false; + nxp_c45_txsa_get_pn(phydev, old_tx_sa); + } + } + + if (test_bit(phy_secy->secy_id, priv->macsec->secy_bitmap)) + nxp_c45_macsec_cfg_ptp(phydev, phy_secy->point_to_point); + + if (phy_secy->rx_sc) + nxp_c45_update_rx_sc_secy_cfg(phydev, phy_secy); + + return 0; +} + +static int nxp_c45_mdo_del_secy(struct macsec_context *ctx) +{ + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + struct nxp_c45_secy *phy_secy; + u32 reg; + + phydev_dbg(phydev, "delete secy SCI %llu\n", ctx->secy->sci); + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + nxp_c45_select_secy(phydev, phy_secy->secy_id); + + nxp_c45_mdo_dev_stop(ctx); + nxp_c45_tx_sa_disable(phydev, phy_secy); + nxp_c45_tx_sc_clear(phy_secy); + if (phy_secy->rx_sc) { + nxp_c45_rx_sc_del(phydev, phy_secy->rx_sc); + kfree(phy_secy->rx_sc); + } + + if (phy_interrupt_is_valid(phydev)) { + nxp_c45_macsec_read(phydev, MACSEC_EVER, ®); + reg &=3D ~TX_SC_BIT(phy_secy->secy_id); + nxp_c45_macsec_write(phydev, MACSEC_EVER, reg); + } + + clear_bit(phy_secy->secy_id, priv->macsec->tx_sc_bitmap); + list_del(&phy_secy->list); + kfree(phy_secy); + + return 0; +} + +static int nxp_c45_mdo_add_rxsc(struct macsec_context *ctx) +{ + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + struct nxp_c45_secy *phy_secy; + struct nxp_c45_rx_sc *rx_sc; + + phydev_dbg(phydev, "add RX SC %s\n", + ctx->rx_sc->active ? "enabled" : "disabled"); + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + if (phy_secy->rx_sc) + return -ENOMEM; + + if (!nxp_c45_rx_sc_valid(phy_secy, ctx->rx_sc)) + return -EINVAL; + + rx_sc =3D kzalloc(sizeof(*rx_sc), GFP_KERNEL); + if (!rx_sc) + return -ENOMEM; + + phy_secy->rx_sc =3D rx_sc; + rx_sc->rx_sc =3D ctx->rx_sc; + + nxp_c45_select_secy(phydev, phy_secy->secy_id); + nxp_c45_commit_rx_sc_cfg(phydev, phy_secy); + + return 0; +} + +static int nxp_c45_mdo_upd_rxsc(struct macsec_context *ctx) +{ + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + struct nxp_c45_secy *phy_secy; + struct nxp_c45_rx_sc *rx_sc; + + phydev_dbg(phydev, "update RX SC %llu %s\n", ctx->rx_sc->sci, + ctx->rx_sc->active ? "enabled" : "disabled"); + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + rx_sc =3D phy_secy->rx_sc; + if (rx_sc->rx_sc !=3D ctx->rx_sc) + return -EINVAL; + + nxp_c45_select_secy(phydev, phy_secy->secy_id); + nxp_c45_commit_rx_sc_cfg(phydev, phy_secy); + + return 0; +} + +static int nxp_c45_mdo_del_rxsc(struct macsec_context *ctx) +{ + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + struct nxp_c45_secy *phy_secy; + struct nxp_c45_rx_sc *rx_sc; + + phydev_dbg(phydev, "delete RX SC %llu %s\n", ctx->rx_sc->sci, + ctx->rx_sc->active ? "enabled" : "disabled"); + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + rx_sc =3D phy_secy->rx_sc; + if (rx_sc->rx_sc !=3D ctx->rx_sc) + return -EINVAL; + + nxp_c45_select_secy(phydev, phy_secy->secy_id); + nxp_c45_rx_sc_del(phydev, rx_sc); + kfree(rx_sc); + phy_secy->rx_sc =3D NULL; + + return 0; +} + +static int nxp_c45_mdo_add_rxsa(struct macsec_context *ctx) +{ + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + struct nxp_c45_secy *phy_secy; + struct nxp_c45_rx_sc *rx_sc; + struct macsec_rx_sa *rx_sa; + u8 an =3D ctx->sa.assoc_num; + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + rx_sc =3D phy_secy->rx_sc; + if (rx_sc->rx_sc !=3D ctx->sa.rx_sa->sc) + return -EINVAL; + + rx_sa =3D ctx->sa.rx_sa; + nxp_c45_select_secy(phydev, phy_secy->secy_id); + if (!rx_sc->rx_sa_a) { + phydev_dbg(phydev, "add RX SA A %u %s\n", + an, rx_sa->active ? "enabled" : "disabled"); + nxp_c45_set_rxsa_key(ctx, true); + rx_sc->rx_sa_a =3D rx_sa; + return 0; + } + + if (!rx_sc->rx_sa_b) { + phydev_dbg(phydev, "add RX SA B %u %s\n", + an, rx_sa->active ? "enabled" : "disabled"); + nxp_c45_set_rxsa_key(ctx, false); + rx_sc->rx_sa_b =3D rx_sa; + return 0; + } + + return -ENOMEM; +} + +static int nxp_c45_mdo_upd_rxsa(struct macsec_context *ctx) +{ + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + struct nxp_c45_secy *phy_secy; + struct nxp_c45_rx_sc *rx_sc; + struct macsec_rx_sa *rx_sa; + u8 an =3D ctx->sa.assoc_num; + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + rx_sc =3D phy_secy->rx_sc; + if (rx_sc->rx_sc !=3D ctx->sa.rx_sa->sc) + return -EINVAL; + + rx_sa =3D ctx->sa.rx_sa; + nxp_c45_select_secy(phydev, phy_secy->secy_id); + if (rx_sc->rx_sa_a =3D=3D rx_sa) { + phydev_dbg(phydev, "update RX SA A %u %s\n", + an, rx_sa->active ? "enabled" : "disabled"); + nxp_c45_set_rxsa_key_cfg(ctx, true, true); + return 0; + } + + if (rx_sc->rx_sa_b =3D=3D rx_sa) { + phydev_dbg(phydev, "update RX SA B %u %s\n", + an, rx_sa->active ? "enabled" : "disabled"); + nxp_c45_set_rxsa_key_cfg(ctx, false, true); + return 0; + } + + return -ENOENT; +} + +static int nxp_c45_mdo_del_rxsa(struct macsec_context *ctx) +{ + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + struct nxp_c45_secy *phy_secy; + struct nxp_c45_rx_sc *rx_sc; + struct macsec_rx_sa *rx_sa; + u8 an =3D ctx->sa.assoc_num; + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + rx_sc =3D phy_secy->rx_sc; + if (rx_sc->rx_sc !=3D ctx->sa.rx_sa->sc) + return -EINVAL; + + rx_sa =3D ctx->sa.rx_sa; + nxp_c45_select_secy(phydev, phy_secy->secy_id); + if (rx_sc->rx_sa_a =3D=3D rx_sa) { + phydev_dbg(phydev, "delete RX SA A %u %s\n", + an, rx_sa->active ? "enabled" : "disabled"); + nxp_c45_disable_rxsa_key(phydev, true); + rx_sc->rx_sa_a =3D NULL; + return 0; + } + + if (rx_sc->rx_sa_b =3D=3D rx_sa) { + phydev_dbg(phydev, "delete RX SA B %u %s\n", + an, rx_sa->active ? "enabled" : "disabled"); + nxp_c45_disable_rxsa_key(phydev, false); + rx_sc->rx_sa_b =3D NULL; + return 0; + } + + return -ENOENT; +} + +static int nxp_c45_mdo_add_txsa(struct macsec_context *ctx) +{ + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + struct nxp_c45_secy *phy_secy; + struct nxp_c45_tx_sa *tx_sa; + u8 sa =3D ctx->sa.assoc_num; + + phydev_dbg(phydev, "add TX SA %u %s\n", ctx->sa.assoc_num, + ctx->sa.tx_sa->active ? "enabled" : "disabled"); + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + if (phy_secy->tx_sa[sa]) + return -EBUSY; + + tx_sa =3D kzalloc(sizeof(*tx_sa), GFP_KERNEL); + tx_sa->an =3D ctx->sa.assoc_num; + memcpy(tx_sa->key, ctx->sa.key, MACSEC_MAX_KEY_LEN); + memcpy(tx_sa->salt, ctx->sa.tx_sa->key.salt.bytes, MACSEC_SALT_LEN); + tx_sa->tx_sa =3D ctx->sa.tx_sa; + tx_sa->next_pn =3D ctx->sa.tx_sa->next_pn; + phy_secy->tx_sa[sa] =3D tx_sa; + + if (tx_sa->an =3D=3D phy_secy->enabled_an && tx_sa->tx_sa->active) { + nxp_c45_select_secy(phydev, phy_secy->secy_id); + tx_sa->is_key_a =3D phy_secy->tx_sa_key_a; + phy_secy->tx_sa_key_a =3D !phy_secy->tx_sa_key_a; + nxp_c45_txsa_set_key(ctx, tx_sa); + nxp_c45_txsa_set_pn(phydev, tx_sa); + nxp_c45_update_key_status(phydev, tx_sa); + } + + return 0; +} + +static int nxp_c45_mdo_upd_txsa(struct macsec_context *ctx) +{ + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + u64 next_pn =3D ctx->sa.tx_sa->next_pn; + struct nxp_c45_secy *phy_secy; + struct nxp_c45_tx_sa *tx_sa; + u8 sa =3D ctx->sa.assoc_num; + + phydev_dbg(phydev, "update TX SA %u %s\n", ctx->sa.assoc_num, + ctx->sa.tx_sa->active ? "enabled" : "disabled"); + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + tx_sa =3D phy_secy->tx_sa[sa]; + if (!tx_sa) + return -EINVAL; + + nxp_c45_select_secy(phydev, phy_secy->secy_id); + + if (tx_sa->is_enabled && tx_sa->tx_sa->active && next_pn) { + tx_sa->next_pn =3D next_pn; + nxp_c45_txsa_set_pn(phydev, tx_sa); + + return 0; + } + + if (tx_sa->is_enabled && !tx_sa->tx_sa->active) { + if (next_pn) + tx_sa->next_pn =3D next_pn; + else + nxp_c45_txsa_get_pn(phydev, tx_sa); + + nxp_c45_update_key_status(phydev, tx_sa); + + return 0; + } + + if (!tx_sa->is_enabled && tx_sa->tx_sa->active && + tx_sa->an =3D=3D phy_secy->enabled_an) { + if (next_pn) + tx_sa->next_pn =3D next_pn; + + tx_sa->is_key_a =3D phy_secy->tx_sa_key_a; + phy_secy->tx_sa_key_a =3D !phy_secy->tx_sa_key_a; + nxp_c45_txsa_set_key(ctx, tx_sa); + nxp_c45_txsa_set_pn(phydev, tx_sa); + nxp_c45_update_key_status(phydev, tx_sa); + + return 0; + } + + if (!tx_sa->is_enabled && !tx_sa->tx_sa->active) + tx_sa->next_pn =3D next_pn; + + return 0; +} + +static int nxp_c45_mdo_del_txsa(struct macsec_context *ctx) +{ + struct macsec_tx_sa *ctx_sa =3D ctx->sa.tx_sa; + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + struct nxp_c45_secy *phy_secy; + struct nxp_c45_tx_sa *tx_sa; + u8 sa =3D ctx->sa.assoc_num; + + phydev_dbg(phydev, "delete TX SA %u %s\n", sa, + ctx_sa->active ? "enabled" : "disabled"); + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + tx_sa =3D phy_secy->tx_sa[sa]; + if (!tx_sa) + return -EINVAL; + + nxp_c45_select_secy(phydev, phy_secy->secy_id); + + if (tx_sa->is_enabled) + nxp_c45_update_key_status(phydev, tx_sa); + + phy_secy->tx_sa[sa] =3D NULL; + kfree(tx_sa); + + return 0; +} + +static const struct macsec_ops nxp_c45_macsec_ops =3D { + .mdo_dev_open =3D nxp_c45_mdo_dev_open, + .mdo_dev_stop =3D nxp_c45_mdo_dev_stop, + .mdo_add_secy =3D nxp_c45_mdo_add_secy, + .mdo_upd_secy =3D nxp_c45_mdo_upd_secy, + .mdo_del_secy =3D nxp_c45_mdo_del_secy, + .mdo_add_rxsc =3D nxp_c45_mdo_add_rxsc, + .mdo_upd_rxsc =3D nxp_c45_mdo_upd_rxsc, + .mdo_del_rxsc =3D nxp_c45_mdo_del_rxsc, + .mdo_add_rxsa =3D nxp_c45_mdo_add_rxsa, + .mdo_upd_rxsa =3D nxp_c45_mdo_upd_rxsa, + .mdo_del_rxsa =3D nxp_c45_mdo_del_rxsa, + .mdo_add_txsa =3D nxp_c45_mdo_add_txsa, + .mdo_upd_txsa =3D nxp_c45_mdo_upd_txsa, + .mdo_del_txsa =3D nxp_c45_mdo_del_txsa, +}; + +int nxp_c45_macsec_probe(struct phy_device *phydev) +{ + struct nxp_c45_phy *priv =3D phydev->priv; + + priv->macsec =3D kzalloc(sizeof(*priv->macsec), GFP_KERNEL); + if (!priv->macsec) + return -ENOMEM; + + INIT_LIST_HEAD(&priv->macsec->secy_list); + phydev->macsec_ops =3D &nxp_c45_macsec_ops; + + return 0; +} + +void nxp_c45_handle_macsec_interrupt(struct phy_device *phydev, + irqreturn_t *ret) +{ + struct nxp_c45_phy *priv =3D phydev->priv; + struct nxp_c45_secy *pos, *tmp; + struct nxp_c45_tx_sa *tx_sa; + int secy_id; + u32 reg =3D 0; + + if (!phydev->macsec_ops) + return; + + do { + nxp_c45_macsec_read(phydev, MACSEC_EVR, ®); + if (!reg) + return; + + secy_id =3D MACSEC_REG_SIZE - ffs(reg); + list_for_each_entry_safe(pos, tmp, &priv->macsec->secy_list, + list) + if (pos->secy_id =3D=3D secy_id) + break; + + phydev_dbg(phydev, "pn_wrapped: tx sc %d, tx sa an %u\n", + pos->secy_id, pos->enabled_an); + tx_sa =3D pos->tx_sa[pos->enabled_an]; + macsec_pn_wrapped(pos->secy, tx_sa->tx_sa); + nxp_c45_macsec_write(phydev, MACSEC_EVR, + TX_SC_BIT(pos->secy_id)); + *ret =3D IRQ_HANDLED; + } while (reg); +} diff --git a/drivers/net/phy/nxp-c45-tja11xx.c b/drivers/net/phy/nxp-c45-tj= a11xx.c index 7ab080ff02df..5bf7caa4e63d 100644 --- a/drivers/net/phy/nxp-c45-tja11xx.c +++ b/drivers/net/phy/nxp-c45-tja11xx.c @@ -14,9 +14,10 @@ #include #include #include -#include #include =20 +#include "nxp-c45-tja11xx.h" + #define PHY_ID_TJA_1103 0x001BB010 #define PHY_ID_TJA_1120 0x001BB031 =20 @@ -75,9 +76,11 @@ #define PORT_CONTROL_EN BIT(14) =20 #define VEND1_PORT_ABILITIES 0x8046 +#define MACSEC_ABILITY BIT(5) #define PTP_ABILITY BIT(3) =20 #define VEND1_PORT_FUNC_IRQ_EN 0x807A +#define MACSEC_IRQS BIT(5) #define PTP_IRQS BIT(3) =20 #define VEND1_PTP_IRQ_ACK 0x9008 @@ -148,7 +151,6 @@ =20 #define TS_SEC_MASK GENMASK(1, 0) =20 -#define VEND1_PORT_FUNC_ENABLES 0x8048 #define PTP_ENABLE BIT(3) #define PHY_TEST_ENABLE BIT(0) =20 @@ -281,25 +283,6 @@ struct nxp_c45_phy_data { irqreturn_t *irq_status); }; =20 -struct nxp_c45_phy { - const struct nxp_c45_phy_data *phy_data; - struct phy_device *phydev; - struct mii_timestamper mii_ts; - struct ptp_clock *ptp_clock; - struct ptp_clock_info caps; - struct sk_buff_head tx_queue; - struct sk_buff_head rx_queue; - /* used to access the PTP registers atomic */ - struct mutex ptp_lock; - int hwts_tx; - int hwts_rx; - u32 tx_delay; - u32 rx_delay; - struct timespec64 extts_ts; - int extts_index; - bool extts; -}; - static const struct nxp_c45_phy_data *nxp_c45_get_data(struct phy_device *phydev) { @@ -1218,12 +1201,25 @@ static int nxp_c45_start_op(struct phy_device *phyd= ev) =20 static int nxp_c45_config_intr(struct phy_device *phydev) { - if (phydev->interrupts =3D=3D PHY_INTERRUPT_ENABLED) + int ret; + + if (phydev->interrupts =3D=3D PHY_INTERRUPT_ENABLED) { + ret =3D phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, + VEND1_PORT_FUNC_IRQ_EN, MACSEC_IRQS); + if (ret) + return ret; + return phy_set_bits_mmd(phydev, MDIO_MMD_VEND1, VEND1_PHY_IRQ_EN, PHY_IRQ_LINK_EVENT); - else - return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, - VEND1_PHY_IRQ_EN, PHY_IRQ_LINK_EVENT); + } + + ret =3D phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, + VEND1_PORT_FUNC_IRQ_EN, MACSEC_IRQS); + if (ret) + return ret; + + return phy_clear_bits_mmd(phydev, MDIO_MMD_VEND1, + VEND1_PHY_IRQ_EN, PHY_IRQ_LINK_EVENT); } =20 static int tja1103_config_intr(struct phy_device *phydev) @@ -1289,6 +1285,7 @@ static irqreturn_t nxp_c45_handle_interrupt(struct ph= y_device *phydev) } =20 data->nmi_handler(phydev, &ret); + nxp_c45_handle_macsec_interrupt(phydev, &ret); =20 return ret; } @@ -1614,6 +1611,7 @@ static int nxp_c45_config_init(struct phy_device *phy= dev) =20 nxp_c45_counters_enable(phydev); nxp_c45_ptp_init(phydev); + nxp_c45_macsec_config_init(phydev); =20 return nxp_c45_start_op(phydev); } @@ -1629,7 +1627,9 @@ static int nxp_c45_get_features(struct phy_device *ph= ydev) static int nxp_c45_probe(struct phy_device *phydev) { struct nxp_c45_phy *priv; - int ptp_ability; + bool macsec_ability; + int phy_abilities; + bool ptp_ability; int ret =3D 0; =20 priv =3D devm_kzalloc(&phydev->mdio.dev, sizeof(*priv), GFP_KERNEL); @@ -1645,9 +1645,9 @@ static int nxp_c45_probe(struct phy_device *phydev) =20 mutex_init(&priv->ptp_lock); =20 - ptp_ability =3D phy_read_mmd(phydev, MDIO_MMD_VEND1, - VEND1_PORT_ABILITIES); - ptp_ability =3D !!(ptp_ability & PTP_ABILITY); + phy_abilities =3D phy_read_mmd(phydev, MDIO_MMD_VEND1, + VEND1_PORT_ABILITIES); + ptp_ability =3D !!(phy_abilities & PTP_ABILITY); if (!ptp_ability) { phydev_dbg(phydev, "the phy does not support PTP"); goto no_ptp_support; @@ -1666,6 +1666,20 @@ static int nxp_c45_probe(struct phy_device *phydev) } =20 no_ptp_support: + macsec_ability =3D !!(phy_abilities & MACSEC_ABILITY); + if (!macsec_ability) { + phydev_info(phydev, "the phy does not support MACsec\n"); + goto no_macsec_support; + } + + if (IS_ENABLED(CONFIG_MACSEC)) { + ret =3D nxp_c45_macsec_probe(phydev); + phydev_dbg(phydev, "MACsec support enabled."); + } else { + phydev_dbg(phydev, "MACsec support not enabled even if the phy supports = it"); + } + +no_macsec_support: =20 return ret; } diff --git a/drivers/net/phy/nxp-c45-tja11xx.h b/drivers/net/phy/nxp-c45-tj= a11xx.h new file mode 100644 index 000000000000..905c5afb0a5e --- /dev/null +++ b/drivers/net/phy/nxp-c45-tja11xx.h @@ -0,0 +1,55 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +/* NXP C45 PHY driver header file + * Copyright 2023 NXP + * Author: Radu Pirea + */ + +#include + +#define VEND1_PORT_FUNC_ENABLES 0x8048 + +struct nxp_c45_macsec; + +struct nxp_c45_phy { + const struct nxp_c45_phy_data *phy_data; + struct phy_device *phydev; + struct mii_timestamper mii_ts; + struct ptp_clock *ptp_clock; + struct ptp_clock_info caps; + struct sk_buff_head tx_queue; + struct sk_buff_head rx_queue; + /* used to access the PTP registers atomic */ + struct mutex ptp_lock; + int hwts_tx; + int hwts_rx; + u32 tx_delay; + u32 rx_delay; + struct timespec64 extts_ts; + int extts_index; + bool extts; + struct nxp_c45_macsec *macsec; +}; + +#if IS_ENABLED(CONFIG_MACSEC) +void nxp_c45_macsec_config_init(struct phy_device *phydev); +void nxp_c45_handle_macsec_interrupt(struct phy_device *phydev, + irqreturn_t *ret); +int nxp_c45_macsec_probe(struct phy_device *phydev); +#else +static inline +void nxp_c45_macsec_config_init(struct phy_device *phydev) +{ +} + +static inline +void nxp_c45_handle_macsec_interrupt(struct phy_device *phydev, + irqreturn_t *ret) +{ +} + +static inline +int nxp_c45_macsec_probe(struct phy_device *phydev) +{ + return 0; +} +#endif --=20 2.34.1 From nobody Thu Dec 18 09:45:24 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id A59BDC7EE43 for ; Thu, 24 Aug 2023 09:17:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240553AbjHXJRG (ORCPT ); Thu, 24 Aug 2023 05:17:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49556 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237068AbjHXJQ6 (ORCPT ); Thu, 24 Aug 2023 05:16:58 -0400 Received: from EUR03-AM7-obe.outbound.protection.outlook.com (mail-am7eur03on2057.outbound.protection.outlook.com [40.107.105.57]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E4610E67; Thu, 24 Aug 2023 02:16:55 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=bwUYuYyrStB2ReSqRbhgCS/Fhw3UVxjufjANXAK4ctsc1Xa2M5oai8//LsbBUv4jQIDApT21JQaVobgr/u0xVZrqQmgZONjSgkpF8eH5yJr8zupljtQT9ooHRU1k6ENz1RMaKilSHOknWcnOphZ5+u/cgClwQPhcOT+f2+5NoOhR98QG2sdPHD4xLj7a+BdRuRG5qhzRB/3TCbhefISe5Wl9dXNBrLAvg9NKRETZ8J9Y/L8ofWhzE5xXK0KlovLS+UIBrnqGUXqnzgkafOP2UkYJf8suphBKRf8ZsF4r1VRGnVLENvUVmn/r1Zi1IBOsB2uejNnoiZKRc/ozhwOchQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=anR/htTVF+0zb+XilB1FcZ6pnbSQGbLTJ/2FyLpJZSI=; b=AOvSFSLsGk5DaxpDWe+vzKwBZrDhVDgl9mgJOgi6pjYx/mB8P6jcv+1brOa09hHm5q8S18gmR3/w/XylRuHbxPNyG6QqMdYN3uEkIK5BdNFTYYslIPFG7oJzpI8/jypCA4CwMvoOFaUql757JtZiN1dbjKIdptAy+HGAMwZligkcOWdgG75udJPixL953cetG2Df35KbfdRto2AZyocb8WTZt9tpGFTjdJiW2nKpQDZyMFUPN1fSwenlDG+C4Yx4HQqt/7sDbfBGZG+nOCln3TRxchrjuT9Pp0vqaWYX+A/DcRrz//A7UeOqw2XGtk3LztIMFdFK8pnrs9n6sHYm3A== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector2-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=anR/htTVF+0zb+XilB1FcZ6pnbSQGbLTJ/2FyLpJZSI=; b=UPS7x/V+I6icgjnITWFAYG1ndpFAazcbK8GBYjTOJAoGp0XUNp9eKFDch1FeIq8/kqn2feiFiwvOxUK+PWW0L30nExmm2wiMJGxfyrKbhMX49QXLFhCw/TtSVy/fmKFkKpw189XaTsU14f3TKyFmmPd+LrSrYUH4Tqyahh//xdg= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM9PR04MB8954.eurprd04.prod.outlook.com (2603:10a6:20b:409::7) by DBBPR04MB7675.eurprd04.prod.outlook.com (2603:10a6:10:207::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6699.27; Thu, 24 Aug 2023 09:16:52 +0000 Received: from AM9PR04MB8954.eurprd04.prod.outlook.com ([fe80::2545:6d13:5905:bf50]) by AM9PR04MB8954.eurprd04.prod.outlook.com ([fe80::2545:6d13:5905:bf50%5]) with mapi id 15.20.6678.031; Thu, 24 Aug 2023 09:16:52 +0000 From: "Radu Pirea (NXP OSS)" To: andrew@lunn.ch, hkallweit1@gmail.com, linux@armlinux.org.uk, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, richardcochran@gmail.com, sd@queasysnail.net, sebastian.tobuschat@nxp.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, "Radu Pirea (NXP OSS)" Subject: [RFC net-next v2 4/5] net: phy: nxp-c45-tja11xx: add MACsec statistics Date: Thu, 24 Aug 2023 12:16:14 +0300 Message-Id: <20230824091615.191379-5-radu-nicolae.pirea@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230824091615.191379-1-radu-nicolae.pirea@oss.nxp.com> References: <20230824091615.191379-1-radu-nicolae.pirea@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0PR10CA0116.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:e6::33) To AM9PR04MB8954.eurprd04.prod.outlook.com (2603:10a6:20b:409::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM9PR04MB8954:EE_|DBBPR04MB7675:EE_ X-MS-Office365-Filtering-Correlation-Id: 711b7e44-c657-420a-62da-08dba482dab8 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 2jM8HhC99nDh+OLqF+V0hiVq1yrIpKsUrde8rh3HiZKsU0uqfCN5Q5XxH9diAEPQtL5Ne/QSdVmKoG84aAXfVz28Lb79JiqJUDrqJH9y4ED/MtABy69Z0f7j2H18AxwGPmMj7HCrSXYxxFycg63SEOKMbiIMxa9vlrHwR5Tzd+DU9qsZQVA/pbE7eqyZ+c1eejZMcVUiBTF3dHvOepryEwMQjpFOG0OLJGjVHo3pdP2rn61vHSrkOnK4u2o5I//bVtodQ3DbGXflFuYmLz4LIRqDGpJe6v5bDOnVufRvFJs48E8UtD1BqqkvLwQB4p/opImoibUWXlUnTVHyKwcUqTIKjr8QfdIFfyPLbu7C0etFXf3BWU4aD86KhWDm6h/dSCf5zdJPHrGZIaMlVHwFOYkmYjXCgMtiDO5w/n7VsfYGG55P4YiuLFy/uP2ohNd0R1GIIaecjYBDfj7xlzrYW5muAWb7tDGkRxSvuoyH2dNyvkIUYY0Ho0VR9xNrX/n+7Tefg1RvPO4cF1qwd4IESCEek8mp7uadfXny2TuSGTof+KRsnu1UuZJ/armLweeQlOaMDfuohJuqE5oSHguJzQ8ghGyOr5jfsMQgjgwaI1Aog8Ju+sAMvk4AxWibu9bpD9DMJp2f4Phcp9a3mJ3wdA== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM9PR04MB8954.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(376002)(39860400002)(346002)(366004)(136003)(396003)(186009)(1800799009)(451199024)(1076003)(2616005)(5660300002)(4326008)(8676002)(8936002)(30864003)(83380400001)(7416002)(26005)(38350700002)(921005)(6666004)(38100700002)(66946007)(66556008)(66476007)(316002)(478600001)(41300700001)(6512007)(2906002)(6506007)(86362001)(52116002)(6486002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?RDRy74y2KeYWOs2j5N6gpuU8f6ThPTnXiC+SiYuQYtf/LcBi0jtR8c4knvqN?= =?us-ascii?Q?lfhzafs9cKYkkgNLVRtZrkmAeOrbIlIIrjpqJBzKk0JOBG8XKroydBjira3j?= =?us-ascii?Q?r1Wtv1BEN2x0lgsVzQnVV+TLuSFd4gRBBJWvgovLjy5hde7VF8KqKYEpoc5H?= =?us-ascii?Q?RasRBf1bkyuz3ZPekBWBxhezs4GBDuA/DtdEBnDqq9Hd8mWIsMeg//7JOpcb?= =?us-ascii?Q?FZSmns6VRCdijt+PJT6JrEYshJZ/97Mgg8z1Ek0xPyQ1pWPKM7flhuzccKXg?= =?us-ascii?Q?jMih3n/AoWTbpHZnXvd9CmKs14MKgUf19tVwI5GjBh8q85Aw186+4ui3L+Fj?= =?us-ascii?Q?Uel17NNQGWv5KWPEfe9fAJt8Z9//fPERosZ76nU5+eXy9s5SCHwFWyhC176w?= =?us-ascii?Q?v8InYJI5KdBWC71hliwrmkVp+IwccPdYwWVILpf1IcI5uRzUuz+eKeBCASZB?= =?us-ascii?Q?lG2M7xK42PJZEwhYy6g5VOp/rqticVvM8WXOKqFYMoM/gLPdpiAEByDXCw5F?= =?us-ascii?Q?g0mwqjNyPvkAOyZvoC/3anmRTH3pzawwpjr7ciPkZfx8xaihE9maZJQYIRl9?= =?us-ascii?Q?FeVU32nIYmPWCv7VohRCr1/8+M6nPsaPYYaC/Pfo6rHRloPAzKDkOgoHr8HZ?= =?us-ascii?Q?s47GSni9BaqmdRSEFjwsZXHWHadZI2iGtFo/PdhJSSFWAWXw37kJ3GQkTZog?= =?us-ascii?Q?VrWyGQn+xgNlSi3SZxfkABi2vDgmmoCvds5xOFsMwTckeckZUp2FNGkSU2s7?= =?us-ascii?Q?wTURn+TTeKn//ydSl++s/aBPBqqLxxdJh89BqsHJzZa7m6pl2M/ntHJbdvFZ?= =?us-ascii?Q?7laU8JoBEZHjI/AdQaqSVal7OBCxJbOyTHFLjccvg75qdoojSf1bTjUVnTeu?= =?us-ascii?Q?wITIDQoPiMBnqrzhiZodM4E8tRKCtOnSK08ZocyoOUaQCGT27W6+TkqCIDNR?= =?us-ascii?Q?FLg5VmGup4MwgvAf4s85emYMFexnOHCI9P0vXCyzDI39a7EwrFzu1hUXegNi?= =?us-ascii?Q?TKJdn6lOBqTAIwcxV9+odBMGqIV9kLD3GDHBMYbENsCCfpBq6jttSDrz7+uD?= =?us-ascii?Q?/7sIHKaP8H+7gnbZT1Ki778BRoJ0b5jGa+dKfBTYJAr4EF9sPNGEFT8ySuGr?= =?us-ascii?Q?WIi8MS4EG1fvIRXLnPPvxXpIKDBDA6AIhXzTg92Lx/Tud/p8zC6PW7/ADian?= =?us-ascii?Q?eAFxvcrxLvrFmA7W9gQ7/UTudi1kk+SNR8lYzV0yqC+ajjSpqkAlzJwhqUGD?= =?us-ascii?Q?/l5TDuIMiy0vDmQALCLeVAin8yu0zxWngUXSLiY/dxkPBGqO5LwElGQeFD25?= =?us-ascii?Q?kLSzWbvvm9V6uj1XuzXOEMy/W7toVnMx/iue11lqcnQ3p89+8wJHsj3JIGn+?= =?us-ascii?Q?P/lQuT2BvIYTIngdeVnqbiXpEFM2skFX4kWvMLd9iGj9OkAHNyAh9/fNKDjo?= =?us-ascii?Q?g8IeD9CMCgzcQ8Itlz2TM+bcIEGz9os7NrK7nO7nc9cX6ev9EPBAq0NiwwHf?= =?us-ascii?Q?6fYy/W+GM4M4CXYGSU+6SbZBBe7oFrrxCLDa2+ooQKxyEifk1gs+EXSsheoh?= =?us-ascii?Q?bGpwQlJPeeFKJffIIiragxxyN6jA4ldZL18R8FwVJP4rWVuMgvupuHYj1+O6?= =?us-ascii?Q?jA=3D=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: 711b7e44-c657-420a-62da-08dba482dab8 X-MS-Exchange-CrossTenant-AuthSource: AM9PR04MB8954.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Aug 2023 09:16:52.7110 (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: RPkDMlHEoC6vYDF9BhHeE1uG317yqDjsfVo/3U9xQ4qXS75IgB4P3mmQja2OFv0rdNfjhrswMU6CBd7a5uFvUfutQkyTmywvq6G+VkfizN8= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DBBPR04MB7675 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Add MACsec statistics callbacks. The statistic registers must be set to 0 if the SC/SA is deleted to read relevant values next time when the SC/SA is used. Signed-off-by: Radu Pirea (NXP OSS) --- drivers/net/phy/nxp-c45-tja11xx-macsec.c | 416 ++++++++++++++++++++++- 1 file changed, 415 insertions(+), 1 deletion(-) diff --git a/drivers/net/phy/nxp-c45-tja11xx-macsec.c b/drivers/net/phy/nxp= -c45-tja11xx-macsec.c index 1567865b8de4..edfdd2540d39 100644 --- a/drivers/net/phy/nxp-c45-tja11xx-macsec.c +++ b/drivers/net/phy/nxp-c45-tja11xx-macsec.c @@ -140,6 +140,33 @@ #define ADAPTER_EN BIT(6) #define MACSEC_EN BIT(5) =20 +#define MACSEC_INOV1HS 0x0140 +#define MACSEC_INOV2HS 0x0144 +#define MACSEC_INOD1HS 0x0148 +#define MACSEC_INOD2HS 0x014C +#define MACSEC_RXSCIPUS 0x0150 +#define MACSEC_RXSCIPDS 0x0154 +#define MACSEC_RXSCIPLS 0x0158 +#define MACSEC_RXAN0INUSS 0x0160 +#define MACSEC_RXAN0IPUSS 0x0170 +#define MACSEC_RXSAAIPOS 0x0194 +#define MACSEC_RXSAAIPIS 0x01B0 +#define MACSEC_RXSAAIPNVS 0x01B4 +#define MACSEC_RXSABIPOS 0x01D4 +#define MACSEC_RXSABIPIS 0x01F0 +#define MACSEC_RXSABIPNVS 0x01F4 +#define MACSEC_OPUS 0x021C +#define MACSEC_OPTLS 0x022C +#define MACSEC_OOE1HS 0x0248 +#define MACSEC_OOE2HS 0x024C +#define MACSEC_TXSAAOPPS 0x028C +#define MACSEC_TXSAAOPES 0x0290 +#define MACSEC_TXSABOPPS 0x02CC +#define MACSEC_TXSABOPES 0x02D0 +#define MACSEC_INPWTS 0x0630 +#define MACSEC_INPBTS 0x0638 +#define MACSEC_IPSNFS 0x063C + struct nxp_c45_rx_sc { struct macsec_rx_sc *rx_sc; struct macsec_rx_sa *rx_sa_a; @@ -148,6 +175,7 @@ struct nxp_c45_rx_sc { =20 struct nxp_c45_tx_sa { struct macsec_tx_sa *tx_sa; + struct macsec_tx_sa_stats stats; u8 key[MACSEC_MAX_KEY_LEN]; u8 salt[MACSEC_SALT_LEN]; u8 an; @@ -787,6 +815,113 @@ static int nxp_c45_disable_rxsa_key(struct phy_device= *phydev, bool key_a) return 0; } =20 +static void nxp_c45_clear_dev_stats(struct phy_device *phydev, + struct nxp_c45_secy *phy_secy) +{ + nxp_c45_macsec_write(phydev, MACSEC_OPUS, 0); + nxp_c45_macsec_write(phydev, MACSEC_OPTLS, 0); + nxp_c45_macsec_write(phydev, MACSEC_OOE1HS, 0); + nxp_c45_macsec_write(phydev, MACSEC_OOE2HS, 0); + nxp_c45_macsec_write(phydev, MACSEC_TXSAAOPES, 0); + nxp_c45_macsec_write(phydev, MACSEC_TXSABOPES, 0); + nxp_c45_macsec_write(phydev, MACSEC_TXSAAOPPS, 0); + nxp_c45_macsec_write(phydev, MACSEC_TXSABOPPS, 0); + + if (phy_secy->rx_sc) { + nxp_c45_macsec_write(phydev, MACSEC_INPBTS, 0); + nxp_c45_macsec_write(phydev, MACSEC_INPWTS, 0); + nxp_c45_macsec_write(phydev, MACSEC_IPSNFS, 0); + } +} + +static void nxp_c45_clear_rx_sc_stats(struct phy_device *phydev) +{ + int i; + + nxp_c45_macsec_write(phydev, MACSEC_RXSAAIPIS, 0); + nxp_c45_macsec_write(phydev, MACSEC_RXSAAIPNVS, 0); + nxp_c45_macsec_write(phydev, MACSEC_RXSAAIPOS, 0); + + nxp_c45_macsec_write(phydev, MACSEC_RXSABIPIS, 0); + nxp_c45_macsec_write(phydev, MACSEC_RXSABIPNVS, 0); + nxp_c45_macsec_write(phydev, MACSEC_RXSABIPOS, 0); + + nxp_c45_macsec_write(phydev, MACSEC_INOD1HS, 0); + nxp_c45_macsec_write(phydev, MACSEC_INOD2HS, 0); + + nxp_c45_macsec_write(phydev, MACSEC_INOV1HS, 0); + nxp_c45_macsec_write(phydev, MACSEC_INOV2HS, 0); + + nxp_c45_macsec_write(phydev, MACSEC_RXSCIPDS, 0); + nxp_c45_macsec_write(phydev, MACSEC_RXSCIPLS, 0); + nxp_c45_macsec_write(phydev, MACSEC_RXSCIPUS, 0); + + for (i =3D 0; i < MACSEC_NUM_AN; i++) + nxp_c45_macsec_write(phydev, MACSEC_RXAN0INUSS + i * 4, 0); + + for (i =3D 0; i < MACSEC_NUM_AN; i++) + nxp_c45_macsec_write(phydev, MACSEC_RXAN0IPUSS + i * 4, 0); +} + +static void nxp_c45_tx_sa_stats_read(struct phy_device *phydev, + struct nxp_c45_tx_sa *tx_sa, + struct macsec_tx_sa_stats *stats) +{ + u32 reg =3D 0; + + if (tx_sa->is_key_a) { + nxp_c45_macsec_read(phydev, MACSEC_TXSAAOPES, ®); + stats->OutPktsEncrypted =3D reg; + nxp_c45_macsec_read(phydev, MACSEC_TXSAAOPPS, ®); + stats->OutPktsProtected =3D reg; + } else { + nxp_c45_macsec_read(phydev, MACSEC_TXSABOPES, ®); + stats->OutPktsEncrypted =3D reg; + nxp_c45_macsec_read(phydev, MACSEC_TXSABOPPS, ®); + stats->OutPktsProtected =3D reg; + } +} + +static void nxp_c45_tx_sa_stats_clear(struct phy_device *phydev, + struct nxp_c45_tx_sa *tx_sa) +{ + if (tx_sa->is_key_a) { + nxp_c45_macsec_write(phydev, MACSEC_TXSAAOPES, 0); + nxp_c45_macsec_write(phydev, MACSEC_TXSAAOPPS, 0); + } else { + nxp_c45_macsec_write(phydev, MACSEC_TXSABOPES, 0); + nxp_c45_macsec_write(phydev, MACSEC_TXSABOPPS, 0); + } +} + +static void nxp_c45_tx_sa_stats_backup(struct phy_device *phydev, + struct nxp_c45_tx_sa *tx_sa) +{ + struct macsec_tx_sa_stats stats; + + nxp_c45_tx_sa_stats_read(phydev, tx_sa, &stats); + tx_sa->stats.OutPktsEncrypted +=3D stats.OutPktsEncrypted; + tx_sa->stats.OutPktsProtected +=3D stats.OutPktsProtected; + nxp_c45_tx_sa_stats_clear(phydev, tx_sa); +} + +static void nxp_c45_clear_rx_sa_stats(struct phy_device *phydev, + u8 an, bool is_key_a) +{ + if (is_key_a) { + nxp_c45_macsec_write(phydev, MACSEC_RXSAAIPIS, 0); + nxp_c45_macsec_write(phydev, MACSEC_RXSAAIPNVS, 0); + nxp_c45_macsec_write(phydev, MACSEC_RXSAAIPOS, 0); + } else { + nxp_c45_macsec_write(phydev, MACSEC_RXSABIPIS, 0); + nxp_c45_macsec_write(phydev, MACSEC_RXSABIPNVS, 0); + nxp_c45_macsec_write(phydev, MACSEC_RXSABIPOS, 0); + } + + nxp_c45_macsec_write(phydev, MACSEC_RXAN0INUSS + an * 4, 0); + nxp_c45_macsec_write(phydev, MACSEC_RXAN0IPUSS + an * 4, 0); +} + static int nxp_c45_rx_sc_del(struct phy_device *phydev, struct nxp_c45_rx_sc *rx_sc) { @@ -801,6 +936,8 @@ static int nxp_c45_rx_sc_del(struct phy_device *phydev, if (rx_sc->rx_sa_b) nxp_c45_disable_rxsa_key(phydev, false); =20 + nxp_c45_clear_rx_sc_stats(phydev); + return 0; } =20 @@ -961,6 +1098,7 @@ static int nxp_c45_mdo_upd_secy(struct macsec_context = *ctx) if (old_tx_sa) { old_tx_sa->is_enabled =3D false; nxp_c45_txsa_get_pn(phydev, old_tx_sa); + nxp_c45_tx_sa_stats_backup(phydev, old_tx_sa); } } =20 @@ -979,6 +1117,7 @@ static int nxp_c45_mdo_del_secy(struct macsec_context = *ctx) struct nxp_c45_phy *priv =3D phydev->priv; struct nxp_c45_secy *phy_secy; u32 reg; + int i; =20 phydev_dbg(phydev, "delete secy SCI %llu\n", ctx->secy->sci); =20 @@ -990,11 +1129,16 @@ static int nxp_c45_mdo_del_secy(struct macsec_contex= t *ctx) nxp_c45_mdo_dev_stop(ctx); nxp_c45_tx_sa_disable(phydev, phy_secy); nxp_c45_tx_sc_clear(phy_secy); + nxp_c45_clear_dev_stats(phydev, phy_secy); if (phy_secy->rx_sc) { nxp_c45_rx_sc_del(phydev, phy_secy->rx_sc); kfree(phy_secy->rx_sc); } =20 + for (i =3D 0; i < ARRAY_SIZE(phy_secy->tx_sa); i++) + if (phy_secy->tx_sa[i] && phy_secy->tx_sa[i]->is_enabled) + nxp_c45_tx_sa_stats_clear(phydev, phy_secy->tx_sa[i]); + if (phy_interrupt_is_valid(phydev)) { nxp_c45_macsec_read(phydev, MACSEC_EVER, ®); reg &=3D ~TX_SC_BIT(phy_secy->secy_id); @@ -1188,6 +1332,7 @@ static int nxp_c45_mdo_del_rxsa(struct macsec_context= *ctx) phydev_dbg(phydev, "delete RX SA A %u %s\n", an, rx_sa->active ? "enabled" : "disabled"); nxp_c45_disable_rxsa_key(phydev, true); + nxp_c45_clear_rx_sa_stats(phydev, an, true); rx_sc->rx_sa_a =3D NULL; return 0; } @@ -1196,6 +1341,7 @@ static int nxp_c45_mdo_del_rxsa(struct macsec_context= *ctx) phydev_dbg(phydev, "delete RX SA B %u %s\n", an, rx_sa->active ? "enabled" : "disabled"); nxp_c45_disable_rxsa_key(phydev, false); + nxp_c45_clear_rx_sa_stats(phydev, an, false); rx_sc->rx_sa_b =3D NULL; return 0; } @@ -1323,8 +1469,10 @@ static int nxp_c45_mdo_del_txsa(struct macsec_contex= t *ctx) =20 nxp_c45_select_secy(phydev, phy_secy->secy_id); =20 - if (tx_sa->is_enabled) + if (tx_sa->is_enabled) { nxp_c45_update_key_status(phydev, tx_sa); + nxp_c45_tx_sa_stats_clear(phydev, tx_sa); + } =20 phy_secy->tx_sa[sa] =3D NULL; kfree(tx_sa); @@ -1332,6 +1480,267 @@ static int nxp_c45_mdo_del_txsa(struct macsec_conte= xt *ctx) return 0; } =20 +static int nxp_c45_mdo_get_dev_stats(struct macsec_context *ctx) +{ + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + struct macsec_dev_stats *dev_stats; + struct nxp_c45_secy *phy_secy; + u32 reg =3D 0; + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + dev_stats =3D ctx->stats.dev_stats; + nxp_c45_select_secy(phydev, phy_secy->secy_id); + + nxp_c45_macsec_read(phydev, MACSEC_OPUS, ®); + dev_stats->OutPktsUntagged =3D reg; + nxp_c45_macsec_read(phydev, MACSEC_OPTLS, ®); + dev_stats->OutPktsTooLong =3D reg; + + dev_stats->InPktsUntagged =3D 0; + dev_stats->InPktsNoTag =3D 0; + dev_stats->InPktsBadTag =3D 0; + dev_stats->InPktsUnknownSCI =3D 0; + dev_stats->InPktsNoSCI =3D 0; + + if (phy_secy->rx_sc) { + nxp_c45_macsec_read(phydev, MACSEC_INPBTS, ®); + dev_stats->InPktsBadTag =3D reg; + + nxp_c45_macsec_read(phydev, MACSEC_INPWTS, ®); + if (phy_secy->secy->validate_frames =3D=3D MACSEC_VALIDATE_STRICT) + dev_stats->InPktsNoTag +=3D reg; + else + dev_stats->InPktsUntagged +=3D reg; + + nxp_c45_macsec_read(phydev, MACSEC_IPSNFS, ®); + if (phy_secy->secy->validate_frames =3D=3D MACSEC_VALIDATE_STRICT) + dev_stats->InPktsNoSCI +=3D reg; + else + dev_stats->InPktsUnknownSCI +=3D reg; + } + + /* Always 0. */ + dev_stats->InPktsOverrun =3D 0; + + return 0; +} + +static int nxp_c45_mdo_get_tx_sc_stats(struct macsec_context *ctx) +{ + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + struct macsec_tx_sc_stats *tx_sc_stats; + struct macsec_tx_sa_stats tx_sa_stats; + struct nxp_c45_secy *phy_secy; + struct nxp_c45_tx_sa *tx_sa; + u32 reg =3D 0; + u64 stat; + int i; + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + tx_sc_stats =3D ctx->stats.tx_sc_stats; + nxp_c45_select_secy(phydev, phy_secy->secy_id); + + nxp_c45_macsec_read(phydev, MACSEC_OOE1HS, ®); + stat =3D (u64)reg << 32; + nxp_c45_macsec_read(phydev, MACSEC_OOE2HS, ®); + stat |=3D reg; + if (ctx->secy->tx_sc.encrypt) + tx_sc_stats->OutOctetsEncrypted =3D stat; + else + tx_sc_stats->OutOctetsEncrypted =3D 0; + + if (ctx->secy->protect_frames) + tx_sc_stats->OutOctetsProtected =3D stat; + else + tx_sc_stats->OutOctetsProtected =3D 0; + + tx_sc_stats->OutPktsEncrypted =3D 0; + tx_sc_stats->OutPktsProtected =3D 0; + + for (i =3D 0; i < ARRAY_SIZE(phy_secy->tx_sa); i++) { + tx_sa =3D phy_secy->tx_sa[i]; + if (!tx_sa) + continue; + + if (tx_sa->is_enabled) { + nxp_c45_tx_sa_stats_read(phydev, tx_sa, &tx_sa_stats); + tx_sc_stats->OutPktsEncrypted +=3D + tx_sa_stats.OutPktsEncrypted; + tx_sc_stats->OutPktsProtected +=3D + tx_sa_stats.OutPktsProtected; + continue; + } + + tx_sc_stats->OutPktsEncrypted +=3D tx_sa->stats.OutPktsEncrypted; + tx_sc_stats->OutPktsProtected +=3D tx_sa->stats.OutPktsProtected; + } + + return 0; +} + +static int nxp_c45_mdo_get_tx_sa_stats(struct macsec_context *ctx) +{ + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + struct macsec_tx_sa_stats *tx_sa_stats; + struct nxp_c45_secy *phy_secy; + struct nxp_c45_tx_sa *tx_sa; + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + tx_sa =3D phy_secy->tx_sa[ctx->sa.assoc_num]; + if (!tx_sa) + return -EINVAL; + + tx_sa_stats =3D ctx->stats.tx_sa_stats; + + if (!tx_sa->is_enabled) { + tx_sa_stats->OutPktsEncrypted =3D tx_sa->stats.OutPktsEncrypted; + tx_sa_stats->OutPktsProtected =3D tx_sa->stats.OutPktsProtected; + return 0; + } + + nxp_c45_select_secy(phydev, phy_secy->secy_id); + nxp_c45_tx_sa_stats_read(phydev, tx_sa, tx_sa_stats); + + return 0; +} + +static int nxp_c45_mdo_get_rx_sc_stats(struct macsec_context *ctx) +{ + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + struct macsec_rx_sc_stats *rx_sc_stats; + struct nxp_c45_secy *phy_secy; + struct nxp_c45_rx_sc *rx_sc; + u32 reg =3D 0; + int i; + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + rx_sc =3D phy_secy->rx_sc; + if (rx_sc->rx_sc !=3D ctx->rx_sc) + return -EINVAL; + + rx_sc_stats =3D ctx->stats.rx_sc_stats; + nxp_c45_select_secy(phydev, phy_secy->secy_id); + + rx_sc_stats->InPktsInvalid =3D 0; + rx_sc_stats->InPktsNotValid =3D 0; + rx_sc_stats->InPktsOK =3D 0; + + if (rx_sc->rx_sa_a) { + nxp_c45_macsec_read(phydev, MACSEC_RXSAAIPIS, ®); + rx_sc_stats->InPktsInvalid +=3D reg; + nxp_c45_macsec_read(phydev, MACSEC_RXSAAIPNVS, ®); + rx_sc_stats->InPktsNotValid +=3D reg; + nxp_c45_macsec_read(phydev, MACSEC_RXSAAIPOS, ®); + rx_sc_stats->InPktsOK +=3D reg; + } + + if (rx_sc->rx_sa_b) { + nxp_c45_macsec_read(phydev, MACSEC_RXSABIPIS, ®); + rx_sc_stats->InPktsInvalid +=3D reg; + nxp_c45_macsec_read(phydev, MACSEC_RXSABIPNVS, ®); + rx_sc_stats->InPktsNotValid +=3D reg; + nxp_c45_macsec_read(phydev, MACSEC_RXSABIPOS, ®); + rx_sc_stats->InPktsOK +=3D reg; + } + + ctx->stats.rx_sa_stats->InPktsNotUsingSA =3D 0; + for (i =3D 0; i < MACSEC_NUM_AN; i++) { + nxp_c45_macsec_read(phydev, MACSEC_RXAN0INUSS + i * 4, ®); + rx_sc_stats->InPktsNotUsingSA +=3D reg; + } + + ctx->stats.rx_sa_stats->InPktsUnusedSA =3D 0; + for (i =3D 0; i < MACSEC_NUM_AN; i++) { + nxp_c45_macsec_read(phydev, MACSEC_RXAN0IPUSS + i * 4, ®); + rx_sc_stats->InPktsUnusedSA +=3D reg; + } + + nxp_c45_macsec_read(phydev, MACSEC_INOD1HS, ®); + rx_sc_stats->InOctetsDecrypted =3D (u64)reg << 32; + nxp_c45_macsec_read(phydev, MACSEC_INOD2HS, ®); + rx_sc_stats->InOctetsDecrypted |=3D reg; + + nxp_c45_macsec_read(phydev, MACSEC_INOV1HS, ®); + rx_sc_stats->InOctetsValidated =3D (u64)reg << 32; + nxp_c45_macsec_read(phydev, MACSEC_INOV2HS, ®); + rx_sc_stats->InOctetsValidated |=3D reg; + + nxp_c45_macsec_read(phydev, MACSEC_RXSCIPDS, ®); + rx_sc_stats->InPktsDelayed =3D reg; + nxp_c45_macsec_read(phydev, MACSEC_RXSCIPLS, ®); + rx_sc_stats->InPktsLate =3D reg; + nxp_c45_macsec_read(phydev, MACSEC_RXSCIPUS, ®); + rx_sc_stats->InPktsUnchecked =3D reg; + + return 0; +} + +static int nxp_c45_mdo_get_rx_sa_stats(struct macsec_context *ctx) +{ + struct phy_device *phydev =3D ctx->phydev; + struct nxp_c45_phy *priv =3D phydev->priv; + struct macsec_rx_sa_stats *rx_sa_stats; + struct nxp_c45_secy *phy_secy; + struct nxp_c45_rx_sc *rx_sc; + u8 an =3D ctx->sa.assoc_num; + u32 reg =3D 0; + + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, ctx->secy->sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + rx_sc =3D phy_secy->rx_sc; + if (rx_sc->rx_sc !=3D ctx->sa.rx_sa->sc) + return -EINVAL; + + if (!rx_sc->rx_sa_a && !rx_sc->rx_sa_b) + return -EINVAL; + + rx_sa_stats =3D ctx->stats.rx_sa_stats; + nxp_c45_select_secy(phydev, phy_secy->secy_id); + + if (rx_sc->rx_sa_a =3D=3D ctx->sa.rx_sa) { + nxp_c45_macsec_read(phydev, MACSEC_RXSAAIPIS, ®); + rx_sa_stats->InPktsInvalid =3D reg; + nxp_c45_macsec_read(phydev, MACSEC_RXSAAIPNVS, ®); + rx_sa_stats->InPktsNotValid =3D reg; + nxp_c45_macsec_read(phydev, MACSEC_RXSAAIPOS, ®); + rx_sa_stats->InPktsOK =3D reg; + } + + if (rx_sc->rx_sa_b =3D=3D ctx->sa.rx_sa) { + nxp_c45_macsec_read(phydev, MACSEC_RXSABIPIS, ®); + rx_sa_stats->InPktsInvalid =3D reg; + nxp_c45_macsec_read(phydev, MACSEC_RXSABIPNVS, ®); + rx_sa_stats->InPktsNotValid =3D reg; + nxp_c45_macsec_read(phydev, MACSEC_RXSABIPOS, ®); + rx_sa_stats->InPktsOK =3D reg; + } + + nxp_c45_macsec_read(phydev, MACSEC_RXAN0INUSS + an * 4, ®); + rx_sa_stats->InPktsNotUsingSA =3D reg; + nxp_c45_macsec_read(phydev, MACSEC_RXAN0IPUSS + an * 4, ®); + rx_sa_stats->InPktsUnusedSA =3D reg; + + return 0; +} + static const struct macsec_ops nxp_c45_macsec_ops =3D { .mdo_dev_open =3D nxp_c45_mdo_dev_open, .mdo_dev_stop =3D nxp_c45_mdo_dev_stop, @@ -1347,6 +1756,11 @@ static const struct macsec_ops nxp_c45_macsec_ops = =3D { .mdo_add_txsa =3D nxp_c45_mdo_add_txsa, .mdo_upd_txsa =3D nxp_c45_mdo_upd_txsa, .mdo_del_txsa =3D nxp_c45_mdo_del_txsa, + .mdo_get_dev_stats =3D nxp_c45_mdo_get_dev_stats, + .mdo_get_tx_sc_stats =3D nxp_c45_mdo_get_tx_sc_stats, + .mdo_get_tx_sa_stats =3D nxp_c45_mdo_get_tx_sa_stats, + .mdo_get_rx_sc_stats =3D nxp_c45_mdo_get_rx_sc_stats, + .mdo_get_rx_sa_stats =3D nxp_c45_mdo_get_rx_sa_stats, }; =20 int nxp_c45_macsec_probe(struct phy_device *phydev) --=20 2.34.1 From nobody Thu Dec 18 09:45:24 2025 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B7AD6C88CB9 for ; Thu, 24 Aug 2023 09:17:33 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240594AbjHXJRI (ORCPT ); Thu, 24 Aug 2023 05:17:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49558 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S237853AbjHXJQ6 (ORCPT ); Thu, 24 Aug 2023 05:16:58 -0400 Received: from EUR02-DB5-obe.outbound.protection.outlook.com (mail-db5eur02on2045.outbound.protection.outlook.com [40.107.249.45]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E5F5010FA; Thu, 24 Aug 2023 02:16:56 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=KRL8IFSm6Pmdm7ai/bd6P7WjCFiBRjvEs7QAIaoFQS9Y7kfCcDJhunXMSZh6f26vEh89QnvcAYP0dre5Wvnhg4JTvVCTVgjmtY+GHf8KKQMkD6rQj5931hRIhfGLEBy8jhm/o9tZMwTNVZJtu+k3Jp2/vPzZGcXledjJmg6/FWSdSwiF3UsebfYBmpCS8YgkB7fMnFx+3x3uzbL5MLeY9jJk6TILd6i57x2Zs/VuOw2kGyyHSz24QGLBWgF8NCYv5eXJlqE7CLygDq8yWyo22Z3m9kvVnqSrAd12LntpOU/3enVKhVhz5oJ6DouHzKvFGjqZcSF1i36Rad0zY0Vu/Q== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; 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=nutZQJPCqR1y0+LI0oPQ/hYUO5Bl2EabmBwdKKgTAIs=; b=gGLu3q26M8TXjJbEvmqm/ISWRChR2OaQzTN64Ops60KH5kzAGUJ5P7Qat/tY9aaTEyJn37hp+tbGiwOTRXeIu9uior2jz+BmsrCdPziCz1UdSwwlppf+mLaI8gzClinpS0Qr4iVmICx//Oeuhe3ZRfDlnH0qangdB2nr8OdclboXev8bzoBGpTPyjqL9k2QyTXkvhiYNCnrENILfGs0pICMprVBTRjyAqjRO1FajMdvXfT0YmLP/eq+eB9GigCcswkIldTzrgtv3ezU9ovBpWZLMHsL5OkcEbJDmsEzejD4R7IDpWMkmv2v/in1u1pBZZV0MpyyUHhb882QdLTsEYg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com; dkim=pass header.d=oss.nxp.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com; s=selector2-NXP1-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=nutZQJPCqR1y0+LI0oPQ/hYUO5Bl2EabmBwdKKgTAIs=; b=K3JVUMsHkmpof2Bba0ABiEbHCVCYA4UmleGfjYnlAmsRNxlxWJ91haQBqc2aYNpVEqF+K97LFfQzJ50SezH+nN61puia4KrqaYuNkshPtHkTRoxTZuZPijIhfw9mYDE+VF1f6EV8ThRYhyxlnYauo8eAYd8+pmrtebYMT+sltJM= Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=oss.nxp.com; Received: from AM9PR04MB8954.eurprd04.prod.outlook.com (2603:10a6:20b:409::7) by DB9PR04MB8138.eurprd04.prod.outlook.com (2603:10a6:10:25c::8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6699.27; Thu, 24 Aug 2023 09:16:54 +0000 Received: from AM9PR04MB8954.eurprd04.prod.outlook.com ([fe80::2545:6d13:5905:bf50]) by AM9PR04MB8954.eurprd04.prod.outlook.com ([fe80::2545:6d13:5905:bf50%5]) with mapi id 15.20.6678.031; Thu, 24 Aug 2023 09:16:53 +0000 From: "Radu Pirea (NXP OSS)" To: andrew@lunn.ch, hkallweit1@gmail.com, linux@armlinux.org.uk, davem@davemloft.net, edumazet@google.com, kuba@kernel.org, pabeni@redhat.com, richardcochran@gmail.com, sd@queasysnail.net, sebastian.tobuschat@nxp.com Cc: netdev@vger.kernel.org, linux-kernel@vger.kernel.org, "Radu Pirea (NXP OSS)" Subject: [RFC net-next v2 5/5] net: phy: nxp-c45-tja11xx: implement mdo_insert_tx_tag Date: Thu, 24 Aug 2023 12:16:15 +0300 Message-Id: <20230824091615.191379-6-radu-nicolae.pirea@oss.nxp.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20230824091615.191379-1-radu-nicolae.pirea@oss.nxp.com> References: <20230824091615.191379-1-radu-nicolae.pirea@oss.nxp.com> Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: AM0PR10CA0116.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:e6::33) To AM9PR04MB8954.eurprd04.prod.outlook.com (2603:10a6:20b:409::7) MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AM9PR04MB8954:EE_|DB9PR04MB8138:EE_ X-MS-Office365-Filtering-Correlation-Id: d41f8702-7190-4255-f255-08dba482db50 X-MS-Exchange-SharedMailbox-RoutingAgent-Processed: True X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ZNHRgb4K5oDNnr1aqkKAx5wHgwT8LWLba/4mz2jYYQlDJNLL5H3ttTBBqC53HmCg9trrGCD4QP2pXSY8pdrE8Z0r/bJ1+MUdA9xFpkJSzB4GktUheVB+R7MTBhKIv7qkl096jZNmAJVFZUpZ7bT82tubdM7bkRQ+J2UoPZXdaChBddt6qqYAegQLigYZ1YdzMDPH2NPTqmXY5AEOcS0L5ZJlmP4Ua2+IeoYYOkWYtqwrZrq9tj4PxVbXiTJRWeHQ6NwjaJWwg7dHgCadlAk9lVJJVUJeZyL57CiE3DrP1bx4ufKcliPtbwXM88KEnVd0AgDNwNv95qcrCy1JxZOMKUkeeGSuFnokG8ipatPlmWdksytzLGag3VMtq4A9pTdf+aEeGNjlklIdXnUb596k4DILPwmCM/eV+EnnhQY2sPliqimYNygCzGgZA60Wr2xOAY3JV/ZBOztJD4MwmGxVcaIoQNzTwDXSc35eBtcs4jQ5Fnb8g/lfvD2hM7PINvx6zweoERnD+MrUIPb4vZvgHVtXV3qdpi8YrXx2lByGUsyiQxaaBKTjtirKL1T/pa6oVhQlBSmemFU2M/hWpuSWVXRzdWT1e1/pp72RSH0iUPC5VBQhWBz8GPLw5uwgGnf8y6lqiEpIyakDlELSDhMNYQ== X-Forefront-Antispam-Report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM9PR04MB8954.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(376002)(39860400002)(346002)(366004)(136003)(396003)(186009)(1800799009)(451199024)(1076003)(2616005)(5660300002)(4326008)(8676002)(8936002)(7416002)(26005)(38350700002)(921005)(6666004)(38100700002)(66946007)(66556008)(66476007)(316002)(478600001)(41300700001)(6512007)(2906002)(6506007)(86362001)(52116002)(6486002);DIR:OUT;SFP:1101; X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?UAS6clcZeAwHzm1GZzLg+gFgVp0sahGzIOyvHWx6daNhZtYzt+Wzfj1eRAz3?= =?us-ascii?Q?TKWItkTdVlJf7UFjvTWGmGkoXeAsj4cGl08EFIgpZGnpAd2ruMsW3FNAQJ5K?= =?us-ascii?Q?unRFES+Q4RSOh7fC3rBVxTdvtO3pIGhu/ozhYrgYty2B7m2vIUn0/vLBamGb?= =?us-ascii?Q?XG9pQMz3Dd41ardOi6kqATFKbBrM+YdeNhzJAD61LbFGivPDattn880tkOmQ?= =?us-ascii?Q?WpozjTTwQ1o0YZm8e8HbwhSaHxwZf8Q/4KBoHcJymjsFecoK3yD5h/GVEvEg?= =?us-ascii?Q?WARJSpIFOhGwhkER/Sto62sMxXW/sbKtmncaR58O6na79NvucpMnldUaGMNz?= =?us-ascii?Q?UqtDfex8/qTj3XJ7jbw5a3PqAAdJLzr3ssNcsXY8QXGqTiczYnCnF9OeG7mi?= =?us-ascii?Q?jbtpZ2enLDHeBKBtuWjm9C3V+sw0EFqBXXRTi/WZbzAto8Wlgfxe3Vcw8Li5?= =?us-ascii?Q?FdKLx3hlf+eM0ltEGhxtSVqQHPOTPus5yPn6xTODLqRniFY4ipk8MuI3Sgo7?= =?us-ascii?Q?XHqIaR450lo2R69TjVm4st8HUt8aq6Ca66Bzmi/QGjjD8vh29Eks50njGGAE?= =?us-ascii?Q?aigoXPo22NrvxNI8vuyr0gsL23ZV+rh5CXJzMDlv1N4xto7RgZXYlWAiHP01?= =?us-ascii?Q?TD3QH2EsG1V42WWa5+3ClhTSvM3jMFRO/HphVqYtVNqEvFh91FaSFfO9/xpU?= =?us-ascii?Q?tf6rEO2GRd1AYxHY3PIt2Hz4jFpPJbpUEoOgkVi7GGvdf+fi+jtjM8Rqkzga?= =?us-ascii?Q?sCPPK1TL1Vxj8URXU9hoilhMe/5MYrKu/gR5sqJ3mQhUykCUfhBz/b2aa8u5?= =?us-ascii?Q?U5Rg+RqLhWDJmENwV3Hp5YX7ixHJRsul0vyTm1lGs69dxHZqUb7z/eOy6Lrd?= =?us-ascii?Q?dNs+Zk7x1kKiVPLb4ZdDocnQUBCgxXOnS6iDeVTJkFQttvRADzDgnzOzzT+7?= =?us-ascii?Q?1mnL0igIe6iNDr6IakyEYY7ovVNLeWRf/HUPa+zgejq3ueDe+vv00RltP5bp?= =?us-ascii?Q?ht2b5HdfyjScUu2OcUQdkJkeeJ8ucauvZQ1FoOszDQBvFy2PXAUW/k4WDx/6?= =?us-ascii?Q?xk8W2QnMXxaV0Vch6B6LiwbbtarD3emYa0/ultmdMQFDXxzchm4Yq5bvU6zo?= =?us-ascii?Q?n7RVKh7dtix3FzojQBbQDnrtl7xMgYs+yiDa93VeEyd4AYARJNwAE/Tc4tzD?= =?us-ascii?Q?+lSnSHzmC4GvDrnyHWRD5ZOCj0+OPmCRtVRqorMCbqtweAi9/F4BVB8fW33t?= =?us-ascii?Q?bWxx5H24lMddGKIq1s0cAHdG0gpOZqb0kc1WD5LzJZuw8XezXj7xzPW+nhPA?= =?us-ascii?Q?/t3c0FClQBScio0LKOWtCdWqIID97swr0w2IaFhAFzQmqM1Uy1+2/2sa6F04?= =?us-ascii?Q?TvwKKIQ2rj2f8b1wgV1pyLGWZiHVIuVnRoF4oCVfzIMvgrLork9VALAqd80i?= =?us-ascii?Q?Xn4m6kzuxL9Su0m664wiUhIZ+FDm0jKzlY8r++EskGh9XcddYXdIQZwzVp8d?= =?us-ascii?Q?O0Y0W2hBiY3mXNK8g1uoqOEFuX0UDwhovtxj4jk87zHVmNOg15cFIBoS1CQi?= =?us-ascii?Q?lqvDtGCE+COwI2SJ3hCR9QSG2PUesteiVq5HC+oWwJ2/9aAAYMxgtK2va/ce?= =?us-ascii?Q?Pg=3D=3D?= X-OriginatorOrg: oss.nxp.com X-MS-Exchange-CrossTenant-Network-Message-Id: d41f8702-7190-4255-f255-08dba482db50 X-MS-Exchange-CrossTenant-AuthSource: AM9PR04MB8954.eurprd04.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 24 Aug 2023 09:16:53.6798 (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: zVPGkGTEdT0aDbLnH1U0i/p3NJhEx9zKufwu0CmF3WSdgzeRtpb5R/zAxzWNTTdSETZ1DOYnmyvPemJ9cxiOk8dg/DsKwUdE038C2qCOEes= X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB9PR04MB8138 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" Implement mdo_insert_tx_tag to insert the TLV header in the ethernet frame. If extscs parameter is set to 1, then the TLV header will contain the TX SC that will be used to encrypt the frame, otherwise the TX SC will be selected using the MAC source address. Signed-off-by: Radu Pirea (NXP OSS) --- drivers/net/phy/nxp-c45-tja11xx-macsec.c | 66 ++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/drivers/net/phy/nxp-c45-tja11xx-macsec.c b/drivers/net/phy/nxp= -c45-tja11xx-macsec.c index edfdd2540d39..f06505c04b13 100644 --- a/drivers/net/phy/nxp-c45-tja11xx-macsec.c +++ b/drivers/net/phy/nxp-c45-tja11xx-macsec.c @@ -11,6 +11,7 @@ #include #include #include +#include #include =20 #include "nxp-c45-tja11xx.h" @@ -23,6 +24,7 @@ #define VEND1_MACSEC_BASE 0x9000 =20 #define MACSEC_CFG 0x0000 +#define MACSEC_CFG_EXTSCS BIT(26) #define MACSEC_CFG_BYPASS BIT(1) #define MACSEC_CFG_S0I BIT(0) =20 @@ -121,6 +123,8 @@ #define ADPTR_CNTRL 0x0F00 #define ADPTR_CNTRL_CONFIG_EN BIT(14) #define ADPTR_CNTRL_ADPTR_EN BIT(12) +#define ADPTR_TX_TAG_CNTRL 0x0F0C +#define ADPTR_TX_TAG_CNTRL_ENA BIT(31) =20 #define TX_SC_FLT_BASE 0x800 #define TX_SC_FLT_SIZE 0x10 @@ -167,6 +171,18 @@ #define MACSEC_INPBTS 0x0638 #define MACSEC_IPSNFS 0x063C =20 +#define TJA11XX_TLV_TX_NEEDED_HEADROOM (32) +#define TJA11XX_TLV_NEEDED_TAILROOM (0) + +#define MACSEC_TLV_CP BIT(0) +#define MACSEC_TLV_SC_ID_OFF (2) + +#define ETH_P_TJA11XX_TLV (0x4e58) + +bool extscs; +module_param(extscs, bool, 0); +MODULE_PARM_DESC(extscs, "Select the TX SC using TLV header information."); + struct nxp_c45_rx_sc { struct macsec_rx_sc *rx_sc; struct macsec_rx_sa *rx_sa_a; @@ -315,6 +331,8 @@ void nxp_c45_macsec_config_init(struct phy_device *phyd= ev) =20 nxp_c45_macsec_write(phydev, ADPTR_CNTRL, ADPTR_CNTRL_CONFIG_EN | ADPTR_CNTRL_ADPTR_EN); + nxp_c45_macsec_write(phydev, ADPTR_TX_TAG_CNTRL, + ADPTR_TX_TAG_CNTRL_ENA); nxp_c45_macsec_write(phydev, ADPTR_CNTRL, ADPTR_CNTRL_ADPTR_EN); =20 nxp_c45_macsec_write(phydev, MACSEC_TPNET, PN_WRAP_THRESHOLD); @@ -324,6 +342,9 @@ void nxp_c45_macsec_config_init(struct phy_device *phyd= ev) nxp_c45_macsec_write(phydev, MACSEC_UPFR0M1, MACSEC_OVP); nxp_c45_macsec_write(phydev, MACSEC_UPFR0M2, ETYPE_MASK); nxp_c45_macsec_write(phydev, MACSEC_UPFR0R, MACSEC_UPFR_EN); + + if (extscs) + nxp_c45_macsec_write(phydev, MACSEC_CFG, MACSEC_CFG_EXTSCS); } =20 static void nxp_c45_macsec_cfg_ptp(struct phy_device *phydev, bool enable) @@ -1741,6 +1762,48 @@ static int nxp_c45_mdo_get_rx_sa_stats(struct macsec= _context *ctx) return 0; } =20 +struct tja11xx_tlv_header { + struct ethhdr eth; + u8 subtype; + u8 len; + u8 payload[28]; +}; + +static int nxp_c45_mdo_insert_tx_tag(struct phy_device *phydev, + struct sk_buff *skb) +{ + struct nxp_c45_phy *priv =3D phydev->priv; + struct tja11xx_tlv_header *tlv; + struct nxp_c45_secy *phy_secy; + struct metadata_dst *md_dst; + struct ethhdr *eth; + sci_t sci; + + eth =3D eth_hdr(skb); + tlv =3D skb_push(skb, TJA11XX_TLV_TX_NEEDED_HEADROOM); + memmove(tlv, eth, sizeof(*eth)); + skb_reset_mac_header(skb); + tlv->eth.h_proto =3D htons(ETH_P_TJA11XX_TLV); + tlv->subtype =3D 1; + tlv->len =3D sizeof(tlv->payload); + memset(tlv->payload, 0, sizeof(tlv->payload)); + + if (!extscs) + return 0; + + /* md_dst should be always set if MACsec is offloaded. */ + md_dst =3D skb_metadata_dst(skb); + sci =3D md_dst->u.macsec_info.sci; + phy_secy =3D nxp_c45_find_secy(&priv->macsec->secy_list, sci); + if (IS_ERR(phy_secy)) + return PTR_ERR(phy_secy); + + tlv->payload[3] =3D phy_secy->secy_id << MACSEC_TLV_SC_ID_OFF | + MACSEC_TLV_CP; + + return 0; +} + static const struct macsec_ops nxp_c45_macsec_ops =3D { .mdo_dev_open =3D nxp_c45_mdo_dev_open, .mdo_dev_stop =3D nxp_c45_mdo_dev_stop, @@ -1761,6 +1824,9 @@ static const struct macsec_ops nxp_c45_macsec_ops =3D= { .mdo_get_tx_sa_stats =3D nxp_c45_mdo_get_tx_sa_stats, .mdo_get_rx_sc_stats =3D nxp_c45_mdo_get_rx_sc_stats, .mdo_get_rx_sa_stats =3D nxp_c45_mdo_get_rx_sa_stats, + .mdo_insert_tx_tag =3D nxp_c45_mdo_insert_tx_tag, + .needed_headroom =3D TJA11XX_TLV_TX_NEEDED_HEADROOM, + .needed_tailroom =3D TJA11XX_TLV_NEEDED_TAILROOM, }; =20 int nxp_c45_macsec_probe(struct phy_device *phydev) --=20 2.34.1