On Sun, Jun 02, 2024 at 05:36:24PM +0300, Serge Semin wrote: > Recently the DW XPCS DT-bindings have been introduced and the DW XPCS > driver has been altered to support the DW XPCS registered as a platform > device. In order to have the DW XPCS DT-device accessed from the STMMAC > driver let's alter the STMMAC PCS-setup procedure to support the > "pcs-handle" property containing the phandle reference to the DW XPCS > device DT-node. The respective fwnode will be then passed to the > xpcs_create_fwnode() function which in its turn will create the DW XPCS > descriptor utilized in the main driver for the PCS-related setups. > > Signed-off-by: Serge Semin <fancer.lancer@xxxxxxxxx> > --- > drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c | 13 +++++++++---- > 1 file changed, 9 insertions(+), 4 deletions(-) > > diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c > index 807789d7309a..dc040051aa53 100644 > --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c > +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_mdio.c > @@ -497,15 +497,22 @@ int stmmac_mdio_reset(struct mii_bus *bus) > > int stmmac_pcs_setup(struct net_device *ndev) > { > + struct fwnode_handle *devnode, *pcsnode; > struct dw_xpcs *xpcs = NULL; > struct stmmac_priv *priv; > int addr, mode, ret; > > priv = netdev_priv(ndev); > mode = priv->plat->phy_interface; > + devnode = priv->plat->port_node; > > if (priv->plat->pcs_init) { > ret = priv->plat->pcs_init(priv); > + } else if (fwnode_property_present(devnode, "pcs-handle")) { > + pcsnode = fwnode_find_reference(devnode, "pcs-handle", 0); > + xpcs = xpcs_create_fwnode(pcsnode, mode); > + fwnode_handle_put(pcsnode); > + ret = PTR_ERR_OR_ZERO(xpcs); Just figured, we might wish to be a bit more portable in the "pcs-handle" property semantics implementation seeing there can be at least three different PCS attached: DW XPCS Lynx PCS Renesas RZ/N1 MII Any suggestion of how to distinguish the passed handle? Perhaps named-property, phandle argument, by the compatible string or the node-name? -Serge(y) > } else if (priv->plat->mdio_bus_data && > priv->plat->mdio_bus_data->has_xpcs) { > addr = priv->plat->mdio_bus_data->xpcs_addr; > @@ -515,10 +522,8 @@ int stmmac_pcs_setup(struct net_device *ndev) > return 0; > } > > - if (ret) { > - dev_warn(priv->device, "No xPCS found\n"); > - return ret; > - } > + if (ret) > + return dev_err_probe(priv->device, ret, "No xPCS found\n"); > > priv->hw->xpcs = xpcs; > > -- > 2.43.0 >