From: Andrew Lunn <andrew@lunn.ch>
To: Aleksei Sviridkin <f@lex.la>
Cc: netdev@vger.kernel.org, andrew+netdev@lunn.ch,
hkallweit1@gmail.com, linux@armlinux.org.uk, davem@davemloft.net,
edumazet@kernel.org, kuba@kernel.org, pabeni@redhat.com,
horms@kernel.org, olteanv@gmail.com, Thangaraj.S@microchip.com,
UNGLinuxDriver@microchip.com, steve.glendinning@shawell.net,
f.fainelli@gmail.com, linux-usb@vger.kernel.org,
linux-kernel@vger.kernel.org
Subject: Re: [PATCH net v11 4/4] net: phy: restore the interrupt when the generic bind cycle fails
Date: Sun, 27 Sep 2026 20:38:35 +0200 [thread overview]
Message-ID: <b1bd8944-2a0a-4140-ace0-0bc9a771c33f@lunn.ch> (raw)
In-Reply-To: <20260926235024.705646-5-f@lex.la>
On Sun, Sep 27, 2026 at 02:50:24AM +0300, Aleksei Sviridkin wrote:
> phy_attach_direct() binds the generic driver by hand, and the probe it
> calls is phy_probe(), which replaces phydev->irq with PHY_POLL before
> either point the hand-bind can fail at. That failure unwinds on a label
> of its own, which does not go through phy_detach(), so the substitution
> outlives a bind cycle that never completed and a later attach finds a
> PHY that can only be polled. Found on a Keenetic KN-1012 while placing
> the restore of the previous patch, as the other exit of the same bind
> cycle.
>
> Save phydev->irq on entry and put it back on that label. The unwind runs
> inside the call that made the substitution, so the value from before it
> is known exactly. The bus table the previous patch reads from would be
> wrong here twice over: it does not hold a PHY_MAC_INTERRUPT that a MAC
> wrote into phydev->irq alone, and the label is also reached when a
> second attach of an attached PHY fails its bind, where the field is
> live.
>
> The store is not ordered against a concurrent bind: this unwind, like
> the hand-bind it undoes, runs without the device lock that
> device_bind_driver() asks its callers to hold.
>
> Fixes: 6d9f66ac7fec ("net: phy: Fix PHY module checks and NULL deref in phy_attach_direct()")
> Assisted-by: LLM
> Signed-off-by: Aleksei Sviridkin <f@lex.la>
> ---
>
> Notes:
> Both points the hand-bind can fail at are reachable. phy_probe() reaches
> genphy_read_abilities() through genphy_driver's .get_features, and that
> returns the error from phy_read(phydev, MII_BMSR); device_bind_driver()
> returns whatever driver_sysfs_add() got, from either of its two
> sysfs_create_link() calls or from the coredump attribute.
>
> A failed genphy bind leaves the device with no driver bound at all, so the
> next driver to arrive binds directly and never goes through phy_detach().
> That is why patch 3 cannot cover this path, and why the Fixes: tag here is
> 6d9f66ac7fec rather than the one patch 3 carries. That commit did not
> introduce the lost number - the substitution is far older - it created this
> second exit from the bind cycle, splitting the failure off the label that
> calls phy_detach(). Before it, patch 3 alone would have covered this, so
> that is where the backport range for this one starts.
>
> Exercised on the board described in patch 3, with a debug-only module
> parameter that fails the hand-bound generic probe once for one MDIO
> address. The connect then ends in -EIO rather than the -EINVAL of the
> validation path, so the unwind takes the label this patch touches.
> Measured again for this version, since the value now comes from the
> local: two images of the distribution's 6.18.52 kernel differing only
> by this patch, injected failure at 2.0 s, real driver bound at 6.4 s.
> phydev->irq afterwards reads -1 with patch 3 alone and 15 with this
> one; the three switch ports read 79, 80 and 81 in both.
>
> One difference between the injector and a real failure, since it does not
> affect what was measured but should not be implied away: a genuine error
> inside phy_probe() leaves through its out: label, which re-asserts the PHY
> reset before returning, while the injector returns earlier than that.
> Neither path touches phydev->irq.
Again, way too much text.
Andrew
prev parent reply other threads:[~2026-09-27 18:38 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-26 23:50 [PATCH net v11 0/4] net: phy: keep a PHY interrupt across a generic bind cycle Aleksei Sviridkin
2026-09-26 23:50 ` [PATCH net v11 1/4] net: usb: lan78xx: register the PHY interrupt with the MDIO bus Aleksei Sviridkin
2026-09-27 18:29 ` Andrew Lunn
2026-09-26 23:50 ` [PATCH net v11 2/4] net: usb: smsc95xx: " Aleksei Sviridkin
2026-09-27 18:29 ` Andrew Lunn
2026-09-26 23:50 ` [PATCH net v11 3/4] net: phy: take the interrupt back from the bus on detach Aleksei Sviridkin
2026-09-27 18:35 ` Andrew Lunn
2026-09-26 23:50 ` [PATCH net v11 4/4] net: phy: restore the interrupt when the generic bind cycle fails Aleksei Sviridkin
2026-09-27 18:38 ` Andrew Lunn [this message]
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=b1bd8944-2a0a-4140-ace0-0bc9a771c33f@lunn.ch \
--to=andrew@lunn.ch \
--cc=Thangaraj.S@microchip.com \
--cc=UNGLinuxDriver@microchip.com \
--cc=andrew+netdev@lunn.ch \
--cc=davem@davemloft.net \
--cc=edumazet@kernel.org \
--cc=f.fainelli@gmail.com \
--cc=f@lex.la \
--cc=hkallweit1@gmail.com \
--cc=horms@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-usb@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=netdev@vger.kernel.org \
--cc=olteanv@gmail.com \
--cc=pabeni@redhat.com \
--cc=steve.glendinning@shawell.net \
/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