From: netdev-bot+sashiko@kernel.org
To: maxime.chevallier@bootlin.com
Cc: davem@davemloft.net, andrew@lunn.ch, kuba@kernel.org,
edumazet@google.com, pabeni@redhat.com, linux@armlinux.org.uk,
hkallweit1@gmail.com, netdev@vger.kernel.org,
linux-kernel@vger.kernel.org, thomas.petazzoni@bootlin.com,
christophe.leroy@csgroup.eu, herve.codina@bootlin.com,
f.fainelli@gmail.com, vladimir.oltean@nxp.com,
kory.maincent@bootlin.com, kabel@kernel.org,
o.rempel@pengutronix.de, nicveronese@gmail.com, horms@kernel.org,
mwojtas@chromium.org, romain.gantois@bootlin.com,
daniel@makrotopia.org, dimitri.fedrau@liebherr.com,
frank.wunderlich@linux.dev, p.ameruoso@live.it, f@lex.la
Subject: Re: [PATCH net-next v18 04/10] net: phy: Create SFP phy_port before registering upstream
Date: Tue, 29 Sep 2026 00:38:35 +0000 [thread overview]
Message-ID: <179064231538.3145.11825184122943631312@kernel.org> (raw)
In-Reply-To: <20260927133619.955236-5-maxime.chevallier@bootlin.com>
Thank you for your contribution! Sashiko AI review found 2 potential
issue(s) to consider.
Critical: 0 · High: 0 · Medium: 2 · Low: 0
If you believe none of the issues are legitimate, please reply to each
issue of Medium severity or higher and explain why the AI is wrong.
If any of them are legitimate and you plan to respin, please let patchwork
know by including "pw-bot: cr" as a separate line at the end of your reply
(one such reply per series is enough).
- [Medium] This commit fixes a real, user-visible bug but the commit
message calls it preparation only ("This will allow passing the…
- [Medium] Now that module_insert can succeed synchronously inside
phy_sfp_probe() (see the previous finding), it runs before…
--
net: phy: Create SFP phy_port before registering upstream
This commit moves creation of the SFP phy_port in phy_sfp_probe() so that
it happens before sfp_bus_add_upstream() instead of after it. It also
changes phy_setup_sfp_port() to return the port pointer, and reworks the
error path to delete the port and drop the bus reference on failure.
> We can move the port creation before registering the sfp upstream ops,
> as long as we know the SFP bus is there. This will allow passing the
> phy_port along with the upstream information to the SFP bus.
[Severity: Medium]
The message describes this as preparation only. Does the reordering also
fix an existing bug?
Before this patch, phy_sfp_probe() called sfp_bus_add_upstream() before
phy_setup_sfp_port(). Suppose the SFP cage driver has already probed the
module, so sm_mod_state is SFP_MOD_WAITDEV. Two common ways to get there
are a built-in sfp driver with a modular PHY driver loaded later, and an
unbind/rebind of the PHY driver while a module is plugged in. In that
case, registering the upstream runs module_insert synchronously:
phy_sfp_probe()
sfp_bus_add_upstream()
sfp_register_bus()
bus->registered = true;
bus->socket_ops->attach()
sfp_attach()
sfp_sm_event(SFP_E_DEV_ATTACH)
sfp_sm_module() /* SFP_MOD_WAITDEV */
sfp_module_insert()
phy_sfp_module_insert()
The SFP phy_port did not exist yet at that point, so
phy_sfp_module_insert() returned without printing anything:
port = phy_get_sfp_port(phydev);
if (!port)
return -EINVAL;
sfp_sm_module() then moved the module to SFP_MOD_ERROR. It only leaves
that state on SFP_E_REMOVE or SFP_E_INSERT, so the module stayed unusable
until someone physically re-inserted it.
With the port now created before sfp_bus_add_upstream(), this path
succeeds. Should the commit message describe the fix? Should it also have
a Fixes: tag so that stable kernels with the phy_port SFP infrastructure
pick it up? Possible candidates:
d7c6082f7e77 ("net: phy: Introduce generic SFP handling for PHY drivers")
07f3ca9e092c ("net: phy: Create a phy_port for PHY-driven SFPs")
The first made module_insert depend on phy_get_sfp_port(). The second
put the port setup after upstream registration.
> diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
> index c4d2c03b8282b..3c20d4cc1a79d 100644
> --- a/drivers/net/phy/phy_device.c
> +++ b/drivers/net/phy/phy_device.c
[ ... ]
> @@ -1619,30 +1621,46 @@ static int phy_setup_sfp_port(struct phy_device *phydev)
> */
> static int phy_sfp_probe(struct phy_device *phydev)
> {
> + struct phy_port *port = NULL;
> struct sfp_bus *bus;
> - int ret = 0;
> + int ret;
>
> - if (phydev->mdio.dev.fwnode) {
> - bus = sfp_bus_find_fwnode(phydev->mdio.dev.fwnode);
> - if (IS_ERR(bus))
> - return PTR_ERR(bus);
> + if (!phydev->mdio.dev.fwnode)
> + return 0;
>
> - phydev->sfp_bus = bus;
> + bus = sfp_bus_find_fwnode(phydev->mdio.dev.fwnode);
> + if (IS_ERR(bus))
> + return PTR_ERR(bus);
>
> - ret = sfp_bus_add_upstream(bus, phydev, &sfp_phydev_ops);
> - sfp_bus_put(bus);
> + phydev->sfp_bus = bus;
>
> - if (ret)
> - phydev->sfp_bus = NULL;
> + if (bus) {
> + port = phy_setup_sfp_port(phydev);
> + if (IS_ERR(port)) {
> + ret = PTR_ERR(port);
> + goto out_sfp;
> + }
> }
>
> - if (!ret && phydev->sfp_bus) {
> - ret = phy_setup_sfp_port(phydev);
> - if (ret) {
> - sfp_bus_del_upstream(phydev->sfp_bus);
> - phydev->sfp_bus = NULL;
> - }
> + ret = sfp_bus_add_upstream(bus, phydev, &sfp_phydev_ops);
[Severity: Medium]
phy_sfp_module_insert() can now succeed from inside phy_sfp_probe(). What
happens to the phydev->port value it sets there?
Take a PHY whose SFP port is its only port (max_n_ports == 1, such as
at8031, 88e1510 or 88x2222). The synchronous insert does this in
phy_sfp_module_insert():
if (phydev->n_ports == 1)
phydev->port = caps->port;
Then phy_sfp_probe() returns, and phy_setup_ports() unconditionally
overwrites the value:
/* For now, the phy->port field is set as the first active port's type */
list_for_each_entry(port, &phydev->ports, head)
if (port->active) {
phydev->port = phy_port_get_type(port);
break;
}
The SFP port has is_mii set and no mediums, so phy_port_get_type()
returns PORT_OTHER for it.
As a result, a module that is already present when the PHY probes reports
PORT_OTHER. The same module hot-plugged after probe keeps caps->port,
for example PORT_FIBRE or PORT_DA.
qca807x in combo mode appears to have the same problem.
qca807x_configure_serdes() sets phydev->port = PORT_FIBRE during the
synchronous insert. phy_setup_ports() then adds the default copper port
and overwrites phydev->port with PORT_TP. The hot-plug path keeps
PORT_FIBRE.
at803x, 88x2222 and qca807x never recompute phydev->port in read_status,
so the port type that ethtool shows stays wrong until the module is
removed. marvell.c and marvell10g recompute it at runtime.
Before this patch, this path failed with -EINVAL, so the overwrite only
becomes reachable with this reordering. Later patches in the series leave
phy_setup_ports() and phy_sfp_module_insert() unchanged, so the behaviour
remains at the end of the series.
Should phy_setup_ports() leave phydev->port alone when an SFP module was
already inserted during phy_sfp_probe()?
> + if (ret)
> + goto out_port;
[ ... ]
--
Sashiko AI review · https://netdev-ai.bots.linux.dev/sashiko/#/patchset/20260927133619.955236-1-maxime.chevallier%40bootlin.com
next prev parent reply other threads:[~2026-09-29 0:38 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-27 13:36 [PATCH net-next v18 00/10] net: phy_port: SFP modules representation and phy_port listing Maxime Chevallier
2026-09-27 13:36 ` [PATCH net-next v18 01/10] net: phy: phy_link_topology: Add a helper for opportunistic alloc Maxime Chevallier
2026-09-28 9:36 ` Christophe Leroy (CS GROUP)
2026-09-29 0:38 ` netdev-bot+sashiko
2026-09-27 13:36 ` [PATCH net-next v18 02/10] net: phy: phy_link_topology: Track ports in phy_link_topology Maxime Chevallier
2026-09-28 9:37 ` Christophe Leroy (CS GROUP)
2026-09-29 0:38 ` netdev-bot+sashiko
2026-09-27 13:36 ` [PATCH net-next v18 03/10] net: phylink: Register a phy_port for MAC-driven SFP cages Maxime Chevallier
2026-09-28 9:38 ` Christophe Leroy (CS GROUP)
2026-09-29 0:38 ` netdev-bot+sashiko
2026-09-27 13:36 ` [PATCH net-next v18 04/10] net: phy: Create SFP phy_port before registering upstream Maxime Chevallier
2026-09-28 9:40 ` Christophe Leroy (CS GROUP)
2026-09-29 0:38 ` netdev-bot+sashiko [this message]
2026-09-27 13:36 ` [PATCH net-next v18 05/10] net: phy: Represent PHY-less SFP modules with phy_port Maxime Chevallier
2026-09-28 9:42 ` Christophe Leroy (CS GROUP)
2026-09-29 0:38 ` netdev-bot+sashiko
2026-09-27 13:36 ` [PATCH net-next v18 06/10] net: phy: phy_port: Store information about a port's upstream Maxime Chevallier
2026-09-28 9:43 ` Christophe Leroy (CS GROUP)
2026-09-29 0:38 ` netdev-bot+sashiko
2026-09-27 13:36 ` [PATCH net-next v18 07/10] net: phy: phy_link_topology: Add a helper to retrieve ports Maxime Chevallier
2026-09-28 9:43 ` Christophe Leroy (CS GROUP)
2026-09-29 0:38 ` netdev-bot+sashiko
2026-09-27 13:36 ` [PATCH net-next v18 08/10] netlink: specs: Add ethernet port listing with ethtool Maxime Chevallier
2026-09-28 9:47 ` Christophe Leroy (CS GROUP)
2026-09-29 0:38 ` netdev-bot+sashiko
2026-09-27 13:36 ` [PATCH net-next v18 09/10] net: ethtool: Introduce ethtool command to list ports Maxime Chevallier
2026-09-28 9:48 ` Christophe Leroy (CS GROUP)
2026-09-29 0:38 ` netdev-bot+sashiko
2026-09-27 13:36 ` [PATCH net-next v18 10/10] Documentation: networking: Update the phy_port infrastructure description Maxime Chevallier
2026-09-28 10:07 ` Christophe Leroy (CS GROUP)
2026-09-28 17:31 ` [PATCH net-next v18 00/10] net: phy_port: SFP modules representation and phy_port listing Christophe Leroy (CS GROUP)
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=179064231538.3145.11825184122943631312@kernel.org \
--to=netdev-bot+sashiko@kernel.org \
--cc=andrew@lunn.ch \
--cc=christophe.leroy@csgroup.eu \
--cc=daniel@makrotopia.org \
--cc=davem@davemloft.net \
--cc=dimitri.fedrau@liebherr.com \
--cc=edumazet@google.com \
--cc=f.fainelli@gmail.com \
--cc=f@lex.la \
--cc=frank.wunderlich@linux.dev \
--cc=herve.codina@bootlin.com \
--cc=hkallweit1@gmail.com \
--cc=horms@kernel.org \
--cc=kabel@kernel.org \
--cc=kory.maincent@bootlin.com \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=maxime.chevallier@bootlin.com \
--cc=mwojtas@chromium.org \
--cc=netdev@vger.kernel.org \
--cc=nicveronese@gmail.com \
--cc=o.rempel@pengutronix.de \
--cc=p.ameruoso@live.it \
--cc=pabeni@redhat.com \
--cc=romain.gantois@bootlin.com \
--cc=thomas.petazzoni@bootlin.com \
--cc=vladimir.oltean@nxp.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®