From nobody Wed Jun 10 11:01:14 2026 Received: from mail-wm1-f47.google.com (mail-wm1-f47.google.com [209.85.128.47]) (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 82EAB3AEF47 for ; Tue, 9 Jun 2026 16:20:13 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.47 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781022015; cv=none; b=XFxKs5ER3DTpHfOPNumLiyiwqiIgoyGjFwVrqPIlc7ymwoy1DgDhigIwyWYnEsmtlRFBOYyLS/3eEjqQRk/zZ/XTEKyIU1REzoeeHVaIZ+XT30cWCfIdUh/6Ab/RUw9KfKziU+Hz3C3nVW5t7Ooy1py4nnKs5n8V3AYF634PvOc= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781022015; c=relaxed/simple; bh=rIK+8qwUbffbSCQ4JIm1hNQ6maO54VCXxjYbTZbIPiM=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=vFqypI1AkzdLwuEYrPS10yx8Wdef+A3zrUZWsMFKMGKVfbLqKgAYtbPBSwuNSxD0JHL2VdC2I5qQbsO+LONtsyUM0x0HySTS29w4goI3x3Wzni6fBSkkF3fUNi6XY4gTUe4VgR2/ivArFGKqq7t85pLaYAvfssAdkKNQA7snXzc= 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=DpPvCux7; arc=none smtp.client-ip=209.85.128.47 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="DpPvCux7" Received: by mail-wm1-f47.google.com with SMTP id 5b1f17b1804b1-490ac357c55so62696505e9.1 for ; Tue, 09 Jun 2026 09:20:13 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781022012; x=1781626812; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=bUz34f8AUlG0gLWcG1NhLV3GhNlUwZnNfPkE4XwZzQc=; b=DpPvCux7dCy9YFhEwmQI651Cd8in5OfGTkqRQ1gHCiIg4IuVUTxL5hwLbXMl0x0CVB Jb8OTQz+KBFJYlif+WUTCPIVzSpnS1AMmFY+w6FFGuvQWBM54Qx4LaEtlG+8JpxZg5X7 QZE035PPMrzg6lSc6UtsaGC48YCbDnqpo6Llof54KOIizfghVoUN7u+VxKydMATCQKdD yzpNLEKYqdCR+LbRveYjbm7593vERoMZWjgI0AVUpnFUD+Q2hulR7KvHmJPX3JmYwEom /Zv9+WDRp1zMNcifQYKN18QeimQaktxklG9PRXuseJEt2O6vJx+BTdhCkQHwUKZ4gYz3 bngQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781022012; x=1781626812; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=bUz34f8AUlG0gLWcG1NhLV3GhNlUwZnNfPkE4XwZzQc=; b=STkk60zpMKZ0q0pqLm7/JA+K/TvDcr1v6/LcKdvB5/NiGBUUnVe+2N/UZO9+NWX3RQ NPkCeQamHL7izX7NOzPN7/EW2WzodIdPBXKb5lLvOQ1o/WVL65XH1f6XymPO698CMPbu 7Mkj6YCbkvtJpv3j+5upcyChnyrysk55DwFIjUGIePTqiW3mfybLpkynr+Rb3/IhpRhw ybdoHQT9Lcv9FppUQ9qbvToiRpIagWg1MvNa6w82jcarFXYRvV40sQhpX6iFNq5unjmi 8yQMEmbxPor0hN01ldqAasW0QXZfTixjeSsowZtpc/eK8oeyej0QgRBcurSzO3Ny8T1p MawA== X-Forwarded-Encrypted: i=1; AFNElJ9/zs2VtvIct9eiqiiLahwue8nJKBLBcmniz+AzcgYf8xC1Ec0NcJvp0gAWrcPgeQLBxRaNGC1MG5vs2B8=@vger.kernel.org X-Gm-Message-State: AOJu0Yz+uiTrQZSOnZKIIyuDJxvAr8nkYYRuXUhGqt+wdQOgLtJFqWML 0WXpaVkLeF8YVJIsPqa8l+pGxsJXXHZsr9dZ/glcvGI7Z47rMbSfwdGq X-Gm-Gg: Acq92OE9qK+c8p6XU4mGv8PaSc7/OaRapL/tNLF7+YpGBbRfBRREyjrKQ2aKljkvnck cjHJOYoNTuzfcTV+34b6FB5PahNmKUpAodVgz9LLgg0L0fvm+a/RLdLrIoqlmCvyGUvl6FhseUU z0QfvHdPzEnreqx2NLl6KDhC4lTh3tm93IFz1kvnuMRFcnyhx0HKFFJqZVtP6uhqnJWKmP22HNz Zlp6MFa8Jx/8SIjZ+/Zbc3wmbSuHDTXUF6GH8TUOJt3PNN9+9ZPJ5IVWfWE7FfEm3Pao3kgZqYN kVBFZDKWIEfq70cKo+aJZ0Qai6JNGm2E7yfT7WKCHsXlQ7ExAYwKyOGp8/i20N2NteNA+vV2m3I tKrEeEFXCYkEyeBk+tU4+D4nLOvBDQFf0K2RZc/rufhnitajKnLc3I953DWVaIAd0SgyEmV9tMf b+wf27FGU+IttiHTqTtZWMfpYCTlSaRByXoMgI95KXlkyLA2yvnan919JrWdFb2LiRotpeREjo2 1cV/tgU7a0WktjKv5r4 X-Received: by 2002:a05:600c:8216:b0:490:c2a3:23cf with SMTP id 5b1f17b1804b1-490c2a323f0mr322472225e9.34.1781022011871; Tue, 09 Jun 2026 09:20:11 -0700 (PDT) Received: from [127.0.1.1] (cust-east-par-46-193-119-166.cust.wifirst.net. [46.193.119.166]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-490bc391aaasm569116365e9.1.2026.06.09.09.20.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Jun 2026 09:20:11 -0700 (PDT) From: Fidelio Lawson X-Google-Original-From: Fidelio Lawson Date: Tue, 09 Jun 2026 18:19:55 +0200 Subject: [PATCH net-next v10 1/3] net: dsa: microchip: implement KSZ87xx Module 3 low-loss cable errata Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260609-ksz87xx_errata_low_loss_connections-v10-1-9ba4418cf3db@exotec.com> References: <20260609-ksz87xx_errata_low_loss_connections-v10-0-9ba4418cf3db@exotec.com> In-Reply-To: <20260609-ksz87xx_errata_low_loss_connections-v10-0-9ba4418cf3db@exotec.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Marek Vasut , Maxime Chevallier , Simon Horman , Heiner Kallweit , Russell King , Tristram Ha Cc: Woojung Huh , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Nicolai Buchwitz , Fidelio Lawson , Marek Vasut X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1781022010; l=8207; i=fidelio.lawson@exotec.com; s=20260326; h=from:subject:message-id; bh=rIK+8qwUbffbSCQ4JIm1hNQ6maO54VCXxjYbTZbIPiM=; b=RNCFrs4UP8RZkJ5rjd8XFSFelSBAfG4A+xfrsn5Hr2aWMJhnQrupZ8C2SfB3arOS3VBAAofJT bTsF6UIT8SbCKsnRxswFpQtUHo72y1bqDeq07j3zf4Q1VXSh3mGg2NG X-Developer-Key: i=fidelio.lawson@exotec.com; a=ed25519; pk=866eH9Bmmpjc+ctgkr5T1uXxBefZzob3tEEuiVWZ6BI= Implement the KSZ87xx short cable workaround. This patch implements the KSZ87xx short cable erratum described in Microchip document DS80000687C for KSZ87xx switches and the following support article: Link: https://support.microchip.com/s/article/Solution-for-Using-CAT-5E-or-= CAT-6-Short-Cable-with-a-Link-Issue-for-the-KSZ8795-Family The issue affects short or low-loss cable links (e.g. CAT5e/CAT6), where the PHY receiver equalizer may amplify high-amplitude signals excessively, resulting in internal distortion and link establishment failures. KSZ87xx devices require a workaround for the Module 3 low-loss cable condition, controlled through the switch TABLE_LINK_MD_V indirect registers. This change models the erratum handling as vendor-specific Clause 22 PHY registers, virtualized by the KSZ8 DSA driver and accessed via ksz8_r_phy() / ksz8_w_phy(). The following controls are provided: - A boolean =E2=80=9Cshort-cable=E2=80=9D preset, which applies a documente= d and conservative configuration (LPF 62 MHz bandwidth and DSP EQ initial value 0), and is the recommended interface for typical use cases. - Separate LPF bandwidth and DSP EQ initial value controls intended for advanced or experimental tuning. These are orthogonal and independent, and override the corresponding settings without requiring any specific ordering. The preset and tunables act as simple setters with no implicit state machine or invalid combinations, keeping the API predictable and aligned with the KISS principle. The erratum affects the shared PHY analog front-end and therefore applies globally to the switch. Reviewed-by: Nicolai Buchwitz Reviewed-by: Marek Vasut Signed-off-by: Fidelio Lawson --- drivers/net/dsa/microchip/ksz8.c | 89 ++++++++++++++++++++++++++++++= ++++ drivers/net/dsa/microchip/ksz8_reg.h | 23 ++++++++- drivers/net/dsa/microchip/ksz_common.h | 4 ++ 3 files changed, 115 insertions(+), 1 deletion(-) diff --git a/drivers/net/dsa/microchip/ksz8.c b/drivers/net/dsa/microchip/k= sz8.c index 0f84b2e7d25d..4ec2d5d2a1bc 100644 --- a/drivers/net/dsa/microchip/ksz8.c +++ b/drivers/net/dsa/microchip/ksz8.c @@ -798,6 +798,40 @@ static int ksz879x_set_loopback(struct ksz_device *dev= , u16 port, u16 val) stat3); } =20 +static int ksz87xx_apply_low_loss_preset(struct ksz_device *dev, bool enab= le) +{ + /* Apply the Microchip erratum short-cable preset (LPF 62 MHz, EQ init 0) + * providing a conservative configuration for short or low-loss cables. + */ + u8 lpf_bw, eq_init; + int ret; + + lpf_bw =3D KSZ87XX_PHY_LPF_62MHZ; + eq_init =3D KSZ87XX_DSP_EQ_INIT_LOW_LOSS; + + if (!ksz_is_ksz87xx(dev)) + return -EOPNOTSUPP; + + if (!enable) { + /* Restore default values (LPF 90 MHz, EQ init 15). */ + lpf_bw =3D KSZ87XX_PHY_LPF_90MHZ; + eq_init =3D KSZ87XX_DSP_EQ_INIT_FACTORY; + } + + ret =3D ksz8_ind_write8(dev, TABLE_LINK_MD, KSZ87XX_REG_PHY_LPF, lpf_bw); + if (ret) + return ret; + + dev->lpf_bw =3D lpf_bw; + ret =3D ksz8_ind_write8(dev, TABLE_LINK_MD, KSZ87XX_REG_DSP_EQ, eq_init); + if (ret) + return ret; + + dev->eq_init =3D eq_init; + + return ret; +} + /** * ksz8_r_phy_ctrl - Translates and reads from the SMI interface to a MIIM= PHY * Control register (Reg. 31). @@ -1046,6 +1080,22 @@ static int ksz8_r_phy(struct ksz_device *dev, u16 ph= y, u16 reg, u16 *val) if (ret) return ret; =20 + break; + case PHY_REG_KSZ87XX_SHORT_CABLE: + if (!ksz_is_ksz87xx(dev)) + return -EOPNOTSUPP; + data =3D !!(dev->lpf_bw =3D=3D KSZ87XX_PHY_LPF_62MHZ && + dev->eq_init =3D=3D KSZ87XX_DSP_EQ_INIT_LOW_LOSS); + break; + case PHY_REG_KSZ87XX_LPF_BW: + if (!ksz_is_ksz87xx(dev)) + return -EOPNOTSUPP; + data =3D dev->lpf_bw; + break; + case PHY_REG_KSZ87XX_EQ_INIT: + if (!ksz_is_ksz87xx(dev)) + return -EOPNOTSUPP; + data =3D dev->eq_init; break; default: processed =3D false; @@ -1272,6 +1322,41 @@ static int ksz8_w_phy(struct ksz_device *dev, u16 ph= y, u16 reg, u16 val) if (ret) return ret; break; + case PHY_REG_KSZ87XX_SHORT_CABLE: + if (!ksz_is_ksz87xx(dev)) + return -EOPNOTSUPP; + dev_info_once(dev->dev, + "KSZ87xx low-loss tuning is global, applied switch-wide\n"); + ret =3D ksz87xx_apply_low_loss_preset(dev, !!val); + if (ret) + return ret; + break; + case PHY_REG_KSZ87XX_LPF_BW: + if (!ksz_is_ksz87xx(dev)) + return -EOPNOTSUPP; + dev_info_once(dev->dev, + "KSZ87xx low-loss tuning is global, applied switch-wide\n"); + /* Only accept LPF bandwidth bits [7:6] */ + if (val & ~KSZ87XX_PHY_LPF_MASK) + return -EINVAL; + ret =3D ksz8_ind_write8(dev, TABLE_LINK_MD, KSZ87XX_REG_PHY_LPF, (u8)val= ); + if (ret) + return ret; + dev->lpf_bw =3D val; + break; + case PHY_REG_KSZ87XX_EQ_INIT: + if (!ksz_is_ksz87xx(dev)) + return -EOPNOTSUPP; + dev_info_once(dev->dev, + "KSZ87xx low-loss tuning is global, applied switch-wide\n"); + /* Only accept DSP EQ initial value bits [5:0] */ + if (val & ~KSZ87XX_DSP_EQ_VALID_MASK) + return -EINVAL; + ret =3D ksz8_ind_write8(dev, TABLE_LINK_MD, KSZ87XX_REG_DSP_EQ, (u8)val); + if (ret) + return ret; + dev->eq_init =3D val; + break; default: break; } @@ -2070,6 +2155,10 @@ static int ksz8_setup(struct dsa_switch *ds) return ret; } =20 + /* Initialize KSZ87xx short-cable preset control */ + dev->eq_init =3D KSZ87XX_DSP_EQ_INIT_FACTORY; + dev->lpf_bw =3D KSZ87XX_PHY_LPF_90MHZ; + ret =3D ksz8_handle_global_errata(ds); if (ret) return ret; diff --git a/drivers/net/dsa/microchip/ksz8_reg.h b/drivers/net/dsa/microch= ip/ksz8_reg.h index 332408567b47..981ab441d9b7 100644 --- a/drivers/net/dsa/microchip/ksz8_reg.h +++ b/drivers/net/dsa/microchip/ksz8_reg.h @@ -202,6 +202,10 @@ #define REG_PORT_3_STATUS_0 0x38 #define REG_PORT_4_STATUS_0 0x48 =20 +/* KSZ87xx LinkMD registers (TABLE_LINK_MD_V) */ +#define KSZ87XX_REG_DSP_EQ 0x08 /* DSP EQ initial value */ +#define KSZ87XX_REG_PHY_LPF 0x4C /* RX LPF bandwidth */ + /* For KSZ8765. */ #define PORT_REMOTE_ASYM_PAUSE BIT(5) #define PORT_REMOTE_SYM_PAUSE BIT(4) @@ -342,7 +346,7 @@ #define TABLE_EEE (TABLE_EEE_V << TABLE_EXT_SELECT_S) #define TABLE_ACL (TABLE_ACL_V << TABLE_EXT_SELECT_S) #define TABLE_PME (TABLE_PME_V << TABLE_EXT_SELECT_S) -#define TABLE_LINK_MD (TABLE_LINK_MD << TABLE_EXT_SELECT_S) +#define TABLE_LINK_MD (TABLE_LINK_MD_V << TABLE_EXT_SELECT_S) #define TABLE_READ BIT(4) #define TABLE_SELECT_S 2 #define TABLE_STATIC_MAC_V 0 @@ -729,6 +733,23 @@ #define PHY_POWER_SAVING_ENABLE BIT(2) #define PHY_REMOTE_LOOPBACK BIT(1) =20 +/* Vendor-specific Clause 22 PHY registers (virtualized) */ +#define PHY_REG_KSZ87XX_SHORT_CABLE 0x1A +#define PHY_REG_KSZ87XX_LPF_BW 0x1B +#define PHY_REG_KSZ87XX_EQ_INIT 0x1C + +/* LPF bandwidth bits [7:6]: 00 =3D 90MHz (default), 01 =3D 62MHz, 10 =3D = 55MHz, 11 =3D 44MHz */ +#define KSZ87XX_PHY_LPF_MASK GENMASK(7, 6) +#define KSZ87XX_PHY_LPF_90MHZ FIELD_PREP(KSZ87XX_PHY_LPF_MASK, 0) +#define KSZ87XX_PHY_LPF_62MHZ FIELD_PREP(KSZ87XX_PHY_LPF_MASK, 1) +#define KSZ87XX_PHY_LPF_55MHZ FIELD_PREP(KSZ87XX_PHY_LPF_MASK, 2) +#define KSZ87XX_PHY_LPF_44MHZ FIELD_PREP(KSZ87XX_PHY_LPF_MASK, 3) + +/* Low-loss workaround DSP EQ INIT VALUE */ +#define KSZ87XX_DSP_EQ_VALID_MASK GENMASK(5, 0) +#define KSZ87XX_DSP_EQ_INIT_LOW_LOSS 0x00 +#define KSZ87XX_DSP_EQ_INIT_FACTORY 0x0F + /* KSZ8463 specific registers. */ #define P1MBCR 0x4C #define P1MBSR 0x4E diff --git a/drivers/net/dsa/microchip/ksz_common.h b/drivers/net/dsa/micro= chip/ksz_common.h index b67038cf1bd0..45613b9aeb1e 100644 --- a/drivers/net/dsa/microchip/ksz_common.h +++ b/drivers/net/dsa/microchip/ksz_common.h @@ -222,6 +222,10 @@ struct ksz_device { * the switch=E2=80=99s internal PHYs, bypassing the main SPI interface. */ struct mii_bus *parent_mdio_bus; + + /* KSZ87xx low-loss tuning state */ + u8 lpf_bw; /* KSZ87XX_PHY_LPF_* */ + u8 eq_init; /* DSP EQ initial value */ }; =20 /* List of supported models */ --=20 2.54.0 From nobody Wed Jun 10 11:01:14 2026 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (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 3061E3D1CB0 for ; Tue, 9 Jun 2026 16:20:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781022015; cv=none; b=teL0+3wzOXCWEU2zdMQwEDkEsI9iG8x/QqKS4fqlp1n+IrZVCvwBNlU3dT27b/ARFnjRhz4lBgDI8xaGvs1+cvJQD1LTDBaed8bMCV1SEjDJdNq5wyDrQ5gLRROdfW0p4UuanSdjc7+JD27xOMC6iZvdrY9sz++flWCzO0gTHGA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781022015; c=relaxed/simple; bh=UBHcYZ64s+XEqC1u/+Yu/XPGxukz4KBbMfIL4HIH8B8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XmWyUzTHQEueXJaTS5IpibaU4EdAu2GhRa5GGyAY9umpuMDaqsNO57puYmJG5m57/MQW1EStqpy5HvbWuwZAmA8o+3EtZmSs98jEEpkbIb3ygFyU9NGApxDpDUX0obFQ2mfdIYl37zwQpg4tiYpMIPedft5A+aavIXz2hTRHiPI= 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=BPbQwVNX; arc=none smtp.client-ip=209.85.128.52 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="BPbQwVNX" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-490b2b037d2so50608905e9.3 for ; Tue, 09 Jun 2026 09:20:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781022013; x=1781626813; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=uLbnKjJBElbO+83M+imgVwItrnVR6hDvTiuQTQU/vBg=; b=BPbQwVNX4bvU7/71ONwU0J8C8QNcSWmSQ8oLQnBMLDhGWg5C+Y2bU2ZTV46MQDF02j 36YNZ9Cn7B+uiozaDsJzM4NeJWuO42+5ZJL4CfYMtBkNjaGj3YdHvH5h+Br4qKjPZXX7 YhkV7he2JlEb0xNtXh8vpta6Wy4Dyh/3uRfHmbZ/srA32OCftXrgdK+n19u+xWuK8r00 jUF/K2rpd07tFcKM81IvAd3czwM/7G/sN3TM+rSmKf+miOzgNZ9b6M+JUvsDjY4Wqtmy q3eUUFBPQVVCg+2G1cBAXNQzrLc35zjGxqUgmIJ290kUl/l8OleMShxvFHaag3wVxu65 lgvQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781022013; x=1781626813; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=uLbnKjJBElbO+83M+imgVwItrnVR6hDvTiuQTQU/vBg=; b=O9kUXDM6hFcXCNRoLL7r0WPuNwqgKkV/fthRbkRtKolGgfCyUhJQte9/ks2Tpf8vx6 erCPIJoNARwTQTVlUphTcni0S4erCy36nQPsT6kj9Kw90gbMcvKKCRp9DvJ2vIo3m7pw fMY0r33D0ytNU1EiNp6LbDDMYaqIi9/XZmBHPEQY2WP3dBUKDbPBcoA+0SfP/hRZS0fV fIZ8BTV51IIFEK9nLVigcrvzavhwNguaeIH/1ideo5VlH1NEnMDrGijKjjCOTuaTIWA+ CZMF7W1XkGA+Gva2+j//GcmLo/zK/DZuw500fVoaRoW/j+GrBkqZ4+hrVRmqZlsLwBSy Ahtg== X-Forwarded-Encrypted: i=1; AFNElJ/U9eLGC1M6xCIpRxmLmYWMy+YI3Z6IoPyGWbz1QLG30usAOhnbgNvYBymkWQ7nSa3RqwSF4BuuIiFvEPk=@vger.kernel.org X-Gm-Message-State: AOJu0YyUQMlm+I3V/H0zKKsSzcAwNnb84sxDJNOqmopnEyEJUGepMb6C 5edYBXRKTWyC0kVikumEiPsRbk8rx/Z1pGA2zmykWIrwBhAagK+8O8BS X-Gm-Gg: Acq92OG5g3PSBl/0kQjE7DuEuogy+LJ6TSiLZiwBGRkVGo1dIwdfugl81vwcBSq1gXe gnlgWb5VhR0oYMXqPYkyHXnCVuDyGfQaalF2LrSiCkDR2Zs2ASU51sQxuxDmBel4I4Dy/IaSYsK ymyl8ELA5cTi4WrxzpUxPJCBYVhM9JpGldC/RFSLHI3/wu9tg+Jp++xhEHhwWcp3XrVfjrmlgfU 64pUtvZzxWDNCugQCrseXna98hjXVdwJlOBQ+QsU3Z4fcHaUfYhUooSvFBwVIZMvw7EmwlHMHkf HMOzhd/NhPckLr2DITPPXyyMV1BRMb+1taN72+A1mhaupZn4/3zFH8pzjuggFWukS4No5ep0kcQ p9jA5ji4Z7yPZLLwAkCc6fkxXyYqqhHI58vNaFlkC4sOns1RYRTrftNNeHwyN5ri0vjD8IlI4P+ iEzzb2qMKpuI8sVs62FzshFFe+L/FBNt5l0FEPWl0auaznlzJQY2wJAgH6+lPeKqReOH1viWDeq guhmI5wahAOT33qtWqA X-Received: by 2002:a05:600c:37c9:b0:490:adb6:7957 with SMTP id 5b1f17b1804b1-490c262dcb5mr339696835e9.33.1781022012581; Tue, 09 Jun 2026 09:20:12 -0700 (PDT) Received: from [127.0.1.1] (cust-east-par-46-193-119-166.cust.wifirst.net. [46.193.119.166]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-490bc391aaasm569116365e9.1.2026.06.09.09.20.11 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Jun 2026 09:20:12 -0700 (PDT) From: Fidelio Lawson X-Google-Original-From: Fidelio Lawson Date: Tue, 09 Jun 2026 18:19:56 +0200 Subject: [PATCH net-next v10 2/3] net: ethtool: add KSZ87xx low-loss cable PHY tunables Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260609-ksz87xx_errata_low_loss_connections-v10-2-9ba4418cf3db@exotec.com> References: <20260609-ksz87xx_errata_low_loss_connections-v10-0-9ba4418cf3db@exotec.com> In-Reply-To: <20260609-ksz87xx_errata_low_loss_connections-v10-0-9ba4418cf3db@exotec.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Marek Vasut , Maxime Chevallier , Simon Horman , Heiner Kallweit , Russell King , Tristram Ha Cc: Woojung Huh , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Nicolai Buchwitz , Fidelio Lawson , Marek Vasut X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1781022010; l=3007; i=fidelio.lawson@exotec.com; s=20260326; h=from:subject:message-id; bh=UBHcYZ64s+XEqC1u/+Yu/XPGxukz4KBbMfIL4HIH8B8=; b=/VxUEs27sUOA/D+N+2RdqtvQWtXaJWaH/h5Gqw15VqqeLlXtmsskq7s0RmcT6a5WqFBRpYNvG oN5D/ehoROzBnWP4Ih60UHRIJOXeIpMKLTf7LaT3ppx+o0wmf1yQrjm X-Developer-Key: i=fidelio.lawson@exotec.com; a=ed25519; pk=866eH9Bmmpjc+ctgkr5T1uXxBefZzob3tEEuiVWZ6BI= Introduce vendor-specific PHY tunable identifiers to control the KSZ87xx low-loss cable erratum handling through the ethtool PHY tunable interface. The following tunables are added: - a boolean "short-cable" tunable, applying a documented and conservative preset intended for short or low-loss Ethernet cables; - an integer LPF bandwidth tunable, allowing advanced adjustment of the receiver low-pass filter bandwidth; - an integer DSP EQ initial value tunable, allowing advanced tuning of the PHY equalizer initialization. The actual behavior is implemented by the corresponding PHY and switch drivers. Reviewed-by: Marek Vasut Reviewed-by: Nicolai Buchwitz Signed-off-by: Fidelio Lawson --- include/uapi/linux/ethtool.h | 3 +++ net/ethtool/common.c | 3 +++ net/ethtool/ioctl.c | 7 +++++++ 3 files changed, 13 insertions(+) diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h index 1cdfb8341df2..a2091d4e00f3 100644 --- a/include/uapi/linux/ethtool.h +++ b/include/uapi/linux/ethtool.h @@ -291,6 +291,9 @@ enum phy_tunable_id { ETHTOOL_PHY_DOWNSHIFT, ETHTOOL_PHY_FAST_LINK_DOWN, ETHTOOL_PHY_EDPD, + ETHTOOL_PHY_SHORT_CABLE_PRESET, + ETHTOOL_PHY_LPF_BW, + ETHTOOL_PHY_DSP_EQ_INIT_VALUE, /* * Add your fresh new phy tunable attribute above and remember to update * phy_tunable_strings[] in net/ethtool/common.c diff --git a/net/ethtool/common.c b/net/ethtool/common.c index 84ec88dee05c..a24d3a8a9ec1 100644 --- a/net/ethtool/common.c +++ b/net/ethtool/common.c @@ -101,6 +101,9 @@ phy_tunable_strings[__ETHTOOL_PHY_TUNABLE_COUNT][ETH_GS= TRING_LEN] =3D { [ETHTOOL_PHY_DOWNSHIFT] =3D "phy-downshift", [ETHTOOL_PHY_FAST_LINK_DOWN] =3D "phy-fast-link-down", [ETHTOOL_PHY_EDPD] =3D "phy-energy-detect-power-down", + [ETHTOOL_PHY_SHORT_CABLE_PRESET] =3D "phy-short-cable-preset", + [ETHTOOL_PHY_LPF_BW] =3D "phy-lpf-bandwidth", + [ETHTOOL_PHY_DSP_EQ_INIT_VALUE] =3D "phy-dsp-eq-init-value", }; =20 #define __LINK_MODE_NAME(speed, type, duplex) \ diff --git a/net/ethtool/ioctl.c b/net/ethtool/ioctl.c index bd97f9b9bf18..11d757ba1265 100644 --- a/net/ethtool/ioctl.c +++ b/net/ethtool/ioctl.c @@ -3114,6 +3114,7 @@ static int ethtool_phy_tunable_valid(const struct eth= tool_tunable *tuna) switch (tuna->id) { case ETHTOOL_PHY_DOWNSHIFT: case ETHTOOL_PHY_FAST_LINK_DOWN: + case ETHTOOL_PHY_SHORT_CABLE_PRESET: if (tuna->len !=3D sizeof(u8) || tuna->type_id !=3D ETHTOOL_TUNABLE_U8) return -EINVAL; @@ -3123,6 +3124,12 @@ static int ethtool_phy_tunable_valid(const struct et= htool_tunable *tuna) tuna->type_id !=3D ETHTOOL_TUNABLE_U16) return -EINVAL; break; + case ETHTOOL_PHY_LPF_BW: + case ETHTOOL_PHY_DSP_EQ_INIT_VALUE: + if (tuna->len !=3D sizeof(u32) || + tuna->type_id !=3D ETHTOOL_TUNABLE_U32) + return -EINVAL; + break; default: return -EINVAL; } --=20 2.54.0 From nobody Wed Jun 10 11:01:14 2026 Received: from mail-wm1-f49.google.com (mail-wm1-f49.google.com [209.85.128.49]) (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 DB16C3EE1FA for ; Tue, 9 Jun 2026 16:20:14 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.49 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781022016; cv=none; b=lXqHmxfcTrd7MjEI672wMKoYJDJ7/kXKYTL2bHs8EPsRZfsEjI71xgjp+yRNoggBfBJ7EgM3SP83bIFNY5S960IjGUuvpAuvkeAGHx3ZxOLfyCL8bMRZZrG/xh+Y+yijhlfR5MODFHmhBkdLqc0ohLcwK4vJwmV2cjx6xDvNDdA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1781022016; c=relaxed/simple; bh=1Bg3HIc+ul+IspMj6051G4PzpB0IZb8XCU6ZrH5Ac1Q=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=M23e88+i7RiBAlBvetcYeqGSK522a/K6CsV3cGzgxNCJGnfl78rD96W5qq0mO5Ndkn1jU6kOWrtFRPx7pJSvwgwBlKGNrEJbIy91QPI+Z7NLrSRv36ZLpu2/gvpnkdwccW6G9TgYN7+1Vy6DC6sx4oHl+NeU/HKCPxvg21YX1vk= 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=f/uItbS9; arc=none smtp.client-ip=209.85.128.49 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="f/uItbS9" Received: by mail-wm1-f49.google.com with SMTP id 5b1f17b1804b1-490ac10e337so50386655e9.3 for ; Tue, 09 Jun 2026 09:20:14 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1781022013; x=1781626813; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=Ky91/+dXFXBr1oY6G2Cx8JO9XPTiajugIHZP2YcNqRA=; b=f/uItbS96P4HYPMPmbPzXG7h95yUzY6GYRJb1H/qlzPs+VuDOyVeNkBpFcJSEi3AL3 Tw13uNSk47RNNjB8jwz6DSvHBCE22X9QlbsDlvFP1HhcsqwBt1VDeTCdUq8t/OwwhcfT wA/B004rdqoaEpi7Qg1e/vc8U0TYVVzZetPVPlToFAYdsOhEsxa8cj0EpGT9uMZc7k14 dDJoJfS2noOoeym/gzzUZ2LO6H4Dsj+vORS6HxLyTigxfAmCjzb70SeGE4RDGh4sSUej DY3PNk01jYawTh8ezO0AjdnF4cPsaQb36ThMZhMaMsEKuIltgCghdA33Yugb+sC6NcbI As8Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1781022013; x=1781626813; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=Ky91/+dXFXBr1oY6G2Cx8JO9XPTiajugIHZP2YcNqRA=; b=gIicBE64UYsm2FD4MTlX+36NPqYaBEDGhSZ+9CH9jSdsl8hQzhWaf2ftrZLYMMQVJ8 AZfcZCnnSPu4O6ytGLHkx2xogL74jLSZSAezkOl3kT4gyDsc56aC5Or0JhcJUOEnMaCF pJLpEESSx2Zj31z+6qh0mlE5NBITlPagNE22f9KFADWoLWGiBClFIo+9/PSRin+8Mhe0 g752tkHqSIerBIEodSy0hD20n8PaKJNrSPzz5bzqBSFim78rXiAHjMlju/eyzerC2m5r wL3gx1rhO47VKV2okGV30EACtcqxlbHwfxynaWoSC2t7FvpzCFdrSD7Gwafz3N/KYY2E rIjw== X-Forwarded-Encrypted: i=1; AFNElJ8GvAKwTnWb2mTVZnzga3gYYS337s4uTpbGkEGEgaG3cd9kL95DV5UZQfVw/1PRD4+tljVeLciO8Nt8jx4=@vger.kernel.org X-Gm-Message-State: AOJu0YyOWOCJ8R/7jto32MaDNTKE6l/sPEzMsy8c0pOHfHBwz5wCe3NL TkHgA2WZJ9p/UCPM3wq/pgYcc3h+uIHeRIP3v0F+AgVLJYlM4rtazv92 X-Gm-Gg: Acq92OEg0tY9O4tSmOBHt8HnXlhokVKbV1wGtD7xNxWJ2ikidQ2UgRFf/B4Nm3yJNTL Lxg5znN8qjKByyht8Yl0uHX04DXM+Ed5Y/r1TQnJxIwMYsI+0ZXDS2SEvIz0rEthAb3ZyY9yvN+ LuJlV96Tcl2uypNKupX40gRElOFtLlSuMKanQpCPGiFuAT4iKcowvgIoLDVqJeSzu8SmdEHW9TF qdzzbztOw9b1Z0xl1EYeFSEEs/LgOs+2VGztyw6eMdVxLNnRAmWsi65Z9uj61VI6EVtlM3ANnf4 xvEHXS9OvKdqc2d0lyyYKGqNsHzxEnaB8eRlMSigXrPYp7UXLv4bcXyLyyrrY1EX1IZvp6AboCF FFgvQaVMV5EOelTOyuudI7XLKs7n/WLL1C7t3kvNSOSdm45iDTpn5dgfSS1w++TisnKbVh7QJ2r AlO77DCj+uzuHUvVbR8yB57nXbe0xZpqZkcKa3gZokn5VBx7MhjoBW+S9hjl+YGStXfqB8+BgLM shMfARGyV1GGj2z5sSf X-Received: by 2002:a05:600c:1908:b0:490:b5d0:598f with SMTP id 5b1f17b1804b1-490c25b5f6cmr350476095e9.13.1781022013221; Tue, 09 Jun 2026 09:20:13 -0700 (PDT) Received: from [127.0.1.1] (cust-east-par-46-193-119-166.cust.wifirst.net. [46.193.119.166]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-490bc391aaasm569116365e9.1.2026.06.09.09.20.12 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 09 Jun 2026 09:20:12 -0700 (PDT) From: Fidelio Lawson X-Google-Original-From: Fidelio Lawson Date: Tue, 09 Jun 2026 18:19:57 +0200 Subject: [PATCH net-next v10 3/3] net: phy: micrel: expose KSZ87xx low-loss cable tunables Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20260609-ksz87xx_errata_low_loss_connections-v10-3-9ba4418cf3db@exotec.com> References: <20260609-ksz87xx_errata_low_loss_connections-v10-0-9ba4418cf3db@exotec.com> In-Reply-To: <20260609-ksz87xx_errata_low_loss_connections-v10-0-9ba4418cf3db@exotec.com> To: Woojung Huh , UNGLinuxDriver@microchip.com, Andrew Lunn , Vladimir Oltean , "David S. Miller" , Eric Dumazet , Jakub Kicinski , Paolo Abeni , Marek Vasut , Maxime Chevallier , Simon Horman , Heiner Kallweit , Russell King , Tristram Ha Cc: Woojung Huh , netdev@vger.kernel.org, linux-kernel@vger.kernel.org, Nicolai Buchwitz , Fidelio Lawson , Marek Vasut X-Mailer: b4 0.15.2 X-Developer-Signature: v=1; a=ed25519-sha256; t=1781022010; l=3643; i=fidelio.lawson@exotec.com; s=20260326; h=from:subject:message-id; bh=1Bg3HIc+ul+IspMj6051G4PzpB0IZb8XCU6ZrH5Ac1Q=; b=gcBJd0pbSowT/2sK4Orvuh8Oyi1LRIS0wtGAyBpM9DbpnSAC1YG6ehm2i9farh2sDcWg0bGCt kEjBLYheW9QDvHUD5Bl75OHkUJ6hdV4ZaYEj06ypr3WTUPbcHxD90kT X-Developer-Key: i=fidelio.lawson@exotec.com; a=ed25519; pk=866eH9Bmmpjc+ctgkr5T1uXxBefZzob3tEEuiVWZ6BI= Add support for the KSZ87xx low-loss cable PHY tunables in the Micrel PHY driver by implementing get_tunable and set_tunable callbacks. These callbacks expose vendor-specific PHY tunables used to control the KSZ87xx embedded PHY receiver behavior when operating with short or low-loss Ethernet cables. The tunables provide: - a boolean short-cable preset applying known good settings; - an integer LPF bandwidth control; - an integer DSP EQ initial value control. The Micrel PHY driver forwards these tunables via standard phy_read() / phy_write() operations, which are virtualized by the KSZ8 DSA driver and translated into the appropriate indirect switch register accesses. Reviewed-by: Marek Vasut Reviewed-by: Nicolai Buchwitz Signed-off-by: Fidelio Lawson --- drivers/net/phy/micrel.c | 61 ++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 61 insertions(+) diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index e211a523c258..55df5efcfc86 100644 --- a/drivers/net/phy/micrel.c +++ b/drivers/net/phy/micrel.c @@ -287,6 +287,12 @@ /* PHY Control 2 / PHY Control (if no PHY Control 1) */ #define MII_KSZPHY_CTRL_2 0x1f #define MII_KSZPHY_CTRL MII_KSZPHY_CTRL_2 + +/* Vendor-specific Clause 22 register, virtualized by KSZ87xx embedded PHY= s DSA driver */ +#define MII_KSZ87XX_SHORT_CABLE 0x1a +#define MII_KSZ87XX_LPF_BW 0x1b +#define MII_KSZ87XX_EQ_INIT 0x1c + /* bitmap of PHY register to set interrupt mode */ #define KSZ8081_CTRL2_HP_MDIX BIT(15) #define KSZ8081_CTRL2_MDI_MDI_X_SELECT BIT(14) @@ -940,6 +946,59 @@ static int ksz8795_match_phy_device(struct phy_device = *phydev, return ksz8051_ksz8795_match_phy_device(phydev, false); } =20 +static int ksz8795_get_tunable(struct phy_device *phydev, + struct ethtool_tunable *tuna, void *data) +{ + int ret; + + switch (tuna->id) { + case ETHTOOL_PHY_SHORT_CABLE_PRESET: + ret =3D phy_read(phydev, MII_KSZ87XX_SHORT_CABLE); + if (ret < 0) + return ret; + *(u8 *)data =3D ret; + return 0; + case ETHTOOL_PHY_LPF_BW: + ret =3D phy_read(phydev, MII_KSZ87XX_LPF_BW); + if (ret < 0) + return ret; + *(u32 *)data =3D ret & 0xff; + return 0; + case ETHTOOL_PHY_DSP_EQ_INIT_VALUE: + ret =3D phy_read(phydev, MII_KSZ87XX_EQ_INIT); + if (ret < 0) + return ret; + *(u32 *)data =3D ret & 0xff; + return 0; + default: + return -EOPNOTSUPP; + } +} + +static int ksz8795_set_tunable(struct phy_device *phydev, + struct ethtool_tunable *tuna, const void *data) +{ + u32 val; + + switch (tuna->id) { + case ETHTOOL_PHY_SHORT_CABLE_PRESET: + return phy_write(phydev, MII_KSZ87XX_SHORT_CABLE, + *(const u8 *)data); + case ETHTOOL_PHY_LPF_BW: + val =3D *(const u32 *)data; + if (val > 0xff) + return -EINVAL; + return phy_write(phydev, MII_KSZ87XX_LPF_BW, (u8)val); + case ETHTOOL_PHY_DSP_EQ_INIT_VALUE: + val =3D *(const u32 *)data; + if (val > 0xff) + return -EINVAL; + return phy_write(phydev, MII_KSZ87XX_EQ_INIT, (u8)val); + default: + return -EOPNOTSUPP; + } +} + static int ksz9021_load_values_from_of(struct phy_device *phydev, const struct device_node *of_node, u16 reg, @@ -6961,6 +7020,8 @@ static struct phy_driver ksphy_driver[] =3D { /* PHY_BASIC_FEATURES */ .config_init =3D kszphy_config_init, .match_phy_device =3D ksz8795_match_phy_device, + .get_tunable =3D ksz8795_get_tunable, + .set_tunable =3D ksz8795_set_tunable, .suspend =3D genphy_suspend, .resume =3D genphy_resume, }, { --=20 2.54.0