Re: [PATCH v2] net: dsa: mxl-gsw1xx: deassert internal PHY resets before MDIO registration

From: Sverdlin, Alexander

Date: Fri Sep 11 2026 - 04:38:35 EST


Hi Daniel!

On Tue, 2026-09-08 at 11:56 +0100, Daniel Golle wrote:
> > When the switch is bootstrapped with PS_NOWAIT = 0, the internal PHYs
> > default to a held-in-reset state. The driver previously only worked with
> > PS_NOWAIT = 1 where PHYs are released from reset automatically.
> >
> > Deassert the PHY reset lines via the RST_REQ register before the MDIO bus
> > is registered, so that PHY IDs can be read during bus scan. Only release
> > PHYs for ports that have a phy-handle in the device tree, so unused ports
> > do not consume power. A single 300ms delay after deasserting all needed
> > resets ensures the PHYs are ready for MDIO communication (refer to Intel
> > XWAY, Maxlinear GPY111 datasheets or the Lantiq counterpart of the driver).
> >
> > Signed-off-by: Alexander Sverdlin <alexander.sverdlin@xxxxxxxxxxx>
> >
> > [...]
> > +static int gsw1xx_setup(struct dsa_switch *ds)
> > +{
> > + struct gsw1xx_priv *priv = container_of(ds->priv, struct gsw1xx_priv, gswip);
> > + struct gswip_priv *gswip_priv = ds->priv;
> > + struct device_node *phy_np;
> > + u32 phy_reset_mask = 0;
> > + struct dsa_port *dp;
> > + int ret;
> > +
> > + dsa_switch_for_each_user_port(dp, ds) {
> > + struct phylink_config cfg = {};
> > +
> > + /* Is there an internal PHY on this port? */
> > + gswip_priv->hw_info->phylink_get_caps(ds, dp->index, &cfg);
> > + if (!test_bit(PHY_INTERFACE_MODE_INTERNAL, cfg.supported_interfaces))
> > + continue;
> > +
> > + /* Will the PHY be really used? */
> > + phy_np = of_parse_phandle(dp->dn, "phy-handle", 0);
> > + if (!phy_np)
> > + continue;
> > +
> > + of_node_put(phy_np);
> > + phy_reset_mask |= GSW1XX_RST_REQ_PHY(dp->index);
> > + }
> > +
> > + if (!phy_reset_mask)
> > + return 0;
> > +
> > + /* Deassert resets only for PHYs referenced by active ports */
> > + ret = regmap_clear_bits(priv->shell, GSW1XX_SHELL_RST_REQ, phy_reset_mask);
>
> Likewise doing the other change may also be a good idea:
> Disable unused PHYs for a switch with PS_NOWAIT = 1 strapped.
> Ie. use regmap_update_bits on the inverted phy_reset_mask.
> This would make us end up with the identical state independently
> of PS_NOWAIT being strapped or not.

Makes sense! Will do in v3.

--
Alexander Sverdlin
Siemens AG
www.siemens.com