All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH net-next] net: phy: micrel: Add loopback support for ksz9131
@ 2026-07-28  7:52 Maxime Chevallier
  2026-07-28 19:58 ` Andrew Lunn
  2026-07-30 11:20 ` patchwork-bot+netdevbpf
  0 siblings, 2 replies; 3+ messages in thread
From: Maxime Chevallier @ 2026-07-28  7:52 UTC (permalink / raw)
  To: Andrew Lunn, davem, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Russell King, Heiner Kallweit
  Cc: Maxime Chevallier, netdev, linux-kernel, thomas.petazzoni

ksz9131 is configured for local loopback in a similar fashion as the
ksz9031, with a need for full-duplex operation, but with some extra
steps to take as specified in section 4.13.1 :

1. Configure the following registers:
- MMD 1C, Register 15 = EEEE
- MMD 1C, Register 16 = EEEE
- MMD 1C, Register 18 = EEEE
- MMD 1C, Register 1B = EEEE

These 4 registers are marked as "Reserved" in the register map.

When setting loopback up without configuring these 4 registers, the PHY
appears to shut its RXC down, which can trigger failures on MACs that
require it, such as stmmac.

The datasheet does not specify to which state the registers must be
reset when disabling loopback, so let's restore them to their measured
initial values.

This was discovered when trying to use stmmac selftests on imx8mp with a
ksz9131 connected in RGMII.

Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>
---
 drivers/net/phy/micrel.c | 60 ++++++++++++++++++++++++++++++++++++++++
 1 file changed, 60 insertions(+)

diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c
index 55df5efcfc86..ae830781824b 100644
--- a/drivers/net/phy/micrel.c
+++ b/drivers/net/phy/micrel.c
@@ -1161,6 +1161,65 @@ static int ksz9031_set_loopback(struct phy_device *phydev, bool enable,
 				     5000, 500000, true);
 }
 
