From nobody Mon Jun 8 19:47:26 2026 Received: from mail-qk1-f182.google.com (mail-qk1-f182.google.com [209.85.222.182]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id A2FE6274B46 for ; Wed, 27 May 2026 00:10:05 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.182 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779840617; cv=none; b=L5wcD56LwhiMRvwwcspsQFma+flsoU4aCwzhsfDPPJhvPsPYO0oJSHIHIMGA5nITeqO3AJW53OK2lZpIRi42kIUd9MGP/QodXAqEOA8yWNM5IX3c63Bvvtl1QtF00vfxmY8udPSGKm6Kh9K7mNyRA9MTegC2RKP0Boa49qAlNio= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779840617; c=relaxed/simple; bh=83HXOB5C+y710z7LBWDFkSqsXErHX9dcdgz6SKoYq+Y=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=XYmbdWPqZVL+GoAL1e+0uxKYbBiBXitGZZRY3GnUSKD9aees3QnexBkivkfsx4+WogIbMYQDidycBmJuv1vIjHqOcx0Ih51CDEHVDLbe3r/qhDCov1dYGaP6T7jMEW2igfg4qODK4ed9q1lANq6andqFd3Lml+O9jd4rVxVY0E4= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=qUJQfWF4; arc=none smtp.client-ip=209.85.222.182 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="qUJQfWF4" Received: by mail-qk1-f182.google.com with SMTP id af79cd13be357-914db83362aso299787185a.1 for ; Tue, 26 May 2026 17:10:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779840602; x=1780445402; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=Zp5j/n0cvOeBIVPinOKHA637ZSRit4YvVz4OGICE4DE=; b=qUJQfWF4B0A1cA47kvzsEVltQIc3CmXeKlkSrazpTzug9PIfCRSFux3xxh4zKIXb7O sQiiHVpwYO8cpEz+ct3+KdVW0k7ikEx0OiWqsAtg56fP+1m5oMIGkOvuOsQ+xHUipKFU l6lTLM1Ah4lzDYSS8PbI6R09uH/CeFYeWIB7iOdqxuQZ1azx7jPv2+whknekA26TEiaO Vo/tA6iT1XP6edI1L+6Mfbv25eB9REbbbhmh4wpIv0oP2Q8DqqvOi6Wjo1qQ4Y2kXZHu n1rDWfmqrv08QfHcvhHx/kdobuxGgKum3ULG6NOEI50iXsMOwwt1FVzr3QxZMMsZOKA1 5EEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779840602; x=1780445402; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=Zp5j/n0cvOeBIVPinOKHA637ZSRit4YvVz4OGICE4DE=; b=na7tGIcZIePKEtaY3PVH1flKf6PnRMYA/VbtmvZ3BMuF5ktgr8XvlG/RLZDKbato/H Ap3Pd//s9Uz/X6dDVET4eRVN12QapCjOHAPmwBbXvaUaibBBATHjpNLlGJROO2rPXRjw 1Z+B2vlQpRsrHzYfYOt4WCYiJRb/1YvLQhg133xY2i6vmK5NFGfffSTu65NiBcSHSZEP uu8ULI/ND05mGjsiJYMUCHuQNvPxW8o7ITKVXCOULKQ55AKjzYMw1xb0t4YUMXJqFfvC vMJw36r+N09V1zF+72h+rQv9C7NFxXS4f2qOGCbKN5RtxyITr5hlteOhl4uIAaFh6Rrn 0/hw== X-Forwarded-Encrypted: i=1; AFNElJ8GsNgL8PZnVdLs+47xFTkpB7Zxk8L/wVoi/Me3INvYtcThZkGHWAQ2YOjU0vYti91LgsETV0enX7tD9Mo=@vger.kernel.org X-Gm-Message-State: AOJu0Yw6Uiu3bMG/RpqKRt5mh/c6lYWDy27c+sqp4HoERc31OnI1eK8v 4kPPdLyqor/MYroJMEkTbFvWk9XOuj1V77AxlizlHAS8DCm1nn2bGASh X-Gm-Gg: Acq92OFqAKaSpgOgZB5Hjnxkg+oKmylzTkju9BpvyVV4kt8FT2uov5K56xYW1Et9tUs jxKAcm3anBDMkqPAipos8Mn0NbtkemwHm/qjwtFTet0fedWAb6jba7FFlNVNRWCUbvOxlT9o3Md ylLP3XzUdyYzh4QHKpt8mmd6V4uTu/mP46g+hg61UmP22TdKAP8+JoiUwzMAaA/LAGVzrb2DFGr QmIxA5ZTQ5/4P0LINLfFrG7alXaG5PSAyuUJlFL6RqgEIg75n7OMn517ZDtEMmGnoFGiM2G0OKu mXuFx76aOAMAzsbTRe8fhSgfxgRBJzC7AxZinjjr2HZt88QSD8gDC8zXEIB21cKU2thVCdDOyG3 QjM3DbruEiTLNTagpZWrHmoxLLqL66iZvrmNC3ntzzkQxtPZIYsWjmwWyunRSJWL5FkXwFXemyN p14gIHLcTs6Hf4MUR9fBL7+N2lR4h0lGsGHHSR9iIw1UMhdt3LhJ/flnR8C0ULUa11jDY= X-Received: by 2002:a05:620a:3186:b0:8ed:6ac5:bac7 with SMTP id af79cd13be357-914b50457aemr2413458385a.10.1779840601568; Tue, 26 May 2026 17:10:01 -0700 (PDT) Received: from PF5YBGDS.localdomain ([163.114.130.4]) by smtp.gmail.com with ESMTPSA id af79cd13be357-914f87fc449sm363803585a.35.2026.05.26.17.10.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 May 2026 17:10:01 -0700 (PDT) From: mike.marciniszyn@gmail.com To: Alexander Duyck , Jakub Kicinski , kernel-team@meta.com, Andrew Lunn , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jiawen Wu , Mengyuan Lou , Heiner Kallweit , Russell King , Mohsin Bashir , Kees Cook , Andrew Lunn Cc: mike.marciniszyn@gmail.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 1/4] net: pcs: xpcs: Expand mdiodev member as an array Date: Tue, 26 May 2026 20:09:55 -0400 Message-ID: <20260527000958.81108-2-mike.marciniszyn@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260527000958.81108-1-mike.marciniszyn@gmail.com> References: <20260527000958.81108-1-mike.marciniszyn@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: "Mike Marciniszyn (Meta)" This allows for support of 50GR2 and 100GR2 by extending the current singleton mdiodev to an array. DW XPCS can support 25GR1 and 50GR1 using just a single group channel. To operate at 50R2 or 100R2 we need both halves of the channel combined into one group channel device. Adjust current use of singleton mdiodev to use the 0th element. Reviewed-by: Alexander Duyck Signed-off-by: Mike Marciniszyn (Meta) --- v3: - new to series - Added DW XPCS details to commit message - change mdiodev to an array in dw_xpcs - adjust singleton use case to use mdiodev[0] drivers/net/pcs/pcs-xpcs-wx.c | 4 ++-- drivers/net/pcs/pcs-xpcs.c | 42 +++++++++++++++++------------------ drivers/net/pcs/pcs-xpcs.h | 5 ++++- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/drivers/net/pcs/pcs-xpcs-wx.c b/drivers/net/pcs/pcs-xpcs-wx.c index fc52f7aa5f59..38c980f974b4 100644 --- a/drivers/net/pcs/pcs-xpcs-wx.c +++ b/drivers/net/pcs/pcs-xpcs-wx.c @@ -123,7 +123,7 @@ static int txgbe_pcs_poll_power_up(struct dw_xpcs *xpcs) 10000, 1000000, false, xpcs, DW_VR_XS_PCS_DIG_STS); if (ret < 0) - dev_err(&xpcs->mdiodev->dev, "xpcs power-up timeout\n"); + dev_err(&xpcs->mdiodev[0]->dev, "xpcs power-up timeout\n"); =20 return ret; } @@ -139,7 +139,7 @@ static int txgbe_pma_init_done(struct dw_xpcs *xpcs) 100000, 10000000, false, xpcs, DW_VR_XS_PCS_DIG_CTRL1); if (ret < 0) - dev_err(&xpcs->mdiodev->dev, "xpcs pma initialization timeout\n"); + dev_err(&xpcs->mdiodev[0]->dev, "xpcs pma initialization timeout\n"); =20 return ret; } diff --git a/drivers/net/pcs/pcs-xpcs.c b/drivers/net/pcs/pcs-xpcs.c index e69fa2f0a0e8..3c11c9552b60 100644 --- a/drivers/net/pcs/pcs-xpcs.c +++ b/drivers/net/pcs/pcs-xpcs.c @@ -211,23 +211,23 @@ static bool __xpcs_linkmode_supported(const struct dw= _xpcs_compat *compat, =20 int xpcs_read(struct dw_xpcs *xpcs, int dev, u32 reg) { - return mdiodev_c45_read(xpcs->mdiodev, dev, reg); + return mdiodev_c45_read(xpcs->mdiodev[0], dev, reg); } =20 int xpcs_write(struct dw_xpcs *xpcs, int dev, u32 reg, u16 val) { - return mdiodev_c45_write(xpcs->mdiodev, dev, reg, val); + return mdiodev_c45_write(xpcs->mdiodev[0], dev, reg, val); } =20 int xpcs_modify(struct dw_xpcs *xpcs, int dev, u32 reg, u16 mask, u16 set) { - return mdiodev_c45_modify(xpcs->mdiodev, dev, reg, mask, set); + return mdiodev_c45_modify(xpcs->mdiodev[0], dev, reg, mask, set); } =20 static int xpcs_modify_changed(struct dw_xpcs *xpcs, int dev, u32 reg, u16 mask, u16 set) { - return mdiodev_c45_modify_changed(xpcs->mdiodev, dev, reg, mask, set); + return mdiodev_c45_modify_changed(xpcs->mdiodev[0], dev, reg, mask, set); } =20 static int xpcs_read_vendor(struct dw_xpcs *xpcs, int dev, u32 reg) @@ -304,7 +304,7 @@ static int xpcs_soft_reset(struct dw_xpcs *xpcs, #define xpcs_warn(__xpcs, __state, __args...) \ ({ \ if ((__state)->link) \ - dev_warn(&(__xpcs)->mdiodev->dev, ##__args); \ + dev_warn(&(__xpcs)->mdiodev[0]->dev, ##__args); \ }) =20 static int xpcs_read_fault_c73(struct dw_xpcs *xpcs, @@ -400,7 +400,7 @@ static void xpcs_link_up_usxgmii(struct dw_xpcs *xpcs, = int speed) return; =20 out: - dev_err(&xpcs->mdiodev->dev, "%s: XPCS access returned %pe\n", + dev_err(&xpcs->mdiodev[0]->dev, "%s: XPCS access returned %pe\n", __func__, ERR_PTR(ret)); } =20 @@ -726,7 +726,7 @@ static void xpcs_pre_config(struct phylink_pcs *pcs, ph= y_interface_t interface) =20 ret =3D xpcs_switch_interface_mode(xpcs, interface); if (ret) - dev_err(&xpcs->mdiodev->dev, "switch interface failed: %pe\n", + dev_err(&xpcs->mdiodev[0]->dev, "switch interface failed: %pe\n", ERR_PTR(ret)); =20 if (!xpcs->need_reset) @@ -734,14 +734,14 @@ static void xpcs_pre_config(struct phylink_pcs *pcs, = phy_interface_t interface) =20 compat =3D xpcs_find_compat(xpcs, interface); if (!compat) { - dev_err(&xpcs->mdiodev->dev, "unsupported interface %s\n", + dev_err(&xpcs->mdiodev[0]->dev, "unsupported interface %s\n", phy_modes(interface)); return; } =20 ret =3D xpcs_soft_reset(xpcs, compat); if (ret) - dev_err(&xpcs->mdiodev->dev, "soft reset failed: %pe\n", + dev_err(&xpcs->mdiodev[0]->dev, "soft reset failed: %pe\n", ERR_PTR(ret)); =20 xpcs->need_reset =3D false; @@ -1189,30 +1189,30 @@ static void xpcs_get_state(struct phylink_pcs *pcs,= unsigned int neg_mode, =20 switch (compat->an_mode) { case DW_10GBASER: - phylink_mii_c45_pcs_get_state(xpcs->mdiodev, state); + phylink_mii_c45_pcs_get_state(xpcs->mdiodev[0], state); break; case DW_AN_C73: ret =3D xpcs_get_state_c73(xpcs, state, compat); if (ret) - dev_err(&xpcs->mdiodev->dev, "%s returned %pe\n", + dev_err(&xpcs->mdiodev[0]->dev, "%s returned %pe\n", "xpcs_get_state_c73", ERR_PTR(ret)); break; case DW_AN_C37_SGMII: ret =3D xpcs_get_state_c37_sgmii(xpcs, state); if (ret) - dev_err(&xpcs->mdiodev->dev, "%s returned %pe\n", + dev_err(&xpcs->mdiodev[0]->dev, "%s returned %pe\n", "xpcs_get_state_c37_sgmii", ERR_PTR(ret)); break; case DW_AN_C37_1000BASEX: ret =3D xpcs_get_state_c37_1000basex(xpcs, neg_mode, state); if (ret) - dev_err(&xpcs->mdiodev->dev, "%s returned %pe\n", + dev_err(&xpcs->mdiodev[0]->dev, "%s returned %pe\n", "xpcs_get_state_c37_1000basex", ERR_PTR(ret)); break; case DW_2500BASEX: ret =3D xpcs_get_state_2500basex(xpcs, state); if (ret) - dev_err(&xpcs->mdiodev->dev, "%s returned %pe\n", + dev_err(&xpcs->mdiodev[0]->dev, "%s returned %pe\n", "xpcs_get_state_2500basex", ERR_PTR(ret)); break; default: @@ -1232,14 +1232,14 @@ static void xpcs_link_up_sgmii_1000basex(struct dw_= xpcs *xpcs, =20 if (interface =3D=3D PHY_INTERFACE_MODE_1000BASEX) { if (speed !=3D SPEED_1000) { - dev_err(&xpcs->mdiodev->dev, + dev_err(&xpcs->mdiodev[0]->dev, "%s: speed %dMbps not supported\n", __func__, speed); return; } =20 if (duplex !=3D DUPLEX_FULL) - dev_err(&xpcs->mdiodev->dev, + dev_err(&xpcs->mdiodev[0]->dev, "%s: half duplex not supported\n", __func__); } @@ -1247,7 +1247,7 @@ static void xpcs_link_up_sgmii_1000basex(struct dw_xp= cs *xpcs, ret =3D xpcs_write(xpcs, MDIO_MMD_VEND2, MII_BMCR, mii_bmcr_encode_fixed(speed, duplex)); if (ret) - dev_err(&xpcs->mdiodev->dev, "%s: xpcs_write returned %pe\n", + dev_err(&xpcs->mdiodev[0]->dev, "%s: xpcs_write returned %pe\n", __func__, ERR_PTR(ret)); } =20 @@ -1533,7 +1533,7 @@ static struct dw_xpcs *xpcs_create_data(struct mdio_d= evice *mdiodev) return ERR_PTR(-ENOMEM); =20 mdio_device_get(mdiodev); - xpcs->mdiodev =3D mdiodev; + xpcs->mdiodev[0] =3D mdiodev; xpcs->pcs.ops =3D &xpcs_phylink_ops; xpcs->pcs.poll =3D true; =20 @@ -1542,7 +1542,7 @@ static struct dw_xpcs *xpcs_create_data(struct mdio_d= evice *mdiodev) =20 static void xpcs_free_data(struct dw_xpcs *xpcs) { - mdio_device_put(xpcs->mdiodev); + mdio_device_put(xpcs->mdiodev[0]); kfree(xpcs); } =20 @@ -1552,7 +1552,7 @@ static int xpcs_init_clks(struct dw_xpcs *xpcs) [DW_XPCS_CORE_CLK] =3D "core", [DW_XPCS_PAD_CLK] =3D "pad", }; - struct device *dev =3D &xpcs->mdiodev->dev; + struct device *dev =3D &xpcs->mdiodev[0]->dev; int ret, i; =20 for (i =3D 0; i < DW_XPCS_NUM_CLKS; ++i) @@ -1580,7 +1580,7 @@ static int xpcs_init_id(struct dw_xpcs *xpcs) { const struct dw_xpcs_info *info; =20 - info =3D dev_get_platdata(&xpcs->mdiodev->dev); + info =3D dev_get_platdata(&xpcs->mdiodev[0]->dev); if (!info) { xpcs->info.pcs =3D DW_XPCS_ID_NATIVE; xpcs->info.pma =3D DW_XPCS_PMA_ID_NATIVE; diff --git a/drivers/net/pcs/pcs-xpcs.h b/drivers/net/pcs/pcs-xpcs.h index 929fa238445e..5c804cfd47d3 100644 --- a/drivers/net/pcs/pcs-xpcs.h +++ b/drivers/net/pcs/pcs-xpcs.h @@ -105,10 +105,13 @@ enum dw_xpcs_clock { DW_XPCS_NUM_CLKS, }; =20 +/* 2 channels per group DW PCS devices */ +#define DW_XPCS_MAX_CHANNELS 2 + struct dw_xpcs { struct dw_xpcs_info info; const struct dw_xpcs_desc *desc; - struct mdio_device *mdiodev; + struct mdio_device *mdiodev[DW_XPCS_MAX_CHANNELS]; struct clk_bulk_data clks[DW_XPCS_NUM_CLKS]; struct phylink_pcs pcs; phy_interface_t interface; --=20 2.43.0 From nobody Mon Jun 8 19:47:26 2026 Received: from mail-qk1-f170.google.com (mail-qk1-f170.google.com [209.85.222.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 7CCD328E0F for ; Wed, 27 May 2026 00:10:06 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.170 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779840615; cv=none; b=OEdEXVltEM2qfF2JnQkatlTg61c5FJCvDMojSsSzyYD8H4KIGsXfk7MQBU9QDvqRqcMI+KR0VyZwo+fG81VZid/eptTRvsU0KXY7sauA9KqeLMxCzN0eHSIbsVsBJycQNYbsqyztO1RUTM39NRlxucB1QCXAvBUmFSfnCdWI9WM= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779840615; c=relaxed/simple; bh=kkexjfuDEOhCFUCRgLGTgSVk9KgDIyMcTiVdHsCmqCU=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=InyhVZBZQY9sCKJMpAiNw8op5oQQyAoHl7SapAux7BOIFWCo8sQv8J9iHiBBS9AuaM0+HjIvLerrRLe/R52OZcPgMvS+K+5paRb0RWNhnDGTuxe4dXzTOSnomDryuG+39dxHoyURBavSODkcvvOlF/iYhhkeGQ5oWvXMIzdd+DU= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=Ys8ZyJbS; arc=none smtp.client-ip=209.85.222.170 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="Ys8ZyJbS" Received: by mail-qk1-f170.google.com with SMTP id af79cd13be357-90caad2e944so1136406785a.2 for ; Tue, 26 May 2026 17:10:06 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779840603; x=1780445403; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=MIiexEOWDq/OlniiyY/LCqW6TR00GCk+g5J6MGZnhD8=; b=Ys8ZyJbSEaUGil4Pc7VdqbUG0D1vPABCRrEM6/pU74CDKtGDjmfvTuT0J9S9T6sYu5 gc7MKa+HiihpY/ddwdmu5bHJifIqeSdrlEM5+zIUyYDasKh226injhM2KQFbTNbMGGWv ETH4FkICWFNgNCYjdbdGsK1jyOZEFsgqqKI4a+j3d0UUVSs/zG/xHJETqsM4HpEM80WB AJY7e03ABdJzkcu0I/lUfQaIYoC7W+JhYHSNfZtW2dG4SjATwE8zOUGrgfzvs4nZaU+/ zOkvroMRlbbOxoEsaqI0IXKmEoJyCQ0zNFZzWCUHT3x6/VU0AC/iZlQ6eAOsQIp6btTh 38AA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779840603; x=1780445403; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=MIiexEOWDq/OlniiyY/LCqW6TR00GCk+g5J6MGZnhD8=; b=Zucb71fBCsvq3/h/V58GO6Jb00MlewJawK73zxXU5P2T7mkjz0vNNjGFew4BTVEQZI +EgaLCarClgaWCLP1xSExf9tH47pYhCZK+Q221ce99jgV51I8dfH3eRkWand/ayRYt4D u8yXfhYVYys/XxJfJLoyQeqMcQcQDw+xQul3TDS2KrOyM8BT1tyD8ABXfwiXotsL3cGc M2QjOjvkzELGobOfUlkyhLZsSVWfPR8KK0agrA9y39N0sg3ovwo8HnPtDRz7b+4vSC1P wi5L2W5EogbYd6eNTf0OnaOHnKvxeEUFAPmwO3jSS8dYRn999tAXSi81UAEfUaptBHrc uxIw== X-Forwarded-Encrypted: i=1; AFNElJ/UOtZjoghoXnjJsxwrw/8mIFgzxaePMCcGzMF8Sl2uvt8+C4Dc/nq1mQNRJKeupbtz1pgiUU82axnMU4E=@vger.kernel.org X-Gm-Message-State: AOJu0YyLaFOEqUq/xDIySUKLz/2vLRtSmbtvquGDQFgllUy8AYytJriu EiTUGLExTsMJoiz2Lo2a5B99RNT7eTIWjlpnKTYyyxUGh0My4W1f0HZo X-Gm-Gg: Acq92OFwSoBwoHOE1unAhQks2vjGaSAo6Au2MF7JRZisFFUzuam2mxBV0gjKvItwLbs /dmZIIEKO0AdoKdIj+HKgrURLTCvVLdWg9LbvQLeURiENtl/IX4QqsVoQknETHQLdy6sbOu/oqk SE/20R+vjvH+I/tiRvPNRy9w1p4/d8WMIvoO6BJgiYWp/zLodcbalTKyaMG+NPBZFmFiUx5yP5/ Pu73ZaoQVqwGEfw1EDtcttb19FTS+gHtW0LZFklVzpy2JY1MhiD5iUAnd4Ml+63YAW8KB4kmOJe wEENAA6TWIIqzfN+5bpvvNaw02Guo4C6GJob5f/2k9uFC/OV6NY6MTwVVg2YIIQMjI56x/H0rSw tVVM2oG8T2KaXqcsT+uwtzC6aEKEe28/TDLOVTWKdbEBv/TjYuDjpVszzM1dF7Il3K3nSPggJo4 LsaZ8SJEG1+XNd9g+SMRXllG6oxig4k2AFe+hcxdT4/VCD7DmBtLo2Tg89VY9JeQ4u5M1iAKNlQ 7teNA== X-Received: by 2002:a05:620a:2242:10b0:914:babf:9f59 with SMTP id af79cd13be357-914babfc9a7mr1925958285a.34.1779840603239; Tue, 26 May 2026 17:10:03 -0700 (PDT) Received: from PF5YBGDS.localdomain ([163.114.130.4]) by smtp.gmail.com with ESMTPSA id af79cd13be357-914f87fc449sm363803585a.35.2026.05.26.17.10.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 May 2026 17:10:02 -0700 (PDT) From: mike.marciniszyn@gmail.com To: Alexander Duyck , Jakub Kicinski , kernel-team@meta.com, Andrew Lunn , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jiawen Wu , Mengyuan Lou , Heiner Kallweit , Russell King , Mohsin Bashir , Kees Cook , Andrew Lunn Cc: mike.marciniszyn@gmail.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 2/4] net: pcs: xpcs: Allow for multiple addr in creation Date: Tue, 26 May 2026 20:09:56 -0400 Message-ID: <20260527000958.81108-3-mike.marciniszyn@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260527000958.81108-1-mike.marciniszyn@gmail.com> References: <20260527000958.81108-1-mike.marciniszyn@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: "Mike Marciniszyn (Meta)" The DW channel 10g-100g IP builds the PCS out of multiple addr mdio addresses. Add xpcs_create_mdiodevs() and xpcs_create_pcs_mdiodevs calls so that a driver using the above part can tell xpcs the addr values in one call. xpcs_create_data(), xpcs_create(), and xpcs_free_data() are extended to accept a variable number of mdio devices. Existing singleton interfaces are re-cast as a having an array pointing to a single mdio device. Reviewed-by: Alexander Duyck Signed-off-by: Mike Marciniszyn (Meta) --- v3: - New to series - use new call to xpcs_create_pcs_mdiodevs() in fbnic - Add xpcs_mdev_write_ch() - Add doc comments for xpcs_create_mdiodevs() v2.2: - New to series .../net/ethernet/meta/fbnic/fbnic_phylink.c | 4 +- drivers/net/pcs/pcs-xpcs.c | 103 +++++++++++++++--- drivers/net/pcs/pcs-xpcs.h | 1 + include/linux/pcs/pcs-xpcs.h | 5 +- 4 files changed, 93 insertions(+), 20 deletions(-) diff --git a/drivers/net/ethernet/meta/fbnic/fbnic_phylink.c b/drivers/net/= ethernet/meta/fbnic/fbnic_phylink.c index 09c5225111be..88fc78d55c7a 100644 --- a/drivers/net/ethernet/meta/fbnic/fbnic_phylink.c +++ b/drivers/net/ethernet/meta/fbnic/fbnic_phylink.c @@ -200,9 +200,11 @@ int fbnic_phylink_create(struct net_device *netdev) struct fbnic_dev *fbd =3D fbn->fbd; struct phylink_pcs *pcs; struct phylink *phylink; + /* See fbnic_mdio.c addr usage */ + int addrs[] =3D { 0, 1 }; int err; =20 - pcs =3D xpcs_create_pcs_mdiodev(fbd->mdio_bus, 0); + pcs =3D xpcs_create_pcs_mdiodevs(fbd->mdio_bus, addrs, ARRAY_SIZE(addrs)); if (IS_ERR(pcs)) { err =3D PTR_ERR(pcs); dev_err(fbd->dev, "Failed to create PCS device: %d\n", err); diff --git a/drivers/net/pcs/pcs-xpcs.c b/drivers/net/pcs/pcs-xpcs.c index 3c11c9552b60..d59ba99c3764 100644 --- a/drivers/net/pcs/pcs-xpcs.c +++ b/drivers/net/pcs/pcs-xpcs.c @@ -214,9 +214,15 @@ int xpcs_read(struct dw_xpcs *xpcs, int dev, u32 reg) return mdiodev_c45_read(xpcs->mdiodev[0], dev, reg); } =20 +static int +xpcs_mdev_write_ch(struct dw_xpcs *xpcs, int ch, int dev, u32 reg, u16 val) +{ + return mdiodev_c45_write(xpcs->mdiodev[ch], dev, reg, val); +} + int xpcs_write(struct dw_xpcs *xpcs, int dev, u32 reg, u16 val) { - return mdiodev_c45_write(xpcs->mdiodev[0], dev, reg, val); + return xpcs_mdev_write_ch(xpcs, 0, dev, reg, val); } =20 int xpcs_modify(struct dw_xpcs *xpcs, int dev, u32 reg, u16 mask, u16 set) @@ -1524,16 +1530,21 @@ static int xpcs_identify(struct dw_xpcs *xpcs) return -ENODEV; } =20 -static struct dw_xpcs *xpcs_create_data(struct mdio_device *mdiodev) +static struct dw_xpcs * +xpcs_create_data(struct mdio_device **mdiodev, int channels) { struct dw_xpcs *xpcs; + int i; =20 xpcs =3D kzalloc_obj(*xpcs); if (!xpcs) return ERR_PTR(-ENOMEM); =20 - mdio_device_get(mdiodev); - xpcs->mdiodev[0] =3D mdiodev; + xpcs->channels =3D channels; + for (i =3D 0; i < channels; i++) { + mdio_device_get(mdiodev[i]); + xpcs->mdiodev[i] =3D mdiodev[i]; + } xpcs->pcs.ops =3D &xpcs_phylink_ops; xpcs->pcs.poll =3D true; =20 @@ -1542,7 +1553,10 @@ static struct dw_xpcs *xpcs_create_data(struct mdio_= device *mdiodev) =20 static void xpcs_free_data(struct dw_xpcs *xpcs) { - mdio_device_put(xpcs->mdiodev[0]); + int i; + + for (i =3D 0; i < xpcs->channels; i++) + mdio_device_put(xpcs->mdiodev[i]); kfree(xpcs); } =20 @@ -1591,12 +1605,12 @@ static int xpcs_init_id(struct dw_xpcs *xpcs) return xpcs_identify(xpcs); } =20 -static struct dw_xpcs *xpcs_create(struct mdio_device *mdiodev) +static struct dw_xpcs *xpcs_create(struct mdio_device **mdiodev, int chann= els) { struct dw_xpcs *xpcs; int ret; =20 - xpcs =3D xpcs_create_data(mdiodev); + xpcs =3D xpcs_create_data(mdiodev, channels); if (IS_ERR(xpcs)) return xpcs; =20 @@ -1628,24 +1642,34 @@ static struct dw_xpcs *xpcs_create(struct mdio_devi= ce *mdiodev) } =20 /** - * xpcs_create_mdiodev() - create a DW xPCS instance with the MDIO @addr + * xpcs_create_mdiodevs() - create a DW xPCS instance with multiple @addrs * @bus: pointer to the MDIO-bus descriptor for the device to be looked at - * @addr: device MDIO-bus ID + * @addrs: an array of int + * @channels: the number of addrs items or channels * - * Return: a pointer to the DW XPCS handle if successful, otherwise -ENODE= V if + * Return: a pointer to the DW XPCS handle if successful, -EINVAL if the + * addrs is NULL or channels is out of bounds, otherwise -ENODEV if * the PCS device couldn't be found on the bus and other negative errno re= lated * to the data allocation and MDIO-bus communications. */ -struct dw_xpcs *xpcs_create_mdiodev(struct mii_bus *bus, int addr) +struct dw_xpcs * +xpcs_create_mdiodevs(struct mii_bus *bus, const int *addrs, int channels) { - struct mdio_device *mdiodev; + struct mdio_device *mdiodev[DW_XPCS_MAX_CHANNELS], *rval; struct dw_xpcs *xpcs; + int i; + + if (!addrs || channels <=3D 0 || channels > DW_XPCS_MAX_CHANNELS) + return ERR_PTR(-EINVAL); =20 - mdiodev =3D mdio_device_create(bus, addr); - if (IS_ERR(mdiodev)) - return ERR_CAST(mdiodev); + for (i =3D 0; i < channels; i++) { + rval =3D mdio_device_create(bus, addrs[i]); + if (IS_ERR(rval)) + goto out_nomem; + mdiodev[i] =3D rval; + } =20 - xpcs =3D xpcs_create(mdiodev); + xpcs =3D xpcs_create(mdiodev, channels); =20 /* xpcs_create() has taken a refcount on the mdiodev if it was * successful. If xpcs_create() fails, this will free the mdio @@ -1653,9 +1677,52 @@ struct dw_xpcs *xpcs_create_mdiodev(struct mii_bus *= bus, int addr) * anymore, and putting it here will allow mdio_device_put() in * xpcs_destroy() to automatically free the mdio device. */ - mdio_device_put(mdiodev); + for (i =3D 0; i < channels; i++) + mdio_device_put(mdiodev[i]); =20 return xpcs; +out_nomem: + while (i--) + mdio_device_free(mdiodev[i]); + return ERR_CAST(rval); +} +EXPORT_SYMBOL_GPL(xpcs_create_mdiodevs); + +/** + * xpcs_create_pcs_mdiodevs() - create a DW xPCS instance with multiple @a= ddrs + * @bus: pointer to the MDIO-bus descriptor for the device to be looked at + * @addrs: an array of int + * @channels: the number of addrs items or channels + * + * Return: a pointer to the DW XPCS handle if successful, otherwise -ENODE= V if + * the PCS device couldn't be found on the bus and other negative errno re= lated + * to the data allocation and MDIO-bus communications. + */ +struct phylink_pcs * +xpcs_create_pcs_mdiodevs(struct mii_bus *bus, const int *addrs, int channe= ls) +{ + struct dw_xpcs *xpcs; + + xpcs =3D xpcs_create_mdiodevs(bus, addrs, channels); + if (IS_ERR(xpcs)) + return ERR_CAST(xpcs); + + return &xpcs->pcs; +} +EXPORT_SYMBOL_GPL(xpcs_create_pcs_mdiodevs); + +/** + * xpcs_create_mdiodev() - create a DW xPCS instance with the MDIO @addr + * @bus: pointer to the MDIO-bus descriptor for the device to be looked at + * @addr: device MDIO-bus ID + * + * Return: a pointer to the DW XPCS handle if successful, otherwise -ENODE= V if + * the PCS device couldn't be found on the bus and other negative errno re= lated + * to the data allocation and MDIO-bus communications. + */ +struct dw_xpcs *xpcs_create_mdiodev(struct mii_bus *bus, int addr) +{ + return xpcs_create_mdiodevs(bus, &addr, 1); } EXPORT_SYMBOL_GPL(xpcs_create_mdiodev); =20 @@ -1693,7 +1760,7 @@ struct dw_xpcs *xpcs_create_fwnode(struct fwnode_hand= le *fwnode) if (!mdiodev) return ERR_PTR(-EPROBE_DEFER); =20 - xpcs =3D xpcs_create(mdiodev); + xpcs =3D xpcs_create(&mdiodev, 1); =20 /* xpcs_create() has taken a refcount on the mdiodev if it was * successful. If xpcs_create() fails, this will free the mdio diff --git a/drivers/net/pcs/pcs-xpcs.h b/drivers/net/pcs/pcs-xpcs.h index 5c804cfd47d3..36f4906e689a 100644 --- a/drivers/net/pcs/pcs-xpcs.h +++ b/drivers/net/pcs/pcs-xpcs.h @@ -114,6 +114,7 @@ struct dw_xpcs { struct mdio_device *mdiodev[DW_XPCS_MAX_CHANNELS]; struct clk_bulk_data clks[DW_XPCS_NUM_CLKS]; struct phylink_pcs pcs; + int channels; phy_interface_t interface; bool need_reset; u8 eee_mult_fact; diff --git a/include/linux/pcs/pcs-xpcs.h b/include/linux/pcs/pcs-xpcs.h index 36073f7b6bb4..6afa8a2aac69 100644 --- a/include/linux/pcs/pcs-xpcs.h +++ b/include/linux/pcs/pcs-xpcs.h @@ -53,10 +53,13 @@ struct dw_xpcs; struct phylink_pcs *xpcs_to_phylink_pcs(struct dw_xpcs *xpcs); int xpcs_get_an_mode(struct dw_xpcs *xpcs, phy_interface_t interface); void xpcs_config_eee_mult_fact(struct dw_xpcs *xpcs, u8 mult_fact); +struct dw_xpcs * +xpcs_create_mdiodevs(struct mii_bus *bus, const int *addrs, int channels); struct dw_xpcs *xpcs_create_mdiodev(struct mii_bus *bus, int addr); struct dw_xpcs *xpcs_create_fwnode(struct fwnode_handle *fwnode); void xpcs_destroy(struct dw_xpcs *xpcs); - +struct phylink_pcs * +xpcs_create_pcs_mdiodevs(struct mii_bus *bus, const int *addrs, int channe= ls); struct phylink_pcs *xpcs_create_pcs_mdiodev(struct mii_bus *bus, int addr); void xpcs_destroy_pcs(struct phylink_pcs *pcs); =20 --=20 2.43.0 From nobody Mon Jun 8 19:47:26 2026 Received: from mail-qk1-f172.google.com (mail-qk1-f172.google.com [209.85.222.172]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id BA9291DC9B5 for ; Wed, 27 May 2026 00:10:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.222.172 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779840616; cv=none; b=N9l4ptlzX94BuTdSzLKzCdxMwJOZAtjjJ9nzTPJi+QeVYQe4WZ62TfQT8RJd3Yt3tx8vfn1DB1MwgQOGRT3gjtQopwR2y/7e+EBAUXbo9gO6/SU4iek9CJ2y5xORYt+FrBCh4G/VGzfk1Qt0g3AYizMyzFWQuUQG2VYLyx0riGA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779840616; c=relaxed/simple; bh=OHjY6IJMkBTBx1a6cUhijjtCHTmYFGDLUGk/LCnMowE=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=macLwyHN5KCIQc86D6mhRogAbqm2XELnZE/UjQEqgBDMWgBJF51TPSOeiSsmRTNumF8VAIRUGcu5QzoZx8pJoxihptr+bBLG8pMKt+MmE1vtHBz6JZxoTnvDtIIsY9unTp6LO5iq9+P8uLImn//Aqh8ymSCzPfX2H3jMahqGoYI= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=JRSOg6Jv; arc=none smtp.client-ip=209.85.222.172 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="JRSOg6Jv" Received: by mail-qk1-f172.google.com with SMTP id af79cd13be357-9102e90bcbeso1150273285a.1 for ; Tue, 26 May 2026 17:10:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779840604; x=1780445404; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=3Z0yd66ZMiBeZhMfIx+Z804H0QcrMevImtwN2M1WuAI=; b=JRSOg6JvAaYMF6wweTQu4TFrRma38i5Yt4OPHXg7Bp+6es+i0JigdSpas/mn+JftNC YQADm6HNgd4CUrtAo8qT1TJmBdIEKc1+YFg/ALrAqcKRJag6uIR4wgH19+VA+/9/dghw ahdmmsirkYghkLgKaSbXhecvvx88S3cct0pu/RVAQExjrg3nYpsebS9U/2r7eZbKk36e hRSILB3Io0SpVl8kelAGqSydpj/GJchujDRM43kffS3w50ysPCHwLzmSs1sO5u8e2h+1 dix08za8gUEjikoqXryU1DGWB2PpuOpY179NSgCX7yMS8LYpMHzsHmndAcBQjyXwe2Iv K9Cw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779840604; x=1780445404; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=3Z0yd66ZMiBeZhMfIx+Z804H0QcrMevImtwN2M1WuAI=; b=eVR8aWaLciq3JOKMRdOzd9OzT0Zf9bH4ir0pIZ4BZSb7e17URDpDAo/21e9KtCw/0G BbOscXz8u5hOZcIkMgTgZxNgXv5MhMqdR7PsnYaopB2fn9pyDxIII5NMYjLqtqh9JkWY XgLI0oBeh3o0kbEyfNvOKKoLamyaqHepAap9WDyfGEtUz/JZI+zpht7+pf0a/K1lJK9L 1azK4/OPeJR7Zy7hVOLtV4JXFQ2hPkBQhE1WgPROVoX3H4grJ1VaA92zeZNjLITCJ1H+ XPKltmD9CcLkg5Xvucaw/G05t6BFHYGjtpVjjXp73beHZ+JsrTWBcFi08Ret/dCNnmPa PLLg== X-Forwarded-Encrypted: i=1; AFNElJ+EnRk/4uJmTGgP5fcVTBrS5TCev8PltqguasXuaavbsrhu4eIFiN+rihVzAn4saLqVt/suH0kmDB4KRfM=@vger.kernel.org X-Gm-Message-State: AOJu0YwV6DvsAa9J6tDtSL5dUXM9nvhWCtIhJa9ZQmgIso9CbhWprm6y tR6MY0EPJK25PS8EvCjK0rftMNwUAeNucn0+Oob/ruVTkhutBub/f3iC X-Gm-Gg: Acq92OG6ti9BbFkGzKDrSpp7uBd+aUcYVnXuRknz8hUsO98UblomzHkypnBcQjHDw+U K/rbnSyVK8iJPvp2cEyK3HPIVU9KtQ52DkOS2aML0PkZsV28/n3RWawnz8nLXnN39gUmaTgKLf0 MEJeX3+Z6njFKEyDNXSLQNMGBiMWMWaRsowMXE4UAr9BnVHXHAnAZBYvnvsZVrLnTYTzW/bupKG WYrBSQzX437yjfc+MHv6+Ewdmb4p1FI1Z/LhxLWXhRKU8CrQbgrS7gLD2ioS9rmTPeoaHDcBJIa 6G5j+4fHNVAfnaPAR+wt8LFtS35RQI6x7qFk2Sq2XguWYblRakU2ZCUTwRpyCE8EWYU4D7KmYez BmKMgufabm/LThsdESskA7bsYJHJUNTi66BSK5LH6/nhKpxh3DLCbc1rjbe9NbPRD7rpuIrkq3M kcp2aI7/Zmq3zpNzRKUXZ8hbdhTGyGsA+8rtStkKVjg+R2m2nFCFpyVqah X-Received: by 2002:a05:620a:1b81:b0:914:aa0d:aa87 with SMTP id af79cd13be357-914b49347edmr3214660185a.23.1779840604173; Tue, 26 May 2026 17:10:04 -0700 (PDT) Received: from PF5YBGDS.localdomain ([163.114.130.4]) by smtp.gmail.com with ESMTPSA id af79cd13be357-914f87fc449sm363803585a.35.2026.05.26.17.10.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 May 2026 17:10:03 -0700 (PDT) From: mike.marciniszyn@gmail.com To: Alexander Duyck , Jakub Kicinski , kernel-team@meta.com, Andrew Lunn , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jiawen Wu , Mengyuan Lou , Heiner Kallweit , Russell King , Mohsin Bashir , Kees Cook , Andrew Lunn Cc: mike.marciniszyn@gmail.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 3/4] net: pcs: xpcs: Add hooks for xpcs configuration of rsfec Date: Tue, 26 May 2026 20:09:57 -0400 Message-ID: <20260527000958.81108-4-mike.marciniszyn@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260527000958.81108-1-mike.marciniszyn@gmail.com> References: <20260527000958.81108-1-mike.marciniszyn@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: "Mike Marciniszyn (Meta)" The DW PCS IP data sheet calls out the need to populate these vendor registers when operating at speeds above 10Gbps. This change enables the correct FEC settings to enable RS-FEC encoding on the link which is the standard used for most links at these higher speeds. Reviewed-by: Alexander Duyck Signed-off-by: Mike Marciniszyn (Meta) --- v3: - lanes -> channels - Added 50gbaser2 that was missing - remove auto probe for addr 0/1 - call xpcs_mdev_write_ch() - reformat building devs1 mask in xpcs_get_pma_mmd() v2: https://lore.kernel.org/netdev/20260511182604.1338-2-mike.marciniszyn@g= mail.com/ - Allow mdiobus probing for addr 0 and addr 1 - Add xpcs_find* helpers based on phy_find* to avoid hardcoded addresses - Remove xpcs_bus write and use mdiodev_c45_write instead - Address comment on use of MDIO_PMA_RSFEC_CTRL v1: https://lore.kernel.org/all/20260506190904.4029-2-mike.marciniszyn@gmai= l.com/ drivers/net/pcs/pcs-xpcs.c | 88 ++++++++++++++++++++++++++++++++++++++ drivers/net/pcs/pcs-xpcs.h | 6 +++ include/uapi/linux/mdio.h | 3 ++ 3 files changed, 97 insertions(+) diff --git a/drivers/net/pcs/pcs-xpcs.c b/drivers/net/pcs/pcs-xpcs.c index d59ba99c3764..342d1cc2adbc 100644 --- a/drivers/net/pcs/pcs-xpcs.c +++ b/drivers/net/pcs/pcs-xpcs.c @@ -1408,6 +1408,90 @@ static int xpcs_read_ids(struct dw_xpcs *xpcs) return 0; } +static int xpcs_get_pma_mmd(struct dw_xpcs *xpcs) +{ + int devs1, b; + + devs1 =3D xpcs_read(xpcs, MDIO_MMD_PMAPMD, MDIO_DEVS1); + if (devs1 < 0) + return devs1; + + /* Locate the PMA closest to the PCS as this should be the one provided + * with the DW IP. This is identified by being the PMA with the + * highest MMD device address. + */ + devs1 &=3D MDIO_DEVS_SEP_PMA1 | MDIO_DEVS_SEP_PMA2 | + MDIO_DEVS_SEP_PMA3 | MDIO_DEVS_SEP_PMA4 | + MDIO_DEVS_PMAPMD; + b =3D fls(devs1); + if (b) + return b - 1; + + return -ENODEV; +} + +struct pma_pcs_values { + int channels; + u16 rsfec_ctrl; +}; + +static int +xpcs_config_rsfec_pma(struct dw_xpcs *xpcs, const struct pma_pcs_values *v) +{ + int ret =3D 0, i, pma_mmd; + + pma_mmd =3D xpcs_get_pma_mmd(xpcs); + if (pma_mmd < 1) + return pma_mmd; + + for (i =3D 0; ret >=3D 0 && i < v->channels; i++) { + ret =3D xpcs_mdev_write_ch(xpcs, i, pma_mmd, + MDIO_PMA_RSFEC_CTRL, v->rsfec_ctrl); + } + + return ret; +} + +static int xpcs_25gbaser_pma_config(struct dw_xpcs *xpcs) +{ + const struct pma_pcs_values v =3D { + .rsfec_ctrl =3D 0, + .channels =3D 1, + }; + + return xpcs_config_rsfec_pma(xpcs, &v); +} + +static int xpcs_50gbaser_pma_config(struct dw_xpcs *xpcs) +{ + const struct pma_pcs_values v =3D { + .rsfec_ctrl =3D DW_VR_RSFEC_CTRL_TC_PAD_ALTER, + .channels =3D 1, + }; + + return xpcs_config_rsfec_pma(xpcs, &v); +} + +static int xpcs_50gbaser2_pma_config(struct dw_xpcs *xpcs) +{ + const struct pma_pcs_values v =3D { + .rsfec_ctrl =3D DW_VR_RSFEC_CTRL_TC_PAD_ALTER, + .channels =3D 2, + }; + + return xpcs_config_rsfec_pma(xpcs, &v); +} + +static int xpcs_100gbasep_pma_config(struct dw_xpcs *xpcs) +{ + const struct pma_pcs_values v =3D { + .rsfec_ctrl =3D MDIO_PMA_RSFEC_CTRL_4LANE_PMD, + .channels =3D 2, + }; + + return xpcs_config_rsfec_pma(xpcs, &v); +} + static const struct dw_xpcs_compat synopsys_xpcs_compat[] =3D { { .interface =3D PHY_INTERFACE_MODE_USXGMII, @@ -1421,6 +1505,7 @@ static const struct dw_xpcs_compat synopsys_xpcs_comp= at[] =3D { .interface =3D PHY_INTERFACE_MODE_25GBASER, .supported =3D xpcs_25gbaser_features, .an_mode =3D DW_AN_C73, + .pma_config =3D xpcs_25gbaser_pma_config, }, { .interface =3D PHY_INTERFACE_MODE_XLGMII, .supported =3D xpcs_xlgmii_features, @@ -1429,14 +1514,17 @@ static const struct dw_xpcs_compat synopsys_xpcs_co= mpat[] =3D { .interface =3D PHY_INTERFACE_MODE_50GBASER, .supported =3D xpcs_50gbaser_features, .an_mode =3D DW_AN_C73, + .pma_config =3D xpcs_50gbaser_pma_config, }, { .interface =3D PHY_INTERFACE_MODE_LAUI, .supported =3D xpcs_50gbaser2_features, .an_mode =3D DW_AN_C73, + .pma_config =3D xpcs_50gbaser2_pma_config, }, { .interface =3D PHY_INTERFACE_MODE_100GBASEP, .supported =3D xpcs_100gbasep_features, .an_mode =3D DW_AN_C73, + .pma_config =3D xpcs_100gbasep_pma_config, }, { .interface =3D PHY_INTERFACE_MODE_10GBASER, .supported =3D xpcs_10gbaser_features, diff --git a/drivers/net/pcs/pcs-xpcs.h b/drivers/net/pcs/pcs-xpcs.h index 36f4906e689a..ab47d6dd050c 100644 --- a/drivers/net/pcs/pcs-xpcs.h +++ b/drivers/net/pcs/pcs-xpcs.h @@ -94,6 +94,12 @@ #define DW_VR_MII_DIG_CTRL2_TX_POL_INV BIT(4) #define DW_VR_MII_DIG_CTRL2_RX_POL_INV BIT(0) +/* Clause 133 defines */ +/* RSFEC transcode pad alter + * DW vendor extension in RS-FEC control + */ +#define DW_VR_RSFEC_CTRL_TC_PAD_ALTER BIT(10) + #define DW_XPCS_INFO_DECLARE(_name, _pcs, _pma) \ static const struct dw_xpcs_info _name =3D { .pcs =3D _pcs, .pma =3D _pma= } diff --git a/include/uapi/linux/mdio.h b/include/uapi/linux/mdio.h index b2541c948fc1..5219c877b2cf 100644 --- a/include/uapi/linux/mdio.h +++ b/include/uapi/linux/mdio.h @@ -317,6 +317,9 @@ #define MDIO_PMA_10GBR_FECABLE_ABLE 0x0001 /* FEC ability */ #define MDIO_PMA_10GBR_FECABLE_ERRABLE 0x0002 /* FEC error indic. ability = */ +/* RSFEC PMA Control register */ +#define MDIO_PMA_RSFEC_CTRL_4LANE_PMD BIT(3) + /* PMA 10GBASE-R Fast Retrain status and control register. */ #define MDIO_PMA_10GBR_FSRT_ENABLE 0x0001 /* Fast retrain enable */ -- 2.43.0 From nobody Mon Jun 8 19:47:26 2026 Received: from mail-qv1-f53.google.com (mail-qv1-f53.google.com [209.85.219.53]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 266D22236F2 for ; Wed, 27 May 2026 00:10:08 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.219.53 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779840622; cv=none; b=LujJ0v/69yZdHOFU9yNQeFoX2LR+oFbWq2CRd21wilTJtCT50u0En1eiKlZc105mFwGHLUe55YS8Il1woDI3hy8AMT1o2CZ37X6QFWXvz9mdnYfZ3vFOFwg/9TDwOJwhNGv68/jtHKxRQ79w6mC2J3oLgjEeIMMDDWKueHK4R6M= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779840622; c=relaxed/simple; bh=0Tm9nwTHeYfugRY9tSjf3VPE4aKFSFYgNEZnx+24jds=; h=From:To:Cc:Subject:Date:Message-ID:In-Reply-To:References: MIME-Version; b=M9Uv3QNvGpbpug3Qg/6MlltUJsV5D9pWgiwtaJ0FFbzG5LxFxAy+R6REWRr0wSl6vw/s1CB0SKNtdLthVpmDUARkjaP+6xCJdbOGVJTHROv9BrbalM+kV2l68T0CCys8vTH0WUMvawGfVVCO3wBnEqmgwg/U3yVNRVqNpKmKg4U= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com; spf=pass smtp.mailfrom=gmail.com; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b=tOEP4GS/; arc=none smtp.client-ip=209.85.219.53 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=gmail.com Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="tOEP4GS/" Received: by mail-qv1-f53.google.com with SMTP id 6a1803df08f44-8c9166b26b4so132356576d6.0 for ; Tue, 26 May 2026 17:10:07 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779840606; x=1780445406; darn=vger.kernel.org; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=JVqIvn7ZAeRsjfqe7C4mbzp1Skqc1oHz8BCR/Ka9cF4=; b=tOEP4GS/P4k4DKncu2Tok1jMMMjWqI6gFDPAvTHQkLRKUPnLAiMdmZcVnydssiSI4J 15NndPrE3abN1ptOsArH9FRvm59Ro89T3d5/5ztHyyRJzC0NLX8k6ktdIPKhtblPIfVP 6l9XyVvX/VSQj/5n6IJdP4A7MdyGYx8HwMIWIzaip3XGTRCFevLDY/1iw5wBfYMdcSF6 6/NETvSuXx1HK/tHXf757iLCxDDYOz7XQrUfKVPgYgRWv2FelSrDHHmnTAb8mrnDj/Lr 5zFJfoCmeNh+4FAdQxi4jvsX2dOol16SBU4WfcMh83Vg0VqgRmfFVnW9GihjtuYbydNc Tl8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779840606; x=1780445406; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-gg:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=JVqIvn7ZAeRsjfqe7C4mbzp1Skqc1oHz8BCR/Ka9cF4=; b=T/3ip0asEtb9fvWI45BVHsl7s5dOWhSV2ceRdD+wPJUJNMHguqzaatY/Pr5oECqVeN mLIPWN7qmhw6E6OTfDC6p5DJO8KOLgYxmHnU75aMp0OjSbM1R64hnW5J+9ym2HK3jBJW m/rFEmoM44POiUEhkqCcVj2f9LMh4cbfNHMnT/BFhBTLn2kFanPY5En3Bc5XvPkp7swb 66wWHw6F35nmuAnW+Hyol8eT+z7XDDl0KIbFzIZ2Uhj9r6Lr+UPud7J7IkAofoBDsabd ZIvX5kgfGkAsu5FNmvHwM5pmc8ZqR5doUWLToNkksfKpd7e/fyP+/VepETrjcGhbVCMV C0eg== X-Forwarded-Encrypted: i=1; AFNElJ80fHkeAFGSqD1/pYdap4ejOaBtXR5u5/x1jLDkH1zrVwR/VQLFleEX/qvXrjtuP+6DTCPezqKTHuuu6qM=@vger.kernel.org X-Gm-Message-State: AOJu0YxT35rWMGPS0xVYLE4mh0LhdEOkXtxKOXcZYygFzX2iWdvP7X6w wN4BctEhIli11LTsIiFPrY/It2zLxll9c1+XThD3DGuYxdL401GfDBSU X-Gm-Gg: Acq92OF0cTV2B6lNHhkkzKwHe2rbEg+BZXZxupIbv0LQAuRy+EWvJFxpFMZCa1GfSn3 CB5ApYQO8FdTTAN1eKkZF4zMci2F4jsyeqcoMaI8TV4haFqoeqdrN8jo29pE5Yy5apQfsTyaUJU IllRWGV4meZoGIRAQnZAe2UhfFDnhdLWhesI2dfMmJySN+jCLonAT8WsNw6RTu8TRljM8MCohMy s5kEWqRMrgVMLlj7LyY3xcjGlnKvAG6ne9XMhqVxOA810Wos8TM0EMrlOwbZ/DqW75gehUL9/08 Qw+HvoXrMiKu483FcqUmJP02voBFDnQPbnC9hxkbx/n9t8kg3VmtkPJPcyJWL5gj0TNJ9qXkwqn SOZbo88IgkIDZkklioLRrYUyGOWbkMiH0EAy1jwCVdFSVq9SJM5Mh6toknBOR2298ppzDS5UQaq PKLfNLbS4FlAsQMlw9WMfIAc6/uFXzJ/MSD4PbkHtOs2A8kVFatjSonxRr8eUT3NSi3oOGfAFC8 fDR3w== X-Received: by 2002:a05:620a:4414:b0:911:e1ab:a3c0 with SMTP id af79cd13be357-914b49de06dmr2870546585a.60.1779840605986; Tue, 26 May 2026 17:10:05 -0700 (PDT) Received: from PF5YBGDS.localdomain ([163.114.130.4]) by smtp.gmail.com with ESMTPSA id af79cd13be357-914f87fc449sm363803585a.35.2026.05.26.17.10.04 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 26 May 2026 17:10:04 -0700 (PDT) From: mike.marciniszyn@gmail.com To: Alexander Duyck , Jakub Kicinski , kernel-team@meta.com, Andrew Lunn , "David S. Miller" , Eric Dumazet , Paolo Abeni , Jiawen Wu , Mengyuan Lou , Heiner Kallweit , Russell King , Mohsin Bashir , Kees Cook , Andrew Lunn Cc: mike.marciniszyn@gmail.com, netdev@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH net-next v3 4/4] net: pcs: xpcs: Add handling for 4 channel rsfec device Date: Tue, 26 May 2026 20:09:58 -0400 Message-ID: <20260527000958.81108-5-mike.marciniszyn@gmail.com> X-Mailer: git-send-email 2.43.0 In-Reply-To: <20260527000958.81108-1-mike.marciniszyn@gmail.com> References: <20260527000958.81108-1-mike.marciniszyn@gmail.com> Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset="utf-8" From: "Mike Marciniszyn (Meta)" This patch introduces the configuration of vendor specific registers for alignment encoding, PCS Mode, and VL_INTVL over the one or two instances as required. The DW PCS IP specification calls out the need to configure both lanes identically when using 2 lane modes such as 50-R2 and 100-R2, so the programming is repeated for each channel. The encoding tables are derived from the IEEE 8023-2022 spec sections 82.2.7 and tables 82-2 and 82-3 for the alignment markers and their insertion. Note that there is a conflict between VRs DW_VR_XS_PCS_DIG_STS and the DW_PCS_IP DW_VR_MII_PCS_PCS_MODE. The bit mask for DW_VR_XS_PCS_DIG_STS/RX_FIFO_ERR fits within the reserved bits for the DW PCS IP DW_VR_MII_PCS_PCS_MODE register so there is no issue. There is also a conflict between DW_VR_MII_PCS_VL_INTVL and DW_VR_MII_AN_INTR_STS but an_mode differs, so again there is no issue. Reviewed-by: Alexander Duyck Signed-off-by: Mike Marciniszyn (Meta) --- v3: - rename xpcs_config_vl_markers() to xpcs_config_ch_vl_markers() - add xpcs_write_pcs_ch() - lanes -> channels v2: https://lore.kernel.org/all/20260511182604.1338-3-mike.marciniszyn@gmai= l.com/ - Replace xpcs_write_pcs_prtad() wiht xpcs_write_pcs_mdev() to avoid hardcoded prtaddr value v1: https://lore.kernel.org/all/20260506190904.4029-3-mike.marciniszyn@gmai= l.com/ drivers/net/pcs/pcs-xpcs.c | 95 +++++++++++++++++++++++++++++++++++++- drivers/net/pcs/pcs-xpcs.h | 25 ++++++++++ 2 files changed, 119 insertions(+), 1 deletion(-) diff --git a/drivers/net/pcs/pcs-xpcs.c b/drivers/net/pcs/pcs-xpcs.c index 342d1cc2adbc..515c0615f382 100644 --- a/drivers/net/pcs/pcs-xpcs.c +++ b/drivers/net/pcs/pcs-xpcs.c @@ -1430,21 +1430,95 @@ static int xpcs_get_pma_mmd(struct dw_xpcs *xpcs) return -ENODEV; } =20 +/* m0 - m2 from Table 82-2/82-3 + * m4 - m6 are skipped since they are inversions of m0 - m2. + * Inverted parity fields (IEEE 82.2.8) bip3 and bip7 are omitted. + */ +struct lane_markers { + u8 m0, m1, m2; +}; + +/* Alignment marker encodings, see table 82-2 in IEEE 802.3-2022 */ +static const struct lane_markers xpcs_100gbaser_markers[] =3D { + {0xc1, 0x68, 0x21}, + {0x9d, 0x71, 0x8e}, + {0x59, 0x4b, 0xe8}, + {0x4d, 0x95, 0x7b}, +}; + +/* Alignment marker encodings, see table 82-3 in IEEE 802.3-2022 + * The content of the 50G markers is identical to 40G values (IEEE 133.2.2= ). + */ +static const struct lane_markers xpcs_50gbaser_markers[] =3D { + {0x90, 0x76, 0x47}, + {0xf0, 0xc4, 0xe6}, + {0xc5, 0x65, 0x9b}, + {0xa2, 0x79, 0x3d}, +}; + struct pma_pcs_values { + const struct lane_markers *vl0_markers; + const struct lane_markers *vl123_markers; int channels; u16 rsfec_ctrl; + u16 pcs_mode; + u16 vl_intvl; }; =20 +#define XPCS_VL_TO_REG(vl, lh) \ + (((vl) * 2) + DW_VR_MII_PCS_VL0_##lh) + +static int +xpcs_write_pcs_ch(struct dw_xpcs *xpcs, int ch, int reg, u16 val) +{ + return xpcs_mdev_write_ch(xpcs, ch, MDIO_MMD_PCS, reg, val); +} + +static int xpcs_config_ch_vl_markers(struct dw_xpcs *xpcs, int ch, int vl, + const struct lane_markers *m) +{ + int ret; + + /* m0, m1, m2 written to _L and _H registers + * + * _L =3D (m1 << 8) | m0 + * _H =3D m2 + */ + ret =3D xpcs_write_pcs_ch(xpcs, ch, XPCS_VL_TO_REG(vl, L), + ((u16)m->m1 << 8) | m->m0); + if (ret < 0) + return ret; + return xpcs_write_pcs_ch(xpcs, ch, XPCS_VL_TO_REG(vl, H), m->m2); +} + static int xpcs_config_rsfec_pma(struct dw_xpcs *xpcs, const struct pma_pcs_values *v) { - int ret =3D 0, i, pma_mmd; + int ret =3D 0, i, vl, pma_mmd; =20 pma_mmd =3D xpcs_get_pma_mmd(xpcs); if (pma_mmd < 1) return pma_mmd; =20 for (i =3D 0; ret >=3D 0 && i < v->channels; i++) { + /* code word markings */ + for (vl =3D 0; ret >=3D 0 && vl < 4; vl++) + ret =3D xpcs_config_ch_vl_markers(xpcs, i, + vl, !vl ? + &v->vl0_markers[0] : + &v->vl123_markers[vl - 1]); + if (ret < 0) + break; + /* vendor registers */ + ret =3D xpcs_write_pcs_ch(xpcs, i, + DW_VR_MII_PCS_VL_INTVL, v->vl_intvl); + if (ret < 0) + break; + ret =3D xpcs_write_pcs_ch(xpcs, i, + DW_VR_MII_PCS_PCS_MODE, v->pcs_mode); + if (ret < 0) + break; + /* rsfec register */ ret =3D xpcs_mdev_write_ch(xpcs, i, pma_mmd, MDIO_PMA_RSFEC_CTRL, v->rsfec_ctrl); } @@ -1457,6 +1531,13 @@ static int xpcs_25gbaser_pma_config(struct dw_xpcs *= xpcs) const struct pma_pcs_values v =3D { .rsfec_ctrl =3D 0, .channels =3D 1, + /* 25g markers from 100g and 50g tables per 802.3-2022 + * 108.5.2.4 + */ + .vl0_markers =3D &xpcs_100gbaser_markers[0], + .vl123_markers =3D &xpcs_50gbaser_markers[1], + .vl_intvl =3D 20479, + .pcs_mode =3D DW_VR_MII_PCS_MODE_CLAUSE107, }; =20 return xpcs_config_rsfec_pma(xpcs, &v); @@ -1467,6 +1548,10 @@ static int xpcs_50gbaser_pma_config(struct dw_xpcs *= xpcs) const struct pma_pcs_values v =3D { .rsfec_ctrl =3D DW_VR_RSFEC_CTRL_TC_PAD_ALTER, .channels =3D 1, + .vl0_markers =3D &xpcs_50gbaser_markers[0], + .vl123_markers =3D &xpcs_50gbaser_markers[1], + .pcs_mode =3D 0, + .vl_intvl =3D 20479, }; =20 return xpcs_config_rsfec_pma(xpcs, &v); @@ -1477,6 +1562,10 @@ static int xpcs_50gbaser2_pma_config(struct dw_xpcs = *xpcs) const struct pma_pcs_values v =3D { .rsfec_ctrl =3D DW_VR_RSFEC_CTRL_TC_PAD_ALTER, .channels =3D 2, + .vl0_markers =3D &xpcs_50gbaser_markers[0], + .vl123_markers =3D &xpcs_50gbaser_markers[1], + .pcs_mode =3D 0, + .vl_intvl =3D 20479, }; =20 return xpcs_config_rsfec_pma(xpcs, &v); @@ -1487,6 +1576,10 @@ static int xpcs_100gbasep_pma_config(struct dw_xpcs = *xpcs) const struct pma_pcs_values v =3D { .rsfec_ctrl =3D MDIO_PMA_RSFEC_CTRL_4LANE_PMD, .channels =3D 2, + .vl0_markers =3D &xpcs_100gbaser_markers[0], + .vl123_markers =3D &xpcs_100gbaser_markers[1], + .pcs_mode =3D DW_VR_MII_PCS_MODE_DISABLE_MLD, + .vl_intvl =3D 16383, }; =20 return xpcs_config_rsfec_pma(xpcs, &v); diff --git a/drivers/net/pcs/pcs-xpcs.h b/drivers/net/pcs/pcs-xpcs.h index ab47d6dd050c..adb7b1c13c2d 100644 --- a/drivers/net/pcs/pcs-xpcs.h +++ b/drivers/net/pcs/pcs-xpcs.h @@ -100,6 +100,31 @@ */ #define DW_VR_RSFEC_CTRL_TC_PAD_ALTER BIT(10) =20 +/* Vendor specific 4 channel PCS registers */ + +/* DW_VR_MII_PCS_VL_INTVL and DW_VR_MII_AN_INTR_STS conflict + * but code paths are different + */ +#define DW_VR_MII_PCS_VL_INTVL 0x8002 +/* 0x8008 - 0x800f */ +#define DW_VR_MII_PCS_VL0_L 0x8008 +#define DW_VR_MII_PCS_VL0_H 0x8009 +#define DW_VR_MII_PCS_PCS_MODE 0x8010 + +/* DW_VR_MII_PCS_PCS_MODE bits */ +#define DW_VR_MII_PCS_MODE_HI_BER25 BIT(2) +#define DW_VR_MII_PCS_MODE_DISABLE_MLD BIT(1) +#define DW_VR_MII_PCS_MODE_CLAUSE49 BIT(0) + +/* 25G requires these two bits are set. + * + * The CLAUSE49 bit changes the interface with the MAC + * to 64 bit and the BER25 bit changes the measurement + * interval to 2ms. + */ +#define DW_VR_MII_PCS_MODE_CLAUSE107 \ + (DW_VR_MII_PCS_MODE_HI_BER25 | DW_VR_MII_PCS_MODE_CLAUSE49) + #define DW_XPCS_INFO_DECLARE(_name, _pcs, _pma) \ static const struct dw_xpcs_info _name =3D { .pcs =3D _pcs, .pma =3D _pma= } =20 --=20 2.43.0