get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 2230779,
    "url": "http://patchwork.ozlabs.org/api/1.1/patches/2230779/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260430024945.3413973-12-wei.fang@nxp.com/",
    "project": {
        "id": 2,
        "url": "http://patchwork.ozlabs.org/api/1.1/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/"
    },
    "msgid": "<20260430024945.3413973-12-wei.fang@nxp.com>",
    "date": "2026-04-30T02:49:41",
    "name": "[v5,net-next,11/15] net: dsa: netc: add phylink MAC operations",
    "commit_ref": null,
    "pull_url": null,
    "state": "handled-elsewhere",
    "archived": false,
    "hash": "d413813333ab268b25265d4b6073ed02bd03dbfe",
    "submitter": {
        "id": 84380,
        "url": "http://patchwork.ozlabs.org/api/1.1/people/84380/?format=api",
        "name": "Wei Fang",
        "email": "wei.fang@nxp.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.ozlabs.org/project/linuxppc-dev/patch/20260430024945.3413973-12-wei.fang@nxp.com/mbox/",
    "series": [
        {
            "id": 502180,
            "url": "http://patchwork.ozlabs.org/api/1.1/series/502180/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/linuxppc-dev/list/?series=502180",
            "date": "2026-04-30T02:49:30",
            "name": "Add preliminary NETC switch support for i.MX94",
            "version": 5,
            "mbox": "http://patchwork.ozlabs.org/series/502180/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/2230779/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/2230779/checks/",
    "tags": {},
    "headers": {
        "Return-Path": "\n <linuxppc-dev+bounces-20314-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=NHN1ME9Y;\n\tdkim-atps=neutral",
            "legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.ozlabs.org\n (client-ip=2404:9400:21b9:f100::1; helo=lists.ozlabs.org;\n envelope-from=linuxppc-dev+bounces-20314-incoming=patchwork.ozlabs.org@lists.ozlabs.org;\n receiver=patchwork.ozlabs.org)",
            "lists.ozlabs.org;\n arc=pass smtp.remote-ip=\"2a01:111:f403:c202::7\" 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=NHN1ME9Y;\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:c202::7;\n helo=gvxpr05cu001.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\n [IPv6:2404:9400:21b9:f100::1])\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 4g5dsy3qlQz1yGq\n\tfor <incoming@patchwork.ozlabs.org>; Thu, 30 Apr 2026 12:49:10 +1000 (AEST)",
            "from boromir.ozlabs.org (localhost [127.0.0.1])\n\tby lists.ozlabs.org (Postfix) with ESMTP id 4g5dsc5z3Rz2yqP;\n\tThu, 30 Apr 2026 12:48:52 +1000 (AEST)",
            "from GVXPR05CU001.outbound.protection.outlook.com\n (mail-swedencentralazlp170130007.outbound.protection.outlook.com\n [IPv6:2a01:111:f403:c202::7])\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 4g5dsb4XNtz2ynT\n\tfor <linuxppc-dev@lists.ozlabs.org>; Thu, 30 Apr 2026 12:48:51 +1000 (AEST)",
            "from DBBPR04MB7500.eurprd04.prod.outlook.com (2603:10a6:10:1f4::16)\n by PAXPR04MB8608.eurprd04.prod.outlook.com (2603:10a6:102:21b::17) with\n Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9870.18; Thu, 30 Apr\n 2026 02:48:46 +0000",
            "from DBBPR04MB7500.eurprd04.prod.outlook.com\n ([fe80::c291:543b:4bde:cee7]) by DBBPR04MB7500.eurprd04.prod.outlook.com\n ([fe80::c291:543b:4bde:cee7%6]) with mapi id 15.20.9870.020; Thu, 30 Apr 2026\n 02:48:46 +0000"
        ],
        "ARC-Seal": [
            "i=2; a=rsa-sha256; d=lists.ozlabs.org; s=201707; t=1777517332;\n\tcv=pass;\n b=aDh1wcJeV/15JzK5Nzxe3E4m3gcVVcT9Fl/zAjxOHM7675Gt90CNzauwxBFxbrF6YJb0pUiayxtHqsZkYqA+HCCAnEYt/01pJMU8xyQiJh2y5+F0bVsMGT4EIQ7H5U8dA8JwA0+67Y0HeWfFAFn9Nb4JHM8JJpkxnwqwLZ3zo+tS92n4FgWuCOF4pcIEmvvuaR6YnOu8YrnQyHOeKmCIcaE7taPtNoqQiWAmAkaHayAXeRhnWqKn+l0uB3AI7qjN4/arGIvofZkSDR/wEwEun052fW54kVIxWm3cSSD7Ypz2pCmDeqFOg6Tb8w7ySlULiiHYGGL2+OWsQsF7oWN1nw==",
            "i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=CqIvjZgthDCw23wFsHxnRLtS2zdSj33lMq5B9Q6ZvCbDYBGEqhmZNMWKWxrO3wQ97s+Ndti9iAxeKhTfQcEu9hL/iOkbF9f+6MplsUrAjEEi5gpeW5qsD2F1UeC5X0FwhhlneSvf4sDhonOW0wiQX5foWr1PhQhHwLeo9246PQzJwpoYLqWutYoGoV5ZBy56GWYwVuptAA0QCqidL/8cCXDzd5i1HTrDFutgUPYY0sIM5mv8lKOhVuTemKBkmwhmCS9O6ebg87725SufqYPJv6ZD1LdDQwNYRnFogkYzcM3ve6S+R5pMM5pt3kTyyQd6Z4JP5mHaQ1iij6YmDqRrUw=="
        ],
        "ARC-Message-Signature": [
            "i=2; a=rsa-sha256; d=lists.ozlabs.org; s=201707;\n\tt=1777517332; c=relaxed/relaxed;\n\tbh=scrisMzMwHW3nalchf3MHRRsjin059kDS5eiWt60XHc=;\n\th=From:To:Cc:Subject:Date:Message-Id:In-Reply-To:References:\n\t Content-Type:MIME-Version;\n b=cArYuIJ0Yv9k0RCLcZrTg2gS0SWX4i1OveIRjHMq1CWLVSZ1ItpevLTtnZYVFzTUMYOFlKcVhCy8cu4ByFpndKnfmE4Lkq/JA+jfxzerhTVJjrvb1pZCHawHZjrqYrXUiHD/DxBn9MLBGv51FUYKC2i8UUPlXvDSk6qPfcCpPiL7gfXhL5Vkj2Qgwr20wiIYapu2hmL3R+mF4XJRKF49uteb6IgOvSOuYr00hzW0Dr0qd+dBNl/ww9syuJFfQ7EjoAPyUvAN5JicsbDTkiReqX24d3q9EBAIv/O9FlHZgdZ+E/+foWDlDFap22mmrIUzgmFXyJ3gfkguJ8aiVCpMuw==",
            "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=scrisMzMwHW3nalchf3MHRRsjin059kDS5eiWt60XHc=;\n b=VLge3fMfc2oJL1DUpwOryR2jkQ+N2bFzhIEeKMRYNSJUxeQ5yrKplUNGyEE93CU/eOCgey+utJBwDAq3aB1tIp9ehim4qTyzK+/W3NUnpqvlunuTuPH7KYrcyakoBZcR1vzMZM7cYnvAGoAyk0VTVae9O0lhkyZCDSPgwMEFuygWhZqPmRWxg8sYyTJnW1yuijbkgu2XPvW7yXX5AnceiWuU59Y1Q1V/Pd8G2uhff8BvwRSIKVTeNFzQssnXkX/sxODnKYFpqK5sq1vIGOVe1Y1HsdIK4dW/w33BS0ZY8SeuU9BtLwMQjNDPQTZ6DupMkLh9tBj10bP/t4Fg4ReNAw=="
        ],
        "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=NHN1ME9Y; dkim-atps=neutral;\n spf=permerror (client-ip=2a01:111:f403:c202::7;\n helo=gvxpr05cu001.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=scrisMzMwHW3nalchf3MHRRsjin059kDS5eiWt60XHc=;\n b=NHN1ME9YcLEj7HsK/Ki7iCw5yCLssDss9xLy9LUGbURFeQGaLH/3YLCSDsoPBooMTMs0fwDkqgbLwQRsAWW3obLuLx5gtQpWz2smWsFixHYYZySoVR8XJuiVT5Iqz956NcLD5exh+xHmTO5oxNnu0FHsFxtUEixBObMWYaFF3MCotzxa9Wx6b21s4ooBzHe5y1ACqdqBSAePF5PbyFWqaNT1bIyNhq2sZtnznffCdJjiA9c50QwjrlliBU18p4vXpBxjqmiXavRJRi2SUxC7kT58TT9pCUuKzFK5hJP/qgvvV3CaCOLMkm5hwLg/V3sJaUKqGLLwCyQ0aRKZef+Elg==",
        "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",
        "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 v5 net-next 11/15] net: dsa: netc: add phylink MAC operations",
        "Date": "Thu, 30 Apr 2026 10:49:41 +0800",
        "Message-Id": "<20260430024945.3413973-12-wei.fang@nxp.com>",
        "X-Mailer": "git-send-email 2.34.1",
        "In-Reply-To": "<20260430024945.3413973-1-wei.fang@nxp.com>",
        "References": "<20260430024945.3413973-1-wei.fang@nxp.com>",
        "Content-Transfer-Encoding": "8bit",
        "Content-Type": "text/plain",
        "X-ClientProxiedBy": "SG2PR01CA0133.apcprd01.prod.exchangelabs.com\n (2603:1096:4:8f::13) To DBBPR04MB7500.eurprd04.prod.outlook.com\n (2603:10a6:10:1f4::16)",
        "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": "DBBPR04MB7500:EE_|PAXPR04MB8608:EE_",
        "X-MS-Office365-Filtering-Correlation-Id": "08ec37ba-32ad-42e6-29c5-08dea662ff9a",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-MS-Exchange-AntiSpam-Relay": "0",
        "X-Microsoft-Antispam": "\n\tBCL:0;ARA:13230040|1800799024|366016|19092799006|7416014|52116014|376014|38350700014|921020|56012099003|22082099003|18002099003;",
        "X-Microsoft-Antispam-Message-Info": "\n\t3RiT6b05sZI8CZBTnIbos2oJSTE6SHJq+du95CBi3/tngwJW/CV+0Xdjc4G7s1Joc2w7fMm/jbfCEqWhB5HVNuLrf9Zbtokn/GmvSaHitVU/EHcv/7/QfpHnT4E44WvgPI0E09ZBLxmNkxyd7C4/F4snxdnf/6O5fAiqDTDJZCvIsvo4WalpmsyguPyzqCF0NBgPCvkIsGR1bDsAifIzua9ai7E/uMfV1SPFFKhUVFcKOzxdm0UxGrxxXwe08dnCrKHywrdlN7wcs6FnO1pjy3C1CpAhPpB0ATkkNof0EZS0VG4VdT9pNFpB7GRYWrlVuOzv0a92dnrvCpIYrkaf0VN5jvTYHfkTiSoXPcszjqBgo6TyLsTSEGv/o4LhvwdQVG3JyMV9Alw3qUro9u6bKmsO30N8tlhDoxJouY48P8zVUgqvlOEdQEX0lxcGRL2p68h/1ALdta3XpnF1lRHqxNbfAxq5ECtg1IBt1gbBhVTv04icaIMwMd+xZfjf4BQGMYXNu8vOV9+kY78fhN6iAXLHUfuUc0y19zkqckCawkjyFJNsyf8Wqe24xudsdsjyzlaqPVjwZhhPhPPYZnZ0a4K+6xN+xRnss/Cgm5MmfHTf4IoAgLRIMipZouDUEwCqONpheSpzkdbTgdJYzwo5fTv3YkLy45F75gDygbnkUyGNqUwMetnu2wDrDWpQl3r5yxfGEm7txJoNGp2p987l3Vj0pqX3RTRtf0+75Oj857BS9t/G8i7jvw0KpiM38mdZMzllx6QdibyND5SRaQXYcujFVzBQL8yBp2o6QbFtwRDcxHLfyflb3CVl7EyZwddV",
        "X-Forefront-Antispam-Report": "\n\tCIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:DBBPR04MB7500.eurprd04.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230040)(1800799024)(366016)(19092799006)(7416014)(52116014)(376014)(38350700014)(921020)(56012099003)(22082099003)(18002099003);DIR:OUT;SFP:1101;",
        "X-MS-Exchange-AntiSpam-MessageData-ChunkCount": "1",
        "X-MS-Exchange-AntiSpam-MessageData-0": "\n Y0Z1wiwZgV9dH4H8Ow3xqHsJNcGiKlo3ij/L9FleS+0tb5WK1iDuOhs6qN/Lc0e9gsebaMGWQ+tWzjkTcQEpUBBRaqTDwu7swftKTPBmbXig8d6W1sa0nScw3r22mgnMpHlcP9MmP2mb+viQxab7GM0JnXC2WQx/wb/gbGtEYZxE4FdtrfX+AeRpWrqCGJczkJATkfMADag12/EfBt7qZzgqXrMIuH0NjVgM9FSgTBu2t4I+dFFPbBL/d6hWFXUe6HIqq49DpcnGbZRjuNO0OlQj5WXf4uVuGBhN3cpveAQBB4F+CGGWWMIf+LgBaZYZzxYE0WvAB87fY5Z/vnmqylpcl0Q684KezlDFhbbBpR0v1uV1rrxhtV9TRTke+aj0CnVObGZHnPfXQDsB6N7BONZbbYEuuI2Zi6Z5jtDWilI163NIK+7lQBH58EoTIb02WqDXTjqdZLY2q7qSWHmKVfqqPAql7NBegTZOCbf7e+YIO6zv8FHMLEWWgNuF0IBPdvrqWSiVpciFlVO9n3WVwNVpoc9MhUDqM0NOIsvpCkFH/jjItfvOAn25l+h8biJ7pxUSM4SxgdZGvrF3Z2xYTLYTQrYsfH//7AYvJKiBvKy1WgyZNor2NEeUWxb47ORYjHlRA0ygvoPz5/v4tJUXbtH49W5X0QhoIb6CZd1HhxFVaZj7cKEPOKoU3W5Uf3hf90V332BhH+AGC6HXykBvvk3aEiE6H2buFLDKbD79jdejaBonsYyafimMAsDJW9UTQNSSGgdrSyxCWFLEgDhOtxAKgada1Dgsm37+erj+LKpb7iiDuOGGZQ7oMmmez3TxdBpialgKdV+VnClqtoM7wKrcsAUX1/sVs9Ic8mEkUtDpkdY8xwT8EJrePYKuJJt45n27j52lwKlF2GJVz18jGFgajuYfiO8DHqQLB2xfSFVxh5WMJNRHlxP6Z8lXcYqWF8c7hI2t0m1HkjKBen7ukcKPgQI3be8rhXip879V0Fmk+jKrOaLZnAEg48RhIAEy0O/ODAjUrZfG/xPz+AQ8OxdVOLXAUMaz9o50U6fY4UwV232ltXEHLNT/C1ObKK3nsySMu+C7UCvDrKdLoHhzRBZGbQMkTp6kZhBijCRvZIBrJUCWKLo4ngVsARYTKhIhWmkm1lxOrw+3vFiF25WvNqC8kI0f3B8AeXAO5anPrb5BYOfY9qPYmRchQPA117RGv69zNJHdJ8g3dKG0ZLuZWD6lf0h0fCFWhZeoYnq2ObKUWCFHbcR4oIxVJ+hgvDQMfjQVgcZQFGt04mid0X1VUoKZ4B58BETelGMI8Xci8mUl00ycgfcg4bPBB8xuTWU4oTMwseZctOmuZ3SPVIO7U+ejeEE3fSaS1ue+1s0GXlZejg3Bj+f3Zh3UA+a+nlqoUFK7GYoUriqadQO+X9Qwp89FOM74mg3nv4Dk43nkhiIGEwa7EYXcs2IoqTfeAuY5un9DMJEC3KNWZ05NaPRqnu8wvDivlvIc6RRsjyzDqbkePaP+bOjZVzpGKeBS1vBuRgkJWXhI5i3/zFrMAoA9SY68NeoOIBNQ/Xa/jendSI22qlg4/H306q1M9XiWdbHcj1wpvQsWUZ/JeVirMPNVLECFjRzcDoZxC5XLzYA+9qfHPQF/hodYq9uf5rVb+8qO7cVFkvr3B+JvaCbMlLZun0dIkYT9GpavPUb7KVZUdrZ3ED5bw9v2e14DTErysfgx",
        "X-OriginatorOrg": "nxp.com",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "\n 08ec37ba-32ad-42e6-29c5-08dea662ff9a",
        "X-MS-Exchange-CrossTenant-AuthSource": "DBBPR04MB7500.eurprd04.prod.outlook.com",
        "X-MS-Exchange-CrossTenant-AuthAs": "Internal",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "30 Apr 2026 02:48:46.1677\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 ZJ+6PeGn5a12HLGxSMsbNk6Jdw6AdFQBj9b6+xyljda0+i0VZRcCemUd0cbE15DJ53ttOX4hw9MJQq3+EDLpIw==",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "PAXPR04MB8608",
        "X-Spam-Status": "No, score=-0.2 required=3.0 tests=ARC_SIGNED,ARC_VALID,\n\tDKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,SPF_HELO_NONE,\n\tT_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. Add .phylink_get_caps() to struct netc_switch_info,\nallowing each NETC switch version to implement its own callback for\nobtaining MAC capabilities.\n\nImplement the phylink_mac_ops callbacks: .mac_config(), .mac_link_up(),\nand .mac_link_down(). Note that flow-control configuration is not yet\nsupported in .mac_link_up(), but will be implemented in a subsequent\npatch.\n\nSigned-off-by: Wei Fang <wei.fang@nxp.com>\n---\n drivers/net/dsa/netc/netc_main.c      | 243 ++++++++++++++++++++++++++\n drivers/net/dsa/netc/netc_platform.c  |  38 ++++\n drivers/net/dsa/netc/netc_switch.h    |   4 +\n drivers/net/dsa/netc/netc_switch_hw.h |  26 +++\n 4 files changed, 311 insertions(+)",
    "diff": "diff --git a/drivers/net/dsa/netc/netc_main.c b/drivers/net/dsa/netc/netc_main.c\nindex 90a2d8cfd3d2..edf50cb32cb6 100644\n--- a/drivers/net/dsa/netc/netc_main.c\n+++ b/drivers/net/dsa/netc/netc_main.c\n@@ -44,6 +44,26 @@ static void netc_mac_port_wr(struct netc_port *np, u32 reg, u32 val)\n \t\tnetc_port_wr(np, reg + NETC_PMAC_OFFSET, val);\n }\n \n+static void netc_mac_port_rmw(struct netc_port *np, u32 reg,\n+\t\t\t      u32 mask, u32 val)\n+{\n+\tu32 old, new;\n+\n+\tif (is_netc_pseudo_port(np))\n+\t\treturn;\n+\n+\tWARN_ON((mask | val) != mask);\n+\n+\told = netc_port_rd(np, reg);\n+\tnew = (old & ~mask) | val;\n+\tif (new == old)\n+\t\treturn;\n+\n+\tnetc_port_wr(np, reg, new);\n+\tif (np->caps.pmac)\n+\t\tnetc_port_wr(np, reg + NETC_PMAC_OFFSET, new);\n+}\n+\n static void netc_port_get_capability(struct netc_port *np)\n {\n \tu32 val;\n@@ -522,10 +542,232 @@ static void netc_switch_get_ip_revision(struct netc_switch *priv)\n \tpriv->revision = FIELD_GET(IPBRR0_IP_REV, val);\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, POR_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+\t/* PM_IEVENT_RX_EMPTY is a read-only bit, it is automatically set by\n+\t * hardware if RX FIFO is empty and no RX packet receive in process.\n+\t * And it is automatically cleared if RX FIFO is not empty or RX\n+\t * packet receive in process.\n+\t */\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 \"swp%d MAC%d: RX is not idle\\n\", np->dp->index, mac);\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 rx_disable;\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+\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+rx_disable:\n+\tnetc_port_rmw(np, NETC_POR, POR_RXDIS, POR_RXDIS);\n+}\n+\n+static void netc_port_mac_tx_enable(struct netc_port *np)\n+{\n+\tnetc_mac_port_rmw(np, NETC_PM_CMD_CFG(0), PM_CMD_CFG_TX_EN,\n+\t\t\t  PM_CMD_CFG_TX_EN);\n+\tnetc_port_rmw(np, NETC_POR, POR_TXDIS, 0);\n+}\n+\n+static void netc_port_wait_tx_empty(struct netc_port *np, int mac)\n+{\n+\tu32 val;\n+\n+\t/* PM_IEVENT_TX_EMPTY is a read-only bit, it is automatically set by\n+\t * hardware if TX FIFO is empty. And it is automatically cleared if\n+\t * TX FIFO is not empty.\n+\t */\n+\tif (read_poll_timeout(netc_port_rd, val, val & PM_IEVENT_TX_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 \"swp%d MAC%d: TX FIFO is not empty\\n\",\n+\t\t\t np->dp->index, mac);\n+}\n+\n+static void netc_port_mac_tx_graceful_stop(struct netc_port *np)\n+{\n+\tnetc_port_rmw(np, NETC_POR, POR_TXDIS, POR_TXDIS);\n+\n+\tif (is_netc_pseudo_port(np))\n+\t\treturn;\n+\n+\tnetc_port_wait_tx_empty(np, 0);\n+\tif (np->caps.pmac)\n+\t\tnetc_port_wait_tx_empty(np, 1);\n+\n+\tnetc_mac_port_rmw(np, NETC_PM_CMD_CFG(0), PM_CMD_CFG_TX_EN, 0);\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_tx_enable(np);\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+\tstruct netc_port *np;\n+\n+\tnp = NETC_PORT(dp->ds, dp->index);\n+\tnetc_port_mac_rx_graceful_stop(np);\n+\tnetc_port_mac_tx_graceful_stop(np);\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@@ -564,6 +806,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 \tpriv->ds = ds;\n \ndiff --git a/drivers/net/dsa/netc/netc_platform.c b/drivers/net/dsa/netc/netc_platform.c\nindex abd599ea9c8d..bb4f92d238cb 100644\n--- a/drivers/net/dsa/netc/netc_platform.c\n+++ b/drivers/net/dsa/netc/netc_platform.c\n@@ -11,8 +11,46 @@ 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_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_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 0419f7f9207e..7d9afb493053 100644\n--- a/drivers/net/dsa/netc/netc_switch_hw.h\n+++ b/drivers/net/dsa/netc/netc_switch_hw.h\n@@ -67,6 +67,14 @@\n #define  PQOSMR_VQMP\t\t\tGENMASK(19, 16)\n #define  PQOSMR_QVMP\t\t\tGENMASK(23, 20)\n \n+#define NETC_POR\t\t\t0x100\n+#define  POR_TXDIS\t\t\tBIT(0)\n+#define  POR_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@@ -123,6 +131,24 @@ 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_TX_EMPTY\t\tBIT(5)\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": [
        "v5",
        "net-next",
        "11/15"
    ]
}