+/* KSZ9131-specific sequence to enable loopback, registers are undocumented
+ * in the datasheet but mentionned in the local loopback mode configuration
+ * steps.
+ *
+ * Without taking these steps, the PHY appears to disable its RXC while in
+ * loopback mode, which may be needed by some MACs such as stmmac.
+ */
+static int ksz9131_loopback_enable(struct phy_device *phydev)
+{
+	int ret;
+
+	ret = phy_write_mmd(phydev, 0x1c, 0x15, 0xeeee);
+	if (ret)
+		return ret;
+
+	ret = phy_write_mmd(phydev, 0x1c, 0x16, 0xeeee);
+	if (ret)
+		return ret;
+
+	ret = phy_write_mmd(phydev, 0x1c, 0x18, 0xeeee);
+	if (ret)
+		return ret;
+
+	return phy_write_mmd(phydev, 0x1c, 0x1b, 0xeeee);
+}
+
+/* KSZ9131 datasheet doesn't state how to deal with the MMD 0x1c registers
+ * when disabling loopback.
+ *
+ * Set them back to their measured initial state when disabling loopback, and
+ * ignore errors while doing so.
+ */
+static void ksz9131_loopback_disable(struct phy_device *phydev)
+{
+	phy_write_mmd(phydev, 0x1c, 0x15, 0x6eff);
+	phy_write_mmd(phydev, 0x1c, 0x16, 0xe6ff);
+	phy_write_mmd(phydev, 0x1c, 0x18, 0x43ff);
+	phy_write_mmd(phydev, 0x1c, 0x1b, 0x07ff);
+}
+
+static int ksz9131_set_loopback(struct phy_device *phydev, bool enable,
+				int speed)
+{
+	int ret;
+
+	if (enable) {
+		ret = ksz9131_loopback_enable(phydev);
+		if (ret)
+			return ret;
+	}
+
+	ret = ksz9031_set_loopback(phydev, enable, speed);
+
+	if (ret || !enable)
+		ksz9131_loopback_disable(phydev);
+
+	return ret;
+}
+
 static int ksz9031_of_load_skew_values(struct phy_device *phydev,
 				       const struct device_node *of_node,
 				       u16 reg, size_t field_sz,
@@ -6993,6 +7052,7 @@ static struct phy_driver ksphy_driver[] = {
 	.cable_test_start	= ksz9x31_cable_test_start,
 	.cable_test_get_status	= ksz9x31_cable_test_get_status,
 	.get_features	= ksz9477_get_features,
+	.set_loopback	= ksz9131_set_loopback,
 }, {
 	PHY_ID_MATCH_MODEL(PHY_ID_KSZ8873MLL),
 	.name		= "Micrel KSZ8873MLL Switch",
-- 
2.55.0


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [PATCH net-next] net: phy: micrel: Add loopback support for ksz9131
  2026-07-28  7:52 [PATCH net-next] net: phy: micrel: Add loopback support for ksz9131 Maxime Chevallier
@ 2026-07-28 19:58 ` Andrew Lunn
  2026-07-30 11:20 ` patchwork-bot+netdevbpf
  1 sibling, 0 replies; 3+ messages in thread
From: Andrew Lunn @ 2026-07-28 19:58 UTC (permalink / raw)
  To: Maxime Chevallier
  Cc: Andrew Lunn, davem, Eric Dumazet, Jakub Kicinski, Paolo Abeni,
	Russell King, Heiner Kallweit, netdev, linux-kernel,
	thomas.petazzoni

On Tue, Jul 28, 2026 at 09:52:20AM +0200, Maxime Chevallier wrote:
> ksz9131 is configured for local loopback in a similar fashion as the
> ksz9031, with a need for full-duplex operation, but with some extra
> steps to take as specified in section 4.13.1 :
> 
> 1. Configure the following registers:
> - MMD 1C, Register 15 = EEEE
> - MMD 1C, Register 16 = EEEE
> - MMD 1C, Register 18 = EEEE
> - MMD 1C, Register 1B = EEEE
> 
> These 4 registers are marked as "Reserved" in the register map.
> 
> When setting loopback up without configuring these 4 registers, the PHY
> appears to shut its RXC down, which can trigger failures on MACs that
> require it, such as stmmac.
> 
> The datasheet does not specify to which state the registers must be
> reset when disabling loopback, so let's restore them to their measured
> initial values.
> 
> This was discovered when trying to use stmmac selftests on imx8mp with a
> ksz9131 connected in RGMII.
> 
> Signed-off-by: Maxime Chevallier <maxime.chevallier@bootlin.com>

Reviewed-by: Andrew Lunn <andrew@lunn.ch>

    Andrew

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [PATCH net-next] net: phy: micrel: Add loopback support for ksz9131
  2026-07-28  7:52 [PATCH net-next] net: phy: micrel: Add loopback support for ksz9131 Maxime Chevallier
  2026-07-28 19:58 ` Andrew Lunn
@ 2026-07-30 11:20 ` patchwork-bot+netdevbpf
  1 sibling, 0 replies; 3+ messages in thread
From: patchwork-bot+netdevbpf @ 2026-07-30 11:20 UTC (permalink / raw)
  To: Maxime Chevallier
  Cc: andrew+netdev, davem, edumazet, kuba, pabeni, linux, hkallweit1,
	netdev, linux-kernel, thomas.petazzoni

Hello:

This patch was applied to netdev/net-next.git (main)
by Paolo Abeni <pabeni@redhat.com>:

On Tue, 28 Jul 2026 09:52:20 +0200 you wrote:
> ksz9131 is configured for local loopback in a similar fashion as the
> ksz9031, with a need for full-duplex operation, but with some extra
> steps to take as specified in section 4.13.1 :
> 
> 1. Configure the following registers:
> - MMD 1C, Register 15 = EEEE
> - MMD 1C, Register 16 = EEEE
> - MMD 1C, Register 18 = EEEE
> - MMD 1C, Register 1B = EEEE
> 
> [...]

Here is the summary with links:
  - [net-next] net: phy: micrel: Add loopback support for ksz9131
    https://git.kernel.org/netdev/net-next/c/a5c6ae8de11e

You are awesome, thank you!
-- 
Deet-doot-dot, I am a bot.
https://korg.docs.kernel.org/patchwork/pwbot.html



^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2026-07-30 11:20 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-07-28  7:52 [PATCH net-next] net: phy: micrel: Add loopback support for ksz9131 Maxime Chevallier
2026-07-28 19:58 ` Andrew Lunn
2026-07-30 11:20 ` patchwork-bot+netdevbpf

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.