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
- signature.asc [application/pgp-signature] 833 bytes