{"id":2223405,"url":"http://patchwork.ozlabs.org/api/patches/2223405/?format=json","web_url":"http://patchwork.ozlabs.org/project/uboot/patch/20260415-10g-v1-2-f6809a31c2b2@nxp.com/","project":{"id":18,"url":"http://patchwork.ozlabs.org/api/projects/18/?format=json","name":"U-Boot","link_name":"uboot","list_id":"u-boot.lists.denx.de","list_email":"u-boot@lists.denx.de","web_url":null,"scm_url":null,"webscm_url":null,"list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20260415-10g-v1-2-f6809a31c2b2@nxp.com>","list_archive_url":null,"date":"2026-04-15T08:56:27","name":"[v1,2/2] net: fsl_enetc: Add iMX95 enetc4 10Gbps port support","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"3e54a85c4c1aab9399a62bc489842f96fdb73493","submitter":{"id":80695,"url":"http://patchwork.ozlabs.org/api/people/80695/?format=json","name":"Alice Guo (OSS)","email":"alice.guo@oss.nxp.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/uboot/patch/20260415-10g-v1-2-f6809a31c2b2@nxp.com/mbox/","series":[{"id":499947,"url":"http://patchwork.ozlabs.org/api/series/499947/?format=json","web_url":"http://patchwork.ozlabs.org/project/uboot/list/?series=499947","date":"2026-04-15T08:56:25","name":"net: fsl_enetc: Add iMX95 10Gbps support and PHY fixes","version":1,"mbox":"http://patchwork.ozlabs.org/series/499947/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/2223405/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/2223405/checks/","tags":{},"related":[],"headers":{"Return-Path":"<u-boot-bounces@lists.denx.de>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@legolas.ozlabs.org","Authentication-Results":["legolas.ozlabs.org;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com\n header.a=rsa-sha256 header.s=selector1-NXP1-onmicrosoft-com\n header.b=FGc+sghP;\n\tdkim-atps=neutral","legolas.ozlabs.org;\n spf=pass (sender SPF authorized) smtp.mailfrom=lists.denx.de\n (client-ip=2a01:238:438b:c500:173d:9f52:ddab:ee01; helo=phobos.denx.de;\n envelope-from=u-boot-bounces@lists.denx.de; receiver=patchwork.ozlabs.org)","phobos.denx.de;\n dmarc=none (p=none dis=none) header.from=oss.nxp.com","phobos.denx.de;\n spf=pass smtp.mailfrom=u-boot-bounces@lists.denx.de","phobos.denx.de;\n\tdkim=pass (2048-bit key;\n unprotected) header.d=NXP1.onmicrosoft.com header.i=@NXP1.onmicrosoft.com\n header.b=\"FGc+sghP\";\n\tdkim-atps=neutral","phobos.denx.de;\n dmarc=none (p=none dis=none) header.from=oss.nxp.com","phobos.denx.de;\n spf=pass smtp.mailfrom=alice.guo@oss.nxp.com","dkim=none (message not signed)\n header.d=none;dmarc=none action=none header.from=oss.nxp.com;"],"Received":["from phobos.denx.de (phobos.denx.de\n [IPv6:2a01:238:438b:c500:173d:9f52:ddab:ee01])\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 4fwZhW2Kpfz1yDF\n\tfor <incoming@patchwork.ozlabs.org>; Wed, 15 Apr 2026 18:54:35 +1000 (AEST)","from h2850616.stratoserver.net (localhost [IPv6:::1])\n\tby phobos.denx.de (Postfix) with ESMTP id 5596E84129;\n\tWed, 15 Apr 2026 10:54:27 +0200 (CEST)","by phobos.denx.de (Postfix, from userid 109)\n id 6D2A78419C; Wed, 15 Apr 2026 10:54:25 +0200 (CEST)","from DU2PR03CU002.outbound.protection.outlook.com\n (mail-northeuropeazlp170110003.outbound.protection.outlook.com\n [IPv6:2a01:111:f403:c200::3])\n (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits))\n (No client certificate requested)\n by phobos.denx.de (Postfix) with ESMTPS id 75F0C83C51\n for <u-boot@lists.denx.de>; Wed, 15 Apr 2026 10:54:22 +0200 (CEST)","from PAXPR04MB9644.eurprd04.prod.outlook.com (2603:10a6:102:242::11)\n by FRZPR04MB12431.eurprd04.prod.outlook.com (2603:10a6:d10:1c8::24)\n with Microsoft SMTP Server (version=TLS1_2,\n cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.9769.48; Wed, 15 Apr\n 2026 08:54:19 +0000","from PAXPR04MB9644.eurprd04.prod.outlook.com\n ([fe80::cf3:c5b0:7a0c:d11b]) by PAXPR04MB9644.eurprd04.prod.outlook.com\n ([fe80::cf3:c5b0:7a0c:d11b%5]) with mapi id 15.20.9769.046; Wed, 15 Apr 2026\n 08:54:19 +0000"],"X-Spam-Checker-Version":"SpamAssassin 3.4.2 (2018-09-13) on phobos.denx.de","X-Spam-Level":"","X-Spam-Status":"No, score=-0.9 required=5.0 tests=BAYES_00,DKIM_SIGNED,\n DKIM_VALID,FORGED_SPF_HELO,RCVD_IN_DNSWL_BLOCKED,SPF_HELO_PASS,\n T_SPF_PERMERROR autolearn=no autolearn_force=no version=3.4.2","ARC-Seal":"i=1; a=rsa-sha256; s=arcselector10001; d=microsoft.com; cv=none;\n b=x3TJi4aaeaKoMCnB/JnhwOGu3/Rih9RneG+d/J5a1jco30D0I5lT5KThFd1FmzNz/wj4gchld49vC789RKYIAmcETV6cMn1AnGf9xwF1u5lRiICDrWYl/aJKDr5L/5xB0hsdwv5joC4jK5PRpHs+Ef7oNPOQBr/dMyG5+895BlLXUWtfI53eXDMZ+9g215Zko6MtHXFDqYhvxVXIBJRX8rkVyXdAlcZ3KWZieHB5NrBKvlLX/RUgtAz6Tp+F0+9yje9rr9Grsvqc6mcnjq2NGOsrcqqUB1lTjUt38fHPfEdKdkil+l6zG8IV2lwl7MFVbTYnyrwFzweYuVi1nKJBCg==","ARC-Message-Signature":"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=yKlibF2QVia3QZGuuP4Vpqp3VzggAu31fgePzM0laj4=;\n b=tMPZo5DW+B5QRwF/5JCo2IobUGihK7MUFDadyCAeZ5JqmRvlA8Xf2td75EUeuq7fJ5qvF8Ru4jKxaERk/JkNIwbCAv9VnyL/MS0YN8u3foCBzft5StHMkEFfHL5Wx2ZLGzQ/Ie+3K7admj3PIEQcSCNS6Dj2Vwf09trqlWoxTfxnz3sw4OTB+hjL9wv249EZZgLmboTI4hgAeYuAXIclEOtPfEV2vAgEccg3UqpYwUJgvEoJWnAIly1VsPod0efUcRtOmpjU0YB9nxepeLrMjfXrILzESAozdjvkTU8TPY0y9V9Gz2kguBwT8zV0rsh8VmAWisoJa6ehfZ8YfguT4A==","ARC-Authentication-Results":"i=1; mx.microsoft.com 1; spf=pass\n smtp.mailfrom=oss.nxp.com; dmarc=pass action=none header.from=oss.nxp.com;\n dkim=pass header.d=oss.nxp.com; arc=none","DKIM-Signature":"v=1; a=rsa-sha256; c=relaxed/relaxed; d=NXP1.onmicrosoft.com;\n s=selector1-NXP1-onmicrosoft-com;\n h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n bh=yKlibF2QVia3QZGuuP4Vpqp3VzggAu31fgePzM0laj4=;\n b=FGc+sghPmi63fbB9yPazwFGNKDDuq8FlOAIfkSVRjoO8y/iz0c6NThpf3X8tYQxBZYciQvkIB7nnZGw6x7szODhLlVR3HY92q+k0AoMuuXvkEAOiPYrcBr5BVjD9vCACSvjA6ydlAA6B1+qOpK4nVnxApZMD3QKpHmpclI5m2gb3VSbnN3F9ErejNJL62P58jBY+81x0if9xBmbbycGVMYkW309pqVpUKQBxJmD2Z9kPtWLlFOEXnPgSg6VbyrXpokQTyxfPZXR6L3/zrOkecVoBLTIwy8ko3MxdnfKRSjYTKhNe5VYM5LUP843YCjVED94Q+7DNMdFyKSf7KmEpnw==","From":"alice.guo@oss.nxp.com","Date":"Wed, 15 Apr 2026 16:56:27 +0800","Subject":"[PATCH v1 2/2] net: fsl_enetc: Add iMX95 enetc4 10Gbps port\n support","Content-Type":"text/plain; charset=\"utf-8\"","Content-Transfer-Encoding":"7bit","Message-Id":"<20260415-10g-v1-2-f6809a31c2b2@nxp.com>","References":"<20260415-10g-v1-0-f6809a31c2b2@nxp.com>","In-Reply-To":"<20260415-10g-v1-0-f6809a31c2b2@nxp.com>","To":"u-boot@lists.denx.de, Marek Vasut <marex@nabladev.com>","Cc":"Jerome Forissier <jerome.forissier@arm.com>,\n Tom Rini <trini@konsulko.com>, Beiyan Yun <root@infi.wang>,\n Bo-Cun Chen <bc-bocun.chen@mediatek.com>,\n Siddharth Vadapalli <s-vadapalli@ti.com>,\n Weijie Gao <weijie.gao@mediatek.com>, Ye Li <ye.li@nxp.com>,\n Vladimir Oltean <vladimir.oltean@nxp.com>,\n Michael Walle <mwalle@kernel.org>,\n Thomas Schaefer <thomas.schaefer@kontron.com>, Marek Vasut <marex@denx.de>,\n Alice Guo <alice.guo@nxp.com>","X-Mailer":"b4 0.15.2","X-ClientProxiedBy":"SG2P153CA0018.APCP153.PROD.OUTLOOK.COM (2603:1096::28) To\n PAXPR04MB9644.eurprd04.prod.outlook.com (2603:10a6:102:242::11)","MIME-Version":"1.0","X-MS-Exchange-MessageSentRepresentingType":"1","X-MS-PublicTrafficType":"Email","X-MS-TrafficTypeDiagnostic":"PAXPR04MB9644:EE_|FRZPR04MB12431:EE_","X-MS-Office365-Filtering-Correlation-Id":"40823625-110c-4128-3b1a-08de9acc94c8","X-MS-Exchange-SharedMailbox-RoutingAgent-Processed":"True","X-LD-Processed":"686ea1d3-bc2b-4c6f-a92c-d99c5c301635,ExtAddr","X-MS-Exchange-SenderADCheck":"1","X-MS-Exchange-AntiSpam-Relay":"0","X-Microsoft-Antispam":"BCL:0;\n ARA:13230040|1800799024|19092799006|52116014|7416014|376014|366016|38350700014|22082099003|18002099003|56012099003;","X-Microsoft-Antispam-Message-Info":"\n XY4f2+c3CwUEEMiZQAISKYD0qIBxJI5is7jE0FbjMqek79/Y5UkPEE9Hkfmm0JHEPpIWrsSg1gJyvkvCnillnFeXlUM01mrkf/tk+ZERT4USwXABXGSe39s5JrFj5dBaCObSWBMd9KEreKmCPjusQeUlz4nEOpsI5FVPffHmp3ltuf0m730pP4VZG5YE955d/h7nqOKvlBM/GpFm1xLhqokwLm0KIOm5Tc8YJDRTNsTKmsAglFy+zpfJ0xcHBE0qvFc1EmZ6GuT/WocAcGViPrrunibxrS4+V0/cwNCD+u3UZPWOWb/qzneRnsnDpUMiODgWiE00+yvqxo7ThgJeB6YmMbb1x0xVx1Ya4uKl9lBdTVcI27+tSqRr2wr149Dj/p8wwIEsKmloSkfqCNQfig8WU5tZ8W2AggBXo17pJF4L/Z18/WNdZByZyyMEZtIv3vXYtkQdpmIjCpxRNNrN8l4yaZUkVC07IyifE7GpOVHg0fGM5FIbTt2rACV6qhsUUDhsbKNMf7s0ac1BCm3bYopeFN8fDnLw9FOiNjhN/4IyTMhlJsuLeFOAr0htZmnH//Xhb8WHshOqP2ojKGAaOoNduI14dldPtxFCEjS84jmP09RCR1czSDOv6A0+WMFq/HawU0HYiWYIccIS1r2DasUNittrNPAVGnjxPxxWWhw0iJM3Big74rap2BPj9p0W5/vPZCKsYNNUA3gHQU3kNWLDpaeDCwvcWMe/Zsj5YQCg/+b5kczjawT90DoBbQQBaKDTkNYCy4B3KPcW59BAWP/jfQWw0VkBIjUXSro0Pdw=","X-Forefront-Antispam-Report":"CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:;\n IPV:NLI; SFV:NSPM; H:PAXPR04MB9644.eurprd04.prod.outlook.com; PTR:; CAT:NONE;\n SFS:(13230040)(1800799024)(19092799006)(52116014)(7416014)(376014)(366016)(38350700014)(22082099003)(18002099003)(56012099003);\n DIR:OUT; SFP:1101;","X-MS-Exchange-AntiSpam-MessageData-ChunkCount":"1","X-MS-Exchange-AntiSpam-MessageData-0":"=?utf-8?q?oS0IdPt/ASTIuH1bgP2H8M7jXUnc?=\n\t=?utf-8?q?sSuYXCzTAoom0UgU9IfTOR6gvlZJ6kAu4YkLA6CWx3FhBIUqX+cKyuvQ4Qq7xqyq3?=\n\t=?utf-8?q?lML3HCBZ8K3q2+6seyJwq2cAGlxa78kXMInMHQEr6IbX0efJN6rywr4V2r/ZkHkpr?=\n\t=?utf-8?q?O7feq65I1/LbhZTo3EuSLMjwAX1+A9dGqlgYjEtB0MBVLLW0vt9oAyVB7UKDhufl2?=\n\t=?utf-8?q?+Uj3NQmaIV9bxME8JpM8aedZt+JDqABhFa06HOXSpasGM8qk4VKm0b8eI2oAPSnEH?=\n\t=?utf-8?q?01/B8tl29Fnn7/4e7iPe/5zoamjIyUuIhDhWHah29Ms5CPcEPJWOcBEP7OPJltbpe?=\n\t=?utf-8?q?YOPth3zH4Y/ncbNPC4EhmGC0wBTFVZFIsC8Hc25Sc0IHq4wQx78lh8NF8cBaWQWP8?=\n\t=?utf-8?q?hw1lNJzQ2OLL8R8IhOpNXdPit+pOTaEFe/bT0bBsAP7DS6yDGU4jwWZXS1pJK9iko?=\n\t=?utf-8?q?n67KZiprr5zSImuCgWZezwLXaa313OiewVUambMHxovcDrmQIBkoRdFWmc+AXMKPZ?=\n\t=?utf-8?q?k/uuAu0nVSEOa2vufP7Ui5wg3dXpamonMv2PfvGF7VK6VUVJeVVbYYL1p866FI99l?=\n\t=?utf-8?q?JYg1mr0ZCGL0uvNgxqkRmMtz+Gk8dBR72P62TjZiQzyOSeOW+KF7POYyVjHQoQmwF?=\n\t=?utf-8?q?Vd+ccNB44GrH2hXWxPdV8XghxRlKvaS/SfoOIeqmoMCWF5X5HVROUYe4YPrXITTeA?=\n\t=?utf-8?q?sXAMJVZ6OfJ60sz57tRa5Kiz08c3SFCBXQzn+RU0R+7IGqASYlG7vElTdrxkZ5drp?=\n\t=?utf-8?q?YBolB35X93Zn9yCXkDfYPd8jtVC0DQnS14kdTVJIiSLO8V+8BVPrcqnB9ABWvj4vV?=\n\t=?utf-8?q?8rLC3khbG1lXcx9g62UPv1zeToBJbFte+h8OZTvSpkDye5HRxyz6JgNhfEt2PWZyv?=\n\t=?utf-8?q?pb5EECq4GKmw2eaNENd6bLKL3cF6/zSQQ8ubJDq0opHCHvlfxr+3fsOEr6fzs7IbJ?=\n\t=?utf-8?q?UnXgxHyZWejSAutWjH+ueqIfRepwqZmp6ooUrRdFS088oFkjO7A1u8HiCextJSAH/?=\n\t=?utf-8?q?aGA1mieMiHn3YChb7Qcbnzh94I3eEtwLGYMJ45byQtCBDvlRtj40dji+CqRO9eL8l?=\n\t=?utf-8?q?kKiL+l94Of2XIq6eirMC3LkpS5Yw/JcvI0RqnizjBrbnMGEa6dEKuLVYQKz2ec7db?=\n\t=?utf-8?q?Y07mOkmIdg65yvZANytldDVIFo8vq4un8aluugJKdzgcEGoAjha52U64fTNaYSgwL?=\n\t=?utf-8?q?rPK//lQzCZFkvWHf5Q9RhmnlVR/keTW8svIdzUsKlaPCZWYetyDokDuitFS9R/rwh?=\n\t=?utf-8?q?4BL+QfS4cQ/Xmx+zEtuNqLZj3L9IlnMg0c/4tlHIShHQDpJPCSWzeKy8GXEigP13n?=\n\t=?utf-8?q?Vd1/BOic4ZxGXKWdiv/H02aK1YtIEGYwBX+Yg4m2SkX/iyAxCViygMvssxLIAU9Ie?=\n\t=?utf-8?q?6xqoVgnQznQt3/HjQZCa/JlGGpzsg5VKHrgXviBmQ7DeG+tXaRSJq5/XqCIenizNp?=\n\t=?utf-8?q?j8CTituilRbuaarvXYcZFXCtc9CMh93Vbt9pEt+GD7Qm+1XIEqFFzjvGOxWHJS0Q5?=\n\t=?utf-8?q?bmgfDpdZJkQWJlRXWHoG/29uZ1rMSXyKk1oAW3KoEPggVPaBLSctY+rpKWk9tKoGm?=\n\t=?utf-8?q?86/bgM0sgNMCsvgIpIm04/VdpAvmtmT7H9LhNay//U1rKRa0EM5kR8AYfnC3cUNav?=\n\t=?utf-8?q?dgTDBZA9iSkthYKommJ0o+rubvkMDlQA=3D=3D?=","X-OriginatorOrg":"oss.nxp.com","X-MS-Exchange-CrossTenant-Network-Message-Id":"\n 40823625-110c-4128-3b1a-08de9acc94c8","X-MS-Exchange-CrossTenant-AuthSource":"PAXPR04MB9644.eurprd04.prod.outlook.com","X-MS-Exchange-CrossTenant-AuthAs":"Internal","X-MS-Exchange-CrossTenant-OriginalArrivalTime":"15 Apr 2026 08:54:19.7649 (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 mzITSlDthaEes4zprbq01i1F1hve1rkQUIW+u0Cn4UZBjVY/YpgJpTj1DTjaGtx103htHA3+d3RwCVEDSIPDpQ==","X-MS-Exchange-Transport-CrossTenantHeadersStamped":"FRZPR04MB12431","X-BeenThere":"u-boot@lists.denx.de","X-Mailman-Version":"2.1.39","Precedence":"list","List-Id":"U-Boot discussion <u-boot.lists.denx.de>","List-Unsubscribe":"<https://lists.denx.de/options/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=unsubscribe>","List-Archive":"<https://lists.denx.de/pipermail/u-boot/>","List-Post":"<mailto:u-boot@lists.denx.de>","List-Help":"<mailto:u-boot-request@lists.denx.de?subject=help>","List-Subscribe":"<https://lists.denx.de/listinfo/u-boot>,\n <mailto:u-boot-request@lists.denx.de?subject=subscribe>","Errors-To":"u-boot-bounces@lists.denx.de","Sender":"\"U-Boot\" <u-boot-bounces@lists.denx.de>","X-Virus-Scanned":"clamav-milter 0.103.8 at phobos.denx.de","X-Virus-Status":"Clean"},"content":"From: Ye Li <ye.li@nxp.com>\n\n1. Add optional serdes-supply regulator property support.\n2. Enable 10Gbps feature for the controller, configure netc blkctrl\n   CFG_LINK_PCS_PROT_2 to 10G SXGMII.\n3. Add internal xpcs phy initialization to 10G XGMII Mode without\n   auto-negotiation interface.\n\nSigned-off-by: Ye Li <ye.li@nxp.com>\nSigned-off-by: Alice Guo <alice.guo@nxp.com>\n---\n drivers/net/fsl_enetc.c          |  57 ++-\n drivers/net/fsl_enetc.h          |   1 +\n drivers/net/fsl_enetc_xpcs_phy.c | 970 +++++++++++++++++++++++++++++++++++++++\n 3 files changed, 1017 insertions(+), 11 deletions(-)","diff":"diff --git a/drivers/net/fsl_enetc.c b/drivers/net/fsl_enetc.c\nindex a4ba27904bc..206f1a381bb 100644\n--- a/drivers/net/fsl_enetc.c\n+++ b/drivers/net/fsl_enetc.c\n@@ -8,6 +8,7 @@\n #include <clk.h>\n #include <cpu_func.h>\n #include <dm.h>\n+#include <dm/device_compat.h>\n #include <errno.h>\n #include <fdt_support.h>\n #include <malloc.h>\n@@ -20,14 +21,21 @@\n #include <linux/bug.h>\n #include <linux/delay.h>\n #include <linux/build_bug.h>\n+#include <linux/bitfield.h>\n+#include <power/regulator.h>\n+#include \"fsl_enetc.h\"\n \n #ifdef CONFIG_ARCH_IMX9\n #include <asm/mach-imx/sys_proto.h>\n #include <cpu_func.h>\n+#include \"fsl_enetc_xpcs_phy.c\"\n+#else\n+static inline int xpcs_phy_usxgmii_pma_config(struct udevice *dev)\n+{\n+\treturn 0;\n+}\n #endif\n \n-#include \"fsl_enetc.h\"\n-\n #define ENETC_DRIVER_NAME\t\"enetc_eth\"\n \n /*\n@@ -454,19 +462,23 @@ static void enetc_setup_mac_iface(struct udevice *dev,\n /* set up serdes for SXGMII */\n static int enetc_init_sxgmii(struct udevice *dev)\n {\n-\tstruct enetc_priv *priv = dev_get_priv(dev);\n-\n \tif (!enetc_has_imdio(dev))\n \t\treturn 0;\n \n-\t/* Dev ability - SXGMII */\n-\tenetc_mdio_write(&priv->imdio, ENETC_PCS_PHY_ADDR, ENETC_PCS_DEVAD_REPL,\n-\t\t\t ENETC_PCS_DEV_ABILITY, ENETC_PCS_DEV_ABILITY_SXGMII);\n+\tif (enetc_is_imx95(dev)) {\n+\t\txpcs_phy_usxgmii_pma_config(dev);\n+\t} else {\n+\t\tstruct enetc_priv *priv = dev_get_priv(dev);\n+\n+\t\t/* Dev ability - SXGMII */\n+\t\tenetc_mdio_write(&priv->imdio, ENETC_PCS_PHY_ADDR, ENETC_PCS_DEVAD_REPL,\n+\t\t\t\t ENETC_PCS_DEV_ABILITY, ENETC_PCS_DEV_ABILITY_SXGMII);\n \n-\t/* Restart PCS AN */\n-\tenetc_mdio_write(&priv->imdio, ENETC_PCS_PHY_ADDR, ENETC_PCS_DEVAD_REPL,\n-\t\t\t ENETC_PCS_CR,\n-\t\t\t ENETC_PCS_CR_RST | ENETC_PCS_CR_RESET_AN);\n+\t\t/* Restart PCS AN */\n+\t\tenetc_mdio_write(&priv->imdio, ENETC_PCS_PHY_ADDR, ENETC_PCS_DEVAD_REPL,\n+\t\t\t\t ENETC_PCS_CR,\n+\t\t\t\t ENETC_PCS_CR_RST | ENETC_PCS_CR_RESET_AN);\n+\t}\n \n \treturn 0;\n }\n@@ -523,6 +535,10 @@ static int enetc_config_phy(struct udevice *dev)\n \t\treturn -ENODEV;\n \n \tsupported = PHY_GBIT_FEATURES | SUPPORTED_2500baseX_Full;\n+\n+\tif (enetc_is_imx95(dev))\n+\t\tsupported |= PHY_10G_FEATURES;\n+\n \tpriv->phy->supported &= supported;\n \tpriv->phy->advertising &= supported;\n \n@@ -537,12 +553,31 @@ static int enetc_probe(struct udevice *dev)\n {\n \tstruct enetc_priv *priv = dev_get_priv(dev);\n \tint res;\n+\tstruct udevice *supply = NULL;\n \n \tif (ofnode_valid(dev_ofnode(dev)) && !ofnode_is_enabled(dev_ofnode(dev))) {\n \t\tenetc_dbg(dev, \"interface disabled\\n\");\n \t\treturn -ENODEV;\n \t}\n \n+\tif (CONFIG_IS_ENABLED(DM_REGULATOR)) {\n+\t\tres = device_get_supply_regulator(dev, \"serdes-supply\",\n+\t\t\t\t\t\t  &supply);\n+\t\tif (res  && res  != -ENOENT) {\n+\t\t\tprintf(\"%s: device_get_supply_regulator failed: %d\\n\",\n+\t\t\t       __func__, res);\n+\t\t\treturn res;\n+\t\t}\n+\n+\t\tif (supply) {\n+\t\t\tres = regulator_set_enable_if_allowed(supply, true);\n+\t\t\tif (res) {\n+\t\t\t\tprintf(\"%s: Error enabling phy supply\\n\", dev->name);\n+\t\t\t\treturn res;\n+\t\t\t}\n+\t\t}\n+\t}\n+\n \tpriv->enetc_txbd = memalign(ENETC_BD_ALIGN,\n \t\t\t\t    sizeof(struct enetc_tx_bd) * ENETC_BD_CNT);\n \tpriv->enetc_rxbd = memalign(ENETC_BD_ALIGN,\ndiff --git a/drivers/net/fsl_enetc.h b/drivers/net/fsl_enetc.h\nindex 804df853bf5..6d868e82f8c 100644\n--- a/drivers/net/fsl_enetc.h\n+++ b/drivers/net/fsl_enetc.h\n@@ -205,6 +205,7 @@ struct enetc_data {\n \n /* PCS / internal SoC PHY ID, it defaults to 0 on all interfaces */\n #define ENETC_PCS_PHY_ADDR\t0\n+#define ENETC_NON_PCS_PHY_ADDR      16\n \n /* PCS registers */\n #define ENETC_PCS_CR\t\t\t0x00\ndiff --git a/drivers/net/fsl_enetc_xpcs_phy.c b/drivers/net/fsl_enetc_xpcs_phy.c\nnew file mode 100644\nindex 00000000000..4039690223d\n--- /dev/null\n+++ b/drivers/net/fsl_enetc_xpcs_phy.c\n@@ -0,0 +1,970 @@\n+// SPDX-License-Identifier: GPL-2.0\n+/*\n+ * Copyright 2024 NXP\n+ */\n+\n+#define XPCS_PHY_GLOBAL\t\t0x0\n+#define XPCS_PHY_MPLLA\t\t0x1\n+#define XPCS_PHY_MPLLB\t\t0x2\n+#define XPCS_PHY_LANE\t\t0x3\n+#define XPCS_PHY_MAC_ADAPTER\t0x1f\n+\n+#define XPCS_PHY_REG(x) (((x) & 0x1fffe) >> 1)\n+\n+/* MAC ADAPTER */\n+#define MAC_ADAPTER_LOCK_PHY\t0x200\n+#define MAC_ADAPTER_LOCK_MPLLA\t0x204\n+#define MAC_ADAPTER_LOCK_MPLLB\t0x208\n+#define MAC_ADAPTER_LOCK_ROM\t0x20c\n+#define MAC_ADAPTER_LOCK_RAM\t0x210\n+#define MAC_ADAPTER_LOCK_EVENT\t0x214\n+\n+#define MAC_ADAPTER_LOCK_LOCK\tBIT(7)\n+\n+/* PMA */\n+#define PMA_RX_LSTS\t\t\t\t\t0x10040\n+#define PMA_RX_LSTS_RX_VALID_0\t\t\tBIT(12)\n+#define PMA_MP_12G_16G_25G_TX_GENCTRL0\t\t\t0x10060\n+#define PMA_TX_GENCTRL0_TX_RST_0\t\tBIT(8)\n+#define PMA_TX_GENCTRL0_TX_DT_EN_0\t\tBIT(12)\n+#define PMA_MP_12G_16G_25G_TX_GENCTRL1\t\t\t0x10062\n+#define PMA_TX_GENCTRL1_VBOOST_EN_0\t\tBIT(4)\n+#define PMA_TX_GENCTRL1_VBOOST_LVL_MASK\t\tGENMASK(10, 8)\n+#define PMA_TX_GENCTRL1_VBOOST_LVL(x)\t\t(((x) << 8) & GENMASK(10, 8))\n+#define PMA_TX_GENCTRL1_TX_CLK_RDY_0\t\tBIT(12)\n+#define PMA_MP_12G_16G_TX_GENCTRL2\t\t\t0x10064\n+#define PMA_TX_GENCTRL2_TX_REQ_0\t\tBIT(0)\n+#define PMA_TX_GENCTRL2_TX0_WIDTH_MASK\t\tGENMASK(9, 8)\n+#define PMA_TX_GENCTRL2_TX0_WIDTH(x)\t\t(((x) << 8) & GENMASK(9, 8))\n+#define PMA_MP_12G_16G_25G_TX_BOOST_CTRL\t\t0x10066\n+#define PMA_TX_BOOST_CTRL_TX0_IBOOST_MASK\tGENMASK(3, 0)\n+#define PMA_TX_BOOST_CTRL_TX0_IBOOST(x)\t\t((x) & GENMASK(3, 0))\n+#define PMA_MP_12G_16G_25G_TX_RATE_CTRL\t\t\t0x10068\n+#define PMA_TX_RATE_CTRL_TX0_RATE_MASK\t\tGENMASK(2, 0)\n+#define PMA_TX_RATE_CTRL_TX0_RATE(x)\t\t((x) & GENMASK(2, 0))\n+#define PMA_MP_12G_16G_25G_TX_POWER_STATE_CTRL\t\t0x1006A\n+#define PMA_POWER_STATE_CTRL_TX0_PSTATE_MASK\tGENMASK(1, 0)\n+#define PMA_POWER_STATE_CTRL_TX0_PSTATE(x)\t((x) & GENMASK(1, 0))\n+#define PMA_POWER_STATE_CTRL_TX_DISABLE_0\tBIT(8)\n+#define PMA_MP_12G_16G_25G_TX_EQ_CTRL0\t\t\t0x1006C\n+#define PMA_TX_EQ_CTRL0_TX_EQ_PRE_MASK\t\tGENMASK(5, 0)\n+#define PMA_TX_EQ_CTRL0_TX_EQ_PRE(x)\t\t((x) & GENMASK(5, 0))\n+#define PMA_TX_EQ_CTRL0_TX_EQ_MAIN_MASK\t\tGENMASK(13, 8)\n+#define PMA_TX_EQ_CTRL0_TX_EQ_MAIN(x)\t\t(((x) << 8) & GENMASK(13, 8))\n+#define PMA_MP_12G_16G_25G_TX_EQ_CTRL1\t\t\t0x1006E\n+#define PMA_TX_EQ_CTRL1_TX_EQ_POST_MASK\t\tGENMASK(5, 0)\n+#define PMA_TX_EQ_CTRL1_TX_EQ_POST(x)\t\t((x) & GENMASK(5, 0))\n+#define PMA_MP_16G_25G_TX_MISC_CTRL0\t\t\t0x1007C\n+#define PMA_TX_MISC_CTRL0_TX0_MISC_MASK\t\tGENMASK(7, 0)\n+#define PMA_TX_MISC_CTRL0_TX0_MISC(x)\t\t((x) & GENMASK(7, 0))\n+#define PMA_MP_12G_16G_25G_RX_GENCTRL0\t\t\t0x100A0\n+#define PMA_RX_GENCTRL0_RX_DT_EN_0\t\tBIT(8)\n+#define PMA_MP_12G_16G_25G_RX_GENCTRL1\t\t\t0x100A2\n+#define PMA_RX_GENCTRL1_RX_RST_0\t\tBIT(4)\n+#define PMA_RX_GENCTRL1_RX_TERM_ACDC_0\t\tBIT(8)\n+#define PMA_RX_GENCTRL1_RX_DIV16P5_CLK_EN_0\tBIT(12)\n+#define PMA_MP_12G_16G_RX_GENCTRL2\t\t\t0x100A4\n+#define PMA_RX_GENCTRL2_RX_REQ_0\t\tBIT(0)\n+#define PMA_RX_GENCTRL2_RX0_WIDTH_MASK\t\tGENMASK(9, 8)\n+#define PMA_RX_GENCTRL2_RX0_WIDTH(x)\t\t(((x) << 8) & GENMASK(9, 8))\n+#define PMA_MP_12G_16G_RX_GENCTRL3\t\t\t0x100A6\n+#define PMA_RX_GENCTRL3_LOS_TRSHLD_0_MASK\tGENMASK(2, 0)\n+#define PMA_RX_GENCTRL3_LOS_TRSHLD_0(x)\t\t((x) & GENMASK(2, 0))\n+#define PMA_RX_GENCTRL3_LOS_LFPS_EN_0\t\tBIT(12)\n+#define PMA_MP_12G_16G_25G_RX_RATE_CTRL\t\t\t0x100A8\n+#define PMA_RX_RATE_CTRL_RX0_RATE_MASK\t\tGENMASK(1, 0)\n+#define PMA_RX_RATE_CTRL_RX0_RATE(x)\t\t((x) & GENMASK(1, 0))\n+#define PMA_MP_12G_16G_25G_RX_POWER_STATE_CTRL\t\t0x100AA\n+#define PMA_RX_POWER_STATE_CTRL_RX0_PSTATE_MASK\tGENMASK(1, 0)\n+#define PMA_RX_POWER_STATE_CTRL_RX0_PSTATE(x)\t((x) & GENMASK(1, 0))\n+#define PMA_RX_POWER_STATE_CTRL_RX_DISABLE_0\tBIT(8)\n+#define PMA_MP_12G_16G_25G_RX_CDR_CTRL\t\t\t0x100AC\n+#define PMA_RX_CDR_CTRL_CDR_SSC_EN_0\t\tBIT(4)\n+#define PMA_MP_12G_16G_25G_RX_ATTN_CTRL\t\t\t0x100AE\n+#define PMA_RX_ATTN_CTRL_RX0_EQ_ATT_LVL_MASK\tGENMASK(2, 0)\n+#define PMA_RX_ATTN_CTRL_RX0_EQ_ATT_LVL(x)\t((x) & GENMASK(2, 0))\n+#define PMA_MP_16G_25G_RX_EQ_CTRL0\t\t\t0x100B0\n+#define PMA_RX_EQ_CTRL0_CTLE_BOOST_0_MASK\tGENMASK(4, 0)\n+#define PMA_RX_EQ_CTRL0_CTLE_BOOST_0(x)\t\t((x) & GENMASK(4, 0))\n+#define PMA_RX_EQ_CTRL0_CTLE_POLE_0_MASK\tGENMASK(6, 5)\n+#define PMA_RX_EQ_CTRL0_CTLE_POLE_0(x)\t\t(((x) << 5) & GENMASK(6, 5))\n+#define PMA_RX_EQ_CTRL0_VGA2_GAIN_0_MASK\tGENMASK(10, 8)\n+#define PMA_RX_EQ_CTRL0_VGA2_GAIN_0(x)\t\t(((x) << 8) & GENMASK(10, 8))\n+#define PMA_RX_EQ_CTRL0_VGA1_GAIN_0_MASK\tGENMASK(14, 12)\n+#define PMA_RX_EQ_CTRL0_VGA1_GAIN_0(x)\t\t(((x) << 12) & GENMASK(14, 12))\n+#define PMA_MP_12G_16G_25G_RX_EQ_CTRL4\t\t\t0x100B8\n+#define PMA_RX_EQ_CTRL4_CONT_ADAPT_0\t\tBIT(0)\n+#define PMA_RX_EQ_CTRL4_RX_AD_REQ\t\tBIT(12)\n+#define PMA_MP_16G_25G_RX_EQ_CTRL5\t\t\t0x100BA\n+#define PMA_RX_EQ_CTRL5_RX_ADPT_SEL_0\t\tBIT(0)\n+#define PMA_RX_EQ_CTRL5_RX0_ADPT_MODE_MASK\tGENMASK(5, 4)\n+#define PMA_RX_EQ_CTRL5_RX0_ADPT_MODE(x)\t(((x) << 4) & GENMASK(5, 4))\n+#define PMA_MP_12G_16G_25G_DFE_TAP_CTRL0\t\t0x100BC\n+#define PMA_DFE_TAP_CTRL0_DFE_TAP1_0_MASK\tGENMASK(7, 0)\n+#define PMA_DFE_TAP_CTRL0_DFE_TAP1_0(x)\t\t((x) & GENMASK(7, 0))\n+#define PMA_MP_16G_RX_CDR_CTRL1\t\t\t\t0x100C8\n+#define PMA_RX_CDR_CTRL1_VCO_TEMP_COMP_EN_0\tBIT(0)\n+#define PMA_RX_CDR_CTRL1_VCO_STEP_CTRL_0\tBIT(4)\n+#define PMA_RX_CDR_CTRL1_VCO_FRQBAND_0_MASK\tGENMASK(9, 8)\n+#define PMA_RX_CDR_CTRL1_VCO_FRQBAND_0(x)\t(((x) << 8) & GENMASK(9, 8))\n+#define PMA_MP_16G_25G_RX_PPM_CTRL0\t\t\t0x100CA\n+#define PMA_RX_PPM_CTRL0_RX0_CDR_PPM_MAX_MASK\tGENMASK(4, 0)\n+#define PMA_RX_PPM_CTRL0_RX0_CDR_PPM_MAX(x)\t((x) & GENMASK(4, 0))\n+#define PMA_MP_16G_25G_RX_GENCTRL4\t\t\t0x100D0\n+#define PMA_RX_GENCTRL4_RX_DFE_BYP_0\t\tBIT(8)\n+#define PMA_MP_16G_25G_RX_MISC_CTRL0\t\t\t0x100D2\n+#define PMA_RX_MISC_CTRL0_RX0_MISC_MASK\t\tGENMASK(7, 0)\n+#define PMA_RX_MISC_CTRL0_RX0_MISC(x)\t\t((x) & GENMASK(7, 0))\n+#define PMA_MP_16G_25G_RX_IQ_CTRL0\t\t\t0x100D6\n+#define PMA_RX_IQ_CTRL0_RX0_MARGIN_IQ_MASK\tGENMASK(6, 0)\n+#define PMA_RX_IQ_CTRL0_RX0_MARGIN_IQ(x)\t((x) & GENMASK(6, 0))\n+#define PMA_RX_IQ_CTRL0_RX0_DELTA_IQ_MASK\tGENMASK(11, 8)\n+#define PMA_RX_IQ_CTRL0_RX0_DELTA_IQ(x)\t\t(((x) << 8) & GENMASK(11, 8))\n+#define PMA_MP_12G_16G_25G_MPLL_CMN_CTRL\t\t0x100E0\n+#define PMA_MPLL_CMN_CTRL_MPLL_EN_0\t\tBIT(0)\n+#define PMA_MPLL_CMN_CTRL_MPLLB_SEL_0\t\tBIT(4)\n+#define PMA_MP_12G_16G_MPLLA_CTRL0\t\t\t0x100E2\n+#define PMA_MPLLA_CTRL0_MPLLA_MULTIPLIER_MASK\tGENMASK(7, 0)\n+#define PMA_MPLLA_CTRL0_MPLLA_MULTIPLIER(x)\t((x) & GENMASK(7, 0))\n+#define PMA_MP_16G_MPLLA_CTRL1\t\t\t\t0x100E4\n+#define PMA_MPLLA_CTRL1_MPLLA_SSC_EN\t\tBIT(0)\n+#define PMA_MPLLA_CTRL1_MPLLA_SSC_CLK_SEL\tBIT(4)\n+#define PMA_MPLLA_CTRL1_MPLLA_FRACN_CTRL_MASK\tGENMASK(15, 5)\n+#define PMA_MPLLA_CTRL1_MPLLA_FRACN_CTRL(x)\t(((x) << 5) & GENMASK(15, 5))\n+#define PMA_MP_12G_16G_MPLLA_CTRL2\t\t\t0x100E6\n+#define PMA_MPLLA_CTRL2_MPLLA_DIV_MULT_MASK\tGENMASK(6, 0)\n+#define PMA_MPLLA_CTRL2_MPLLA_DIV_MULT(x)\t((x) & GENMASK(6, 0))\n+#define PMA_MPLLA_CTRL2_MPLLA_DIV_CLK_EN\tBIT(7)\n+#define PMA_MPLLA_CTRL2_MPLLA_DIV8_CLK_EN\tBIT(8)\n+#define PMA_MPLLA_CTRL2_MPLLA_DIV10_CLK_EN\tBIT(9)\n+#define PMA_MPLLA_CTRL2_MPLLA_DIV16P5_CLK_EN\tBIT(10)\n+#define PMA_MPLLA_CTRL2_MPLLA_TX_CLK_DIV_MASK\tGENMASK(12, 11)\n+#define PMA_MPLLA_CTRL2_MPLLA_TX_CLK_DIV(x)\t(((x) << 11) & GENMASK(12, 11))\n+#define PMA_MP_16G_MPLLA_CTRL3\t\t\t\t0x100EE\n+#define PMA_MPLLA_CTRL3_MPLLA_BANDWIDTH_MASK\tGENMASK(15, 0)\n+#define PMA_MPLLA_CTRL3_MPLLA_BANDWIDTH(x)\t((x) & GENMASK(15, 0))\n+#define PMA_MP_16G_MPLLA_CTRL4\t\t\t\t0x100F2\n+#define PMA_MPLLA_CTRL4_MPLLA_SSC_FRQ_CNT_INT_MASK GENMASK(11, 0)\n+#define PMA_MPLLA_CTRL4_MPLLA_SSC_FRQ_CNT_INT(x) ((x) & GENMASK(11, 0))\n+#define PMA_MP_16G_MPLLA_CTRL5\t\t\t\t0x100F4\n+#define PMA_MPLLA_CTRL5_MPLLA_SSC_FRQ_CNT_PK_MASK GENMASK(7, 0)\n+#define PMA_MPLLA_CTRL5_MPLLA_SSC_FRQ_CNT_PK(x)\t((x) & GENMASK(7, 0))\n+#define PMA_MPLLA_CTRL5_MPLLA_SSC_SPD_EN\tBIT(8)\n+#define PMA_MP_12G_16G_25G_MISC_CTRL0\t\t\t0x10120\n+#define PMA_MISC_CTRL0_RX_VREF_CTRL_MASK\tGENMASK(12, 8)\n+#define PMA_MISC_CTRL0_RX_VREF_CTRL(x)\t\t(((x) << 8) & GENMASK(12, 8))\n+#define PMA_MP_12G_16G_25G_REF_CLK_CTRL\t\t\t0x10122\n+#define PMA_REF_CLK_CTRL_REF_CLK_DIV2\t\tBIT(2)\n+#define PMA_REF_CLK_CTRL_REF_RANGE_MASK\t\tGENMASK(5, 3)\n+#define PMA_REF_CLK_CTRL_REF_RANGE(x)\t\t(((x) << 3) & GENMASK(5, 3))\n+#define PMA_REF_CLK_CTRL_REF_MPLLA_DIV2\t\tBIT(6)\n+#define PMA_MP_12G_16G_25G_VCO_CAL_LD0\t\t\t0x10124\n+#define PMA_VCO_CAL_LD0_VCO_LD_VAL_0_MASK\tGENMASK(12, 0)\n+#define PMA_VCO_CAL_LD0_VCO_LD_VAL_0(x)\t\t((x) & GENMASK(12, 0))\n+#define PMA_MP_16G_25G_VCO_CAL_REF0\t\t\t0x1012C\n+#define PMA_VCO_CAL_REF0_VCO_REF_LD_0_MASK\tGENMASK(6, 0)\n+#define PMA_VCO_CAL_REF0_VCO_REF_LD_0(x)\t((x) & GENMASK(6, 0))\n+#define PMA_MP_12G_16G_25G_MISC_STS\t\t\t0x10130\n+#define PMA_MISC_STS_RX_ADPT_ACK\t\tBIT(12)\n+#define PMA_MP_12G_16G_25G_SRAM\t\t\t\t0x10136\n+#define PMA_SRAM_INIT_DN\t\t\tBIT(0)\n+#define PMA_SRAM_EXT_LD_DN\t\t\tBIT(1)\n+#define PMA_MP_16G_25G_MISC_CTRL2\t\t\t0x10138\n+#define PMA_MISC_CTRL2_SUP_MISC_MASK\t\tGENMASK(7, 0)\n+#define PMA_MISC_CTRL2_SUP_MISC(x)\t\t((x) & GENMASK(7, 0))\n+\n+/* PCS */\n+#define PCS_CTRL1\t\t\t\t0x0\n+#define PCS_CTRL1_RESET\t\t\tBIT(15)\n+#define PCS_CTRL2\t\t\t\t0xE\n+#define PCS_CTRL2_PCS_TYPE_SEL_MASK\tGENMASK(3, 0)\n+#define PCS_CTRL2_PCS_TYPE_SEL(x)\t((x) & GENMASK(3, 0))\n+#define PCS_DIG_CTRL1\t\t\t\t0x10000\n+#define PCS_DIG_CTRL1_USXG_EN\t\tBIT(9)\n+#define PCS_DIG_CTRL1_USRA_RST\t\tBIT(10)\n+#define PCS_DIG_CTRL1_VR_RST\t\tBIT(15)\n+#define PCS_DEBUG_CTRL\t\t\t\t0x1000A\n+#define PCS_DEBUG_CTRL_SUPRESS_LOS_DET\tBIT(4)\n+#define PCS_DEBUG_CTRL_RX_DT_EN_CTL\tBIT(6)\n+#define PCS_DEBUG_CTRL_TX_PMBL_CTL\tBIT(8)\n+#define PCS_KR_CTRL1\t\t\t\t0x1000E\n+#define PCS_KR_CTRL1_USXG_MODE_MASK\tGENMASK(12, 10)\n+#define PCS_KR_CTRL1_USXG_MODE(x)\t(((x) << 10) & GENMASK(12, 10))\n+\n+/* VS MII MMD */\n+#define MII_CTRL\t\t\t\t\t0x0\n+#define MII_CTRL_SS5\t\t\t\tBIT(5)\n+#define MII_CTRL_SS6\t\t\t\tBIT(6)\n+#define MII_CTRL_AN_ENABLE\t\t\tBIT(12)\n+#define MII_CTRL_SS13\t\t\t\tBIT(13)\n+#define MII_DIG_CTRL1\t\t\t\t\t0x10000\n+#define MII_DIG_CTRL1_CL37_TMR_OVR_RIDE\t\tBIT(3)\n+#define MII_AN_CTRL\t\t\t\t\t0x10002\n+#define MII_AN_CTRL_MII_AN_INTR_EN\t\tBIT(0)\n+#define MII_AN_CTRL_TX_CONFIG\t\t\tBIT(3)\n+#define MII_AN_INTR_STS\t\t\t\t\t0x10004\n+#define MII_AN_INTR_STS_CL37_ANCMPLT_INTR\tBIT(0)\n+#define MII_LINK_TIMER_CTRL\t\t\t\t0x10014\n+#define MII_LINK_TIMER_CTRL_CL37_LINK_TIME_MASK\t\tGENMASK(15, 0)\n+#define MII_LINK_TIMER_CTRL_CL37_LINK_TIME(x)\t\t((x) & GENMASK(15, 0))\n+\n+/* E16 MEM MAP */\n+#define IDCODE_LO\t\t\t\t\t\t0x0\n+#define IDCODE_HI\t\t\t\t\t\t0x4\n+#define GLOBAL_CTRL_EX_0\t\t\t\t\t0x114\n+#define GLOBAL_CTRL_EX_0_PHY_SRAM_BYPASS\t\tBIT(0)\n+#define L0_RX_VCO_OVRD_OUT_0\t\t\t\t\t0x20c\n+#define L0_RX_VCO_OVRD_OUT_0_RX_ANA_CDR_FREQ_TUNE_MASK\tGENMASK(12, 3)\n+#define L0_RX_VCO_OVRD_OUT_0_RX_ANA_CDR_FREQ_TUNE(x)\t(((x) << 3) & GENMASK(12, 3))\n+#define L0_RX_VCO_OVRD_OUT_0_RX_CDR_FREQ_TUNE_OVRD_EN\tBIT(15)\n+#define L0_RX_VCO_OVRD_OUT_2\t\t\t\t\t0x214\n+#define L0_RX_VCO_OVRD_OUT_2_RX_ANA_CDR_FREQ_TUNE_CLK\tBIT(0)\n+\n+static int enetc_mdio_read(struct mii_dev *bus, int addr, int devad, int reg);\n+static int enetc_mdio_write(struct mii_dev *bus, int addr, int devad, int reg, u16 val);\n+\n+int xpcs_read(struct udevice *dev, int devaddr, u32 reg)\n+{\n+\tstruct enetc_priv *priv = dev_get_priv(dev);\n+\n+\treturn enetc_mdio_read(&priv->imdio, ENETC_PCS_PHY_ADDR, devaddr, reg);\n+}\n+\n+int xpcs_write(struct udevice *dev, int devaddr, u32 reg, u16 val)\n+{\n+\tstruct enetc_priv *priv = dev_get_priv(dev);\n+\n+\treturn enetc_mdio_write(&priv->imdio, ENETC_PCS_PHY_ADDR, devaddr, reg, val);\n+}\n+\n+int xpcs_phy_read(struct udevice *dev, int devaddr, u32 reg)\n+{\n+\tstruct enetc_priv *priv = dev_get_priv(dev);\n+\n+\treturn enetc_mdio_read(&priv->imdio, ENETC_NON_PCS_PHY_ADDR, devaddr, reg);\n+}\n+\n+int xpcs_phy_write(struct udevice *dev, int devaddr, u32 reg, u16 val)\n+{\n+\tstruct enetc_priv *priv = dev_get_priv(dev);\n+\n+\treturn enetc_mdio_write(&priv->imdio, ENETC_NON_PCS_PHY_ADDR, devaddr, reg, val);\n+}\n+\n+int xpcs_phy_read_pma(struct udevice *dev, u32 reg)\n+{\n+\treturn xpcs_read(dev, MDIO_MMD_PMAPMD, XPCS_PHY_REG(reg));\n+}\n+\n+int xpcs_phy_write_pma(struct udevice *dev, int reg, u16 val)\n+{\n+\treturn xpcs_write(dev, MDIO_MMD_PMAPMD, XPCS_PHY_REG(reg), val);\n+}\n+\n+int xpcs_phy_usxgmii_init_seq_2(struct udevice *dev)\n+{\n+\tulong begin;\n+\tu16 val;\n+\n+\t/* Seq 2.1 Keep preamble data */\n+\tval = xpcs_read(dev, MDIO_MMD_PCS, XPCS_PHY_REG(PCS_DEBUG_CTRL));\n+\tval |= PCS_DEBUG_CTRL_TX_PMBL_CTL;\n+\txpcs_write(dev, MDIO_MMD_PCS, XPCS_PHY_REG(PCS_DEBUG_CTRL), val);\n+\n+\t/* Seq 2.2 Power up MPLLA to P1 state */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_POWER_STATE_CTRL);\n+\tval = u16_replace_bits(val, 2, PMA_POWER_STATE_CTRL_TX0_PSTATE_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_POWER_STATE_CTRL, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_MPLL_CMN_CTRL);\n+\tval |= PMA_MPLL_CMN_CTRL_MPLL_EN_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_MPLL_CMN_CTRL, val);\n+\n+\t/* Seq 2.3 Assert request of transmitand receive */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_TX_GENCTRL2);\n+\tval |= PMA_TX_GENCTRL2_TX_REQ_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_TX_GENCTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2);\n+\tval |= PMA_RX_GENCTRL2_RX_REQ_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2, val);\n+\n+\t/* Seq 2.4 Poll for acknowledge */\n+\tbegin = get_timer(0);\n+\tdo {\n+\t\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_TX_GENCTRL2);\n+\t\tif (get_timer(begin) > 500) {\n+\t\t\tdev_err(dev, \"Polling timeout, line: %d\\n\", __LINE__);\n+\t\t\tgoto timeout;\n+\t\t}\n+\t\tmdelay(10);\n+\t} while (val & PMA_TX_GENCTRL2_TX_REQ_0);\n+\n+\tbegin = get_timer(0);\n+\tdo {\n+\t\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2);\n+\t\tif (get_timer(begin) > 500) {\n+\t\t\tdev_err(dev, \"Polling timeout, line: %d\\n\", __LINE__);\n+\t\t\tgoto timeout;\n+\t\t}\n+\t\tmdelay(10);\n+\t} while (val & PMA_RX_GENCTRL2_RX_REQ_0);\n+\n+\t/* Seq 2.5 Turn transmit to P0 state */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_POWER_STATE_CTRL);\n+\tval = u16_replace_bits(val, 0, PMA_POWER_STATE_CTRL_TX0_PSTATE_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_POWER_STATE_CTRL, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL0);\n+\tval &= ~PMA_TX_GENCTRL0_TX_RST_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL0, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_POWER_STATE_CTRL);\n+\tval &= ~PMA_POWER_STATE_CTRL_TX_DISABLE_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_POWER_STATE_CTRL, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_MPLL_CMN_CTRL);\n+\tval |= PMA_MPLL_CMN_CTRL_MPLL_EN_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_MPLL_CMN_CTRL, val);\n+\n+\t/* Seq 2.6 Turn receive to P0 state */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL1);\n+\tval &= ~PMA_RX_GENCTRL1_RX_RST_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL1, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_POWER_STATE_CTRL);\n+\tval &= ~PMA_RX_POWER_STATE_CTRL_RX0_PSTATE_MASK;\n+\tval &= ~PMA_RX_POWER_STATE_CTRL_RX_DISABLE_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_POWER_STATE_CTRL, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_POWER_STATE_CTRL);\n+\tval &= ~PMA_RX_POWER_STATE_CTRL_RX0_PSTATE_MASK;\n+\tval &= ~PMA_RX_POWER_STATE_CTRL_RX_DISABLE_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_POWER_STATE_CTRL, val);\n+\n+\t/* Seq 2.7 Enable transmitter output driver in the PHY */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL0);\n+\tval |= PMA_TX_GENCTRL0_TX_DT_EN_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL0, val);\n+\n+\t/* Seq 2.8 Enable receiver data output from PHY */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL0);\n+\tval |= PMA_RX_GENCTRL0_RX_DT_EN_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL0, val);\n+\n+\t/* Seq 2.9 Assert request of transmit and receive */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_TX_GENCTRL2);\n+\tval |= PMA_TX_GENCTRL2_TX_REQ_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_TX_GENCTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2);\n+\tval |= PMA_RX_GENCTRL2_RX_REQ_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2, val);\n+\n+\t/* Seq 2.10 Poll for acknowledge */\n+\tbegin = get_timer(0);\n+\tdo {\n+\t\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_TX_GENCTRL2);\n+\t\tif (get_timer(begin) > 500) {\n+\t\t\tdev_err(dev, \"Polling timeout, line: %d\\n\", __LINE__);\n+\t\t\tgoto timeout;\n+\t\t}\n+\t\tmdelay(10);\n+\t\tschedule();\n+\t} while (val & PMA_TX_GENCTRL2_TX_REQ_0);\n+\n+\tbegin = get_timer(0);\n+\tdo {\n+\t\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2);\n+\t\tif (get_timer(begin) > 500) {\n+\t\t\tdev_err(dev, \"Polling timeout, line: %d\\n\", __LINE__);\n+\t\t\tgoto timeout;\n+\t\t}\n+\t\tmdelay(10);\n+\t\tschedule();\n+\t} while (val & PMA_RX_GENCTRL2_RX_REQ_0);\n+\n+\treturn 0;\n+\n+timeout:\n+\treturn -ETIMEDOUT;\n+}\n+\n+void xpcs_phy_reg_lock(struct udevice *dev)\n+{\n+\tu16 val;\n+\tulong begin;\n+\n+\tif (xpcs_phy_read(dev, XPCS_PHY_MAC_ADAPTER, XPCS_PHY_REG(MAC_ADAPTER_LOCK_PHY)) & MAC_ADAPTER_LOCK_LOCK)\n+\t\treturn;\n+\n+\txpcs_phy_write(dev, XPCS_PHY_MAC_ADAPTER, XPCS_PHY_REG(MAC_ADAPTER_LOCK_PHY), MAC_ADAPTER_LOCK_LOCK);\n+\txpcs_phy_write(dev, XPCS_PHY_MAC_ADAPTER, XPCS_PHY_REG(MAC_ADAPTER_LOCK_MPLLA), MAC_ADAPTER_LOCK_LOCK);\n+\txpcs_phy_write(dev, XPCS_PHY_MAC_ADAPTER, XPCS_PHY_REG(MAC_ADAPTER_LOCK_MPLLB), MAC_ADAPTER_LOCK_LOCK);\n+\txpcs_phy_write(dev, XPCS_PHY_MAC_ADAPTER, XPCS_PHY_REG(MAC_ADAPTER_LOCK_ROM), MAC_ADAPTER_LOCK_LOCK);\n+\txpcs_phy_write(dev, XPCS_PHY_MAC_ADAPTER, XPCS_PHY_REG(MAC_ADAPTER_LOCK_RAM), MAC_ADAPTER_LOCK_LOCK);\n+\n+\tbegin = get_timer(0);\n+\tdo {\n+\t\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_SRAM);\n+\t\tif (get_timer(begin) > 500) {\n+\t\t\tdev_err(dev, \"Polling timeout, line: %d\\n\", __LINE__);\n+\t\t\tgoto timeout;\n+\t\t}\n+\t\tmdelay(10);\n+\t} while (!(val & PMA_SRAM_INIT_DN));\n+\n+\t/* Work around */\n+\t// xpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_SRAM, PMA_SRAM_EXT_LD_DN);\n+\txpcs_phy_write(dev, XPCS_PHY_GLOBAL, XPCS_PHY_REG(GLOBAL_CTRL_EX_0), GLOBAL_CTRL_EX_0_PHY_SRAM_BYPASS);\n+\n+\tbegin = get_timer(0);\n+\tdo {\n+\t\tval = xpcs_read(dev, MDIO_MMD_PCS, XPCS_PHY_REG(PCS_CTRL1));\n+\t\tif (get_timer(begin) > 500) {\n+\t\t\tdev_err(dev, \"Polling timeout, line: %d\\n\", __LINE__);\n+\t\t\tgoto timeout;\n+\t\t}\n+\t\tmdelay(10);\n+\t} while (val & PCS_CTRL1_RESET);\n+\n+\tmdelay(1);\n+\n+timeout:\n+\treturn;\n+}\n+\n+int xpcs_phy_usxgmii_pma_config(struct udevice *dev)\n+{\n+\tulong begin;\n+\tu16 val;\n+\n+\txpcs_phy_reg_lock(dev);\n+\n+\t/* 1.6 Turn off C37 auto-negotiation */\n+\tval = xpcs_read(dev, MDIO_MMD_VEND2, XPCS_PHY_REG(MII_CTRL));\n+\tval &= ~MII_CTRL_AN_ENABLE;\n+\txpcs_write(dev, MDIO_MMD_VEND2, XPCS_PHY_REG(MII_CTRL), val);\n+\n+\t/* 1.7 Assert tx_reset and rx_reset*/\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL0);\n+\tval |= PMA_TX_GENCTRL0_TX_RST_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL0, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL1);\n+\tval |= PMA_RX_GENCTRL1_RX_RST_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL1, val);\n+\n+\t/* 1.8 Wait for more than 1us */\n+\tudelay(5);\n+\n+\t/* 1.9 Deassert tx_reset and rx_reset*/\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL0);\n+\tval &= ~PMA_TX_GENCTRL0_TX_RST_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL0, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL1);\n+\tval &= ~PMA_RX_GENCTRL1_RX_RST_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL1, val);\n+\n+\t/* 1.10 Power down MPLLA */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_POWER_STATE_CTRL);\n+\tval = u16_replace_bits(val, 3, PMA_POWER_STATE_CTRL_TX0_PSTATE_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_POWER_STATE_CTRL, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_MPLL_CMN_CTRL);\n+\tval &= ~PMA_MPLL_CMN_CTRL_MPLL_EN_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_MPLL_CMN_CTRL, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL0);\n+\tval &= ~PMA_TX_GENCTRL0_TX_DT_EN_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL0, val);\n+\n+\t/* 1.11 Change RX0 power state to P2 */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL0);\n+\tval &= ~PMA_RX_GENCTRL0_RX_DT_EN_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL0, val);\n+\n+\t/* TODO: check if it is needed */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_POWER_STATE_CTRL);\n+\tval = u16_replace_bits(val, 1, PMA_RX_POWER_STATE_CTRL_RX0_PSTATE_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_POWER_STATE_CTRL, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_POWER_STATE_CTRL);\n+\tval = u16_replace_bits(val, 3, PMA_RX_POWER_STATE_CTRL_RX0_PSTATE_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_POWER_STATE_CTRL, val);\n+\n+\t/* 1.12 Assert request of transmit and receive */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_TX_GENCTRL2);\n+\tval |= PMA_TX_GENCTRL2_TX_REQ_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_TX_GENCTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2);\n+\tval |= PMA_RX_GENCTRL2_RX_REQ_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2, val);\n+\n+\t/* 1.13 Poll for acknlowledge */\n+\tbegin = get_timer(0);\n+\tdo {\n+\t\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_TX_GENCTRL2);\n+\t\tif (get_timer(begin) > 500) {\n+\t\t\tdev_err(dev, \"Polling timeout, line: %d\\n\", __LINE__);\n+\t\t\tgoto timeout;\n+\t\t}\n+\t\tmdelay(10);\n+\t} while (val & PMA_TX_GENCTRL2_TX_REQ_0);\n+\n+\tbegin = get_timer(0);\n+\tdo {\n+\t\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2);\n+\t\tif (get_timer(begin) > 500) {\n+\t\t\tdev_err(dev, \"Polling timeout, line: %d\\n\", __LINE__);\n+\t\t\tgoto timeout;\n+\t\t}\n+\t\tmdelay(10);\n+\t} while (val & PMA_RX_GENCTRL2_RX_REQ_0);\n+\n+\t/* 2 Config MPLL for 10G XGMII */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_REF_CLK_CTRL);\n+\tval = u16_replace_bits(val, 6, PMA_REF_CLK_CTRL_REF_RANGE_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_REF_CLK_CTRL, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_REF_CLK_CTRL);\n+\tval &= ~PMA_REF_CLK_CTRL_REF_CLK_DIV2;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_REF_CLK_CTRL, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_REF_CLK_CTRL);\n+\tval |= PMA_REF_CLK_CTRL_REF_MPLLA_DIV2;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_REF_CLK_CTRL, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2);\n+\tval &= ~PMA_MPLLA_CTRL2_MPLLA_DIV8_CLK_EN;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2);\n+\tval |= PMA_MPLLA_CTRL2_MPLLA_DIV10_CLK_EN;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2);\n+\tval |= PMA_MPLLA_CTRL2_MPLLA_DIV16P5_CLK_EN;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2);\n+\tval &= ~PMA_MPLLA_CTRL2_MPLLA_TX_CLK_DIV_MASK;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2);\n+\tval |= PMA_MPLLA_CTRL2_MPLLA_DIV_CLK_EN;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2);\n+\tval = u16_replace_bits(val, 5, PMA_MPLLA_CTRL2_MPLLA_DIV_MULT_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_MPLLA_CTRL1);\n+\tval &= ~PMA_MPLLA_CTRL1_MPLLA_SSC_EN;\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_MPLLA_CTRL1, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_MPLLA_CTRL1);\n+\tval &= ~PMA_MPLLA_CTRL1_MPLLA_SSC_CLK_SEL;\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_MPLLA_CTRL1, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_MPLLA_CTRL5);\n+\tval &= ~PMA_MPLLA_CTRL5_MPLLA_SSC_FRQ_CNT_PK_MASK;\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_MPLLA_CTRL5, val);\n+\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_MPLLA_CTRL4, 0);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_MPLLA_CTRL5);\n+\tval &= ~PMA_MPLLA_CTRL5_MPLLA_SSC_SPD_EN;\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_MPLLA_CTRL5, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_MPLLA_CTRL1);\n+\tval &= ~PMA_MPLLA_CTRL1_MPLLA_FRACN_CTRL_MASK;\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_MPLLA_CTRL1, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL0);\n+\tval = u16_replace_bits(val, 33, PMA_MPLLA_CTRL0_MPLLA_MULTIPLIER_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL0, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL1);\n+\tval = u16_replace_bits(val, 5, PMA_TX_GENCTRL1_VBOOST_LVL_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL1, val);\n+\n+\tval = PMA_MPLLA_CTRL3_MPLLA_BANDWIDTH(0xA016);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_MPLLA_CTRL3, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_MISC_CTRL0);\n+\tval = u16_replace_bits(val, 0x11, PMA_MISC_CTRL0_RX_VREF_CTRL_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_MISC_CTRL0, val);\n+\n+\tval = PMA_MISC_CTRL2_SUP_MISC(1);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_MISC_CTRL2, val);\n+\n+\tval = PMA_VCO_CAL_REF0_VCO_REF_LD_0(0x29);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_VCO_CAL_REF0, val);\n+\n+\tval = PMA_VCO_CAL_LD0_VCO_LD_VAL_0(0x549);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_VCO_CAL_LD0, val);\n+\n+\tval = PMA_RX_PPM_CTRL0_RX0_CDR_PPM_MAX(0x12);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_RX_PPM_CTRL0, val);\n+\n+\t/* 3 Configure LANE0 for 10G XGMII */\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_TX_MISC_CTRL0, 0x0);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_RATE_CTRL, 0x0);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_MPLL_CMN_CTRL);\n+\tval &= ~PMA_MPLL_CMN_CTRL_MPLLB_SEL_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_MPLL_CMN_CTRL, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_TX_GENCTRL2);\n+\tval = u16_replace_bits(val, 3, PMA_TX_GENCTRL2_TX0_WIDTH_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_TX_GENCTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL1);\n+\tval |= PMA_TX_GENCTRL1_VBOOST_EN_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL1, val);\n+\n+\tval = PMA_TX_BOOST_CTRL_TX0_IBOOST(0xf);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_BOOST_CTRL, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_EQ_CTRL0);\n+\tval = u16_replace_bits(val, 0, PMA_TX_EQ_CTRL0_TX_EQ_PRE_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_EQ_CTRL0, val);\n+\n+\tval = PMA_TX_EQ_CTRL1_TX_EQ_POST(0x20);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_EQ_CTRL1, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_EQ_CTRL0);\n+\tval = u16_replace_bits(val, 0x20, PMA_TX_EQ_CTRL0_TX_EQ_MAIN_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_EQ_CTRL0, val);\n+\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_RATE_CTRL, 0x0);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL0);\n+\tval = u16_replace_bits(val, 0x2, PMA_RX_EQ_CTRL0_CTLE_POLE_0_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL0, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL0);\n+\tval = u16_replace_bits(val, 0x10, PMA_RX_EQ_CTRL0_CTLE_BOOST_0_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL0, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_RX_GENCTRL3);\n+\tval = u16_replace_bits(val, 0x7, PMA_RX_GENCTRL3_LOS_TRSHLD_0_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_RX_GENCTRL3, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_RX_CDR_CTRL1);\n+\tval |= PMA_RX_CDR_CTRL1_VCO_STEP_CTRL_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_RX_CDR_CTRL1, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_RX_CDR_CTRL1);\n+\tval |= PMA_RX_CDR_CTRL1_VCO_TEMP_COMP_EN_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_RX_CDR_CTRL1, val);\n+\n+\tval = PMA_RX_MISC_CTRL0_RX0_MISC(0x12);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_RX_MISC_CTRL0, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2);\n+\tval = u16_replace_bits(val, 0x3, PMA_RX_GENCTRL2_RX0_WIDTH_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL1);\n+\tval |= PMA_RX_GENCTRL1_RX_DIV16P5_CLK_EN_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL1, val);\n+\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_CDR_CTRL, 0x0);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_RX_GENCTRL3);\n+\tval &= ~PMA_RX_GENCTRL3_LOS_LFPS_EN_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_RX_GENCTRL3, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_25G_RX_GENCTRL4);\n+\tval &= ~PMA_RX_GENCTRL4_RX_DFE_BYP_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_RX_GENCTRL4, val);\n+\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_ATTN_CTRL, 0x0);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL0);\n+\tval = u16_replace_bits(val, 0x5, PMA_RX_EQ_CTRL0_VGA1_GAIN_0_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL0, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL0);\n+\tval = u16_replace_bits(val, 0x5, PMA_RX_EQ_CTRL0_VGA2_GAIN_0_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL0, val);\n+\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_DFE_TAP_CTRL0, 0x0);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_RX_CDR_CTRL1);\n+\tval = u16_replace_bits(val, 0x1, PMA_RX_CDR_CTRL1_VCO_FRQBAND_0_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_RX_CDR_CTRL1, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL1);\n+\tval |= PMA_RX_GENCTRL1_RX_TERM_ACDC_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL1, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_25G_RX_IQ_CTRL0);\n+\tval = u16_replace_bits(val, 0x0, PMA_RX_IQ_CTRL0_RX0_DELTA_IQ_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_RX_IQ_CTRL0, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL5);\n+\tval &= ~PMA_RX_EQ_CTRL5_RX_ADPT_SEL_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL5, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL5);\n+\tval = u16_replace_bits(val, 0x3, PMA_RX_EQ_CTRL5_RX0_ADPT_MODE_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL5, val);\n+\n+\t/* 4 Configure XPCS for 10G XGMII */\n+\txpcs_write(dev, MDIO_MMD_PCS, XPCS_PHY_REG(PCS_CTRL2), 0x0);\n+\n+\tval = xpcs_read(dev, MDIO_MMD_PCS, XPCS_PHY_REG(PCS_DIG_CTRL1));\n+\tval |= PCS_DIG_CTRL1_USXG_EN;\n+\txpcs_write(dev, MDIO_MMD_PCS, XPCS_PHY_REG(PCS_DIG_CTRL1), val);\n+\n+\tval = xpcs_read(dev, MDIO_MMD_PCS, XPCS_PHY_REG(PCS_KR_CTRL1));\n+\tval = u16_replace_bits(val, 0x0, PCS_KR_CTRL1_USXG_MODE_MASK);\n+\txpcs_write(dev, MDIO_MMD_PCS, XPCS_PHY_REG(PCS_KR_CTRL1), val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL0);\n+\tval = u16_replace_bits(val, 0x21, PMA_MPLLA_CTRL0_MPLLA_MULTIPLIER_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL0, val);\n+\n+\tval = PMA_MPLLA_CTRL3_MPLLA_BANDWIDTH(0xA016);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_MPLLA_CTRL3, val);\n+\n+\tval = PMA_VCO_CAL_LD0_VCO_LD_VAL_0(0x549);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_VCO_CAL_LD0, val);\n+\n+\tval = PMA_VCO_CAL_REF0_VCO_REF_LD_0(0x29);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_VCO_CAL_REF0, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_EQ_CTRL4);\n+\tval |= PMA_RX_EQ_CTRL4_CONT_ADAPT_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_EQ_CTRL4, val);\n+\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_RATE_CTRL, 0x0);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_RATE_CTRL, 0x0);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_TX_GENCTRL2);\n+\tval = u16_replace_bits(val, 0x3, PMA_TX_GENCTRL2_TX0_WIDTH_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_TX_GENCTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2);\n+\tval = u16_replace_bits(val, 0x3, PMA_RX_GENCTRL2_RX0_WIDTH_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2);\n+\tval |= PMA_MPLLA_CTRL2_MPLLA_DIV16P5_CLK_EN;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2);\n+\tval |= PMA_MPLLA_CTRL2_MPLLA_DIV10_CLK_EN;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2);\n+\tval &= ~PMA_MPLLA_CTRL2_MPLLA_DIV8_CLK_EN;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_MPLLA_CTRL2, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL1);\n+\tval |= PMA_TX_GENCTRL1_VBOOST_EN_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL1, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL0);\n+\tval = u16_replace_bits(val, 0x10, PMA_RX_EQ_CTRL0_CTLE_BOOST_0_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL0, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_RX_CDR_CTRL1);\n+\tval |= PMA_RX_CDR_CTRL1_VCO_STEP_CTRL_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_RX_CDR_CTRL1, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_RX_CDR_CTRL1);\n+\tval |= PMA_RX_CDR_CTRL1_VCO_TEMP_COMP_EN_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_RX_CDR_CTRL1, val);\n+\n+\tval = PMA_RX_MISC_CTRL0_RX0_MISC(0x12);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_RX_MISC_CTRL0, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_25G_RX_GENCTRL4);\n+\tval &= ~PMA_RX_GENCTRL4_RX_DFE_BYP_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_RX_GENCTRL4, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_RX_CDR_CTRL1);\n+\tval = u16_replace_bits(val, 0x1, PMA_RX_CDR_CTRL1_VCO_FRQBAND_0_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_RX_CDR_CTRL1, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_25G_RX_IQ_CTRL0);\n+\tval = u16_replace_bits(val, 0x0, PMA_RX_IQ_CTRL0_RX0_DELTA_IQ_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_RX_IQ_CTRL0, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL5);\n+\tval = u16_replace_bits(val, 0x3, PMA_RX_EQ_CTRL5_RX0_ADPT_MODE_MASK);\n+\txpcs_phy_write_pma(dev, PMA_MP_16G_25G_RX_EQ_CTRL5, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL1);\n+\tval &= ~PMA_TX_GENCTRL1_TX_CLK_RDY_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL1, val);\n+\n+\t/* 5 Assert soft reset */\n+\tval = xpcs_read(dev, MDIO_MMD_PCS, XPCS_PHY_REG(PCS_DIG_CTRL1));\n+\tval |= PCS_DIG_CTRL1_VR_RST;\n+\txpcs_write(dev, MDIO_MMD_PCS, XPCS_PHY_REG(PCS_DIG_CTRL1), val);\n+\n+\t/* 6 Poll for SRAM initialization done */\n+\tbegin = get_timer(0);\n+\tdo {\n+\t\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_SRAM);\n+\t\tif (get_timer(begin) > 500) {\n+\t\t\tdev_err(dev, \"Polling timeout, line: %d\\n\", __LINE__);\n+\t\t\tgoto timeout;\n+\t\t}\n+\t\tmdelay(10);\n+\t} while (!(val & PMA_SRAM_INIT_DN));\n+\n+\t/* 7 Assert SRAM external loading done */\n+\t/* Workaround */\n+\t// xpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_SRAM, PMA_SRAM_EXT_LD_DN);\n+\txpcs_phy_write(dev, XPCS_PHY_GLOBAL, XPCS_PHY_REG(GLOBAL_CTRL_EX_0), GLOBAL_CTRL_EX_0_PHY_SRAM_BYPASS);\n+\n+\t/* 8 Poll for vendor-specific soft reset */\n+\tbegin = get_timer(0);\n+\tdo {\n+\t\tval = xpcs_read(dev, MDIO_MMD_PCS, XPCS_PHY_REG(PCS_DIG_CTRL1));\n+\t\tif (get_timer(begin) > 500) {\n+\t\t\tdev_err(dev, \"Polling timeout, line: %d\\n\", __LINE__);\n+\t\t\tgoto timeout;\n+\t\t}\n+\t\tmdelay(10);\n+\t} while (val & PCS_DIG_CTRL1_VR_RST);\n+\n+\t/* 9 Turn receive to P0 state */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL1);\n+\tval &= ~PMA_RX_GENCTRL1_RX_RST_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL1, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_POWER_STATE_CTRL);\n+\tval &= ~PMA_RX_POWER_STATE_CTRL_RX_DISABLE_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_POWER_STATE_CTRL, val);\n+\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_POWER_STATE_CTRL);\n+\tval &= ~PMA_RX_POWER_STATE_CTRL_RX0_PSTATE_MASK;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_POWER_STATE_CTRL, val);\n+\n+\t/* 10 Enable receiver data output from PHY */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL0);\n+\tval |= PMA_RX_GENCTRL0_RX_DT_EN_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_GENCTRL0, val);\n+\n+\t/* 11 Assert request of receive */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2);\n+\tval |= PMA_RX_GENCTRL2_RX_REQ_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2, val);\n+\n+\t/* 11.1 Poll for acknowledge */\n+\tbegin = get_timer(0);\n+\tdo {\n+\t\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_RX_GENCTRL2);\n+\t\tif (get_timer(begin) > 500) {\n+\t\t\tdev_err(dev, \"Polling timeout, line: %d\\n\", __LINE__);\n+\t\t\tgoto timeout;\n+\t\t}\n+\t\tmdelay(10);\n+\t} while (val & PMA_RX_GENCTRL2_RX_REQ_0);\n+\n+\t/* 12 Assert TX0 clock is active and stable */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL1);\n+\tval |= PMA_TX_GENCTRL1_TX_CLK_RDY_0;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_TX_GENCTRL1, val);\n+\n+\t/*\n+\t * 13.1 Configure XPCS to consider Loss-of-Signal indicated by the\n+\t * PHY while evaluating the receive link status\n+\t */\n+\tval = xpcs_read(dev, MDIO_MMD_PCS, XPCS_PHY_REG(PCS_DEBUG_CTRL));\n+\tval |= PCS_DEBUG_CTRL_SUPRESS_LOS_DET;\n+\txpcs_write(dev, MDIO_MMD_PCS, XPCS_PHY_REG(PCS_DEBUG_CTRL), val);\n+\t/*\n+\t * 13.2 Configure XPCS to deassert \"receiver data enable\" on\n+\t * detecting of Loss-of-Signal\n+\t */\n+\tval = xpcs_read(dev, MDIO_MMD_PCS, XPCS_PHY_REG(PCS_DEBUG_CTRL));\n+\tval |= PCS_DEBUG_CTRL_RX_DT_EN_CTL;\n+\txpcs_write(dev, MDIO_MMD_PCS, XPCS_PHY_REG(PCS_DEBUG_CTRL), val);\n+\n+\t/* 14 Poll for DPLL lock status for Lane 0 */\n+\tbegin = get_timer(0);\n+\tdo {\n+\t\tval = xpcs_phy_read_pma(dev, PMA_RX_LSTS);\n+\t\tif (get_timer(begin) > 500) {\n+\t\t\tdev_err(dev, \"Polling timeout, line: %d\\n\", __LINE__);\n+\t\t\tgoto timeout;\n+\t\t}\n+\t\tmdelay(10);\n+\t} while (!(val & PMA_RX_LSTS_RX_VALID_0));\n+\n+\t/* 15 Assert request of receive adaptation */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_EQ_CTRL4);\n+\tval |= PMA_RX_EQ_CTRL4_RX_AD_REQ;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_EQ_CTRL4, val);\n+\n+\t/* 16 Poll for acknowledge */\n+\tbegin = get_timer(0);\n+\tdo {\n+\t\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_MISC_STS);\n+\t\tif (get_timer(begin) > 500) {\n+\t\t\tdev_err(dev, \"Polling timeout, line: %d\\n\", __LINE__);\n+\t\t\tgoto timeout;\n+\t\t}\n+\t\tmdelay(10);\n+\t} while (!(val & PMA_MISC_STS_RX_ADPT_ACK));\n+\n+\t/* 17 Deassert request of receive adaptation */\n+\tval = xpcs_phy_read_pma(dev, PMA_MP_12G_16G_25G_RX_EQ_CTRL4);\n+\tval &= ~PMA_RX_EQ_CTRL4_RX_AD_REQ;\n+\txpcs_phy_write_pma(dev, PMA_MP_12G_16G_25G_RX_EQ_CTRL4, val);\n+\n+\t/* 18 Set the value of Config_Reg to 0 for Clause 37 autonegotiation. */\n+\tval = xpcs_read(dev, MDIO_MMD_VEND2, XPCS_PHY_REG(MII_AN_CTRL));\n+\tval &= ~MII_AN_CTRL_TX_CONFIG;\n+\txpcs_write(dev, MDIO_MMD_VEND2, XPCS_PHY_REG(MII_AN_CTRL), val);\n+\n+\t/* 19 Select XGMII speed */\n+\tval = xpcs_read(dev, MDIO_MMD_VEND2, XPCS_PHY_REG(MII_CTRL));\n+\tval &= ~MII_CTRL_SS5;\n+\tval |= MII_CTRL_SS6 | MII_CTRL_SS13;\n+\txpcs_write(dev, MDIO_MMD_VEND2, XPCS_PHY_REG(MII_CTRL), val);\n+\n+\tval = xpcs_phy_usxgmii_init_seq_2(dev);\n+\tif (val)\n+\t\treturn val;\n+\n+\treturn 0;\n+\n+timeout:\n+\treturn -ETIMEDOUT;\n+}\n+\n+u32 xpcs_phy_get_id(struct udevice *dev)\n+{\n+\tint ret;\n+\tu32 id;\n+\n+\t/* First, search C73 PCS using PCS MMD */\n+\tret = xpcs_phy_read(dev, XPCS_PHY_GLOBAL, XPCS_PHY_REG(IDCODE_HI));\n+\tif (ret < 0)\n+\t\treturn 0xffffffff;\n+\n+\tid = ret << 16;\n+\n+\tret = xpcs_phy_read(dev, XPCS_PHY_GLOBAL, XPCS_PHY_REG(IDCODE_LO));\n+\tif (ret < 0)\n+\t\treturn 0xffffffff;\n+\n+\t/* If Device IDs are not all zeros or all ones,\n+\t * we found C73 AN-type device\n+\t */\n+\tif ((id | ret) && (id | ret) != 0xffffffff)\n+\t\treturn id | ret;\n+\n+\treturn 0xffffffff;\n+}\n","prefixes":["v1","2/2"]}