Thread (13 messages) 13 messages, 4 authors, 2025-05-14

Re: [PATCH net-next 3/3] net: phy: dp83869: Support 1000Base-X SFP modules

From: Romain Gantois <romain.gantois@bootlin.com>
Date: 2025-05-14 13:10:14
Also in: lkml

On Wednesday, 14 May 2025 14:32:22 CEST Andrew Lunn wrote:
quoted
quoted
quoted
+	/* Update advertisement */
+	if (mutex_trylock(&phydev->lock)) {
+		ret = dp83869_config_aneg(phydev);
+		mutex_unlock(&phydev->lock);
+	}
Just skimmed through this quickly and it's not clear to me why aneg is
restarted only if there was no contention on the global phydev lock;
it's not guaranteed a concurrent holder would do the same. If this is
intended, a comment would be welcomed.
The reasoning here is that there are code paths which call
dp83869_port_configure_serdes() with phydev->lock already held, for
example:

phy_start() -> sfp_upstream_start() -> sfp_start() -> \

	sfp_sm_event() -> __sfp_sm_event() -> sfp_sm_module() -> \
	sfp_module_insert() -> phy_sfp_module_insert() -> \
	dp83869_port_configure_serdes()

so taking this lock could result in a deadlock.

mutex_trylock() is definitely not a perfect solution though, but I went
with it partly because the marvell-88x2222 driver already does it this
way, and partly because if phydev->lock() is held, then there's a solid
chance that the phy state machine is already taking care of reconfiguring
the advertisement. However, I'll admit that this is a bit of a shaky
argument.

If someone has a better solution in mind, I'll gladly hear it out, but for
now I guess I'll just add a comment explaining why trylock() is being
used.
The marvell10g driver should be the reference to look at.

As you say, phy_start() will eventually get around to calling
dp83869_config_aneg(). What is more interesting here are the paths
which lead to this function which don't result in a call to
dp83869_config_aneg(). What are those?
Whenever you insert an SFP module, either sfp_irq() or sfp_poll() will will 
detect it and eventually call module_insert() from the SFP state machine. As 
far as I'm aware, this doesn't imply any calls to config_aneg().

Since the DP83869 remaps fiber registers to 0 when we switch it to RGMII-
to-1000Base-X mode, the value in MII_ADVERTISE won't be correct anymore,
which is why we have to reconfigure the advertisement after a module is 
inserted. It doesn't seem like the marvell10g driver does this, and I'm not 
sure why that's the case.

Thanks,

-- 
Romain Gantois, Bootlin
Embedded Linux and Kernel engineering
https://bootlin.com

Attachments

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help