From nobody Mon May 25 00:13:50 2026 Received: from mail-wr1-f43.google.com (mail-wr1-f43.google.com [209.85.221.43]) (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 353A733D6D5 for ; Wed, 20 May 2026 08:49:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.43 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779266951; cv=none; b=GfKWRgBCfLedLM4afMw88CsK5Fz6/KFDCvri5E/zU7amRlJJE7PP+ROr/VAdQMivsrqFcvzW+tITSq18cC8x99dzJ+MkiWrkcVyTISeGT2PMN4MnfzKxAyzfz83TPsfHNK8rpyHYYBZzyv9txEPpWufkVHMUZ5lqRVIpvG/Xo8w= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779266951; c=relaxed/simple; bh=H6SGpdaC29K/Zk+eDG+MwjCPxUG2PoHybJvWUO/AYrY=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=XIIdVSa0qb8WLkHiYARDAmS+N8teHkEN3H3Z/Es2QdpCKdGI4S6KVvNODHCXf9DbURsId4kJf8WPFI5ssZIV9+ahD86b26LCObPVeXMT02cbCBHi0ZyRe5x0M4BV7j0TTEy0WeMA0EX664uaC7vzubyz5UQqG7IuZ6gdTVuNkMc= 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=aVdK6q6p; arc=none smtp.client-ip=209.85.221.43 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="aVdK6q6p" Received: by mail-wr1-f43.google.com with SMTP id ffacd0b85a97d-43d73422431so3126440f8f.2 for ; Wed, 20 May 2026 01:49:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779266949; x=1779871749; 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=winpt9D+ghSWBWpkDbNzEDvZl/T9vpO7PHVPp2ovBO0=; b=aVdK6q6pSP8XWIwvSZ1auMxv1ZOKTtxZuXhVLTsqNZsCaWU9fJgoauUaXYju707tsM EdfNelmYVDgErQDjM+gjyU9uR2bD2Q1qcaFYmyUfk7XH6R7tnBYkpzn1cplNrRFRJ642 kQAm5ci2gMv2QskO/NPCaOxonhmPajVlAbt/NkHQNpZ7UR07DLUth7k6pjmziNfppQ+A 1ijLeaBEDxrUrYg3YUdJvRHNPNQ/oNPPwI0uEk8zsGnSapwpMxyNaEI7+LIwK/EyLYtt 74mlVJZcw9LlepIu/BAm9dlfRaGWEzh7U5gls+ADpKvXF60SVSdou/XHuuFla/1Y6JP7 s1gw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779266949; x=1779871749; 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=winpt9D+ghSWBWpkDbNzEDvZl/T9vpO7PHVPp2ovBO0=; b=Ntvh3cP1A3Xhu6/HXV4tRk84+NnKdAgUa5dWDzYaSaWcCg9Ng7Yb79RPJ6lAR2842e nWa9WpFweKMnLes+gt2TBmlqC/2vPJQsDBPJBqtqBj4Sz3L5QaJnTU61BxXtvGCBUolI u/cXvFO8YCXFEebuD0cTYvGOXBYXZZCnpeuvJGluBgcE0ZlFWhEel9D1NX3iKURLbj0u +tuZZIHnF1yu1Rdfq2GQLctBG4JaXat8HjsSNTB1yF9ajuN9gF+F0n8w7efryA4eySTx ovS4KE4Z5Ad4ogZtxBqPx3mKrmPMV5HOwH4HZxBkVCjzMQc00wj74tmjOCbtuoxV5SQa 9CnA== X-Forwarded-Encrypted: i=1; AFNElJ+qLKCL3HhexJtHwaREeCvhh2OZSOzYr+ztFecRVZtomGpI45k7Q384eMzPYPLdXGUaQoOlt0W6SgK1nqs=@vger.kernel.org X-Gm-Message-State: AOJu0YzL6AtNI7S3L29HpzT8VLnApGrwdHk43bCpabzl3idCOxdF1Wsz UV/4MnszsUNAKSqQwn9oSNn3yTGjIxbQ1ltDjIRxDmnQIqbTZ9Ibs5HO X-Gm-Gg: Acq92OG3iqUSPoN5AH8jAA+mIBZhcs83RcKpdf8w/gOEWXalG4IOwINSQHBJUC8XEBb dAkaTZlgM1FDVps0zA/F+ZY4Ej6gBGRKwYUP/nrUexZYkwIaqFDgWlr35HwdsBIETyqe0Axggte XeFJCab34JRoJbNUEOcCz0HZcVav7bUihgZY5TlbxxB8QT336kc1R50FJ9HjDBHxBvy77+1C9RE rSsDDT1NqcV3CEv/uth/QETabET+pRWUP7FoMbYnJChzpB+Sb1mPiEaZvnhL0x7aV8YkvLROZbC wqrnh4VV87/Lan85uUgS0uyz5mUKqBtFU8fNBy1/7+f9NH3SC98LcRF75N4RRzH9stzNuEY6n7e LngkcTKlr9p4o71DQBStkt2Ba783Xdwbzjig4uf/KXaNH4kSWcwNf/za979iSP7OrIr2NEGBG/R KJlHd6CFJnTrc6Xu9jLf7KzSoTFCSa9a543yb5MmPuSSkVYPVeHWR43OVbQcWsBzruqT0BHv2QL 0tE9HCW+A== X-Received: by 2002:a5d:588c:0:b0:43c:cf25:f29a with SMTP id ffacd0b85a97d-45e5c5bbd6bmr37315849f8f.8.1779266948516; Wed, 20 May 2026 01:49:08 -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 ffacd0b85a97d-45d9ec39806sm51244283f8f.9.2026.05.20.01.49.07 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 May 2026 01:49:08 -0700 (PDT) From: Fidelio Lawson X-Google-Original-From: Fidelio Lawson Date: Wed, 20 May 2026 10:48:56 +0200 Subject: [PATCH v6 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: <20260520-ksz87xx_errata_low_loss_connections-v6-1-43f33d4aaf0f@exotec.com> References: <20260520-ksz87xx_errata_low_loss_connections-v6-0-43f33d4aaf0f@exotec.com> In-Reply-To: <20260520-ksz87xx_errata_low_loss_connections-v6-0-43f33d4aaf0f@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=1779266946; l=8023; i=fidelio.lawson@exotec.com; s=20260326; h=from:subject:message-id; bh=H6SGpdaC29K/Zk+eDG+MwjCPxUG2PoHybJvWUO/AYrY=; b=z1HLvAITzAVXl3TMNS0BWs9GhiqVjo4lArqLu7kko6VkZNkMsA0vOhv7VKhMQ/YOr/jMtyRzc WMruFEemiCeC+ox5ximAQcrxDqGL1YcELKaBX4xPxZcMps04bFqSsUq 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 Reviewed-by: Marek Vasut --- drivers/net/dsa/microchip/ksz8.c | 78 ++++++++++++++++++++++++++++++= ++++ drivers/net/dsa/microchip/ksz8.h | 1 + drivers/net/dsa/microchip/ksz8_reg.h | 23 +++++++++- drivers/net/dsa/microchip/ksz_common.h | 4 ++ 4 files changed, 105 insertions(+), 1 deletion(-) diff --git a/drivers/net/dsa/microchip/ksz8.c b/drivers/net/dsa/microchip/k= sz8.c index c354abdafc1b..656a28c4dd52 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_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; + /* 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,44 @@ 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..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 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 Mon May 25 00:13:50 2026 Received: from mail-wr1-f42.google.com (mail-wr1-f42.google.com [209.85.221.42]) (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 D98CF367B64 for ; Wed, 20 May 2026 08:49:10 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.42 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779266952; cv=none; b=Q+CUzDS6LOZ4hWIwRpm7JjXyLIFTvj+3rSO49+TVE/ukE1cNrpDdM1/vzAdi5GsKlSBJSkMHhO7lwKtTGqz0MNJ9Tncxl+4tVtxgAoraDhaBLEMHwEDh0GcsZ1Y+Ml7tm0OdW2odAdwCMSoQGHUK8cFwkYS1UZZhPa51tgORXTk= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779266952; c=relaxed/simple; bh=gx7A00isc7RmHttEx52KE0RV6KvQzLxU1Ys+dmiy2c8=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=EDkxibJu6xaSLOvONP4KggrNo+2E5xRRyuxeZvPcbkIj79HvrP8Aoeq+ad/x2eprrsR9pPSyiddHIOzwoJQ1mURCBCprR3xc0i5hU6Ro7JAtPZemi+eBPueqc/mhunGdOb3bTcLJoFQTxT8VWbZPy1XT6fhXM3BDni4GA8lyHSM= 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=Fihijkvt; arc=none smtp.client-ip=209.85.221.42 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="Fihijkvt" Received: by mail-wr1-f42.google.com with SMTP id ffacd0b85a97d-43d734223e4so2922028f8f.0 for ; Wed, 20 May 2026 01:49:10 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779266949; x=1779871749; 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=Fihijkvtv5ek77Toz+4RbbFspq5BlGMZ1YCIYGFGp3UFTCHblO5rb/RQWBxCnIi6PS fH4aiF9RB6b4NHEXxh4/xz1gO5wVK/UO9HjFrI+8VXhI8M5Y4eHQW2s/06qtFkewVcd5 Tkw7nCB7+LF2zTzalbEWKDHWOtG53FRLI+oDs/SrVkaWCPmtNFsR0X1KlMZQ8hFnojUJ 0i9DHVzpJMb4x7lTlWsx+z4NgcBWI7RTKoYatoHldnILMl7nfIneL+X0aldq9XelZ/r3 CQylgCVaMkjZOOcNEUx3UEECX5vk6yMbmihgILpzyHQLF9MuB9kY2j4rLdquXIyRFBXy JqMQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779266949; x=1779871749; 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=R8MUjZQlYSHn68S8+CACGBRWHrCfX6AVkYzrqVfRqIvF+oK+uxe9xexwzTwvvYcH+c EyxSmSvrDiF1/jGvq2kUYgew/AKBOpJONyCJtVQZFhm18F2A7z1sU0f5JNxutH6lR8d+ +FYbOPL0KfeP4gTiHXomO7Tq9A0AI9rVWCjnyrwXBehGR2Q/3Wlo7z4V2AW0BjZHjdms eQxxwH+mzFg4MtLZWOIeAg1t0mlZkU5SyLBMbbQ5Mgmf6yBZF7ls7GLFz8+vUd7Wmpy+ KqHwbcvEjXj+DjSnl5sfnGb44rPY7rRHlSHV2XJQ944fAYSkbfd8otS0Jv0K+qgdda51 fweA== X-Forwarded-Encrypted: i=1; AFNElJ8PhOn3fPLGOtlmux9LXfPGYQjqi4IaxsZxNnui5nmbviqjveF7en/3IQQenKx7hnYdksJuLfcLO3RGCzE=@vger.kernel.org X-Gm-Message-State: AOJu0YwH3ppyXNf2l5vgJoRgfYtyzYsCe5QFAJ8+jQBJjpWs0OAEnSjh NDwbGpnC0Oo0ezMYAYTt4dML1GxgVLJbooWipTndrPy2R/nC8l4rS+w8 X-Gm-Gg: Acq92OHDkIyWahwTSCbuJyF6X7I19jBrlkJOxd5XxKXveHx3udAIfWUnLW7bJhBipKD ADT8IU5lALjZ8YU3fEY6VFLM479zKmVcHJ5DtTI5/gd0qSvkT6/1GwzpL7n/v1UK/VOTZd/R31P w70FHRf9BroadBUbhAj7QDhrJO8pKEd1pFXfMj/TrhfIMjpUu1I6SOIcaAj+SskIldFozJ1/I+L wkMI1Zo+UGNddOZAptMGRWF0tLvVf9rymKV+5qKnyx+rFEMxI5T5rFQYlCvP/1yUJZpWeEBrXXb E1kaXBU8OgxUOUDPEz7svu4VMz3eFnbVe7bM8jR8qsEDASzMOPMS4b7Gd3gFNSmMa9UUcMd++k5 4LQ4uX7vdcfVD/I+Jz6I8gkuaWAqiyOMWdZLIT6erstL9rQFndphuFmzCdKRhiX6uXrs7f5CzTA jE3fvz5ErFXIC0H4Zq3znk3hlMCH4xR/OrbbpjZYhzFqiL9GEmIp9sGqvAwPyFKaLBCfDp3LhCr 2Tiw19F6w== X-Received: by 2002:a05:6000:2885:b0:44b:5a37:36c4 with SMTP id ffacd0b85a97d-45d941b198fmr44851329f8f.26.1779266949221; Wed, 20 May 2026 01:49:09 -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 ffacd0b85a97d-45d9ec39806sm51244283f8f.9.2026.05.20.01.49.08 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 May 2026 01:49:09 -0700 (PDT) From: Fidelio Lawson X-Google-Original-From: Fidelio Lawson Date: Wed, 20 May 2026 10:48:57 +0200 Subject: [PATCH v6 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: <20260520-ksz87xx_errata_low_loss_connections-v6-2-43f33d4aaf0f@exotec.com> References: <20260520-ksz87xx_errata_low_loss_connections-v6-0-43f33d4aaf0f@exotec.com> In-Reply-To: <20260520-ksz87xx_errata_low_loss_connections-v6-0-43f33d4aaf0f@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=1779266946; l=2581; i=fidelio.lawson@exotec.com; s=20260326; h=from:subject:message-id; bh=gx7A00isc7RmHttEx52KE0RV6KvQzLxU1Ys+dmiy2c8=; b=PAjhy3pxHd5CswMBeXxsyZ7t2LNWU1+WZ8sWa6vob26nuZODzTgIffh8LY87HPoFCHJyWbkcf qVMrIF21RatB4O6a3U4zBVsR96hKF4nuKEbAPTLc2cGoSnUH+wmfIcQ 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 Reviewed-by: Marek Vasut --- 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 Mon May 25 00:13:50 2026 Received: from mail-wr1-f54.google.com (mail-wr1-f54.google.com [209.85.221.54]) (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 2D66C3AF643 for ; Wed, 20 May 2026 08:49:12 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.221.54 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779266953; cv=none; b=N3F9cPqsfv13+YBqA3X+vUqppO9kQJeHzHBhVGWMgFkb8IMbEDzZXzqmv8NZl6mS8ZySqU90wxlzXqb8ZT3B5QwBvnGThkvYORpYP8xK60NZUv0cZUvNG4XyqoJh+oYxGljWq6BSMUOBf+pTP+uY55uYw4XJKKSi/+8nii528WE= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1779266953; c=relaxed/simple; bh=hLquf2FXjFMX5gDHDJVCQehd9khx7qm22bITTcuq5Mk=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=BN+QW0eENLGPczDw+vQ+8NFOAEQLq4woz2tVszDSQn5dVwir6MQi5PF8P+p/4E0mgR/mD726B1oYTjckKXQdMNYlMPWOi0tYzL7/ZrS4j7CQsU3+2s6uDiSr9kQA/7TZRi39AN56nFs8JhYO170ZqI4GA/rqgXXgYNz/P55nxoA= 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=V66aSMa2; arc=none smtp.client-ip=209.85.221.54 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="V66aSMa2" Received: by mail-wr1-f54.google.com with SMTP id ffacd0b85a97d-44509921fbcso2841667f8f.3 for ; Wed, 20 May 2026 01:49:11 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20251104; t=1779266950; x=1779871750; 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+LElh/p4H7Jl1wglSsGBgLSISpuoKZ91ueSbuYJV04=; b=V66aSMa2ffQLDmr4NUxe4t91JgwAG2SMkaVm3LMPzLCjdcVpsCSe2n+jN/PfGaziXU puITKL2OmhgWZKE7z0h+TN0yD5maYg2r5deD+LfrpGePmhDPy/fZVbXaXBHhlIzma6SI phUEGd1nY+Lbvx4VllZn6lERQRsdWPjtXcTS0FVrpGa8WAElRrxARfzp+8L1wrr+/aZ+ 2RON1awj8fXc/c+4Z+xlQrk7xkJfBqaTlBvvsN7SgEFNSlyVyQQXJaPLGhyhCo/gYj7n pWNvJyd2seu6caUyBIYTCcSg29jNUyRFJ/Up30YkUpKNzKviGlQYUYhSch6wHIfkn08l VIjA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1779266950; x=1779871750; 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+LElh/p4H7Jl1wglSsGBgLSISpuoKZ91ueSbuYJV04=; b=KhUEi9zf8PxYOjLj5fOwdbXPbI2dY2rAd8iJNSBjTnk5QL1yhpNtWRCEardofyVb8R i0BMZYfdSTFrd/N7YnNT5sawzDlEl6XIt6dRZxxPlC1UusCdwCkNjNbULR3kAhayU5Cw RnPn0cSJzHvQuMPr9igTdTNI8X11L50vMDMIYwlwKpJv/TucJguCQxc8rC5faHMQFy2F eL/tM7ZcIuHQ7WwLJSHXhwxCmLH3g865a/caGzOYjXmqUCa4HGNXr5Jqt4K9fEUBnHxp juDPwrRTVLSqn3MRs4+SjkORPIOxM/IL7SFfRJW0HynJMnBcNrXR45tZdWoVGw7V7nn7 6lkA== X-Forwarded-Encrypted: i=1; AFNElJ+AOZrUCDE+q2uprCkq4sTuwMObuyhXPaNBVizU/je/EUxJTgB8gFW+xUXvSslZceOSHunOcdyvHXEfn2Y=@vger.kernel.org X-Gm-Message-State: AOJu0YwazwiJfK8TPmj46rA0xe9DbSHAOc+5aTu5pekN+iSEBk+yKDmH 0l/rjTioqtRcugw6u1G9WzROeCDa4xAZycrrSrUH71J9Z+hTKMroJtSE X-Gm-Gg: Acq92OHXyHZ2iuSxn55n7QaF20gZTlYqxiXa239DRY0TCD7tQfBRv8Lc14vSX4VcmUm BNW0eqOv/QyAKKi4HH2ojfNVqjDNTv0VzLri1FRPOTj1wXoz5iB42f7wnIfzuz439cVRjEIZQsC 3+ZiZ3q4sydiLga9yk7zJaAQOF9cUHAHICARvNffkXk4FT6WMbvCp4ceDpDk2yJQ7qKpJxULPxt 1wSpqViuR05ib6GNEPZ2sKdzAfRfhkp6SJiHP+hMGkHNj3D0jbokbT6vsD3UqdDscP382cY9o6p VGhM6+puYdPubJ/w/arbRqHYL0nJG68sedO402aH3XbhZAtLYZWnkRpZot+bsKVO38YFdJK/e5i xKscDEH/jwPlyhhBS0zjyQHPHgCwAwX156jfCMLkpnevnp3kg8hDSzQOiGajaVbrzmLWP3raHVY qAm4pODLfgSK2rjX64ddxNWb7UjKgC2pSLpRwF98DtD/QsuDV+QwOTCxPFDiUn66kaE4kV9lLm6 mdCNYVIcA== X-Received: by 2002:a05:6000:2489:b0:43f:e2b7:7160 with SMTP id ffacd0b85a97d-45e5c58fe72mr35661001f8f.4.1779266950168; Wed, 20 May 2026 01:49:10 -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 ffacd0b85a97d-45d9ec39806sm51244283f8f.9.2026.05.20.01.49.09 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 May 2026 01:49:09 -0700 (PDT) From: Fidelio Lawson X-Google-Original-From: Fidelio Lawson Date: Wed, 20 May 2026 10:48:58 +0200 Subject: [PATCH v6 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: <20260520-ksz87xx_errata_low_loss_connections-v6-3-43f33d4aaf0f@exotec.com> References: <20260520-ksz87xx_errata_low_loss_connections-v6-0-43f33d4aaf0f@exotec.com> In-Reply-To: <20260520-ksz87xx_errata_low_loss_connections-v6-0-43f33d4aaf0f@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=1779266946; l=3380; i=fidelio.lawson@exotec.com; s=20260326; h=from:subject:message-id; bh=hLquf2FXjFMX5gDHDJVCQehd9khx7qm22bITTcuq5Mk=; b=cK4F35M8B0Cw0K9VbWlMCM/PYKwoXdxSE1gp9f8kEryPtpA5EG3yWedCT00iVzwV/zfGOPYjf yie7gI25W0OB2xE7yQ3Pko6XUj/xosLmM5Lxd7cJFx8N7706HJO4osH 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 Reviewed-by: Marek Vasut --- 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..da91ef992361 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 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; + *(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 ksz8795_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 ksz8795_get_tunable, + .set_tunable =3D ksz8795_set_tunable, .suspend =3D genphy_suspend, .resume =3D genphy_resume, }, { --=20 2.54.0