From nobody Sat Jun 13 21:27:25 2026 Received: from mail-wm1-f44.google.com (mail-wm1-f44.google.com [209.85.128.44]) (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 2F66B38550C for ; Tue, 5 May 2026 11:42:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.44 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777981338; cv=none; b=j8EKSo2axBXYAtGTA+dReRkbh9OxexfyoMLgrKN6H4jmI0kosFN6h7QghtBY3faXFGrUhvtlgoUZnCRgeZpyDtDV+W3f6ZOxTMxUiHppiiU9yLl0sW6rdkG5NL8wWqLbx66mF2ntsFr38rtbyy93ipKgLGrgWVXGQcQl4z3uY0g= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777981338; c=relaxed/simple; bh=0DBYZ0OHc96PubhDLfpSi/6exkt0TeIh+xxJ/cwExT0=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=tUxXVKuMrToJ674VJIeSMww+Lm3vi0Ys/jSspS1DfI+X2Xqlr2i3mhKd/JVaDNXjpx0CUgqTGRXKyEl/f67SHcsWIeIpMn2zmikx2Snnd6lDu7DsgQO/z2Eerx7OKaM45kPnV8YLBIWmiUL8J/gMiAOCEomaP3chdDvo54+tXQ8= 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=BMO57CxF; arc=none smtp.client-ip=209.85.128.44 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="BMO57CxF" Received: by mail-wm1-f44.google.com with SMTP id 5b1f17b1804b1-4891c00e7aeso43247495e9.2 for ; Tue, 05 May 2026 04:42:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777981335; x=1778586135; 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=RW58Mnrr7EFtwPBQY9NqzeHFutqbTyM7rMgnNzRPTkY=; b=BMO57CxFuyKwjuVOofh6sI7nZMw71GPNWpw0wFE6ypeJF0/0hhXHoVrvhgQhS2M4Yy h/IdLyde87a1be8PFrnGqeeicDR2sl+3A0bk85I51Dyy25wpWCX02eEIfXB9ExRRZoUK AwOKzs1XKzbkmvBem6E2IDKaZKURepzLsl6ujeGlkewlAwe0FJIFHrP0Vr4RelnevgY8 c/cTXEBSx2ILLHe6bU6MzbRUloPcbA10KC3aBTJQW2CZ9DTBSaTCDbOIz4a1rAsVfewx exVDcVTuda2qafLelxPBkKNytBv3Kryq4Op7nZOcQHgsb8Gj80FyyB4GMejx1hhoKPG6 R9pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777981335; x=1778586135; 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=RW58Mnrr7EFtwPBQY9NqzeHFutqbTyM7rMgnNzRPTkY=; b=V6c5Dh58igEAJnzAgh8trlE4YFPgnlM2YctDunavaa/MwVkh0UWqBm3tpm3vFQMwg4 OpT8/h6B5vrc0AMZlm6KeIayLoH1ZoPmaK7LGcYLTtOZahCiV+SHA60RKFIZT9hr6gHu mDqJ1NLiEQq7LAK0x6f4scbJViO2EM2sUVUHbz4JOY8we8Bok1LTaUXuXI2/HFlGalpG lfbA/ZSQmPJzXW9NgdCh7wzM1TLLzzRSmXDVj7YQu/Wuoe+u8EMJhU1wUULcq68RLz38 aD+YPdqJ8HhNwUyGFvmFet7UCqL2455PJ+eIVrUQvGf63sQkJN9koT1yuwH1NqU6gnkw 2cWA== X-Forwarded-Encrypted: i=1; AFNElJ8Ep1CGu+0ybDqNJsatcaD7gNTT7bgQxeNwkKyj2H4xIu91XnN3zpJWLQtTR7C4dJ1uD7+uL4Gq23EdYKE=@vger.kernel.org X-Gm-Message-State: AOJu0Yy/6rUR9uonv/hmBTGbOULvWfAMidoB0BORfOorhumlF7ATH5W4 wDRBfjDLowV4kI8+hbSQMZamgV3p+gANjWaEqyLALYAVSNRe0al3OYXl X-Gm-Gg: AeBDieuLYx+P3l/4XiztFDlqfrhCO8UDthzdJv30jBDcIJfEcVMXm8ic+R9aqtQ0Pwb VQOLyET04sY1BAYaRhkWitbViwc0JkIiWuhkn8JqFOy8+xo3GYAUJTcx87BcKf8SiYIEekshLu4 WnixCMKlTtkPiAwdrcDao3g+iuFxk7HYcJHTlP5qvYB+LhBuqBfjd6Z6VNzruYSLvPGtQFgPLQ1 wLoHUBNohdfe6BPojzHjcuoceWEBkrDQq3RwKbBA/d0dM+nrYoQ230IJIimRxTsnaq41mTLy6LS KbYg2PpukbiQ7Qu7Xu4xhxWwLJTzGKaHwGLGFGwScNu6brwXZ1+ASacUJ6Ry8NPsCpxn7oBMGyj VvZAYVeVlWbCnr0cXzOywmaAbAO9YwmU9FiirxHRD7A+hbK15uCyNGwlVY8kWaWjgigb76bo4vd 19f5ck0f7Z4kXn/J+4cqPnONSSCWJJA+8TCHqJWf7gZZhTOPedv7/efvO++2OLyvQvQAyDFU217 VIe8oTjLwIpyLKSqXduNtaDERBGkuDg X-Received: by 2002:a05:600c:a30a:b0:489:149a:f9e6 with SMTP id 5b1f17b1804b1-48d18cef14dmr29090035e9.28.1777981335228; Tue, 05 May 2026 04:42:15 -0700 (PDT) Received: from [127.0.1.1] (2a02-8434-6628-bc01-577d-da52-626d-d378.rev.sfr.net. [2a02:8434:6628:bc01:577d:da52:626d:d378]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48a8eb69698sm616575105e9.1.2026.05.05.04.42.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 May 2026 04:42:14 -0700 (PDT) From: Fidelio Lawson X-Google-Original-From: Fidelio Lawson Date: Tue, 05 May 2026 13:42:10 +0200 Subject: [PATCH v5 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: <20260505-ksz87xx_errata_low_loss_connections-v5-1-da4002b21c42@exotec.com> References: <20260505-ksz87xx_errata_low_loss_connections-v5-0-da4002b21c42@exotec.com> In-Reply-To: <20260505-ksz87xx_errata_low_loss_connections-v5-0-da4002b21c42@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, Fidelio Lawson X-Mailer: b4 0.15.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1777981333; l=7914; i=fidelio.lawson@exotec.com; s=20260326; h=from:subject:message-id; bh=0DBYZ0OHc96PubhDLfpSi/6exkt0TeIh+xxJ/cwExT0=; b=xEYsXFV81GdeuHZkY/KVZIIrpVaxU7LclQupkEk96HaGoCH0TwCi1J1ThauveCV0lZN/Djyqg k62UkBJkGzwCqKa4SfzTjkoljmlz7l7N3ex4dQVITGfK2EERE1b8EGA X-Developer-Key: i=fidelio.lawson@exotec.com; a=ed25519; pk=866eH9Bmmpjc+ctgkr5T1uXxBefZzob3tEEuiVWZ6BI= Implement the "Module 3: Equalizer fix for short cables" erratum from Microchip document DS80000687C for KSZ87xx switches. 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. Fixes: e66f840c08a2 ("net: dsa: ksz: Add Microchip KSZ8795 DSA driver") Signed-off-by: Fidelio Lawson --- drivers/net/dsa/microchip/ksz8.c | 73 ++++++++++++++++++++++++++++++= ++++ drivers/net/dsa/microchip/ksz8.h | 1 + drivers/net/dsa/microchip/ksz8_reg.h | 24 ++++++++++- drivers/net/dsa/microchip/ksz_common.h | 4 ++ 4 files changed, 101 insertions(+), 1 deletion(-) diff --git a/drivers/net/dsa/microchip/ksz8.c b/drivers/net/dsa/microchip/k= sz8.c index c354abdafc1b..62fc59c3da7e 100644 --- a/drivers/net/dsa/microchip/ksz8.c +++ b/drivers/net/dsa/microchip/ksz8.c @@ -1058,6 +1058,22 @@ int ksz8_r_phy(struct ksz_device *dev, u16 phy, 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; @@ -1271,6 +1287,35 @@ int ksz8_w_phy(struct ksz_device *dev, u16 phy, u16 = reg, u16 val) if (ret) return ret; break; + case PHY_REG_KSZ87XX_SHORT_CABLE: + if (!ksz_is_ksz87xx(dev)) + return -EOPNOTSUPP; + 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; + /* Only accept LPF bandwidth bits [7:6] */ + if (val & ~KSZ87XX_LPF_VALID_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; + /* 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; } @@ -2096,11 +2141,39 @@ int ksz8463_w_phy(struct ksz_device *dev, u16 phy, = u16 reg, u16 val) return 0; } =20 +int ksz87xx_apply_low_loss_preset(struct ksz_device *dev, bool enable) +{ + /* 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) + return 0; + 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; +} + int ksz8_switch_init(struct ksz_device *dev) { dev->cpu_port =3D fls(dev->info->cpu_ports) - 1; dev->phy_port_cnt =3D dev->info->port_cnt - 1; dev->port_mask =3D (BIT(dev->phy_port_cnt) - 1) | dev->info->cpu_ports; + dev->lpf_bw =3D KSZ87XX_PHY_LPF_90MHZ; + dev->eq_init =3D KSZ87XX_DSP_EQ_INIT_FACTORY; =20 return 0; } diff --git a/drivers/net/dsa/microchip/ksz8.h b/drivers/net/dsa/microchip/k= sz8.h index 0f2cd1474b44..5cf7bd90af0f 100644 --- a/drivers/net/dsa/microchip/ksz8.h +++ b/drivers/net/dsa/microchip/ksz8.h @@ -66,5 +66,6 @@ int ksz8_all_queues_split(struct ksz_device *dev, int que= ues); u32 ksz8463_get_port_addr(int port, int offset); int ksz8463_r_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 *val); int ksz8463_w_phy(struct ksz_device *dev, u16 phy, u16 reg, u16 val); +int ksz87xx_apply_low_loss_preset(struct ksz_device *dev, bool enable); =20 #endif diff --git a/drivers/net/dsa/microchip/ksz8_reg.h b/drivers/net/dsa/microch= ip/ksz8_reg.h index 332408567b47..cd41214f874e 100644 --- a/drivers/net/dsa/microchip/ksz8_reg.h +++ b/drivers/net/dsa/microchip/ksz8_reg.h @@ -202,6 +202,13 @@ #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 */ + +#define KSZ87XX_DSP_EQ_VALID_MASK GENMASK(5, 0) +#define KSZ87XX_LPF_VALID_MASK GENMASK(7, 6) + /* For KSZ8765. */ #define PORT_REMOTE_ASYM_PAUSE BIT(5) #define PORT_REMOTE_SYM_PAUSE BIT(4) @@ -342,7 +349,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 +736,21 @@ #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_90MHZ 0x00 +#define KSZ87XX_PHY_LPF_62MHZ 0x40 +#define KSZ87XX_PHY_LPF_55MHZ 0x80 +#define KSZ87XX_PHY_LPF_44MHZ 0xC0 + +/* Low-loss workaround DSP EQ INIT VALUE */ +#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 929aff4c55de..482e79cf6ae6 100644 --- a/drivers/net/dsa/microchip/ksz_common.h +++ b/drivers/net/dsa/microchip/ksz_common.h @@ -219,6 +219,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 Sat Jun 13 21:27:25 2026 Received: from mail-wm1-f50.google.com (mail-wm1-f50.google.com [209.85.128.50]) (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 B731C38AC79 for ; Tue, 5 May 2026 11:42:17 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.50 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777981340; cv=none; b=bvvIuiU5PYRODDLMIM57BdsckblxapbtBKEI6n8I5cexQ+suxJvGmtUrw7siittB79hlkUojDeIxF/IRqJpIugEJYNqiyLsATIyoDXMgR5Btyth2E7TbGHloocdxDSVoOW7hCtqIbjPK/GJoG56o/SnH2kk7yUI24mEsEikBNSA= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777981340; c=relaxed/simple; bh=gx7A00isc7RmHttEx52KE0RV6KvQzLxU1Ys+dmiy2c8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=itA8HkOtiREa/dRFtCB4Q5OvvQevENE4J/rfyu0rVGE+1g6yCoL37kbCLBrLpiHvOKwNo1Kzs48q8hEPr73HdKYF9Ybdf1qd1i9jWsBcCbdpmVBfMsnsg9b5jnlsWpBl/KzBGPKtADYf/3DRKQ/G+i0ZYYjPcC3wdimMk2F4OBQ= 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=erBGyO8a; arc=none smtp.client-ip=209.85.128.50 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="erBGyO8a" Received: by mail-wm1-f50.google.com with SMTP id 5b1f17b1804b1-48a563e4ef7so49728415e9.0 for ; Tue, 05 May 2026 04:42:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777981336; x=1778586136; 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=x4cXplLEpKYnCchclmkDMqifsuTXLnl5XMB3nAYB268=; b=erBGyO8anYU3l3LJ6uzJTLLdWGkNAc1dBLWu5FUDiJdYsFKiL5yEysNp5vnQvT5/jZ aMvr/eYERgd4/YA6th5tuT6AmJVoEarJxoTp/im36GwrAzVgCUjmFEsar3T99dxJf1Aa ABXYM+DmruRn8k2/HpEwIQcsH1kgqwpaUWn7ASR5v7OV48XnTLx2Fmz/8yvIDQtrIJtT QdtV8zk5Zpa+gc2Xr/uvZfHe2+UvvNKKY8Q5e7Qu7oFROMi+qdUP0Zg1TYf8NbKSc+Wy b+b0fF9TwW5tMOZJ1lbuw6OIyyHxo+SQTqCwC3UkpRys0WILJBOkpMHQ474vusQeJFOe 9yeQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777981336; x=1778586136; 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=x4cXplLEpKYnCchclmkDMqifsuTXLnl5XMB3nAYB268=; b=RjTSJm2MM1fkrSL9aFQKmIQVnB8xNhWW+mTur2McOffY5p9iC4VCutaDfl9MCtDeDb 6Dr4QdGeJbcJqZET1a2+58RRMeppDB9AvxyVUABFYcjlxaLms7E4EwkcGv9+UoCOuMzu Mt2KEaoUy/EXa2mU5erXiprZYOeehDcgLIf4uTioqMCLpQ9ejkdNkv4m2W0bVdFY5NBP p5YE7QaPFOSWtM4SQTw32nTARJ0+rGl1iYvWIP+LQhWZMIGicnAFLOSJTFbbEIyNhqsB ueFn44YVGOF/OyRS3UbYY1WSGcbmcZehNix9PaUbj/aUDGTy/fsa4iT+vG/9JqLj872P cEvA== X-Forwarded-Encrypted: i=1; AFNElJ/Z7WgLgcydDD5dgDb+wc9vw7eCGC4iO1ODAeANyEnc117sjUnaoM8ajB4svkZ1DQfU9AdqbCT1jxvRJN4=@vger.kernel.org X-Gm-Message-State: AOJu0Yyg3Yi+awUPulrWo5TPjn3cO56rLkTJfFikRTL4j2BTF6kxqFmj EKL9jyVIsWCyMJ6mpM5zbl1r4asqeWmaNHAzih58bfyxTQ9yjEyG8+RO X-Gm-Gg: AeBDieteunIULvDebN74u8b80ojnknlYJiC8HrzVfqrJVw15NIZssKccAz6ZzcMeMu/ +BnV0y8it7omT7cuejqk9dnIrj6c0WTASJhunZQgOu1/g6MWzxMAu5AFI7uW2jSJNJvPXaYoybd p+pnZt+ZnPp379Q3b/J0Wsez3npDYfOlvisxwJCBcRkN7dMsnWYFHuxOY12xVR+WTrWyaVEcm9V 2lii5hYLVffzefxM5vZPpVgprVFMGiWt4QC5FYWKeEKbRHquS+4ujVBLm/2GBXjQz+WKukmVPMx U4/pC3AYKDD+X0EUAHJi/mIT3uuz5wTyy3zbTT2gw0W1ltMMwqDdq+1RQ8R87aMkU9ntgOWfaLu uRCMYUaHAr+/Fmi8KybYVaCNOnGR0PYLX52HM5bQCu27kS3xqqMfLpIo761JvAVk/gyZuhjTHei bdKvDK/V4GPo+UYWQ2ZBgCvD+ahQUwpjN1ZbeUXmhBEpisTp6IHSIDmZ/NAsZsI1CRuHuHHOREu BdFWM2i9dHUONB0Ikcnf/PZJfFyniCWDyu0+hgPPqs= X-Received: by 2002:a05:600c:3496:b0:488:c40b:c8a4 with SMTP id 5b1f17b1804b1-48d186dc879mr43982575e9.1.1777981336111; Tue, 05 May 2026 04:42:16 -0700 (PDT) Received: from [127.0.1.1] (2a02-8434-6628-bc01-577d-da52-626d-d378.rev.sfr.net. [2a02:8434:6628:bc01:577d:da52:626d:d378]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48a8eb69698sm616575105e9.1.2026.05.05.04.42.15 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 May 2026 04:42:15 -0700 (PDT) From: Fidelio Lawson X-Google-Original-From: Fidelio Lawson Date: Tue, 05 May 2026 13:42:11 +0200 Subject: [PATCH v5 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: <20260505-ksz87xx_errata_low_loss_connections-v5-2-da4002b21c42@exotec.com> References: <20260505-ksz87xx_errata_low_loss_connections-v5-0-da4002b21c42@exotec.com> In-Reply-To: <20260505-ksz87xx_errata_low_loss_connections-v5-0-da4002b21c42@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, Fidelio Lawson X-Mailer: b4 0.15.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1777981333; l=2581; i=fidelio.lawson@exotec.com; s=20260326; h=from:subject:message-id; bh=gx7A00isc7RmHttEx52KE0RV6KvQzLxU1Ys+dmiy2c8=; b=/dOqb+MbAD44sY/ssNLfyWqATYjy24hquZlfDrWmurG2RHQC7GCU3+Uo+PHQhybPvs1j248V+ ExwyDP0EU/5CVctEh6ECvjyZ1m/MZB2iOSSebINjjZrEWuAa88mL5GT 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. Signed-off-by: Fidelio Lawson --- include/uapi/linux/ethtool.h | 3 +++ net/ethtool/common.c | 3 +++ net/ethtool/ioctl.c | 3 +++ 3 files changed, 9 insertions(+) diff --git a/include/uapi/linux/ethtool.h b/include/uapi/linux/ethtool.h index b74b80508553..081d8f2191b6 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 e252cf20c22f..9c2fe5b626d6 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 ff4b4780d6af..5b66e4a96f67 100644 --- a/net/ethtool/ioctl.c +++ b/net/ethtool/ioctl.c @@ -3109,6 +3109,9 @@ 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: + case ETHTOOL_PHY_LPF_BW: + case ETHTOOL_PHY_DSP_EQ_INIT_VALUE: if (tuna->len !=3D sizeof(u8) || tuna->type_id !=3D ETHTOOL_TUNABLE_U8) return -EINVAL; --=20 2.54.0 From nobody Sat Jun 13 21:27:25 2026 Received: from mail-wm1-f45.google.com (mail-wm1-f45.google.com [209.85.128.45]) (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 61053390CBF for ; Tue, 5 May 2026 11:42:18 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.45 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777981339; cv=none; b=lOxoMFfaC7A4HcjcjhDFp7Pm/ebNrRlSwJb9GPUMGQ0qIP0/jmUefeahjGDOTrmBfHdcWUL68cd+0iR5I0xLBrd4T8pCVXMx298IjpCt2lvZrE14HzeWX13bK2PeGUgnyIf7yLdTQ8RWRm/FPnjITjAB/29KFEMeAiXKXNtChUI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1777981339; c=relaxed/simple; bh=gOC5G/MjEcU+cjPbczT1n5fBRi/QDZzNd3idAG37qfk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=UCPVyBhI7g24af2/8Xkeb/stzUa3vgrC+z+n5mMOBZcCNPkBp6j2gO5gMMwAAGgsbB+0d2dYAznIR3nlaq/pM2HZbhyTZYTHp6TODO+NDUZ8kwRQNjZFsq6ULJteFJFqvRjzzAcitG2DkJRb9GJz6Pmn8Gmaj1WDc0m8xfZke+Y= 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=KVh3PKLl; arc=none smtp.client-ip=209.85.128.45 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="KVh3PKLl" Received: by mail-wm1-f45.google.com with SMTP id 5b1f17b1804b1-48d102471a4so18312245e9.2 for ; Tue, 05 May 2026 04:42:18 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1777981337; x=1778586137; 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=1/sImLCWBGmuwdARQysC0FgKop+Arozoc5YO1W6z3wo=; b=KVh3PKLlWT9M/LE21UuCio2PDX04lU9WAKY211FB3I8+kJnWD6xKe0hlclFsDeN7/X guPkyStcSpgw5W2g8Pb+xIbichAYfsFz2+0MoxUVl99ak/6Eu9BVZ9952gTaFOSbm5xg Vc+IFYRgyG3g+bEJZIFU1mpoT5Ow4k663CUQiCUT3xVvXHy73384oHwLwTGg77yZ9fvt Q5sEKRgPc99Ge69mlZqlGe++Sb4fuOrBvo/Y7oTHJ/RyYLOt9RIKvkxoJOF6pyZ4OxRY z0zTaTDzu5S5YHXunVfRo5xACWfhknDwe2NBYgvMobXMjtIkiCxzbCgpFHRI5+fQqi8/ nycQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1777981337; x=1778586137; 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=1/sImLCWBGmuwdARQysC0FgKop+Arozoc5YO1W6z3wo=; b=dlAZrxJCtgHPOiYEo1FEHG3e6V+FL0M18mSKweja1jKF+09OcGxZzqEQ7jkYztRH2o nkDpNo01g/7pKCQMJ22Z7KsS/BRo9Qft0ydpYdHawR6Q4yt+tW/9OPwH3vE8WHVn/n58 5x2fqqh2LUGTaWkar2ybYGbXgDMi83f2RVT6iCpc0DG0sYPAAyXbO7+3Sk2Pkp8PH+G6 a+hGkfVTUonBOxXm2sOabQrtFsgkmUfsAgQ6UfzO/7RTD+V/BUpdRCXCW5WLzRmPJrZP H38ga1hozX80IK6QBrBET4QdAZKmtxU4LsAiODxnc2qlLvtlnFFrWnvfL3Y14qagrJf2 +uSg== X-Forwarded-Encrypted: i=1; AFNElJ8gQ5Wa1A380nzerZrQAv9CJXBVLcGDbydtrAUNsKlVCUO1nnG/1SXa6WbKU+ZiVdSsKo2B5yX4o0709oQ=@vger.kernel.org X-Gm-Message-State: AOJu0YxE2eKMhxR7CC+Kwy76hmDRrfL4sAgh9SztuCsqkLrtcnXedZyi 2UWMdUiszPELlf1R741vGnnNrAsizPjYN6t3DdMmgbNltK/ShTvLFmJj X-Gm-Gg: AeBDiescprYB7dq1jdm7VTW8nPyB/p9riqzYHOBt24V71E99+BbKaDlILAubyL8tjhP 7TtADOHxQKKEjbO0F848MtLUzdFrF0a8MaWV0md2DMzQ5VCmZ69X64Me0LexqHFIpSyeHKejVc6 iX6U3E5Hz9L7CfwiMEyRNpn9olsaGY8e3Iw+5XNeDtMD+boGT9l5yQuoazC8nmcFxH296TYicck KifOW3j66oQQnb/I7yLpsnjplxYkEyz2piIvIBs1CZmXiLyY0Gfe7el0SeoLzAQhqvUzGDhjLaP PX6gSdQ7aoo5aFERUglWhpOH68AXIXQTkcLruvB5ybv1VZcK42qkNHIwuWbWojc0xSJp+sBp4MG 7NIdCsIeppYkXJ41t7zHh7ZeJj0lmR8X5yaVRZ/4lcVG9UJcpnYESMM/lzBNgBjGZePU896rii5 6nzR8ZqNVSsSQWDvwFHL9dZ+y8sYU0PaReGl5lS0UCKY/MRl6YFpD0Zg5wPyXk5paUbyAR7NtfK FgL6ae0kJumUjN1qq2IMfCXJJNgpnxQ X-Received: by 2002:a05:600c:6388:b0:488:b239:77ec with SMTP id 5b1f17b1804b1-48a98895044mr194228095e9.17.1777981336733; Tue, 05 May 2026 04:42:16 -0700 (PDT) Received: from [127.0.1.1] (2a02-8434-6628-bc01-577d-da52-626d-d378.rev.sfr.net. [2a02:8434:6628:bc01:577d:da52:626d:d378]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-48a8eb69698sm616575105e9.1.2026.05.05.04.42.16 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 05 May 2026 04:42:16 -0700 (PDT) From: Fidelio Lawson X-Google-Original-From: Fidelio Lawson Date: Tue, 05 May 2026 13:42:12 +0200 Subject: [PATCH v5 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: <20260505-ksz87xx_errata_low_loss_connections-v5-3-da4002b21c42@exotec.com> References: <20260505-ksz87xx_errata_low_loss_connections-v5-0-da4002b21c42@exotec.com> In-Reply-To: <20260505-ksz87xx_errata_low_loss_connections-v5-0-da4002b21c42@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, Fidelio Lawson X-Mailer: b4 0.15.0 X-Developer-Signature: v=1; a=ed25519-sha256; t=1777981333; l=3380; i=fidelio.lawson@exotec.com; s=20260326; h=from:subject:message-id; bh=gOC5G/MjEcU+cjPbczT1n5fBRi/QDZzNd3idAG37qfk=; b=cZ8Jo/F68xUeo70cAO7FyTm9qrPQU5bF9dqlHQLsEY/7X50J2+RNguABjp71u1s1PSvKpNdfd lMp8RbWbGt7B1Vl+wWpdSVQSw5H0xNenM0j4D61XJdXxNOTA6zFEXqw 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. Signed-off-by: Fidelio Lawson --- drivers/net/phy/micrel.c | 54 ++++++++++++++++++++++++++++++++++++++++++++= ++++ 1 file changed, 54 insertions(+) diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c index c6b011a9d636..1852e9bd0e01 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,52 @@ static int ksz8795_match_phy_device(struct phy_device = *phydev, return ksz8051_ksz8795_match_phy_device(phydev, false); } =20 +static int ksz87xx_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; + *(u8 *)data =3D ret; + return 0; + case ETHTOOL_PHY_DSP_EQ_INIT_VALUE: + ret =3D phy_read(phydev, MII_KSZ87XX_EQ_INIT); + if (ret < 0) + return ret; + *(u8 *)data =3D ret; + return 0; + default: + return -EOPNOTSUPP; + } +} + +static int ksz87xx_set_tunable(struct phy_device *phydev, + struct ethtool_tunable *tuna, const void *data) +{ + u8 val =3D *(const u8 *)data; + + switch (tuna->id) { + case ETHTOOL_PHY_SHORT_CABLE_PRESET: + return phy_write(phydev, MII_KSZ87XX_SHORT_CABLE, val); + case ETHTOOL_PHY_LPF_BW: + return phy_write(phydev, MII_KSZ87XX_LPF_BW, val); + case ETHTOOL_PHY_DSP_EQ_INIT_VALUE: + return phy_write(phydev, MII_KSZ87XX_EQ_INIT, val); + default: + return -EOPNOTSUPP; + } +} + static int ksz9021_load_values_from_of(struct phy_device *phydev, const struct device_node *of_node, u16 reg, @@ -6809,6 +6861,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 ksz87xx_get_tunable, + .set_tunable =3D ksz87xx_set_tunable, .suspend =3D genphy_suspend, .resume =3D genphy_resume, }, { --=20 2.54.0