[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-Id: <20250823-cisco-1g-sfp-phy-features-v1-1-3b3806b89a22@solid-run.com>
Date: Sat, 23 Aug 2025 16:03:12 +0200
From: Josua Mayer <josua@...id-run.com>
To: Andrew Lunn <andrew@...n.ch>, Heiner Kallweit <hkallweit1@...il.com>,
Russell King <linux@...linux.org.uk>,
"David S. Miller" <davem@...emloft.net>, Eric Dumazet <edumazet@...gle.com>,
Jakub Kicinski <kuba@...nel.org>, Paolo Abeni <pabeni@...hat.com>
Cc: Russell King <rmk+kernel@...linux.org.uk>, netdev@...r.kernel.org,
linux-kernel@...r.kernel.org, Josua Mayer <josua@...id-run.com>
Subject: [PATCH RFC net-next] net: phy: marvell: 88e1111: define gigabit
features
When connecting RJ45 SFP modules to Linux an ethernet phy is expected -
and probed on the i2c bus when possible. Once the PHY probed, phylink
populates the supported link modes for the netdev based on bmsr
register bits set at the time (see phy_device.c: phy_probe).
Marvell phy driver probe function only allocates memory, leaving actual
configuration for config_init callback.
This means the supported link modes of the netdev depend entirely on the
power-on status of the phy bmsr register.
Certain Cisco SFP modules such as GLC-T and GLC-TE have invalid
configuration at power-on: MII_M1111_HWCFG_MODE_COPPER_1000X_AN
This means fiber with automatic negotiation to copper. As the module
exhibits a physical RJ45 connector this configuration is wrong.
As a consequence after power-on the bmsr does not set bits for 10/100
modes.
During config_init marvell phy driver identifies the correct intended
MII_M1111_HWCFG_MODE_SGMII_NO_CLK which means sgmii with automatic
negotiation to copper, and configures the phy accordingly.
At this point the bmsr register correctly indicates support for 10/100
link modes - however the netedev supported modes bitmask is never
updated.
Hence the netdev fails to negotiate or link-up at 10/100
speeds, limiting to 1000 links only.
Explicitly define features for 88e1111 phy to ensure that all supported
modes are available at runtime even when phy power-on configuration was
invalid.
[1] known functional 1Gbps RJ45 SFP module with 88E1111 PHY
[ 75.117858] sfp c2-at-sfp: module LINKTEL LX1801CNR rev 1.0 sn 1172623934 dc 170628
[ 75.127723] drivers/net/phy/sfp-bus.c:284: sfp_parse_support: 1000baseT_Half
[ 75.134779] drivers/net/phy/sfp-bus.c:285: sfp_parse_support: 1000baseT_Full
[ 75.141831] phylink_sfp_module_insert: sfp_may_have_phy - delaying phylink_sfp_config
[ 75.204100] drivers/net/phy/phy_device.c:2942: phy_probe
[ 75.212828] drivers/net/phy/phy_device.c:2961: phy_probe: phydev->drv->probe
[ 75.228017] drivers/net/phy/phy_device.c:2983: phy_probe: genphy_read_abilities
[ 75.246019] drivers/net/phy/phy_device.c:2502: genphy_read_abilities: MII_MARVELL_PHY_PAGE: 0x00
[ 75.263045] drivers/net/phy/phy_device.c:2507: genphy_read_abilities: MII_BMSR: 0x7949
[ 75.279282] sfp_add_phy
[ 75.287150] phylink_sfp_connect_phy: calling phylink_sfp_config with phy settings
[ 75.302778] drivers/net/phy/sfp-bus.c:445: sfp_select_interface: PHY_INTERFACE_MODE_SGMII
[ 75.302778]
[ 75.320600] m88e1111_config_init
[ 75.334333] drivers/net/phy/marvell.c:905: m88e1111_config_init: MII_M1111_PHY_EXT_SR: 0x8084
[ 75.348694] m88e1111_config_init: sgmii
[ 75.364329] drivers/net/phy/marvell.c:787: m88e1111_config_init_hwcfg_mode: MII_M1111_PHY_EXT_SR: 0x8084
[ 75.450737] fsl_dpaa2_eth dpni.0 eth0: PHY [i2c:c2-at-sfp:16] driver [Marvell 88E1111] (irq=POLL)
[ 75.461329] sfp_sm_probe_for_phy: tried to probe clause 22 phy: 0
[ 75.461333] phy detected after 0 retries
Settings for eth0:
Supported ports: [ TP MII FIBRE ]
Supported link modes: 10baseT/Full
100baseT/Full
1000baseT/Full
Supports auto-negotiation: Yes
Advertised link modes: 10baseT/Full
100baseT/Full
1000baseT/Full
Advertised pause frame use: Symmetric Receive-only
Advertised auto-negotiation: Yes
[ 77.445537] sfp c2-at-sfp: module removed
[2] problematic 1Gbps RJ45 SFP module with 88E1111 PHY before this patch
[ 84.463372] sfp c2-at-sfp: module CISCO-AVAGO ABCU-5710RZ-CS2 rev sn AGM1131246C dc 070803
[ 84.473218] drivers/net/phy/sfp-bus.c:284: sfp_parse_support: 1000baseT_Half
[ 84.480267] drivers/net/phy/sfp-bus.c:285: sfp_parse_support: 1000baseT_Full
[ 84.487314] sfp c2-at-sfp: Unknown/unsupported extended compliance code: 0x01
[ 84.487316] phylink_sfp_module_insert: sfp_may_have_phy - delaying phylink_sfp_config
[ 84.548557] drivers/net/phy/phy_device.c:2942: phy_probe
[ 84.557011] drivers/net/phy/phy_device.c:2961: phy_probe: phydev->drv->probe
[ 84.572223] drivers/net/phy/phy_device.c:2983: phy_probe: genphy_read_abilities
[ 84.589831] drivers/net/phy/phy_device.c:2502: genphy_read_abilities: MII_MARVELL_PHY_PAGE: 0x00
[ 84.606107] drivers/net/phy/phy_device.c:2507: genphy_read_abilities: MII_BMSR: 0x149
[ 84.622177] sfp_add_phy
[ 84.631256] phylink_sfp_connect_phy: calling phylink_sfp_config with phy settings
[ 84.631261] drivers/net/phy/sfp-bus.c:445: sfp_select_interface: PHY_INTERFACE_MODE_SGMII
[ 84.631261]
[ 84.650011] m88e1111_config_init
[ 84.667424] drivers/net/phy/marvell.c:905: m88e1111_config_init: MII_M1111_PHY_EXT_SR: 0x9088
[ 84.676137] m88e1111_config_init: sgmii
[ 84.697088] drivers/net/phy/marvell.c:787: m88e1111_config_init_hwcfg_mode: MII_M1111_PHY_EXT_SR: 0x9084
[ 84.794983] fsl_dpaa2_eth dpni.0 eth0: PHY [i2c:c2-at-sfp:16] driver [Marvell 88E1111] (irq=POLL)
[ 84.805537] sfp_sm_probe_for_phy: tried to probe clause 22 phy: 0
[ 84.819781] phy detected after 0 retries
Settings for eth4:
Supported ports: [ TP MII ]
Supported link modes: 1000baseT/Full
1000baseX/Full
Supports auto-negotiation: Yes
Advertised link modes: 1000baseT/Full
1000baseX/Full
[ 86.149536] sfp c2-at-sfp: module removed
Signed-off-by: Josua Mayer <josua@...id-run.com>
---
drivers/net/phy/marvell.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/drivers/net/phy/marvell.c b/drivers/net/phy/marvell.c
index 623292948fa706a2b0d8b98919ead8b609bbd949..2da4b845ef4c854a445be2888c3776e44f24fb33 100644
--- a/drivers/net/phy/marvell.c
+++ b/drivers/net/phy/marvell.c
@@ -3717,7 +3717,7 @@ static struct phy_driver marvell_drivers[] = {
.phy_id = MARVELL_PHY_ID_88E1111,
.phy_id_mask = MARVELL_PHY_ID_MASK,
.name = "Marvell 88E1111",
- /* PHY_GBIT_FEATURES */
+ .features = PHY_GBIT_FIBRE_FEATURES,
.flags = PHY_POLL_CABLE_TEST,
.probe = marvell_probe,
.inband_caps = m88e1111_inband_caps,
---
base-commit: b1c92cdf5af3198e8fbc1345a80e2a1dff386c02
change-id: 20250823-cisco-1g-sfp-phy-features-c0960d945d07
Best regards,
--
Josua Mayer <josua@...id-run.com>
Powered by blists - more mailing lists