On Tue, Dec 15, 2020 at 07:53:26PM +0200, Andy Shevchenko wrote: > On Tue, Dec 15, 2020 at 6:44 PM Calvin Johnson > <calvin.johnson@xxxxxxxxxxx> wrote: > > > > Introduce fwnode_mdiobus_register() to register PHYs on the mdiobus. > > If the fwnode is DT node, then call of_mdiobus_register(). > > If it is an ACPI node, then: > > - disable auto probing of mdiobus > > - register mdiobus > > - save fwnode to mdio structure > > - loop over child nodes & register a phy_device for each PHY > > ... > > > +/** > > + * fwnode_mdiobus_register - Register mii_bus and create PHYs from fwnode > > + * @mdio: pointer to mii_bus structure > > + * @fwnode: pointer to fwnode of MDIO bus. > > + * > > + * This function registers the mii_bus structure and registers a phy_device > > + * for each child node of @fwnode. > > + */ > > +int fwnode_mdiobus_register(struct mii_bus *mdio, struct fwnode_handle *fwnode) > > +{ > > + struct fwnode_handle *child; > > + unsigned long long addr; > > + acpi_status status; > > + int ret; > > + > > + if (is_of_node(fwnode)) { > > + return of_mdiobus_register(mdio, to_of_node(fwnode)); > > + } else if (is_acpi_node(fwnode)) { > > I would rather see this as simple as > > if (is_of_node(fwnode)) > return of_mdiobus_register(mdio, to_of_node(fwnode)); > if (is_acpi_node(fwnode)) > return acpi_mdiobus_register(mdio, fwnode); > > where the latter one is defined somewhere in drivers/acpi/. Makes sense. I'll do it. But I think it will be better to place acpi_mdiobus_register() here itself in the network subsystem, maybe /drivers/net/mdio/acpi_mdio.c. > > > + /* Mask out all PHYs from auto probing. */ > > + mdio->phy_mask = ~0; > > + ret = mdiobus_register(mdio); > > + if (ret) > > + return ret; > > + > > + mdio->dev.fwnode = fwnode; > > + /* Loop over the child nodes and register a phy_device for each PHY */ > > + fwnode_for_each_child_node(fwnode, child) { > > > + status = acpi_evaluate_integer(ACPI_HANDLE_FWNODE(child), > > + "_ADR", NULL, &addr); > > + if (ACPI_FAILURE(status)) { > > Isn't it fwnode_get_id() now? Yes. Will change it. > > > + pr_debug("_ADR returned %d\n", status); > > + continue; > > + } > > > + if (addr < 0 || addr >= PHY_MAX_ADDR) > > + continue; > > addr can't be less than 0. Yes. will update in v3. > > > + ret = fwnode_mdiobus_register_phy(mdio, child, addr); > > + if (ret == -ENODEV) > > + dev_err(&mdio->dev, > > + "MDIO device at address %lld is missing.\n", > > + addr); > > + } > > + return 0; > > + } > > + return -EINVAL; > > +} > > -- > With Best Regards, > Andy Shevchenko