get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/2218094/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 2218094,
    "url": "http://patchwork.ozlabs.org/api/patches/2218094/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260331113025.1566878-12-wei.fang@nxp.com/",
    "project": {
        "id": 2,
        "url": "http://patchwork.ozlabs.org/api/projects/2/?format=api",
        "name": "Linux PPC development",
        "link_name": "linuxppc-dev",
        "list_id": "linuxppc-dev.lists.ozlabs.org",
        "list_email": "linuxppc-dev@lists.ozlabs.org",
        "web_url": "https://github.com/linuxppc/wiki/wiki",
        "scm_url": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git",
        "webscm_url": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/",
        "list_archive_url": "https://lore.kernel.org/linuxppc-dev/",
        "list_archive_url_format": "https://lore.kernel.org/linuxppc-dev/{}/",
        "commit_url_format": "https://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux.git/commit/?id={}"
    },
    "msgid": "<20260331113025.1566878-12-wei.fang@nxp.com>",
    "list_archive_url": "https://lore.kernel.org/linuxppc-dev/20260331113025.1566878-12-wei.fang@nxp.com/",
    "date": "2026-03-31T11:30:22",
    "name": "[v4,net-next,11/14] net: dsa: netc: add phylink MAC operations",
    "commit_ref": null,
    "pull_url": null,
    "state": "handled-elsewhere",
    "archived": false,
    "hash": "c50b18640467a133ee8be26bd1b05849ee082630",
    "submitter": {
        "id": 84380,
        "url": "http://patchwork.ozlabs.org/api/people/84380/?format=api",
        "name": "Wei Fang",
        "email": "wei.fang@nxp.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260331113025.1566878-12-wei.fang@nxp.com/mbox/",
    "series": [
        {
            "id": 498181,
            "url": "http://patchwork.ozlabs.org/api/series/498181/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=498181",
            "date": "2026-03-31T11:30:11",
            "name": "Add preliminary NETC switch support for i.MX94",
            "version": 4,
            "mbox": "http://patchwork.ozlabs.org/series/498181/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2218094/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2218094/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "\n <linuxppc-dev+bounces-19076-incoming=patchwork.ozlabs.org@lists.ozlabs.org>",
        "X-Original-To": [
            "incoming@patchwork.ozlabs.org",
            "linuxppc-dev@lists.ozlabs.org"
        ],
        "Delivered-To": "patchwork-incoming@legolas.ozlabs.org",
        "Authentication-Results": [
            "legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=nxp.com header.i=@nxp.com header.a=rsa-sha256\n header.s=selector1 header.b=HRckaSu7;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org\n (client-ip=112.213.38.117; helo=lists.ozlabs.org;\n envelope-from=linuxppc-dev+bounces-19076-incoming=patchwork.ozlabs.org@lists.ozlabs.org;\n receiver=patchwork.ozlabs.org)",
            "lists.ozlabs.org;\n arc=pass smtp.remote-ip=\"2a01:111:f403:c201::3\" arc.chain=microsoft.com",
            "lists.ozlabs.org;\n dmarc=pass (p=none dis=none) header.from=nxp.com",
            "lists.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=nxp.com header.i=@nxp.com header.a=rsa-sha256\n header.s=selector1 header.b=HRckaSu7;\n\tdkim-atps=neutral",
            "lists.ozlabs.org;\n spf=permerror (SPF Permanent Error: Void lookup limit of 2 exceeded)\n smtp.mailfrom=nxp.com (client-ip=2a01:111:f403:c201::3;\n helo=as8pr04cu009.outbound.protection.outlook.com;\n envelope-from=wei.fang@nxp.com; receiver=lists.ozlabs.org)",
            "dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=nxp.com;"
        ],
        "Received": [
            "from lists.ozlabs.org (lists.ozlabs.org [112.213.38.117])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange x25519)\n\t(No client certificate requested)\n\tby legolas.ozlabs.org (Postfix) with ESMTPS id 4flQs71f5Zz1xtJ\n\tfor <incoming@patchwork.ozlabs.org>; Tue, 31 Mar 2026 22:30:19 +1100 (AEDT)",
            "from boromir.ozlabs.org (localhost [127.0.0.1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4flQs12FHdz304l;\n\tTue, 31 Mar 2026 22:30:13 +1100 (AEDT)",
            "from AS8PR04CU009.outbound.protection.outlook.com\n (mail-westeuropeazlp170110003.outbound.protection.outlook.com\n [IPv6:2a01:111:f403:c201::3])\n\t(using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits)\n\t key-exchange secp256r1 server-signature RSA-PSS (2048 bits) server-digest\n SHA256)\n\t(No client certificate requested)\n\tby lists.ozlabs.org (Postfix) with ESMTPS id 4flQrz0W45z2yhZ\n\tfor <linuxppc-dev@lists.ozlabs.org>; Tue, 31 Mar 2026 22:30:11 +1100 (AEDT)",
            "from AM8PR04MB7284.eurprd04.prod.outlook.com (2603:10a6:20b:1dc::8)\n by PA1PR04MB11406.eurprd04.prod.outlook.com (2603:10a6:102:4f1::22) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.15; Tue, 31 Mar\n 2026 11:29:50 +0000",
            "from AM8PR04MB7284.eurprd04.prod.outlook.com\n ([fe80::9cd6:51bd:82b:98dc]) by AM8PR04MB7284.eurprd04.prod.outlook.com\n ([fe80::9cd6:51bd:82b:98dc%5]) with mapi id 15.20.9745.027; Tue, 31 Mar 2026\n 11:29:50 +0000"
        ],
        "ARC-Seal": [
            "i=2; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1774956612;\n\tcv=pass;\n b=BIrZkVHYm670M1MeZdahRQoSPJodKFJZAOMd8F9Z/HdLO/LKtaS8uqt+7iU2R4PkxSr64QPrwfQGsFrnzg5OgY08NDpCPwjCeVOLvW5SwqdYJV+IVwaqdqo7NXj3o4BeQs7xmPMYoLyIC/rJkWAHbrvmiTLSwHY2LZ+OOfXuRz3l01Qno3mo5il5vchSAbm4kOP9biX8lyaUfRSjWuW/1QCi0PHPCK5jF6baQolqtE66nGIjSJSlwsIfQNYrXBRQMAwWTqBxL+FczBN31Gt6pcVT1oJ2mxBlszLeg892i38swMJpFutO0fyKMMsmIatUzDoagEO27Z0EH+ApN8h9bA==",
            "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=ZvadaCcdUAL/8TyH+jRxB7KS5n/WAyVESkpkLzkScCew7pSccJWcFx8og9lrXuN0cknylM0o7YUixO1LEw3GeX5E0dQdyFmgU6sCVU87pBRXqaXA91kfnXkd0rlgF+Oc4ql9ohLoVVEN0qvRm/Pm0yH8Ph6UqNlxh03OurN3m2wtmOUJGk3ydEaC3efDci6gtsaF62PCJr+eRCel4tqot0HQurjiob1QUo3RuOUe+Rm9rmnTnKVwrjtRFnej/e+/vWa5E7HuysQNOjh/S9fzvmKkN7jyZ/vALYFQUrjNecfy/Gile9YjwGzd8MYRzAHpDfBq6DaJhe981ZCtgZfynw=="
        ],
        "ARC-Message-Signature": [
            "i=2; a=rsa-sha256; d=lists.ozlabs.org; s=201707;\n\tt=1774956612; c=relaxed/relaxed;\n\tbh=HkMF1aoHeOeVrDs0DDXBJ6pqtj3IjxmrFndsEhCO494=;\n\th=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:\n\t Content-Type:MIME-Version;\n b=R48cjZWGcB5Mwg70Rxq93u6ynel79jkkFEQVSwlMr/Mw7OF9XwcGFuvwxOTS48oUQfBCkyDFBOsuiKuGMZULh2MsRgQVPBfs8iT7IW7dUrkr1mdTKaUZdm+7KysmTMNHF4UrKqcIc9z40CiO1f9xMD7yZAanMeK/RXMH4gY94T/gTfV086JvWsByBF7fRd1sm4Cfx/9DMOwnjDGOoUFs1Kq8hVbvqunBmQXpRB8R+RdYph114PKS4d4s9hxQt+X9tTYJjpUHzz+GZT6q/yfBVNRU51ZKVTmsm72VbZmZi3g7BigF0N/dx0Ey7RXi8aobyHa8msEzePef5/SdtaYWmA==",
            "i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com;\n s=arcselector10001;\n 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;\n bh=HkMF1aoHeOeVrDs0DDXBJ6pqtj3IjxmrFndsEhCO494=;\n b=HPO4qRUoUIJxmCzzE37tZESaE5EaSHHMrm+EFoBeNxcUHLHnBhUL4i7CyER+dN2QOEQ77xbgmD+UCFque7xA4VJCaR47RUdQKkxRVURMUDkrRTo8QFGhIU690UP/3Z2BisP3fgIgjHdXeZVQJk/WAaCDH0ZZkj+gxHhEbkhhfF18iZro1hnrnsjyGb9Dk1VZ+9N6Lor3bFmdOkGsex7gu3RLKv1CWmAfRO9CCZR0DC6Ici0AcsS5IxOsQVFJjVqvBlmeixzIWCynxtxEWgx4WpWcVfqqUj9Y71DvlUw4kPEHi0axhV9j/2ndxPY4Ta3SbCsfZWldtG0AZEA5P8m+xw=="
        ],
        "ARC-Authentication-Results": [
            "i=2; lists.ozlabs.org;\n dmarc=pass (p=none dis=none) header.from=nxp.com; dkim=pass (2048-bit key;\n unprotected) header.d=nxp.com header.i=@nxp.com header.a=rsa-sha256\n header.s=selector1 header.b=HRckaSu7; dkim-atps=neutral;\n spf=permerror (client-ip=2a01:111:f403:c201::3;\n helo=as8pr04cu009.outbound.protection.outlook.com;\n envelope-from=wei.fang@nxp.com;\n receiver=lists.ozlabs.org) smtp.mailfrom=nxp.com",
            "i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=nxp.com; dmarc=pass action=none header.from=nxp.com; dkim=pass\n header.d=nxp.com; arc=none"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed; d=nxp.com; s=selector1;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=HkMF1aoHeOeVrDs0DDXBJ6pqtj3IjxmrFndsEhCO494=;\n b=HRckaSu7i53Hvoo3oWLDhuSUOpBMXOcFQAvtmZo2FkBXQeEI3+2l59SY8qxChU1l+o9CBBUWKg6UVJkkhw37YMTmvAvL2Dkrt7e9P/kRUPkDPmwLF91KmW8F9EIHj7KMNJT/5H5vR7I7WzfaGC1qL4PoEmbk8zexlmXb9klN6JWWmlPVEn/VpfwUa2NN806c+6QVitFGSeKSy8/He130DPjFMZ2HonZ5VMW+6FS1GRXsqLC06WH8xnJTShTOSGvPfEQ+epYsgHl8MGzBh8zzuBF7AbPCF4rKvOEGogO0lmL7ChsFhcroOtxnZEPAeCM1RN67aGQ6l8wXvwXhK3Rhsg==",
        "From": "Wei Fang <wei.fang@nxp.com>",
        "To": "claudiu.manoil@nxp.com,\n\tvladimir.oltean@nxp.com,\n\txiaoning.wang@nxp.com,\n\tandrew+netdev@lunn.ch,\n\tdavem@davemloft.net,\n\tedumazet@google.com,\n\tkuba@kernel.org,\n\tpabeni@redhat.com,\n\trobh@kernel.org,\n\tkrzk+dt@kernel.org,\n\tconor+dt@kernel.org,\n\tf.fainelli@gmail.com,\n\tfrank.li@nxp.com,\n\tchleroy@kernel.org,\n\thorms@kernel.org,\n\tlinux@armlinux.org.uk,\n\tandrew@lunn.ch",
        "Cc": "netdev@vger.kernel.org,\n\tlinux-kernel@vger.kernel.org,\n\tdevicetree@vger.kernel.org,\n\tlinuxppc-dev@lists.ozlabs.org,\n\tlinux-arm-kernel@lists.infradead.org,\n\timx@lists.linux.dev",
        "Subject": "[PATCH v4 net-next 11/14] net: dsa: netc: add phylink MAC operations",
        "Date": "Tue, 31 Mar 2026 19:30:22 +0800",
        "Message-Id": "<20260331113025.1566878-12-wei.fang@nxp.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20260331113025.1566878-1-wei.fang@nxp.com>",
        "References": "<20260331113025.1566878-1-wei.fang@nxp.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "MA5P287CA0151.INDP287.PROD.OUTLOOK.COM\n (2603:1096:a01:1d7::14) To AM8PR04MB7284.eurprd04.prod.outlook.com\n (2603:10a6:20b:1dc::8)",
        "X-Mailing-List": "linuxppc-dev@lists.ozlabs.org",
        "List-Id": "<linuxppc-dev.lists.ozlabs.org>",
        "List-Help": "<mailto:linuxppc-dev+help@lists.ozlabs.org>",
        "List-Owner": "<mailto:linuxppc-dev+owner@lists.ozlabs.org>",
        "List-Post": "<mailto:linuxppc-dev@lists.ozlabs.org>",
        "List-Archive": "<https://lore.kernel.org/linuxppc-dev/>,\n  <https://lists.ozlabs.org/pipermail/linuxppc-dev/>",
        "List-Subscribe": "<mailto:linuxppc-dev+subscribe@lists.ozlabs.org>,\n  <mailto:linuxppc-dev+subscribe-digest@lists.ozlabs.org>,\n  <mailto:linuxppc-dev+subscribe-nomail@lists.ozlabs.org>",
        "List-Unsubscribe": "<mailto:linuxppc-dev+unsubscribe@lists.ozlabs.org>",
        "Precedence": "list",
        "MIME-Version": "1.0",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-TrafficTypeDiagnostic": "AM8PR04MB7284:EE_|PA1PR04MB11406:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "664baac4-f29d-4bcc-58d7-08de8f18d219",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "\n\tBCL:0;ARA:13230040|19092799006|376014|52116014|366016|7416014|1800799024|18002099003|56012099003|22082099003|38350700014|921020;",
        "X-Microsoft-Antispam-Message-Info": "\n\tVb4PCUII1bL7zk2V6mZmC9Z5QjJIgMmUruO986FFrAQo03XPZ8E3qIasJcxuBis8dQo6FsZ99yXDKTLtw8EXWMIIIwJUnzeu4HUCd5+CvqY27ducvvkWGrhmFP1QoXS6rFzXFI732mS47JSYspZGGTXk3TS8w6oCWj6WWebjxpV4K3GTx3tWSoAnDd13bMNVkGV7SZYucsD/14BXHyciwevVNKU+p2jz/kjHjnNyXtoyJL4Xhzt9hU/nYJugZdAD9Pi+nWd4n5S3dJY2LHhwLextaMDkLIAB46twB443tx5Pyf+J/8lSItMPtzIGATM//vjr+1YgiF5tYOqFQyEnU8kDAZC4aHxnP/Wy6UMyxSXct5iX8Fh5oAn0DY6a65MSGsI5P0WAAYUcb+u9fznjncNVNDO9yI89qJeKnUDNpndSz0POivDwcX6SLOn7SWsk/m1Y8Jrx3MC8hR+PuuCCQyT9uDVFbzLyKmSWOBcmRbZ9Ab3DjRNjivr4IFBHTfzMKRbCToVnrVQ9fIrVxhTO2gnDfFdDS8UZzjR34yyuaPKVykz8SI971r59Hv5FcxnmNeGQLqKRKcFpgd4qFAZRedjiEL0fnLOIruGLOQ9C+KD7jzC/93IT9/lW+JoRjtum7NoSb68dbzFz5itRQ3AGC49ahx8vVIhOK9+Q+HU0Yqqd3J+ufvjZWUhainPTh3qNy0GzNHNbWa15un3WoZnDEFCu/8BJ1cPe/V7pIO1pk5c3Tedkp8rokPFiZeL0Lbt7G09d6U0v0qtOIz6eK4v12Cak3507jCszP6xK1hwek2S7z5+qWrSaO5/xxKOIXBkn",
        "X-Forefront-Antispam-Report": "\n\tCIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:AM8PR04MB7284.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(19092799006)(376014)(52116014)(366016)(7416014)(1800799024)(18002099003)(56012099003)(22082099003)(38350700014)(921020);DIR:OUT;SFP:1101;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n 5OcTXfYKjRjstLsT76ZhXOKWYUrQl1NmNnD/tYsryRU7tSWGu921Gr9RJUaKPUH4RJx0wA43O5KZRk6amNSfVlWjzW/+u2TpC9Z+ILUaO1hBvoyDSy/c7DNQBFYbTEmo1303M6wjoVtDsTw+uJBijNBseJwzPyUVEXFBrV4e0Wz3SuUqTrbugdifo7ho7YdI89heI7gE5h/013L9VeJAa+0KIdt8SLArpex50q6aKHtQwhSWn2cqff9XFacYLhff/93e/v1PTYoYasyWgQc2CJuImlCf3hPi/1LlbwVNcUPW0Ss3ulJnkQG8H4LCW9LJpEpdrreJLmEg3EL+3GZaobbnnhYDmAI0pEcNXXnXt1Itc0CH19NSfhwtM+diJcSL3gClBJeHVACGYmHYzmHuoww5z2A+Vj+tvUmWnJnlm4ft+gtNMwKtj70RoQXEVTNL3c+rDd/IkVAb1pKfCGZNb6kEs/1ZnOKENmlppmM8buVCGtrn3SWRjH9LdR7co2Hx1TjCMNxxsRqhikTPAl9fXzMV2GTW8/XnIpj2bk4vzPBltLzJSCu8esFhe5bo57UPR0Dq+qlP5zQYuJYWWL+ThOXSJYLLUXskfTEaxg6bvXaQwtmHHgHzdq2F28rtyThzsvDvTAA8TRugNWHTCQM2CAYjJOkSF6MBYFDKHWKe4PrZouRITKhnfqC01MDJS+CX1L8Uq679d4Ld1SuzJVAoA4H6qA7ToW/5eccWYU+Y7Oiq2grASNyC8wRm7MnzKQ8rXjqr4E0aLiITH1OVXD4xYPT6jn37c0VGYc9tNhIjTtFVKEtBI9BuBrE4XfI3LskU0tT1h9fkOOwBOragAdJPXgslyYdgUdAWWPl/43YJ4CYuro/76tmCJ8O76NFPJeJyAIhlzWtbBq3VXaVFYq6tia6exaQ45lrrQYJZlatyJANPuF3gPq38iqn6bbFqGwZCEFeLGns2IN+U/wSIAlMXrwFiqz7KxsBqA1PgCuc9ZWNLxbB9fEe7p2RTRyx+iz9pNPTlqoLhKtGEH113bb2rq0d807xmarViViCIiphAahLuvzsidzlicRDVZnvBsVx7UZ3Mdy2EHUMu3HVIiyNULFmxhosD6ZMGg/95VOqHn+9uK4tG+t5LdAojSDuxFWTLahMbVYaHtICbbpRyj3Ce9Qj2Ex0Xr86VrRzAVIEQf6LXkdbMjupaNQz4N20s8kMhQY6X5gT8w2LPGDPxeyU7tDvxEPd8MEyp2VaiVzsOFRKqAVnHcGcB9SmbK8gx1IgAF/nAEmEok+4CzFQmtHYXABqaNIdaG4sCvLyGikEl+ojC9zSco6EaikoFwy8OE3JF1vWjkP9te2TzbHCWlZE84bV3AwVrGBhbnrLESatHT7MKlBUdU+Ax7Xwj5KAlsfuaGUkxhAGERrEc3DAMwdqQn4glZ5YF2agzbCQ4UxKM0c7OjyHOSUFqLto6Xwr2SFigTbYMY20HDAC20N2f0Rt0RhOCj93v7ragqfgNEl5cRkUqmfOcJd536uv91DT3zWrUWBPSST3BwFYwJdC2rU0YEl39P1pFKgRZuk1lt2NnI5vKQdNRQfdm/tKGYrPZOlASaCE9Q0mjj5Oe0ZCGE9lxo6ZS0ivMIkp2fclG6cEJiXRMu6TG4uVxcQWGauTxIvxnOaP7p/nT6oUe4ZSw7N3pduD7QkFyG9UD6/MLvAx2p+UX/syxOanCOdfFuQhXJCWJ3xXge/uxfdYVL7F4nTgttg==",
        "X-OriginatorOrg": "nxp.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 664baac4-f29d-4bcc-58d7-08de8f18d219",
        "X-MS-Exchange-CrossTenant-AuthSource": "AM8PR04MB7284.eurprd04.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "31 Mar 2026 11:29:50.1018\n (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": "\n BWFDGOVpmVS+BYpVdQnNeNssSpv/seaGF+iAUEMDklYp3DA2e5g1Vjw74M+dDSCoc2I4sf6eeO4fAJ44D6PDbA==",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "PA1PR04MB11406",
        "X-Spam-Status": "No, score=0.8 required=3.0 tests=ARC_SIGNED,ARC_VALID,\n\tDKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,FORGED_SPF_HELO,\n\tSPF_HELO_PASS,T_SPF_PERMERROR autolearn=disabled version=4.0.1 OzLabs 8",
        "X-Spam-Checker-Version": "SpamAssassin 4.0.1 (2024-03-25) on lists.ozlabs.org"
    },
    "content": "Different versions of NETC switches have different numbers of ports and\nMAC capabilities, so add .phylink_get_caps() to struct netc_switch_info,\nso that each version of the NETC switch can implement its own callback\nto obtain MAC capabilities. In addition, related interfaces of struct\nphylink_mac_ops are added, such as .mac_config(), .mac_link_up(), and\n.mac_link_down().\n\nSigned-off-by: Wei Fang <wei.fang@nxp.com>\n---\n drivers/net/dsa/netc/netc_main.c      | 179 ++++++++++++++++++++++++++\n drivers/net/dsa/netc/netc_platform.c  |  41 ++++++\n drivers/net/dsa/netc/netc_switch.h    |   4 +\n drivers/net/dsa/netc/netc_switch_hw.h |  21 +++\n 4 files changed, 245 insertions(+)",
    "diff": "diff --git a/drivers/net/dsa/netc/netc_main.c b/drivers/net/dsa/netc/netc_main.c\nindex 5828fd3e342e..f11f5d0f6a6d 100644\n--- a/drivers/net/dsa/netc/netc_main.c\n+++ b/drivers/net/dsa/netc/netc_main.c\n@@ -569,10 +569,188 @@ static void netc_switch_get_ip_revision(struct netc_switch *priv)\n \tpriv->revision = val & IPBRR0_IP_REV;\n }\n \n+static void netc_phylink_get_caps(struct dsa_switch *ds, int port,\n+\t\t\t\t  struct phylink_config *config)\n+{\n+\tstruct netc_switch *priv = ds->priv;\n+\n+\tpriv->info->phylink_get_caps(port, config);\n+}\n+\n+static void netc_port_set_mac_mode(struct netc_port *np,\n+\t\t\t\t   unsigned int mode,\n+\t\t\t\t   phy_interface_t phy_mode)\n+{\n+\tu32 mask = PM_IF_MODE_IFMODE | PM_IF_MODE_REVMII;\n+\tu32 val = 0;\n+\n+\tswitch (phy_mode) {\n+\tcase PHY_INTERFACE_MODE_RGMII:\n+\tcase PHY_INTERFACE_MODE_RGMII_ID:\n+\tcase PHY_INTERFACE_MODE_RGMII_RXID:\n+\tcase PHY_INTERFACE_MODE_RGMII_TXID:\n+\t\tval |= IFMODE_RGMII;\n+\t\tbreak;\n+\tcase PHY_INTERFACE_MODE_RMII:\n+\t\tval |= IFMODE_RMII;\n+\t\tbreak;\n+\tcase PHY_INTERFACE_MODE_REVMII:\n+\t\tval |= PM_IF_MODE_REVMII;\n+\t\tfallthrough;\n+\tcase PHY_INTERFACE_MODE_MII:\n+\t\tval |= IFMODE_MII;\n+\t\tbreak;\n+\tcase PHY_INTERFACE_MODE_SGMII:\n+\tcase PHY_INTERFACE_MODE_2500BASEX:\n+\t\tval |= IFMODE_SGMII;\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\tnetc_mac_port_rmw(np, NETC_PM_IF_MODE(0), mask, val);\n+}\n+\n+static void netc_mac_config(struct phylink_config *config, unsigned int mode,\n+\t\t\t    const struct phylink_link_state *state)\n+{\n+\tstruct dsa_port *dp = dsa_phylink_to_port(config);\n+\n+\tnetc_port_set_mac_mode(NETC_PORT(dp->ds, dp->index), mode,\n+\t\t\t       state->interface);\n+}\n+\n+static void netc_port_set_speed(struct netc_port *np, int speed)\n+{\n+\tnetc_port_rmw(np, NETC_PCR, PCR_PSPEED, PSPEED_SET_VAL(speed));\n+}\n+\n+static void netc_port_set_rgmii_mac(struct netc_port *np,\n+\t\t\t\t    int speed, int duplex)\n+{\n+\tu32 mask, val;\n+\n+\tmask = PM_IF_MODE_SSP | PM_IF_MODE_HD | PM_IF_MODE_M10;\n+\n+\tswitch (speed) {\n+\tdefault:\n+\tcase SPEED_1000:\n+\t\tval = FIELD_PREP(PM_IF_MODE_SSP, SSP_1G);\n+\t\tbreak;\n+\tcase SPEED_100:\n+\t\tval = FIELD_PREP(PM_IF_MODE_SSP, SSP_100M);\n+\t\tbreak;\n+\tcase SPEED_10:\n+\t\tval = FIELD_PREP(PM_IF_MODE_SSP, SSP_10M);\n+\t\tbreak;\n+\t}\n+\n+\tif (duplex != DUPLEX_FULL)\n+\t\tval |= PM_IF_MODE_HD;\n+\n+\tnetc_mac_port_rmw(np, NETC_PM_IF_MODE(0), mask, val);\n+}\n+\n+static void netc_port_set_rmii_mii_mac(struct netc_port *np,\n+\t\t\t\t       int speed, int duplex)\n+{\n+\tu32 mask, val = 0;\n+\n+\tmask = PM_IF_MODE_SSP | PM_IF_MODE_HD | PM_IF_MODE_M10;\n+\n+\tif (speed == SPEED_10)\n+\t\tval |= PM_IF_MODE_M10;\n+\n+\tif (duplex != DUPLEX_FULL)\n+\t\tval |= PM_IF_MODE_HD;\n+\n+\tnetc_mac_port_rmw(np, NETC_PM_IF_MODE(0), mask, val);\n+}\n+\n+static void netc_port_mac_rx_enable(struct netc_port *np)\n+{\n+\tnetc_port_rmw(np, NETC_POR, PCR_RXDIS, 0);\n+\tnetc_mac_port_rmw(np, NETC_PM_CMD_CFG(0), PM_CMD_CFG_RX_EN,\n+\t\t\t  PM_CMD_CFG_RX_EN);\n+}\n+\n+static void netc_port_wait_rx_empty(struct netc_port *np, int mac)\n+{\n+\tu32 val;\n+\n+\tif (read_poll_timeout(netc_port_rd, val, val & PM_IEVENT_RX_EMPTY,\n+\t\t\t      100, 10000, false, np, NETC_PM_IEVENT(mac)))\n+\t\tdev_warn(np->switch_priv->dev,\n+\t\t\t \"MAC %d of swp%d RX is not empty\\n\", mac,\n+\t\t\t np->dp->index);\n+}\n+\n+static void netc_port_mac_rx_graceful_stop(struct netc_port *np)\n+{\n+\tu32 val;\n+\n+\tif (is_netc_pseudo_port(np))\n+\t\tgoto check_rx_busy;\n+\n+\tif (np->caps.pmac) {\n+\t\tnetc_port_rmw(np, NETC_PM_CMD_CFG(1), PM_CMD_CFG_RX_EN, 0);\n+\t\tnetc_port_wait_rx_empty(np, 1);\n+\t}\n+\n+\tnetc_port_rmw(np, NETC_PM_CMD_CFG(0), PM_CMD_CFG_RX_EN, 0);\n+\tnetc_port_wait_rx_empty(np, 0);\n+\n+check_rx_busy:\n+\tif (read_poll_timeout(netc_port_rd, val, !(val & PSR_RX_BUSY),\n+\t\t\t      100, 10000, false, np, NETC_PSR))\n+\t\tdev_warn(np->switch_priv->dev, \"swp%d RX is busy\\n\",\n+\t\t\t np->dp->index);\n+\n+\tnetc_port_rmw(np, NETC_POR, PCR_RXDIS, PCR_RXDIS);\n+}\n+\n+static void netc_mac_link_up(struct phylink_config *config,\n+\t\t\t     struct phy_device *phy, unsigned int mode,\n+\t\t\t     phy_interface_t interface, int speed,\n+\t\t\t     int duplex, bool tx_pause, bool rx_pause)\n+{\n+\tstruct dsa_port *dp = dsa_phylink_to_port(config);\n+\tstruct netc_port *np;\n+\n+\tnp = NETC_PORT(dp->ds, dp->index);\n+\tnetc_port_set_speed(np, speed);\n+\n+\tif (phy_interface_mode_is_rgmii(interface))\n+\t\tnetc_port_set_rgmii_mac(np, speed, duplex);\n+\n+\tif (interface == PHY_INTERFACE_MODE_RMII ||\n+\t    interface == PHY_INTERFACE_MODE_REVMII ||\n+\t    interface == PHY_INTERFACE_MODE_MII)\n+\t\tnetc_port_set_rmii_mii_mac(np, speed, duplex);\n+\n+\tnetc_port_mac_rx_enable(np);\n+}\n+\n+static void netc_mac_link_down(struct phylink_config *config,\n+\t\t\t       unsigned int mode,\n+\t\t\t       phy_interface_t interface)\n+{\n+\tstruct dsa_port *dp = dsa_phylink_to_port(config);\n+\n+\tnetc_port_mac_rx_graceful_stop(NETC_PORT(dp->ds, dp->index));\n+}\n+\n+static const struct phylink_mac_ops netc_phylink_mac_ops = {\n+\t.mac_config\t\t= netc_mac_config,\n+\t.mac_link_up\t\t= netc_mac_link_up,\n+\t.mac_link_down\t\t= netc_mac_link_down,\n+};\n+\n static const struct dsa_switch_ops netc_switch_ops = {\n \t.get_tag_protocol\t\t= netc_get_tag_protocol,\n \t.setup\t\t\t\t= netc_setup,\n \t.teardown\t\t\t= netc_teardown,\n+\t.phylink_get_caps\t\t= netc_phylink_get_caps,\n };\n \n static int netc_switch_probe(struct pci_dev *pdev,\n@@ -613,6 +791,7 @@ static int netc_switch_probe(struct pci_dev *pdev,\n \tds->num_ports = priv->info->num_ports;\n \tds->num_tx_queues = NETC_TC_NUM;\n \tds->ops = &netc_switch_ops;\n+\tds->phylink_mac_ops = &netc_phylink_mac_ops;\n \tds->priv = priv;\n \n \tpriv->ds = ds;\ndiff --git a/drivers/net/dsa/netc/netc_platform.c b/drivers/net/dsa/netc/netc_platform.c\nindex abd599ea9c8d..8271c27d1dfc 100644\n--- a/drivers/net/dsa/netc/netc_platform.c\n+++ b/drivers/net/dsa/netc/netc_platform.c\n@@ -11,8 +11,49 @@ struct netc_switch_platform {\n \tconst struct netc_switch_info *info;\n };\n \n+static void imx94_switch_phylink_get_caps(int port,\n+\t\t\t\t\t  struct phylink_config *config)\n+{\n+\tconfig->mac_capabilities = MAC_ASYM_PAUSE | MAC_SYM_PAUSE |\n+\t\t\t\t   MAC_1000FD;\n+\n+\tswitch (port) {\n+\tcase 0 ... 1:\n+\t\t__set_bit(PHY_INTERFACE_MODE_SGMII,\n+\t\t\t  config->supported_interfaces);\n+\t\t__set_bit(PHY_INTERFACE_MODE_1000BASEX,\n+\t\t\t  config->supported_interfaces);\n+\t\t__set_bit(PHY_INTERFACE_MODE_2500BASEX,\n+\t\t\t  config->supported_interfaces);\n+\t\tconfig->mac_capabilities |= MAC_2500FD;\n+\t\tfallthrough;\n+\tcase 2:\n+\t\tconfig->mac_capabilities |= MAC_10 | MAC_100;\n+\t\t__set_bit(PHY_INTERFACE_MODE_MII,\n+\t\t\t  config->supported_interfaces);\n+\t\t__set_bit(PHY_INTERFACE_MODE_RMII,\n+\t\t\t  config->supported_interfaces);\n+\t\t/* Port 0 and 1 do not support REVMII */\n+\t\tif (port == 2)\n+\t\t\t__set_bit(PHY_INTERFACE_MODE_REVMII,\n+\t\t\t\t  config->supported_interfaces);\n+\n+\t\tphy_interface_set_rgmii(config->supported_interfaces);\n+\t\tbreak;\n+\tcase 3: /* CPU port */\n+\t\t__set_bit(PHY_INTERFACE_MODE_INTERNAL,\n+\t\t\t  config->supported_interfaces);\n+\t\tconfig->mac_capabilities |= MAC_10FD | MAC_100FD |\n+\t\t\t\t\t    MAC_2500FD;\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+}\n+\n static const struct netc_switch_info imx94_info = {\n \t.num_ports = 4,\n+\t.phylink_get_caps = imx94_switch_phylink_get_caps,\n };\n \n static const struct netc_switch_platform netc_platforms[] = {\ndiff --git a/drivers/net/dsa/netc/netc_switch.h b/drivers/net/dsa/netc/netc_switch.h\nindex dac19bfba02b..eb65c36ecead 100644\n--- a/drivers/net/dsa/netc/netc_switch.h\n+++ b/drivers/net/dsa/netc/netc_switch.h\n@@ -34,6 +34,7 @@ struct netc_switch;\n \n struct netc_switch_info {\n \tu32 num_ports;\n+\tvoid (*phylink_get_caps)(int port, struct phylink_config *config);\n };\n \n struct netc_port_caps {\n@@ -70,6 +71,9 @@ struct netc_switch {\n \tstruct ntmp_user ntmp;\n };\n \n+#define NETC_PRIV(ds)\t\t\t((struct netc_switch *)((ds)->priv))\n+#define NETC_PORT(ds, port_id)\t\t(NETC_PRIV(ds)->ports[(port_id)])\n+\n /* Write/Read Switch base registers */\n #define netc_base_rd(r, o)\t\tnetc_read((r)->base + (o))\n #define netc_base_wr(r, o, v)\t\tnetc_write((r)->base + (o), v)\ndiff --git a/drivers/net/dsa/netc/netc_switch_hw.h b/drivers/net/dsa/netc/netc_switch_hw.h\nindex 11cb124ce4bf..881122004644 100644\n--- a/drivers/net/dsa/netc/netc_switch_hw.h\n+++ b/drivers/net/dsa/netc/netc_switch_hw.h\n@@ -71,6 +71,10 @@\n #define  PCR_TXDIS\t\t\tBIT(0)\n #define  PCR_RXDIS\t\t\tBIT(1)\n \n+#define NETC_PSR\t\t\t0x104\n+#define  PSR_TX_BUSY\t\t\tBIT(0)\n+#define  PSR_RX_BUSY\t\t\tBIT(1)\n+\n #define NETC_PTCTMSDUR(a)\t\t(0x208 + (a) * 0x20)\n #define  PTCTMSDUR_MAXSDU\t\tGENMASK(15, 0)\n #define  PTCTMSDUR_SDU_TYPE\t\tGENMASK(17, 16)\n@@ -127,6 +131,23 @@ enum netc_mfo {\n #define NETC_PM_MAXFRM(a)\t\t(0x1014 + (a) * 0x400)\n #define  PM_MAXFRAM\t\t\tGENMASK(15, 0)\n \n+#define NETC_PM_IEVENT(a)\t\t(0x1040 + (a) * 0x400)\n+#define  PM_IEVENT_RX_EMPTY\t\tBIT(6)\n+\n+#define NETC_PM_IF_MODE(a)\t\t(0x1300 + (a) * 0x400)\n+#define  PM_IF_MODE_IFMODE\t\tGENMASK(2, 0)\n+#define   IFMODE_MII\t\t\t1\n+#define   IFMODE_RMII\t\t\t3\n+#define   IFMODE_RGMII\t\t\t4\n+#define   IFMODE_SGMII\t\t\t5\n+#define  PM_IF_MODE_REVMII\t\tBIT(3)\n+#define  PM_IF_MODE_M10\t\t\tBIT(4)\n+#define  PM_IF_MODE_HD\t\t\tBIT(6)\n+#define  PM_IF_MODE_SSP\t\t\tGENMASK(14, 13)\n+#define   SSP_100M\t\t\t0\n+#define   SSP_10M\t\t\t1\n+#define   SSP_1G\t\t\t2\n+\n #define NETC_PEMDIOCR\t\t\t0x1c00\n #define NETC_EMDIO_BASE\t\t\tNETC_PEMDIOCR\n \n",
    "prefixes": [
        "v4",
        "net-next",
        "11/14"
    ]
}