.../devicetree/bindings/net/ethernet-phy.yaml | 6 + drivers/net/phy/phylink.c | 220 +++++++++++++++++- 2 files changed, 219 insertions(+), 7 deletions(-)
On the Keenetic KN-1012 (MT7981B with an MT7531 switch), the Airoha
EN8811H behind lan4 has its PHY driver built as a module on the root
filesystem. The switch sets up its ports before that filesystem is
mounted, so the port is validated against the generic driver, fails its
phy-mode and stays dead for the uptime. DSA does not retry it.
Let the PHY node say so with needs-host-firmware and have phylink poll
for the PHY instead of giving up. Patch 1 adds the property, patch 2
does the waiting; the reasoning is in the patches.
A late bringup failure has to leave pl->phydev clear, because the
poller reads a set pl->phydev as a PHY that arrived by another path.
v3 depended on a pending phylink fix for that; it went in as commit
a940003f44e7 ("net: phylink: record the PHY only once bringup cannot
fail"), so this series applies to net-next on its own.
Tested on that board with both patches and a940003f44e7 backported to
its OpenWrt 6.18 kernel. The retry runs used a local debug parameter,
not part of this series, that fails the connect after a successful
attach a given number of times; the switch was unbound and rebound
with the PHY driver unbound, so the poller was waiting when the driver
was bound by hand:
- at boot the switch set up its ports at 2.0 s, the PHY driver loaded
its firmware at 6.3 s and the port attached at 7.2 s
- two injected failures: "failed to connect late PHY: -EIO" twice, a
second apart, and the third attempt attached
- failures that do not stop: four attempts, then one "giving up on
/soc/ethernet@15100000/mdio-bus/ethernet-phy@d after 4 attempts",
and no further poll in the 25 s that followed
- unbinding the switch while the poller waited: the poll stopped,
nothing oopsed, and the port attached normally after a rebind
Unbinding the switch after the poller had attached lan4's PHY prints a
kernfs WARN: dsa_user_destroy() unregisters the netdev before
disconnecting the PHY, and only a PHY attached after registration has a
"phydev" link to remove. That ordering predates this series.
In one rebind the EN8811H's own probe failed (MCU not ready); the
poller kept polling at 1 Hz, as patch 2 describes for a driver whose
probe has failed (the run was too short to reach the backoff).
Conor, on 2026-09-10 [3] I said the property would go and the wait would
key off firmware-name. I went back on that. firmware-name names the file
to load, and the EN8811H driver keeps its two blob names in code, so it
would only be read as a presence flag. If firmware-name is still
preferred, I will redo it that way in the next version.
No in-tree device tree sets needs-host-firmware yet. The board is
supported out of tree, in OpenWrt.
Alternatives considered. The poll follows the plan in [1]; a
BUS_NOTIFY_BOUND_DRIVER notifier would give the exact edge, at the cost
of registering a bus notifier for each phylink instance that waits. The
poller repeats what phylink_fwnode_phy_connect() does - choose the
interface, attach, bring up, detach on failure - but drops its reference
at a different point, so the two are not merged into one helper.
Changes since v3:
- Rebased onto net-next, which now carries a940003f44e7; the code is
unchanged, and the prerequisite line is gone.
- No longer RFC. The two open questions are settled above.
- The board is named, and each patch says how the problem was found.
- The binding description keeps only what the hardware does, and the
comments in patch 2 are shorter.
- Tested again on the rebased code, including the teardown cancel that
v3 could not reach before the mt7530 unbind fixes were merged.
- The NULL phydev->drv window mentioned in v3 is left to phylib; a
separate series for net addresses it [2].
v3: https://lore.kernel.org/r/20260914211137.2760618-1-f@lex.la/
[1] https://lore.kernel.org/r/a230d199-5d4d-4637-aff3-e725a37e1da1@lunn.ch/
[2] https://lore.kernel.org/r/20260924215951.2127682-1-f@lex.la/
[3] https://lore.kernel.org/r/20260910153811.778387-1-f@lex.la/
Aleksei Sviridkin (2):
dt-bindings: net: ethernet-phy: add needs-host-firmware
net: phylink: wait for PHYs that are known to probe late
.../devicetree/bindings/net/ethernet-phy.yaml | 6 +
drivers/net/phy/phylink.c | 220 +++++++++++++++++-
2 files changed, 219 insertions(+), 7 deletions(-)
base-commit: 42a9fb3382fc2573e92f41d203b095d9a372cfc9
--
2.53.0
© 2016 - 2026 Red Hat, Inc.